From 4464ab6811576d25cd7a77ca5ec2df1e4b2fd97e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 28 Jun 2022 17:53:18 +0300 Subject: [PATCH 001/174] Removed support for Delphi 2010 and XE. This simplifies VarPyth. --- Source/PythonEngine.pas | 4 +- Source/VarPyth.pas | 299 +--------------------------------------- 2 files changed, 6 insertions(+), 297 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 7fb1244f..13527c0b 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -62,8 +62,8 @@ { TODO -oMMM : implement Attribute descriptor and subclassing stuff } {$IFNDEF FPC} - {$IFNDEF DELPHI2010_OR_HIGHER} - Error! Delphi 2010 or higher is required! + {$IFNDEF DELPHIXE2_OR_HIGHER} + Error! Delphi XE2 or higher is required! {$ENDIF} {$ENDIF} diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index 67c18ba8..6e4d0f4f 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -150,14 +150,8 @@ TNamedParamDesc = record end; TNamedParamArray = array of TNamedParamDesc; -{$IFDEF DELPHIXE2_OR_HIGHER} - {$DEFINE USESYSTEMDISPINVOKE} //Delphi 2010 DispInvoke is buggy - {$IF defined(OSX64) or defined(LINUX) or not defined(DELPHI10_4_OR_HIGHER)} - {$DEFINE PATCHEDSYSTEMDISPINVOKE} //To correct memory leaks - {$IFEND} -{$ENDIF} -{$IF DEFINED(FPC_FULLVERSION) and (FPC_FULLVERSION >= 20500)} - {$DEFINE USESYSTEMDISPINVOKE} +{$IF not defined(FPC) and (defined(OSX64) or defined(LINUX) or not defined(DELPHI10_4_OR_HIGHER))} + {$DEFINE PATCHEDSYSTEMDISPINVOKE} //To correct memory leaks {$IFEND} { Python variant type handler } @@ -173,20 +167,13 @@ TPythonVariantType = class(TInvokeableVariantType, IVarInstanceReference) const Arguments: TVarDataArray): PPyObject; function VarDataToPythonObject( AVarData : TVarData ) : PPyObject; procedure PyhonVarDataCreate( var Dest : TVarData; AObject : PPyObject ); - {$IFNDEF USESYSTEMDISPINVOKE} - procedure DoDispInvoke(Dest: PVarData; var Source: TVarData; - CallDesc: PCallDesc; Params: Pointer); virtual; - function GetPropertyWithArg(var Dest: TVarData; const V: TVarData; - const AName: AnsiString; AArg : TVarData): Boolean; virtual; - {$ENDIF USESYSTEMDISPINVOKE} - {$IFNDEF FPC} - function FixupIdent(const AText: string): string; override; - {$ENDIF FPC} {$IFDEF FPC} procedure VarDataClear(var Dest: TVarData); procedure VarDataCopyNoInd(var Dest: TVarData; const Source: TVarData); procedure VarDataCastTo(var Dest: TVarData; const Source: TVarData; const AVarType: TVarType); overload; + {$ELSE} + function FixupIdent(const AText: string): string; override; {$ENDIF FPC} public procedure Clear(var V: TVarData); override; @@ -1158,7 +1145,6 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; procedure TPythonVariantType.DispInvoke(Dest: PVarData; var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); {$ENDIF} -{$IFDEF USESYSTEMDISPINVOKE} {$IFDEF PATCHEDSYSTEMDISPINVOKE} // Modified to correct memory leak QC102387 / RSP-23093 procedure PatchedFinalizeDispatchInvokeArgs(CallDesc: PCallDesc; const Args: TVarDataArray; OrderLTR : Boolean); @@ -1336,283 +1322,6 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; end; end; -{$ELSE USESYSTEMDISPINVOKE} -begin - DoDispInvoke(Dest, Source, CallDesc, Params); -end; - -procedure TPythonVariantType.DoDispInvoke(Dest: PVarData; - var Source: TVarData; CallDesc: PCallDesc; Params: Pointer); -type - PParamRec = ^TParamRec; - TParamRec = array[0..3] of Integer; - TStringDesc = record - BStr: WideString; - PStr: PAnsiString; - end; -var - LArguments: TVarDataArray; - LStrings: array of TStringDesc; - LStrCount: Integer; - LParamPtr: Pointer; - LNamedArgStart : Integer; //arg position of 1st named argument (if any) - LNamePtr: PAnsiChar; - - procedure ParseParam(I: Integer); - const - CArgTypeMask = $7F; - CArgByRef = $80; - var - LArgType: Integer; - LArgByRef: Boolean; - begin - LArgType := CallDesc^.ArgTypes[I] and CArgTypeMask; - LArgByRef := (CallDesc^.ArgTypes[I] and CArgByRef) <> 0; - - if I >= LNamedArgStart then - begin - LNamePtr := LNamePtr + Succ(StrLen(LNamePtr)); - fNamedParams[I-LNamedArgStart].Index := I; - fNamedParams[I-LNamedArgStart].Name := AnsiString(LNamePtr); - end; - - // error is an easy expansion - if LArgType = varError then - SetClearVarToEmptyParam(LArguments[I]) - - // literal string - else if LArgType = varStrArg then - begin - with LStrings[LStrCount] do - if LArgByRef then - begin - //BStr := StringToOleStr(PAnsiString(ParamPtr^)^); - BStr := WideString(System.Copy(PAnsiString(LParamPtr^)^, 1, MaxInt)); - PStr := PAnsiString(LParamPtr^); - LArguments[I].VType := varOleStr or varByRef; - LArguments[I].VOleStr := @BStr; - end - else - begin - //BStr := StringToOleStr(PAnsiString(LParamPtr)^); - BStr := WideString(System.Copy(PAnsiString(LParamPtr)^, 1, MaxInt)); - PStr := nil; - LArguments[I].VType := varOleStr; - if BStr = '' then - LArguments[I].VOleStr := nil - else - LArguments[I].VOleStr := PWideChar(BStr); - end; - Inc(LStrCount); - end - - // value is by ref - else if LArgByRef then - begin - if (LArgType = varVariant) and - (PVarData(LParamPtr^)^.VType = varString) - or (PVarData(LParamPtr)^.VType = varUString) - then - //VarCast(PVariant(ParamPtr^)^, PVariant(ParamPtr^)^, varOleStr); - VarDataCastTo(PVarData(LParamPtr^)^, PVarData(LParamPtr^)^, varOleStr); - LArguments[I].VType := LArgType or varByRef; - LArguments[I].VPointer := Pointer(LParamPtr^); - end - - // value is a variant - else if LArgType = varVariant then - if (PVarData(LParamPtr)^.VType = varString) - or (PVarData(LParamPtr)^.VType = varUString) - then - begin - with LStrings[LStrCount] do - begin - //BStr := StringToOleStr(AnsiString(PVarData(LParamPtr)^.VString)); - if (PVarData(LParamPtr)^.VType = varString) then - BStr := WideString(System.Copy(AnsiString(PVarData(LParamPtr)^.VString), 1, MaxInt)) - else - {$IFDEF FPC} - BStr := System.Copy(UnicodeString(PVarData(LParamPtr)^.VString), 1, MaxInt); - {$ELSE} - BStr := System.Copy(UnicodeString(PVarData(LParamPtr)^.VUString), 1, MaxInt); - {$ENDIF} - PStr := nil; - LArguments[I].VType := varOleStr; - LArguments[I].VOleStr := PWideChar(BStr); - end; - Inc(LStrCount); - Inc(NativeInt(LParamPtr), SizeOf(TVarData) - SizeOf(Pointer)); - end - else - begin - LArguments[I] := PVarData(LParamPtr)^; - Inc(NativeInt(LParamPtr), SizeOf(TVarData) - SizeOf(Pointer)); - end - else - begin - LArguments[I].VType := LArgType; - case CVarTypeToElementInfo[LArgType].Size of - 1, 2, 4: - begin - LArguments[I].VLongs[1] := PParamRec(LParamPtr)^[0]; - end; - 8: - begin - LArguments[I].VLongs[1] := PParamRec(LParamPtr)^[0]; - LArguments[I].VLongs[2] := PParamRec(LParamPtr)^[1]; - Inc(NativeInt(LParamPtr), 8 - SizeOf(Pointer)); - end; - else - RaiseDispError; - end; - end; - Inc(NativeInt(LParamPtr), SizeOf(Pointer)); - end; - -var - I, LArgCount: Integer; - LIdent: AnsiString; - LTemp: TVarData; -begin - //------------------------------------------------------------------------------------ - // Note that this method is mostly a copy&paste from TInvokeableVariantType.DispInvoke - // because Borland assumes that the names are not case sensitive, whereas Python has - // case sensitive symbols. - // We modified the property get to allow the use of indexed properties. - //------------------------------------------------------------------------------------ - - // Grab the identifier - LArgCount := CallDesc^.ArgCount; - //After arg types, method name and named arg names are stored - //Position pointer on method name - LNamePtr := PAnsiChar(@CallDesc^.ArgTypes[LArgCount]); - LIdent := AnsiString(LNamePtr); - //Named params must be after positional params - LNamedArgStart := CallDesc^.ArgCount - CallDesc^.NamedArgCount; - SetLength(fNamedParams, CallDesc^.NamedArgCount); - - // Parse the arguments - LParamPtr := Params; - SetLength(LArguments, LArgCount); - LStrCount := 0; - SetLength(LStrings, LArgCount); - for I := 0 to LArgCount - 1 do - ParseParam(I); - - // What type of invoke is this? - case CallDesc^.CallType of - CDoMethod: - // procedure with N arguments - if Dest = nil then - begin - if not DoProcedure(Source, string(LIdent), LArguments) then - begin - - // ok maybe its a function but first we must make room for a result - VarDataInit(LTemp); - try - - // notate that the destination shouldn't be bothered with - // functions can still return stuff, we just do this so they - // can tell that they don't need to if they don't want to - SetClearVarToEmptyParam(LTemp); - - // ok lets try for that function - if not DoFunction(LTemp, Source, string(LIdent), LArguments) then - RaiseDispError; - finally - VarDataClear(LTemp); - end; - end - end - - // property get or function with 0 argument - else if LArgCount = 0 then - begin - if not GetProperty(Dest^, Source, string(LIdent)) and - not DoFunction(Dest^, Source, string(LIdent), LArguments) then - RaiseDispError; - end - - // function with N arguments - else if not DoFunction(Dest^, Source, string(LIdent), LArguments) then - RaiseDispError; - - CPropertyGet: - begin - // here that code has been changed to allow the indexed properties. - - if Dest = nil then // there must be a dest - RaiseDispError; - if LArgCount = 0 then // no args - begin - if not GetProperty(Dest^, Source, string(LIdent)) then // get op be valid - RaiseDispError; - end - else if LArgCount = 1 then // only one arg - begin - if not GetPropertyWithArg(Dest^, Source, LIdent, LArguments[0]) then // get op be valid - RaiseDispError; - end - else - raise Exception.Create( SMultiDimensionalPropsNotSupported ); - end; - - CPropertySet: - if not ((Dest = nil) and // there can't be a dest - (LArgCount = 1) and // can only be one arg - SetProperty(Source, string(LIdent), LArguments[0])) then // set op be valid - RaiseDispError; - else - RaiseDispError; - end; - - // copy back the string info - I := LStrCount; - while I <> 0 do - begin - Dec(I); - with LStrings[I] do - if Assigned(PStr) then - PStr^ := AnsiString(System.Copy(BStr, 1, MaxInt)); - end; -end; - -function TPythonVariantType.GetPropertyWithArg(var Dest: TVarData; - const V: TVarData; const AName: AnsiString; AArg: TVarData): Boolean; -var - _prop, _result : PPyObject; -begin - with GetPythonEngine do - begin - _result := nil; - _prop := PyObject_GetAttrString(TPythonVarData(V).VPython.PyObject, PAnsiChar(AName)); - CheckError; - if Assigned(_prop) then - begin - // here we check only sequences, as Delphi does not allow a type different from Integer - // to be used within brackets. - // But you can still access a dictionary with parenthesis, like: myObj.MyDict('MyKey') - // Note that we can't use the brackets on a Python variant that contains a list, - // because Delphi thinks it's a variant array, whereas it is not, of course! - // So: myList[0] won't work, but myObj.MyList[0] will!!! - if PySequence_Check(_prop) <> 0 then - begin - _result := PySequence_GetItem(_prop, Variant(AArg)); - CheckError; - end; // of if - end; // of if - Result := Assigned(_result); - if Result then - try - PyhonVarDataCreate(Dest, _result); - finally - Py_XDecRef(_prop); - end; // of try - end; // of with -end; -{$ENDIF USESYSTEMDISPINVOKE} - function TPythonVariantType.DoFunction(var Dest: TVarData; const V: TVarData; const AName: string; const Arguments: TVarDataArray): Boolean; From 27b7ae88d4351594823d8632802489a864f3b746 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 14 Jul 2022 00:45:26 +0300 Subject: [PATCH 002/174] Avoid access violation in TPythonModule.GetVarAsVariant (see https://en.delphipraxis.net/topic/7085-returning-lists-from-python-to-delphi/) --- Source/PythonEngine.pas | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 13527c0b..d924c8a5 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -7311,11 +7311,12 @@ function TPythonModule.GetVarAsVariant( const varName : AnsiString ) : Variant; with Engine do begin obj := GetVar( varName ); - try - Result := PyObjectAsVariant( obj ); - finally - Py_XDecRef(obj); - end; + if Assigned(obj) then + try + Result := PyObjectAsVariant( obj ); + finally + Py_XDecRef(obj); + end; end; end; From cd5fbbbd8d70353e9123e741989c57f336da5239 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 16 Jul 2022 18:39:24 +0300 Subject: [PATCH 003/174] Minor fixes --- Source/WrapDelphiWindows.pas | 2 +- Source/vcl/WrapVclForms.pas | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/WrapDelphiWindows.pas b/Source/WrapDelphiWindows.pas index 9601f057..d0bc0aa9 100644 --- a/Source/WrapDelphiWindows.pas +++ b/Source/WrapDelphiWindows.pas @@ -185,7 +185,7 @@ class function TWindowsRegistration.SetProcessDpiAwareness_Wrapper(PySelf, {$ENDIF DELPHI11_OR_HIGHER} initialization - RegisteredUnits.Add( TWindowsRegistration.Create ); + RegisteredUnits.Add(TWindowsRegistration.Create); {$IFDEF MSWINDOWS} {$IFDEF DELPHI11_OR_HIGHER} diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index d0a34631..d40e9ef9 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -591,8 +591,8 @@ function TPyDelphiCustomForm.LoadProps_Wrapper(args: PPyObject): PPyObject; Exit(GetPythonEngine().ReturnFalse); except on E: Exception do - GetPythonEngine().PyErr_SetString(PyExc_RuntimeError^, - PAnsiChar(AnsiString(E.Message))); + with GetPythonEngine() do + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); end; Result := nil; end; From 556b33e7fc52d7258b5ab2bb1f70408c313c6311 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 16 Jul 2022 23:55:48 +0300 Subject: [PATCH 004/174] Fix #368 --- Source/PythonEngine.pas | 2 ++ Source/WrapDelphi.pas | 44 +++++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index d924c8a5..5e6802ad 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1521,6 +1521,7 @@ TPythonInterface=class(TDynamicDll) PyObject_GetAttrString:function (ob:PPyObject;c:PAnsiChar):PPyObject; cdecl; PyObject_GetItem:function (ob,key:PPyObject):PPyObject; cdecl; PyObject_DelItem:function (ob,key:PPyObject):PPyObject; cdecl; + PyObject_HasAttr:function (ob, attr_name:PPyObject):integer; cdecl; PyObject_HasAttrString:function (ob:PPyObject;key:PAnsiChar):integer; cdecl; PyObject_Hash:function (ob:PPyObject):NativeInt; cdecl; PyObject_IsTrue:function (ob:PPyObject):integer; cdecl; @@ -3711,6 +3712,7 @@ procedure TPythonInterface.MapDll; PyObject_GetAttrString := Import('PyObject_GetAttrString'); PyObject_GetItem := Import('PyObject_GetItem'); PyObject_DelItem := Import('PyObject_DelItem'); + PyObject_HasAttr := Import('PyObject_HasAttr'); PyObject_HasAttrString := Import('PyObject_HasAttrString'); PyObject_Hash := Import('PyObject_Hash'); PyObject_IsTrue := Import('PyObject_IsTrue'); diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index c3188749..a9925f5c 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2226,9 +2226,10 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; Result := inherited GetAttrO(key); if GetPythonEngine.PyErr_Occurred = nil then Exit; // We found what we wanted - if Assigned(DelphiObject) and GetPythonEngine.PyUnicode_Check(Key) then - KeyName := GetPythonEngine.PyUnicodeAsString(Key) - else + // should not happen + if not (Assigned(DelphiObject) and + CheckStrAttribute(Key, 'GetAttrO key parameter', KeyName)) + then Exit; GetPythonEngine.PyErr_Clear; @@ -2512,11 +2513,15 @@ function TPyDelphiObject.Repr: PPyObject; function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; (* - First look whether the attribute has ben wrapped (RegisterGetSet, RegisterMethod). - This is done by calling the inherited SetAttrO. If this fails then + First look whether the attribute exists., e.g. has been wrapped with + RegisterGetSet, RegisterMethod, etc. + If it does then the inherited generic SetAttrO is called. + If the attribute does not exist or the generic SetAttO fails (unlikely) then - Use Rtti to locate the property in DELPHIXE_OR_HIGHER (EXTENDED_RTTI) or for other versions - Look for published properties + Finally, if all the above fail then you call the inherited generic SetAttrO + which adds a new field in the object dictionary *) function HandleEvent(PropInfo: PPropInfo; out ErrMsg: string) : Integer; @@ -2582,20 +2587,29 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; {$ENDIF} KeyName: string; ErrMsg: string; + PyEngine: TPythonEngine; + PyObj: PPyobject; begin Result := -1; - if Assigned(DelphiObject) and GetPythonEngine.PyUnicode_Check(Key) then - KeyName := GetPythonEngine.PyUnicodeAsString(Key) - else begin + PyEngine := GetPythonEngine; + + // should not happen + if not (Assigned(DelphiObject) and + CheckStrAttribute(Key, 'SetAttrO key parameter', KeyName)) + then Exit; - end; - // Only call the inherited method if the attribute exists - if GetPythonEngine.PyObject_HasAttrString(GetSelf, PAnsiChar(key)) = 1 then + // Only call the inherited method at this stage if the attribute exists + PyObj := PyEngine.PyObject_GenericGetAttr(GetSelf, key); + if Assigned(PyObj) then + begin + PyEngine.Py_DECREF(PyObj); // not needed Result := inherited SetAttrO(key, value); - if Result = 0 then Exit; + if Result = 0 then + Exit; + end; - GetPythonEngine.PyErr_Clear; + PyEngine.PyErr_Clear; {$IFDEF EXTENDED_RTTI} Context := TRttiContext.Create(); try @@ -2623,8 +2637,8 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; if Result <> 0 then Result := inherited SetAttrO(key, value); if Result <> 0 then - with GetPythonEngine do - PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString( + with PyEngine do + PyErr_SetObject(PyEngine.PyExc_AttributeError^, PyUnicodeFromString( Format(rs_ErrAttrSetr, [KeyName, ErrMsg]))); end; From 641de688a8fa53c03a4bce5a309c2a120db20b0d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 29 Jul 2022 16:56:02 +0300 Subject: [PATCH 005/174] Fix #373 --- Demos/Demo33/ThSort.pas | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Demos/Demo33/ThSort.pas b/Demos/Demo33/ThSort.pas index ca82a386..adf7156b 100644 --- a/Demos/Demo33/ThSort.pas +++ b/Demos/Demo33/ThSort.pas @@ -197,11 +197,18 @@ procedure TThreadSortForm.ThreadDone(Sender: TObject); function TThreadSortForm.SortModule_GetValue( pself, args : PPyObject ) : PPyObject; cdecl; var - psort, index: Integer; + psort: NativeInt; + index: Integer; begin with GetPythonEngine do begin - if (PyErr_Occurred() = nil) and (PyArg_ParseTuple( args, 'ii',@psort, @index) <> 0) then + if (PyErr_Occurred() = nil) and +{$IFDEF CPU64BITS} + (PyArg_ParseTuple( args, 'Li',@psort, @index) <> 0) +{$ELSE} + (PyArg_ParseTuple( args, 'ii',@psort, @index) <> 0) +{$ENDIF} + then begin Result := PyLong_FromLong(TSortThread(psort)[index]); end else @@ -211,11 +218,18 @@ function TThreadSortForm.SortModule_GetValue( pself, args : PPyObject ) : PPyObj function TThreadSortForm.SortModule_Swap( pself, args : PPyObject ) : PPyObject; cdecl; var - psort, i, j: Integer; + psort: NativeInt; + i, j: Integer; begin with GetPythonEngine do begin - if (PyErr_Occurred() = nil) and (PyArg_ParseTuple( args, 'iii',@psort, @i, @j) <> 0) then + if (PyErr_Occurred() = nil) and +{$IFDEF CPU64BITS} + (PyArg_ParseTuple( args, 'Lii',@psort, @i, @j) <> 0) +{$ELSE} + (PyArg_ParseTuple( args, 'iii',@psort, @i, @j) <> 0) +{$ENDIF} + then begin TSortThread(psort).VisualSwap(i,j); Result := ReturnNone; From 0fe42b19a837c8e6ec02b5cce8c44dbe85519e77 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 29 Jul 2022 17:58:06 +0300 Subject: [PATCH 006/174] Fix #370 --- Source/vcl/WrapVclThemes.pas | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index f409a705..73767a55 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -103,11 +103,13 @@ function StyleServices_Wrapper(pself, args: PPyObject): PPyObject; cdecl; if PyTuple_Check(args) then begin if PyTuple_Size(args) = 0 then Result := GlobalDelphiWrapper.Wrap(StyleServices()) +{$IF CompilerVersion > 33} else if (PyArg_ParseTuple(args, 'O:StyleServices', @LPyObj) <> 0) - and CheckObjAttribute(LPyObj, 'AControl', TControl, TObject(LControl)) then - begin - Result := GlobalDelphiWrapper.Wrap(StyleServices(LControl)); - end else + and CheckObjAttribute(LPyObj, 'AControl', TControl, TObject(LControl)) + then + Result := GlobalDelphiWrapper.Wrap(StyleServices(LControl)) +{$IFEND} + else Result := nil; end else Result := nil; From b2712f15d3f512ee9e3aaaff60d12c0dabcb46d8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 28 Sep 2022 19:44:25 +0300 Subject: [PATCH 007/174] FPC POSIX compatibility. https://en.delphipraxis.net/topic/7542-lazarusfpc-support/ --- Source/MethodCallBack.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/MethodCallBack.pas b/Source/MethodCallBack.pas index b341c408..f5eaec11 100644 --- a/Source/MethodCallBack.pas +++ b/Source/MethodCallBack.pas @@ -194,7 +194,7 @@ procedure GetCodeMem(var ptr: PByte; size: integer); {$IFEND} if mprotect(page, PageSize, flags) <> 0 then raise EMProtectError.CreateFmt('MProtect error: %s', [ - SysErrorMessage(GetLastError())]); + SysErrorMessage({$IFDEF FPC}GetLastOSError{$ELSE}GetLastError{$ENDIF}())]); {$ENDIF} page^.next:=CodeMemPages; CodeMemPages:=page; @@ -210,7 +210,7 @@ procedure GetCodeMem(var ptr: PByte; size: integer); //RW permission to the entire page for new changes... if mprotect(page, PageSize, PROT_READ or PROT_WRITE) <> 0 then raise EMProtectError.CreateFmt('MProtect error: %s', [ - SysErrorMessage(GetLastError())]); + SysErrorMessage({$IFDEF FPC}GetLastOSError{$ELSE}GetLastError{$ENDIF}())]); end; {$ELSE} end; @@ -751,7 +751,7 @@ function GetCallBack(Self: TObject; Method: Pointer; ArgNum: Integer; //X permission to the entire page for executions... if mprotect(CodeMemPages, PageSize, PROT_EXEC) <> 0 then raise EMProtectError.CreateFmt('MProtect error: %s', [ - SysErrorMessage(GetLastError())]); + SysErrorMessage({$IFDEF FPC}GetLastOSError{$ELSE}GetLastError{$ENDIF}())]); {$IFEND} Result := Pointer(Q); //set arm mode From e77cf44b4c7d9cea77b5a6e3a7af7c48ffc9b9f2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 27 Oct 2022 01:45:34 +0300 Subject: [PATCH 008/174] Fix #386 --- Source/Definition.Inc | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/Source/Definition.Inc b/Source/Definition.Inc index e60baccc..5c2723b7 100644 --- a/Source/Definition.Inc +++ b/Source/Definition.Inc @@ -204,22 +204,43 @@ {$IFDEF FPC} {$MODE DELPHI} + {$IFDEF CPU64} {$DEFINE CPU64BITS} {$ENDIF CPU64} - {$IFDEF CPU386} + + {$IFDEF CPU86} {$DEFINE CPUX86} - {$ENDIF CPU32} + {$ENDIF CPU86} + {$IFDEF DARWIN} + {$DEFINE OSX} {$DEFINE MACOS} - {$DEFINE ALIGN_STACK} {$IFDEF CPU32} {$DEFINE MACOS32} {$ENDIF CPU32} + {$IFDEF CPU64} + {$DEFINE MACOS64} + {$DEFINE OSX64} + {$ENDIF CPU64} {$ENDIF DARWIN} + + {$IFDEF CPUARM} + {$DEFINE CPUARM32} + {$ENDIF} + + {$IFDEF CPUAARCH64} + {$DEFINE CPUARM} + {$DEFINE CPUARM64} + {$ENDIF} + {$IFDEF UNIX} {$DEFINE POSIX} {$ENDIF UNIX} + + {$IFDEF ANDROID} + {$DEFINE POSIX} + {$ENDIF ANDROID} {$ENDIF FPC} {$IFDEF DELPHIXE_OR_HIGHER} @@ -230,8 +251,6 @@ {$LEGACYIFEND ON} {$ENDIF DELPHIXE4_OR_HIGHER} -{$IFDEF DELPHIXE2_OR_HIGHER} - {$IFDEF MACOS} - {$DEFINE DARWIN} - {$ENDIF MACOS} -{$ENDIF DELPHIXE2_OR_HIGHER} +{$IFDEF MACOS} + {$DEFINE DARWIN} +{$ENDIF MACOS} From d865565122b2be19e85ccce4f6151756b4fe8d1d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 3 Nov 2022 04:47:12 +0200 Subject: [PATCH 009/174] Fix GetHelpFile and take account of the fact that python 11 includes html documentation. --- Source/PythonVersions.pas | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 9eb3708c..6bbd0a72 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -170,13 +170,13 @@ function TPythonVersion.GetHelpFile: string; SR: TSearchRec; begin Result := FHelpFile; - // for unregistered Python - if (Result = '') and (InstallPath <> '') then + // for unregistered Python or python 11 + if ((Result = '') or (ExtractFileExt(Result) = '.html')) and (InstallPath <> '') then begin - PythonHelpFilePath := InstallPath + '\Doc\python*.chm'; + PythonHelpFilePath := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\python*.chm'; Res := FindFirst(PythonHelpFilePath, faAnyFile, SR); if Res = 0 then - Result := InstallPath + '\Doc\' + SR.Name; + Result := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\' + SR.Name; FindClose(SR); end; end; From d530217b29f5eedbed278f7d98e346f73ec784de Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 4 Dec 2022 03:00:46 +0200 Subject: [PATCH 010/174] SyntaxError in python 10+ has two new attributes end_offset and end_lineNo --- Source/PythonEngine.pas | 49 +++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 5e6802ad..c3a61fcf 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1060,6 +1060,8 @@ EPySyntaxError = class (EPyStandardError) ELineStr: UnicodeString; ELineNumber: Integer; EOffset: Integer; + EEndLineNumber: Integer; + EEndOffset: Integer; end; EPyIndentationError = class (EPySyntaxError); EPyTabError = class (EPyIndentationError); @@ -5004,12 +5006,14 @@ procedure TPythonEngine.RaiseError; function DefineSyntaxError( E : EPySyntaxError; const sType, sValue : UnicodeString; err_type, err_value : PPyObject ) : EPySyntaxError; var - s_value : UnicodeString; - s_line : UnicodeString; - s_filename : UnicodeString; - i_line_number : Integer; - i_offset : Integer; - tmp : PPyObject; + s_value : UnicodeString; + s_line : UnicodeString; + s_filename : UnicodeString; + i_line_number : Integer; + i_offset : Integer; + i_end_line_number : Integer; + i_end_offset : Integer; + tmp : PPyObject; begin Result := E; Result.EName := sType; @@ -5019,8 +5023,10 @@ procedure TPythonEngine.RaiseError; s_filename := ''; i_line_number := 0; i_offset := 0; + i_end_line_number := 0; + i_end_offset := 0; // Sometimes there's a tuple instead of instance... - if PyTuple_Check( err_value ) and (PyTuple_Size( err_value) >= 2) then + if PyTuple_Check(err_value) and (PyTuple_Size( err_value) >= 2) then begin s_value := PyObjectAsString(PyTuple_GetItem( err_value, 0)); err_value := PyTuple_GetItem( err_value, 1); @@ -5065,19 +5071,34 @@ procedure TPythonEngine.RaiseError; if Assigned(tmp) and PyUnicode_Check(tmp) then s_value := PyUnicodeAsString(tmp); Py_XDECREF(tmp); + if MajorVersion >= 10 then + begin + // Get the end offset of the error + tmp := PyObject_GetAttrString(err_value, 'end_offset' ); + if Assigned(tmp) and PyLong_Check(tmp) then + i_end_offset := PyLong_AsLong(tmp); + Py_XDECREF(tmp); + // Get the end line number of the error + tmp := PyObject_GetAttrString(err_value, 'end_lineno' ); + if Assigned(tmp) and PyLong_Check(tmp) then + i_end_line_number := PyLong_AsLong(tmp); + Py_XDECREF(tmp); + end; end; // If all is ok if s_value <> '' then begin with Result do begin - Message := Format('%s: %s (line %d, offset %d): ''%s''', [sType,s_value,i_line_number, i_offset,s_line]); - EName := sType; - EValue := s_value; - EFileName := s_filename; - ELineNumber := i_line_number; - EOffset := i_offset; - ELineStr := s_line; + Message := Format('%s: %s (line %d, offset %d): ''%s''', [sType,s_value,i_line_number, i_offset,s_line]); + EName := sType; + EValue := s_value; + EFileName := s_filename; + ELineNumber := i_line_number; + EOffset := i_offset; + EEndLineNumber := i_end_line_number; + EEndOffset := i_end_offset; + ELineStr := s_line; end; end else From 3b95d07f087ed44d034ea6858ff14f68247e74dd Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 4 Dec 2022 04:41:10 +0200 Subject: [PATCH 011/174] Added PyCF_ONLY_AST constant --- Source/PythonEngine.pas | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index c3a61fcf..edab0a98 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -759,6 +759,9 @@ TPythonVersionProp = record cf_feature_version : integer; //added in Python 3.8 end; + const + PyCF_ONLY_AST = $0400; + // from datetime.h From 87f8f775c1e7e6a17d9d7ecc385292f5c64ace26 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 5 Dec 2022 15:12:12 +0200 Subject: [PATCH 012/174] Try to find index.html help file, in unregistered versions. --- Source/PythonVersions.pas | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 6bbd0a72..59395432 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -166,6 +166,7 @@ function TPythonVersion.GetDisplayName: string; function TPythonVersion.GetHelpFile: string; var PythonHelpFilePath: string; + HtmlIndex: string; Res: Integer; SR: TSearchRec; begin @@ -176,7 +177,13 @@ function TPythonVersion.GetHelpFile: string; PythonHelpFilePath := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\python*.chm'; Res := FindFirst(PythonHelpFilePath, faAnyFile, SR); if Res = 0 then - Result := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\' + SR.Name; + Result := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\' + SR.Name + else if Result = '' then + begin + HtmlIndex := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\index.html'; + if FileExists(HtmlIndex) then + Result := HtmlIndex; + end; FindClose(SR); end; end; From a345a86542cbbe28fadc94a1e0de1bbe09436482 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 5 Dec 2022 15:33:09 +0200 Subject: [PATCH 013/174] Fixed html index path. --- Source/PythonVersions.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 59395432..e6be6d41 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -180,7 +180,7 @@ function TPythonVersion.GetHelpFile: string; Result := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\' + SR.Name else if Result = '' then begin - HtmlIndex := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\index.html'; + HtmlIndex := IncludeTrailingPathDelimiter(InstallPath) + 'Doc\html\index.html'; if FileExists(HtmlIndex) then Result := HtmlIndex; end; From a20b191acd09417892971a9de6ea2264b4f69bd6 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 13 Dec 2022 17:08:06 +0200 Subject: [PATCH 014/174] Workaround for https://github.com/python/cpython/issues/100171 --- Source/PythonEngine.pas | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index edab0a98..293b172d 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4473,6 +4473,7 @@ procedure TPythonEngine.Initialize; var i : Integer; + WorkAround: AnsiString; begin if Assigned(gPythonEngine) then raise Exception.Create('There is already one instance of TPythonEngine running' ); @@ -4510,8 +4511,27 @@ procedure TPythonEngine.Initialize; with Clients[i] do if not Initialized then Initialize; + + // WorkAround for https://github.com/python/cpython/issues/100171 + if (MajorVersion = 3) and (MinorVersion >= 11) then + begin + WorkAround := + 'import sys'#13#10 + //0 + 'if sys.version_info > (3,11,0):'#13#10 + //1 + ' import os'#13#10 + //2 + ''#13#10 + //3 + ' dllpath = os.path.join(sys.prefix, ''DLLs'')'#13#10 + //4 + ' if dllpath not in sys.path:'#13#10 + //5 + ' sys.path.insert(3, dllpath)'#13#10 + //6 + ''#13#10 + //7 + ' del dllpath'#13#10 + //8 + ' del os'#13#10 + //9 + 'del sys'#13#10; //10 + ExecString(WorkAround); + end; + if InitScript.Count > 0 then - ExecStrings( InitScript ); + ExecStrings(InitScript); if Assigned(FOnAfterInit) then FOnAfterInit(Self); end; From 615522f6706997ac4aef6ef35ab63b3668141d73 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 13 Dec 2022 17:15:40 +0200 Subject: [PATCH 015/174] Changed workaround so that it can work with venvs --- Source/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 293b172d..ea5b9c41 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4520,7 +4520,7 @@ procedure TPythonEngine.Initialize; 'if sys.version_info > (3,11,0):'#13#10 + //1 ' import os'#13#10 + //2 ''#13#10 + //3 - ' dllpath = os.path.join(sys.prefix, ''DLLs'')'#13#10 + //4 + ' dllpath = os.path.join(sys.base_prefix, ''DLLs'')'#13#10 + //4 ' if dllpath not in sys.path:'#13#10 + //5 ' sys.path.insert(3, dllpath)'#13#10 + //6 ''#13#10 + //7 From 89be2c52a4deaa6e0d465990fd5a229fc6edbce2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 23 Dec 2022 15:14:44 +0200 Subject: [PATCH 016/174] FIx #342 --- Source/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ea5b9c41..47815e23 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -5284,7 +5284,7 @@ procedure TPythonEngine.DoRedirectIO; ' def flush(self):' + LF + ' pass' + LF + ' def isatty(self):' + LF + - ' return True' + LF + + ' return False' + LF + 'sys.old_stdin=sys.stdin'+LF+ 'sys.old_stdout=sys.stdout'+LF+ 'sys.old_stderr=sys.stderr'+LF+ From d842a47931bf7b263989feba96f369eb1af24d6f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 23 Dec 2022 17:42:46 +0200 Subject: [PATCH 017/174] Fix #376 --- Source/PythonEngine.pas | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 47815e23..f856985f 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4376,8 +4376,10 @@ procedure TPythonEngine.DoOpenDll(const aDllName : string); end; end else + begin RegVersion := SysVersionFromDLLName(aDllName); - inherited; + inherited; + end; end; procedure TPythonEngine.AssignPyFlags; From 0a50d194a09a0ba27183564b5c5e12ab4bddcfd2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 24 Dec 2022 06:25:52 +0200 Subject: [PATCH 018/174] Fix #369 Demo 32 updated to show off the use of keyword arguments --- Demos/Demo08/Unit1.dfm | 2 -- Demos/Demo08/Unit1.pas | 4 +-- Demos/Demo21/Unit1.dfm | 6 +--- Demos/Demo21/Unit1.pas | 4 +-- Demos/Demo26/Unit1.dfm | 3 -- Demos/Demo26/Unit1.pas | 4 +-- Demos/Demo28/Unit1.dfm | 7 ++--- Demos/Demo28/Unit1.pas | 12 ++++---- Demos/Demo32/Unit1.dfm | 16 ++++++++--- Demos/Demo32/Unit1.pas | 14 +++++++-- Demos/Demo34/Unit1.dfm | 3 -- Demos/Demo34/Unit1.pas | 4 +-- Source/PythonEngine.pas | 30 +++++++++++--------- Source/WrapDelphiClasses.pas | 6 ++-- Source/WrapDelphiTypes.pas | 18 ++++++------ Source/fmx/WrapFmxStyles.pas | 12 ++++---- Source/fmx/WrapFmxTypes.pas | 36 ++++++++++++------------ Source/vcl/WrapVclThemes.pas | 18 ++++++------ Tests/FMX/Android/NumberServicesTest.pas | 6 ++-- Tests/NumberServicesTest.pas | 6 ++-- 20 files changed, 107 insertions(+), 104 deletions(-) diff --git a/Demos/Demo08/Unit1.dfm b/Demos/Demo08/Unit1.dfm index 0dd46325..93d699a3 100644 --- a/Demos/Demo08/Unit1.dfm +++ b/Demos/Demo08/Unit1.dfm @@ -13,8 +13,6 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 diff --git a/Demos/Demo08/Unit1.pas b/Demos/Demo08/Unit1.pas index 9f6bbbff..18621f3a 100644 --- a/Demos/Demo08/Unit1.pas +++ b/Demos/Demo08/Unit1.pas @@ -38,7 +38,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -88,7 +88,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith( PythonType : TPythonType; args : PPyObject ); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Demos/Demo21/Unit1.dfm b/Demos/Demo21/Unit1.dfm index 6a257ea0..888384e4 100644 --- a/Demos/Demo21/Unit1.dfm +++ b/Demos/Demo21/Unit1.dfm @@ -10,8 +10,6 @@ object Form1: TForm1 Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -20,8 +18,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alTop - ExplicitTop = 153 - ExplicitWidth = 536 end object Memo1: TMemo Left = 0 @@ -145,7 +141,7 @@ object Form1: TForm1 TypeName = 'Point' Prefix = 'Create' Module = PythonModule1 - Services.Basic = [bsGetAttrO, bsSetAttrO, bsRepr, bsStr] + Services.Basic = [bsRepr, bsStr, bsGetAttrO, bsSetAttrO] Services.InplaceNumber = [] Services.Number = [] Services.Sequence = [] diff --git a/Demos/Demo21/Unit1.pas b/Demos/Demo21/Unit1.pas index bb307e81..bc9a7055 100644 --- a/Demos/Demo21/Unit1.pas +++ b/Demos/Demo21/Unit1.pas @@ -46,7 +46,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject ); override; // Type services //////////////// @@ -81,7 +81,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith( PythonType : TPythonType; args : PPyObject ); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Demos/Demo26/Unit1.dfm b/Demos/Demo26/Unit1.dfm index 23663ec7..70fec754 100644 --- a/Demos/Demo26/Unit1.dfm +++ b/Demos/Demo26/Unit1.dfm @@ -13,8 +13,6 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -23,7 +21,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alTop - ExplicitWidth = 584 end object Memo1: TMemo Left = 0 diff --git a/Demos/Demo26/Unit1.pas b/Demos/Demo26/Unit1.pas index 94a54ec9..783c8f03 100644 --- a/Demos/Demo26/Unit1.pas +++ b/Demos/Demo26/Unit1.pas @@ -35,7 +35,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -84,7 +84,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith( PythonType : TPythonType; args : PPyObject ); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Demos/Demo28/Unit1.dfm b/Demos/Demo28/Unit1.dfm index c73d6d48..89e7b1ad 100644 --- a/Demos/Demo28/Unit1.dfm +++ b/Demos/Demo28/Unit1.dfm @@ -13,8 +13,6 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -25,7 +23,6 @@ object Form1: TForm1 Align = alTop Color = clBtnFace ParentColor = False - ExplicitWidth = 589 end object Memo1: TMemo Left = 0 @@ -142,7 +139,7 @@ object Form1: TForm1 TypeName = 'TStringList' Prefix = 'Create' Module = pmP4D - Services.Basic = [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsIter] + Services.Basic = [bsRepr, bsStr, bsGetAttrO, bsSetAttrO, bsIter] Services.InplaceNumber = [] Services.Number = [] Services.Sequence = [ssLength, ssItem, ssAssItem] @@ -163,7 +160,7 @@ object Form1: TForm1 TypeName = 'TStringListIterator' Prefix = 'Create' Module = pmP4D - Services.Basic = [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsIter, bsIterNext] + Services.Basic = [bsRepr, bsStr, bsGetAttrO, bsSetAttrO, bsIter, bsIterNext] Services.InplaceNumber = [] Services.Number = [] Services.Sequence = [] diff --git a/Demos/Demo28/Unit1.pas b/Demos/Demo28/Unit1.pas index 72d223bd..0726eb2d 100644 --- a/Demos/Demo28/Unit1.pas +++ b/Demos/Demo28/Unit1.pas @@ -18,7 +18,7 @@ TPyStringList = class(TPyObject) public // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; // Basic services @@ -46,7 +46,7 @@ TPyStringListIterator = class(TPyObject) procedure SetStringList(const Value: TPyStringList); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; // Basic services @@ -145,8 +145,8 @@ constructor TPyStringList.Create(APythonType: TPythonType); fStrings := TStringList.Create; end; -constructor TPyStringList.CreateWith(PythonType: TPythonType; - args: PPyObject); +constructor TPyStringList.CreateWith(PythonType: TPythonType; args, kwds: + PPyObject); var i : Integer; begin @@ -239,8 +239,8 @@ constructor TPyStringListIterator.Create(APythonType: TPythonType); inherited; end; -constructor TPyStringListIterator.CreateWith(PythonType: TPythonType; - args: PPyObject); +constructor TPyStringListIterator.CreateWith(PythonType: TPythonType; args, + kwds: PPyObject); var _obj : PPyObject; _stringList : TPyStringList; diff --git a/Demos/Demo32/Unit1.dfm b/Demos/Demo32/Unit1.dfm index caf03f76..21ef3f18 100644 --- a/Demos/Demo32/Unit1.dfm +++ b/Demos/Demo32/Unit1.dfm @@ -13,9 +13,7 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True Visible = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -24,7 +22,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alTop - ExplicitWidth = 584 end object Memo1: TMemo Left = 0 @@ -106,7 +103,18 @@ object Form1: TForm1 'if p == spam.Point(2, 5):' ' print ("Equal")' 'else:' - ' print ("Not equal")') + ' print ("Not equal")' + '' + + 'print ("--------------------------------------------------------' + + '----------")' + 'print("== create with keyword arguments ==")' + 'p = spam.Point(x=20, y=30)' + 'print(p)' + 'p = spam.Point(y = 30, x=20)' + 'print(p)' + 'p = spam.Point(20, y=30)' + 'print(p)') ParentFont = False ScrollBars = ssBoth TabOrder = 0 diff --git a/Demos/Demo32/Unit1.pas b/Demos/Demo32/Unit1.pas index 7f8984d4..7fb8d5e3 100644 --- a/Demos/Demo32/Unit1.pas +++ b/Demos/Demo32/Unit1.pas @@ -59,7 +59,7 @@ TPoint = class(TPersistent) TPyPoint = class(TPyDelphiPersistent) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Basic services function Repr : PPyObject; override; @@ -106,12 +106,20 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith( PythonType : TPythonType; args : PPyObject ); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); +var + KeyArray: array of AnsiString; + KeyPointerArray: array of PAnsiChar; begin inherited; + KeyArray := ['x', 'y']; + SetLength(KeyPointerArray, 3); + KeyPointerArray[0] := PAnsiChar(KeyArray[0]); + KeyPointerArray[1] := PAnsiChar(KeyArray[1]); with GetPythonEngine, DelphiObject as TPoint do begin - if PyArg_ParseTuple( args, 'ii:CreatePoint',@fx, @fy ) = 0 then + if PyArg_ParseTupleAndKeywords(args, kwds, 'ii:CreatePoint', + @KeyPointerArray[0], @fx, @fy) = 0 then Exit; end; end; diff --git a/Demos/Demo34/Unit1.dfm b/Demos/Demo34/Unit1.dfm index 5fed44b7..b1727364 100644 --- a/Demos/Demo34/Unit1.dfm +++ b/Demos/Demo34/Unit1.dfm @@ -13,9 +13,7 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True OnCreate = FormCreate - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -24,7 +22,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alTop - ExplicitWidth = 584 end object Memo1: TMemo Left = 0 diff --git a/Demos/Demo34/Unit1.pas b/Demos/Demo34/Unit1.pas index d860dd0a..0ac121c5 100644 --- a/Demos/Demo34/Unit1.pas +++ b/Demos/Demo34/Unit1.pas @@ -43,7 +43,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( PythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -158,7 +158,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will automatically be called. -constructor TPyPoint.CreateWith( PythonType : TPythonType; args : PPyObject ); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index f856985f..073b2ef3 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2370,7 +2370,8 @@ TPyObject = class // Constructors & Destructors constructor Create( APythonType : TPythonType ); virtual; - constructor CreateWith( APythonType : TPythonType; args : PPyObject ); virtual; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); + virtual; destructor Destroy; override; class function NewInstance: TObject; override; @@ -2558,7 +2559,7 @@ TPythonType = class(TGetSetContainer) procedure SetModule( val : TPythonModule ); procedure SetServices( val : TTypeServices ); procedure SetTypeName( const val : AnsiString ); - function CreateMethod( pSelf, args : PPyObject ) : PPyObject; cdecl; + function CreateMethod(pSelf, args, kwds: PPyObject): PPyObject; cdecl; procedure InitServices; procedure SetDocString( value : TStringList ); function TypeFlagsAsInt : C_ULong; @@ -2583,7 +2584,7 @@ TPythonType = class(TGetSetContainer) procedure Initialize; override; procedure Finalize; override; function CreateInstance : PPyObject; - function CreateInstanceWith( args : PPyObject ) : PPyObject; + function CreateInstanceWith(args, kwds: PPyObject): PPyObject; procedure AddTypeVar; property TheType : PyTypeObject read FType write FType; @@ -2671,7 +2672,7 @@ TPyVar = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; // Type services @@ -7393,7 +7394,8 @@ constructor TPyObject.Create( APythonType : TPythonType ); end; end; -constructor TPyObject.CreateWith( APythonType : TPythonType; args : PPyObject ); +constructor TPyObject.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); begin Create( APythonType ); end; @@ -7953,9 +7955,9 @@ procedure TPythonType.SetTypeName( const val : AnsiString ); end; end; -function TPythonType.CreateMethod( pSelf, args : PPyObject ) : PPyObject; +function TPythonType.CreateMethod(pSelf, args, kwds: PPyObject): PPyObject; begin - Result := CreateInstanceWith( args ); + Result := CreateInstanceWith(args, kwds); end; procedure TPythonType.ReallocGetSets; @@ -8123,7 +8125,7 @@ function TPythonType.NewSubtypeInst( aType: PPyTypeObject; args, kwds : PPyObje obj.ob_type := aType; obj.IsSubtype := aType <> @FType; obj.PythonAlloc := True; - obj.CreateWith(Self, args); + obj.CreateWith(Self, args, kwds); if Engine.PyErr_Occurred <> nil then begin Engine.Py_DECREF(Result); @@ -8597,14 +8599,14 @@ function TPythonType.CreateInstance : PPyObject; end; end; -function TPythonType.CreateInstanceWith( args : PPyObject ) : PPyObject; +function TPythonType.CreateInstanceWith(args, kwds: PPyObject): PPyObject; var obj : TPyObject; begin CheckEngine; with Engine do begin - obj := PyObjectClass.CreateWith( Self, args ); + obj := PyObjectClass.CreateWith(Self, args, kwds); obj.ob_type := @FType; if PyErr_Occurred <> nil then begin @@ -8619,7 +8621,7 @@ function TPythonType.CreateInstanceWith( args : PPyObject ) : PPyObject; procedure TPythonType.AddTypeVar; var d : PPyObject; - meth : TDelphiMethod; + meth : TDelphiMethodWithKW; begin CheckEngine; Assert(Module <> nil); @@ -8632,8 +8634,8 @@ procedure TPythonType.AddTypeVar; begin meth := CreateMethod; FCreateFuncDef.ml_name := PAnsiChar(FCreateFuncName); - FCreateFuncDef.ml_meth := GetOfObjectCallBack( TCallBack(meth), 2, DEFAULT_CALLBACK_TYPE); - FCreateFuncDef.ml_flags := METH_VARARGS; + FCreateFuncDef.ml_meth := GetOfObjectCallBack(TCallBack(meth), 3, DEFAULT_CALLBACK_TYPE); + FCreateFuncDef.ml_flags := METH_KEYWORDS; FCreateFuncDef.ml_doc := PAnsiChar(FCreateFuncDoc); FCreateFunc := Engine.PyCFunction_NewEx(@FCreateFuncDef, nil, nil); Engine.Py_INCREF(FCreateFunc); @@ -8872,7 +8874,7 @@ constructor TPyVar.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyVar.Create will be automatically be called. -constructor TPyVar.CreateWith( APythonType : TPythonType; args : PPyObject ); +constructor TPyVar.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index feb0314b..045e3a73 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -120,7 +120,7 @@ TPyDelphiComponent = class (TPyDelphiPersistent) function Get_Owner( AContext : Pointer) : PPyObject; cdecl; function Get_Components( AContext : Pointer) : PPyObject; cdecl; public - constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith( APythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; function GetAttrO( key: PPyObject) : PPyObject; override; @@ -1096,8 +1096,8 @@ function TPyDelphiComponent.CreateComponent(AOwner: TComponent): TComponent; Result := TComponentClass(DelphiObjectClass).Create(AOwner); end; -constructor TPyDelphiComponent.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiComponent.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var _obj : PPyObject; _owner : TObject; diff --git a/Source/WrapDelphiTypes.pas b/Source/WrapDelphiTypes.pas index b3ff17ad..57d6a3ae 100644 --- a/Source/WrapDelphiTypes.pas +++ b/Source/WrapDelphiTypes.pas @@ -23,7 +23,7 @@ TPyDelphiPoint = class(TPyObject) function Set_X(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_Y(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -55,7 +55,7 @@ TPyDelphiRect = class(TPyObject) public PyDelphiWrapper : TPyDelphiWrapper; - constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -77,7 +77,7 @@ TPyDelphiSize = class(TPyObject) function Set_CX(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_CY(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith( APythonType : TPythonType; args : PPyObject ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -235,8 +235,8 @@ function TPyDelphiPoint.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var x, y : Integer; begin @@ -340,8 +340,8 @@ function TPyDelphiRect.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); begin inherited; APythonType.Engine.PyArg_ParseTuple( args, 'iiii:Create',@fValue.Left, @fValue.Top, @fValue.Right, @fValue.Bottom ); @@ -528,8 +528,8 @@ function TPyDelphiSize.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var cx, cy : Integer; begin diff --git a/Source/fmx/WrapFmxStyles.pas b/Source/fmx/WrapFmxStyles.pas index b40aba05..edfe9222 100644 --- a/Source/fmx/WrapFmxStyles.pas +++ b/Source/fmx/WrapFmxStyles.pas @@ -14,7 +14,7 @@ TPyDelphiStyleStreaming = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TStyleStreaming); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; class procedure RegisterMethods(PythonType: TPythonType); override; @@ -28,7 +28,7 @@ TPyDelphiStyleManager = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TStyleManager); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; class procedure RegisterMethods(PythonType: TPythonType); override; @@ -77,8 +77,8 @@ constructor TPyDelphiStyleStreaming.Create(APythonType: TPythonType); inherited; end; -constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); begin inherited; DelphiObject := TStyleStreaming.Create(); @@ -118,8 +118,8 @@ constructor TPyDelphiStyleManager.Create(APythonType: TPythonType); inherited; end; -constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); begin inherited; DelphiObject := TStyleManager.Create(); diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index b87245a5..6ed6a564 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -22,7 +22,7 @@ TPyDelphiPointF = class(TPyObject) function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; Args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -41,7 +41,7 @@ TPyDelphiSizeF = class(TPyObject) function Set_Width(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Height(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -64,7 +64,7 @@ TPyDelphiRectF = class(TPyObject) function Set_Left(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Right(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -103,7 +103,7 @@ TPyDelphiPosition = class(TPyDelphiPersistent) function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Point(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterMethods(PythonType: TPythonType); override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -128,7 +128,7 @@ TPyDelphiBounds = class(TPyDelphiPersistent) function Get_Rect(Acontext: Pointer): PPyObject; cdecl; function Set_Rect(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; property DelphiObject: TBounds read GetDelphiObject write SetDelphiObject; @@ -142,7 +142,7 @@ TPyDelphiControlSize = class(TPyDelphiPersistent) function Get_SizeF(Acontext: Pointer): PPyObject; cdecl; function Set_SizeF(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; property DelphiObject: TControlSize read GetDelphiObject write SetDelphiObject; @@ -187,8 +187,8 @@ function TPyDelphiPointF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; - Args: PPyObject); +constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var x, y : single; begin @@ -432,8 +432,8 @@ function TPyDelphiFmxObject.Set_Parent(AValue: PPyObject; { TPyDelphiPosition } -constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var LPPosition: PPyObject; LPointF: TPointF; @@ -555,8 +555,8 @@ function TPyDelphiSizeF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var LWidth, LHeight : single; begin @@ -657,8 +657,8 @@ procedure TPyDelphiCustomPopupMenu.SetDelphiObject( { TPyDelphiBounds } -constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var LPBounds: PPyObject; LRectF: TRectF; @@ -716,8 +716,8 @@ function TPyDelphiBounds.Set_Rect(AValue: PPyObject; { TPyDelphiControlSize } -constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LPControlSize: PPyObject; LSizeF: TSizeF; @@ -791,8 +791,8 @@ function TPyDelphiRectF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var LLeft, LTop, LRight, LBottom : single; begin diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index 73767a55..381af5ab 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -24,7 +24,7 @@ TPyDelphiStyleInfo = class(TPyObject) function Set_AuthorUrl(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; function Set_Version(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; AArgs: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(AObj: PPyObject) : Integer; override; function Repr: PPyObject; override; @@ -41,7 +41,7 @@ TPyDelphiCustomStyleServices = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TCustomStyleServices); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterMethods( PythonType : TPythonType ); override; @@ -60,7 +60,7 @@ TPyDelphiStyleManager = class(TPyDelphiObject) function LoadFromFileName_Wrapper(AArgs: PPyObject): PPyObject; cdecl; function IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -170,8 +170,8 @@ procedure TVclThemesRegistration.RegisterWrappers( { TPyDelphiStyleManager } -constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; - args: PPyObject); +constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); begin inherited; DelphiObject := TStyleManager.Create(); @@ -295,8 +295,8 @@ class function TStyleManagerStyleNamesAccess.Name: string; { TPyDelphiStyleInfo } -constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; - AArgs: PPyObject); +constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args, kwds: + PPyObject); var LName: PAnsiChar; LAuthor: PAnsiChar; @@ -305,7 +305,7 @@ constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; LVersion: PAnsiChar; begin inherited; - if APythonType.Engine.PyArg_ParseTuple(AArgs, 'sssss:Create', @LName, @LAuthor, @LAuthorEMail, @LAuthorURL, @LVersion) <> 0 then + if APythonType.Engine.PyArg_ParseTuple(args, 'sssss:Create', @LName, @LAuthor, @LAuthorEMail, @LAuthorURL, @LVersion) <> 0 then begin FValue.Name := string(LName); FValue.Author := string(LAuthor); @@ -484,7 +484,7 @@ constructor TPyDelphiCustomStyleServices.Create(APythonType: TPythonType); end; constructor TPyDelphiCustomStyleServices.CreateWith(APythonType: TPythonType; - args: PPyObject); + args, kwds: PPyObject); begin inherited; DelphiObject := StyleServices(); diff --git a/Tests/FMX/Android/NumberServicesTest.pas b/Tests/FMX/Android/NumberServicesTest.pas index d9d3ccfc..df4e6828 100644 --- a/Tests/FMX/Android/NumberServicesTest.pas +++ b/Tests/FMX/Android/NumberServicesTest.pas @@ -56,7 +56,7 @@ PyTRandomInteger = class(TPyObject) FRandomInteger: TRandomInteger; public - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Basic services function Repr: PPyObject; override; @@ -301,8 +301,8 @@ function PyTRandomInteger.Repr: PPyObject; { PyTRandomInteger } -constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; - args: PPyObject); +constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, kwds: + PPyObject); var val1: PPyObject; begin diff --git a/Tests/NumberServicesTest.pas b/Tests/NumberServicesTest.pas index 9443cf8c..0bbfee7a 100644 --- a/Tests/NumberServicesTest.pas +++ b/Tests/NumberServicesTest.pas @@ -22,7 +22,7 @@ PyTRandomInteger = class(TPyObject) FRandomInteger: TRandomInteger; public - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Basic services function Repr: PPyObject; override; @@ -272,8 +272,8 @@ function PyTRandomInteger.Repr: PPyObject; { PyTRandomInteger } -constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; - args: PPyObject); +constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, kwds: + PPyObject); var val1: PPyObject; begin From c5b2d01c2e3424e5df9b4e8350fab62d7d1e0b05 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 24 Dec 2022 07:00:30 +0200 Subject: [PATCH 019/174] minor improvement in Demo 32 --- Demos/Demo32/Unit1.dfm | 8 ++++---- Demos/Demo32/Unit1.pas | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Demos/Demo32/Unit1.dfm b/Demos/Demo32/Unit1.dfm index 21ef3f18..d50dfec3 100644 --- a/Demos/Demo32/Unit1.dfm +++ b/Demos/Demo32/Unit1.dfm @@ -110,11 +110,11 @@ object Form1: TForm1 '----------")' 'print("== create with keyword arguments ==")' 'p = spam.Point(x=20, y=30)' - 'print(p)' - 'p = spam.Point(y = 30, x=20)' - 'print(p)' + 'print("Point(x=20, y=30) = ", p)' + 'p = spam.Point(y=30, x=20)' + 'print("Point(y=30, x=20) = ", p)' 'p = spam.Point(20, y=30)' - 'print(p)') + 'print("Point(20, y=30) = ",p)') ParentFont = False ScrollBars = ssBoth TabOrder = 0 diff --git a/Demos/Demo32/Unit1.pas b/Demos/Demo32/Unit1.pas index 7fb8d5e3..57195d50 100644 --- a/Demos/Demo32/Unit1.pas +++ b/Demos/Demo32/Unit1.pas @@ -113,9 +113,7 @@ constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin inherited; KeyArray := ['x', 'y']; - SetLength(KeyPointerArray, 3); - KeyPointerArray[0] := PAnsiChar(KeyArray[0]); - KeyPointerArray[1] := PAnsiChar(KeyArray[1]); + KeyPointerArray := [PAnsiChar(KeyArray[0]), PAnsiChar(KeyArray[1]), nil]; with GetPythonEngine, DelphiObject as TPoint do begin if PyArg_ParseTupleAndKeywords(args, kwds, 'ii:CreatePoint', From a1c0d97a7083199f29500cb401cc2d2c43efb608 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 24 Dec 2022 16:45:52 +0200 Subject: [PATCH 020/174] Sync with the Embarcadero fork --- Packages/Delphi/Delphi 10.4+/Python.dpk | 11 +- Packages/Delphi/Delphi 10.4+/Python.dproj | 7 +- Packages/Delphi/Delphi 10.4+/PythonFmx.dpk | 15 +- Packages/Delphi/Delphi 10.4+/PythonFmx.dproj | 823 +-------------- .../Delphi/Delphi 10.4+/PythonFmxLinux.dpk | 62 ++ .../Delphi/Delphi 10.4+/PythonFmxLinux.dproj | 967 ++++++++++++++++++ Packages/Delphi/Delphi 10.4+/PythonVcl.dpk | 10 +- Packages/Delphi/Delphi 10.4+/PythonVcl.dproj | 5 +- Packages/Delphi/Delphi 10.4+/dclPython.dpk | 11 +- Packages/Delphi/Delphi 10.4+/dclPython.dproj | 5 +- Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk | 1 - .../Delphi/Delphi 10.4+/dclPythonFmx.dproj | 745 +------------- Packages/Delphi/Delphi 10.4+/dclPythonVcl.dpk | 10 +- .../Delphi/Delphi 10.4+/dclPythonVcl.dproj | 5 +- .../P4DComponentSuite.groupproj | 192 ++-- .../Delphi/P4DLinuxComponentSuite.groupproj | 108 ++ Source/VarPyth.pas | 6 +- Tests/FMX/Android/P4DAndroidTest.dproj | 635 ++++++------ Tests/FMX/Android/PythonLoad.pas | 8 +- 19 files changed, 1650 insertions(+), 1976 deletions(-) create mode 100644 Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk create mode 100644 Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj rename Packages/Delphi/{Delphi 10.4+ => }/P4DComponentSuite.groupproj (50%) create mode 100644 Packages/Delphi/P4DLinuxComponentSuite.groupproj diff --git a/Packages/Delphi/Delphi 10.4+/Python.dpk b/Packages/Delphi/Delphi 10.4+/Python.dpk index e282db2c..b27c7bb2 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dpk +++ b/Packages/Delphi/Delphi 10.4+/Python.dpk @@ -8,21 +8,20 @@ package Python; {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} -{$LOCALSYMBOLS ON} +{$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} +{$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Run-time Engine Package'} {$LIBSUFFIX AUTO} diff --git a/Packages/Delphi/Delphi 10.4+/Python.dproj b/Packages/Delphi/Delphi 10.4+/Python.dproj index 05aea215..689ea6e5 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dproj +++ b/Packages/Delphi/Delphi 10.4+/Python.dproj @@ -7,7 +7,7 @@ Python.dpk Win32 {018AAA56-F5BD-4A04-BCCA-A0043EAAA5CE} - 19.4 + 19.5 168083 @@ -97,9 +97,9 @@ 1033 - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= Debug @@ -202,12 +202,13 @@ True True - False True True True True True + False + False 12 diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk index b25bcf38..ddc2ec03 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk @@ -9,21 +9,20 @@ package PythonFmx; {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} -{$LOCALSYMBOLS ON} +{$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} -{$OVERFLOWCHECKS ON} -{$RANGECHECKS ON} -{$REFERENCEINFO ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} +{$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Run-time Engine Package for FMX'} {$LIBSUFFIX AUTO} diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj index 36d86082..ecfd8d6b 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj @@ -1,14 +1,14 @@  - {513BF750-373D-4C95-A672-78CA8DDF3F63} - PythonFmx.dpk - 19.4 - FMX True + Package Release + FMX + PythonFmx.dpk Win32 + {513BF750-373D-4C95-A672-78CA8DDF3F63} + 19.5 167955 - Package true @@ -23,11 +23,6 @@ Base true - - true - Base - true - true Base @@ -65,74 +60,61 @@ true + PythonFmx + All ..\..\..\lib\$(Platform)\$(Config) + Python4Delphi - Run-time Engine Package for FMX .\$(Platform)\$(Config) - false - false - false - false - false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + $(Auto) true true - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - All - PythonFmx - 1046 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - Python4Delphi - Run-time Engine Package for FMX true - $(Auto) + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1046 + Debug None annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug + Debug None annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - - - None - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers Debug + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers Debug + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) true 1033 - DEBUG;$(DCC_Define) true - false - true true - true + DEBUG;$(DCC_Define) + true true + false true + true false @@ -140,10 +122,10 @@ 1033 - false + 0 RELEASE;$(DCC_Define) + false 0 - 0 @@ -196,769 +178,18 @@ PythonFmx.dpk - - Python4Delphi - Design-time Engine Package - P4D AI&ML - Python environments - P4D AI&ML extension for Python packages - P4D AI&ML extension for Python packages - NumPy - P4D AI&ML extension for Python packages - Scikit-learn - P4D AI&ML extension for Python packages - PyTorch - File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\dclMatplotLib280.bpl not found - P4D AI&ML extension for Python packages - TensorFlow - P4D AI&ML extension for Python packages - TensorFlow - File C:\Users\Public\Documents\Embarcadero\Studio\22.0\dcp\Win32\Release\DUnitX_IDE_Expert_D11Alexandria.bpl not found - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - P4D AI&ML extension for Python packages - TensorFlow - + - - - - true - - - - - true - - - - - true - - - - - PythonFmx.bpl - true - - - - - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - True True - False False True True True True + False + False 12 diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk new file mode 100644 index 00000000..8e416898 --- /dev/null +++ b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk @@ -0,0 +1,62 @@ +package PythonFmxLinux; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$DEFINE RELEASE} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'Python4Delphi - Run-time Engine Package for FMXLinux'} +{$LIBSUFFIX AUTO} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + python, + fmx; + +contains + FMX.PythonGUIInputOutput in '..\..\..\Source\fmx\FMX.PythonGUIInputOutput.pas', + WrapDelphiFmx in '..\..\..\Source\fmx\WrapDelphiFmx.pas', + WrapFmxActnList in '..\..\..\Source\fmx\WrapFmxActnList.pas', + WrapFmxColors in '..\..\..\Source\fmx\WrapFmxColors.pas', + WrapFmxComCtrls in '..\..\..\Source\fmx\WrapFmxComCtrls.pas', + WrapFmxControls in '..\..\..\Source\fmx\WrapFmxControls.pas', + WrapFmxDialogs in '..\..\..\Source\fmx\WrapFmxDialogs.pas', + WrapFmxEdit in '..\..\..\Source\fmx\WrapFmxEdit.pas', + WrapFmxForms in '..\..\..\Source\fmx\WrapFmxForms.pas', + WrapFmxGrids in '..\..\..\Source\fmx\WrapFmxGrids.pas', + WrapFmxLayouts in '..\..\..\Source\fmx\WrapFmxLayouts.pas', + WrapFmxListBox in '..\..\..\Source\fmx\WrapFmxListBox.pas', + WrapFmxListView in '..\..\..\Source\fmx\WrapFmxListView.pas', + WrapFmxMedia in '..\..\..\Source\fmx\WrapFmxMedia.pas', + WrapFmxMemo in '..\..\..\Source\fmx\WrapFmxMemo.pas', + WrapFmxMenus in '..\..\..\Source\fmx\WrapFmxMenus.pas', + WrapFmxScrollBox in '..\..\..\Source\fmx\WrapFmxScrollBox.pas', + WrapFmxShapes in '..\..\..\Source\fmx\WrapFmxShapes.pas', + WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas', + WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas', + WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas', + WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas'; + +end. + diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj new file mode 100644 index 00000000..85456f05 --- /dev/null +++ b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj @@ -0,0 +1,967 @@ + + + {B0F48139-24FB-42F3-93E8-05DA2E142904} + PythonFmxLinux.dpk + True + Release + 128 + Package + None + 19.5 + Linux64 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + false + false + false + false + false + 00400000 + true + true + PythonFmxLinux + Python4Delphi - Run-time Engine Package for FMXLinux + $(Auto) + true + 1046 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + System;Xml;Data;Datasnap;Web;Soap;REST.Authenticator.OAuth.WebForm;$(DCC_Namespace) + $(BDSCatalogRepositoryAllUsers)\FmxLinux-1.71\redist;$(DCC_UnitSearchPath) + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + /usr/bin/gnome-terminal -- "%debuggee%" + + + DEBUG;$(DCC_Define) + false + true + true + true + + + Debug + + + Debug + + + Debug + + + Debug + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Package + + + + PythonFmxLinux.dpk + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + False + False + False + False + True + False + False + False + False + + + + + true + + + + + true + + + + + true + + + + + bplPythonFmxLinux.so + true + + + + + PythonFmxLinux.bpl + true + + + + + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + + 12 + + + + + diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk b/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk index 383bb4fb..bc68ac72 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk @@ -9,21 +9,21 @@ package PythonVcl; {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} -{$LOCALSYMBOLS ON} +{$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} -{$DEFINE DEBUG} +{$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Run-time Engine Package for VCL'} {$LIBSUFFIX AUTO} diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj index c86ebb4d..5e059dc0 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj @@ -7,7 +7,7 @@ PythonVcl.dpk Win32 {D8908301-393C-4CFA-8842-4948A9935E21} - 19.4 + 19.5 3 @@ -143,12 +143,13 @@ False False - False False False False True True + False + False 12 diff --git a/Packages/Delphi/Delphi 10.4+/dclPython.dpk b/Packages/Delphi/Delphi 10.4+/dclPython.dpk index 5c4287aa..8b8781e2 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPython.dpk +++ b/Packages/Delphi/Delphi 10.4+/dclPython.dpk @@ -10,21 +10,20 @@ package dclPython; {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} -{$LOCALSYMBOLS ON} +{$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} +{$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Design-time Engine Package'} {$LIBSUFFIX AUTO} diff --git a/Packages/Delphi/Delphi 10.4+/dclPython.dproj b/Packages/Delphi/Delphi 10.4+/dclPython.dproj index 00300534..a2f01927 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPython.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPython.dproj @@ -7,7 +7,7 @@ dclPython.dpk Win32 {D9AB994C-54A3-4E76-81C8-6D0BB035A091} - 19.4 + 19.5 1 @@ -144,12 +144,13 @@ False False - False False False False True False + False + False 12 diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk index 10d59d5e..913f8b17 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk +++ b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dpk @@ -23,7 +23,6 @@ package dclPythonFmx; {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} -{$IMAGEBASE $400000} {$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Design-time Engine Package for FMX'} diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj index 5a0748e7..9fed4132 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj @@ -7,7 +7,7 @@ dclPythonFmx.dpk Win32 {E057921E-25DB-426E-8090-FE3F428894FF} - 19.4 + 19.5 1 @@ -89,7 +89,7 @@ MainSource - + BITMAP @@ -120,751 +120,14 @@ False False - False False False False True False + False + False - - - - true - - - - - true - - - - - true - - - - - dclPythonFmx.bpl - true - - - - - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - 12 diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dpk b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dpk index 08223df5..7302489d 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dpk +++ b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dpk @@ -10,21 +10,21 @@ package dclPythonVcl; {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} -{$LOCALSYMBOLS ON} +{$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} -{$OPTIMIZATION OFF} +{$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} -{$REFERENCEINFO ON} +{$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} -{$STACKFRAMES ON} +{$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} -{$DEFINE DEBUG} +{$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'Python4Delphi - Design-Time Engine Package for VCL'} {$LIBSUFFIX AUTO} diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj index 92a13f0a..3944b8d3 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj @@ -7,7 +7,7 @@ dclPythonVcl.dpk Win32 {48DDC28A-E154-4CA0-864A-30EB8C4CCBB3} - 19.4 + 19.5 1 @@ -120,12 +120,13 @@ False False - False False False False True False + False + False 12 diff --git a/Packages/Delphi/Delphi 10.4+/P4DComponentSuite.groupproj b/Packages/Delphi/P4DComponentSuite.groupproj similarity index 50% rename from Packages/Delphi/Delphi 10.4+/P4DComponentSuite.groupproj rename to Packages/Delphi/P4DComponentSuite.groupproj index 228df3d8..4995cf22 100644 --- a/Packages/Delphi/Delphi 10.4+/P4DComponentSuite.groupproj +++ b/Packages/Delphi/P4DComponentSuite.groupproj @@ -1,96 +1,96 @@ - - - {8BE1193B-E609-445D-9BA3-F57DBEA042F5} - - - - - - - Python.dproj - - - Python.dproj - - - PythonVcl.dproj - - - PythonVcl.dproj - - - PythonFmx.dproj - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + {8BE1193B-E609-445D-9BA3-F57DBEA042F5} + + + + + + + Delphi 10.4+\Python.dproj + + + Delphi 10.4+\Python.dproj + + + Delphi 10.4+\PythonVcl.dproj + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Packages/Delphi/P4DLinuxComponentSuite.groupproj b/Packages/Delphi/P4DLinuxComponentSuite.groupproj new file mode 100644 index 00000000..544e8812 --- /dev/null +++ b/Packages/Delphi/P4DLinuxComponentSuite.groupproj @@ -0,0 +1,108 @@ + + + {8BE1193B-E609-445D-9BA3-F57DBEA042F5} + + + + + + + Delphi 10.4+\Python.dproj + + + Delphi 10.4+\Python.dproj + + + Delphi 10.4+\PythonVcl.dproj + + + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index 6e4d0f4f..ab9f170a 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -2148,7 +2148,7 @@ function TVarPyEnumerator.MoveNext: Boolean; function VarPyIterate(const AValue: Variant): TVarPyEnumerateHelper; begin - Result.Create(AValue); + Result := TVarPyEnumerateHelper.Create(AValue); end; { TVarPyEnumerateHelper } @@ -2160,7 +2160,7 @@ constructor TVarPyEnumerateHelper.Create(const AValue: Variant); function TVarPyEnumerateHelper.GetEnumerator: TVarPyEnumerator; begin - Result.Create(FIterable); + Result := TVarPyEnumerator.Create(FIterable); end; procedure VarPyToStrings(const AValue : Variant; const AStrings: TStrings); @@ -2173,6 +2173,8 @@ procedure VarPyToStrings(const AValue : Variant; const AStrings: TStrings); initialization PythonVariantType := TPythonVariantType.Create; + finalization FreeAndNil(PythonVariantType); + end. diff --git a/Tests/FMX/Android/P4DAndroidTest.dproj b/Tests/FMX/Android/P4DAndroidTest.dproj index c82d4739..d4528baf 100644 --- a/Tests/FMX/Android/P4DAndroidTest.dproj +++ b/Tests/FMX/Android/P4DAndroidTest.dproj @@ -1,12 +1,12 @@  {652D9A8E-1625-4F00-9B29-2E3D31D7A186} - 19.2 + 19.3 FMX True Debug Android - 37915 + 168979 Application P4DAndroidTest.dpr @@ -28,13 +28,13 @@ Base true - - true + + true Base true - - true + + true Base true @@ -199,39 +199,21 @@ $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - 10.0 - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers Debug true + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + true + Base + true + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage);$(DCC_UsePackage) + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) @@ -270,6 +252,7 @@ 1 #000000 + C:\Users\lucas\OneDrive\Documents\Embarcadero\Studio\Projects\python4delphi\Source\;$(Debugger_DebugSourcePath) false @@ -311,10 +294,7 @@ - - Cfg_2 - Base - + Base @@ -322,6 +302,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -337,53 +321,47 @@ - - - ic_launcher.png + + + splash_image.png true - + splash_image.png true - + - library\lib\arm64-v8a\ - libpython3.9d.so true - - - splash_image.png + + true - + ic_launcher.png true - - - ic_notification.png + + + ic_launcher.png true - + - library\lib\armeabi-v7a\ - libpython3.9d.so true - + - ic_launcher.png true @@ -392,411 +370,426 @@ true - - - ic_notification.png + + + ic_launcher.png true - + - classes.dex + ic_launcher.png true - - - styles.xml + + + ic_launcher.png true - - + + + ic_launcher.png true - - - ic_notification.png + + true - + - splash_image.png true - - - libPyLoad.so + + + ic_launcher.png true - + - ic_notification.png + ic_launcher.png true - + - ic_notification.png + splash_image.png true - - + + + splash_image.png true - + + ic_launcher.png true - + - ic_notification.png + ic_launcher.png true - + - ic_launcher.png true - - + + + styles.xml true - + - library\lib\armeabi-v7a\ - libpython3.9.so + splash_image.png true - + + splash_image.png true - + - ic_launcher.png + 64 true - + - ic_launcher.png - true - - - - ic_notification.png true - - + + + ic_notification.png true - - - ic_launcher.png + + true - - - splash_image.png + + + libPyLoad.so true - + libPyLoad.so true - + - libP4DAndroidTest.so + classes.dex true - - - splash_image.png + + + library\lib\armeabi-v7a\ + libpython3.9.so true - + - splash_image.png + library\lib\armeabi-v7a\ + libpython3.9.so true - - + + libPyLoad.so true - + - .\assets\internal - build.zip + ic_notification.png true - + - splash_image.png + styles.xml true - - - .\assets\internal - build.zip - false + + + styles.xml + true - - + + ic_launcher.png true - + - classes.dex + libPyLoad.so true - + - classes.dex + ic_notification.png true - - - ic_notification.png + + + ic_launcher.png true - - + + + library\lib\arm64-v8a\ + libpython3.9.so true - + + library\lib\arm64-v8a\ + libpython3.9.so true - + + + 64 + true + + + - ic_launcher.png + libPyLoad.so true - - - styles.xml + + + libPyLoad.so true - + - ic_launcher.png true - - + + ic_launcher.png true - + - ic_launcher.png + classes.dex true - + + classes.dex true - - - splash_image.png + + + ic_notification.png true - + - splash_image.png + ic_notification.png true - + + ic_launcher.png true - - - splash_image.png + + true - - + + + .\assets\internal + build.zip true - + + + .\assets\internal + build.zip + true + + + - splash_image.png + .\assets\internal + build.zip true - + - styles.xml true - + - libPyLoad.so + .\assets\internal + build.zip true - + true - + - ic_launcher.png + classes.dex true - - + + ic_notification.png true - + - ic_launcher.png + ic_notification.png true - - + + libP4DAndroidTest.so true - + - ic_notification.png - true - - - - true - - - ic_notification.png + + + ic_launcher.png true - - + + ic_launcher.png true - + ic_notification.png true - + - libPyLoad.so + ic_notification.png true - - - libP4DAndroidTest.so + + true - + - libPyLoad.so + splash_image.png true - - - ic_notification.png + + + splash_image.png true - - + + + ic_notification.png true - - + + ic_notification.png true - + - ic_notification.png + libPyLoad.so true - + - .\assets\internal - build.zip - false + ic_launcher.png + true - + + + ic_launcher.png + true + + + + ic_launcher.png true - + libPyLoad.so true @@ -807,183 +800,174 @@ true - + - ic_notification.png + ic_launcher.png true - + - libPyLoad.so - true - - - - - ic_notification.png + ic_launcher.png true - + true - + - ic_launcher.png true - + - ic_launcher.png + ic_notification.png true - - - P4DAndroidTest.exe + + + ic_notification.png true - + - ic_launcher.png true - - - ic_notification.png + + true - + - classes.dex true - + - splash_image.png true - + ic_launcher.png true - - - splash_image.png + + + ic_launcher.png true - - - splash_image.png + + + libP4DAndroidTest.so true - + ic_notification.png true - + + ic_notification.png true - + - ic_launcher.png + splash_image.png true - + splash_image.png true - + - ic_launcher.png true - - - libPyLoad.so + + + ic_notification.png true - - - .\assets\internal - build.zip + + true - - - library\lib\arm64-v8a\ - libpython3.9.so + + + ic_notification.png true - - + + + splash_image.png true - + + splash_image.png true - + + splash_image.png true - + + splash_image.png true - - - ic_notification.png + + + libPyLoad.so true - + - ic_launcher.png + libPyLoad.so true - - + + + P4DAndroidTest.exe true - - - splash_image.png + + true - + + libP4DAndroidTest.so true @@ -993,21 +977,33 @@ true - + - libPyLoad.so + styles.xml true - + - ic_launcher.png + ic_notification.png true - + - styles.xml + ic_notification.png + true + + + + + splash_image.png + true + + + + + splash_image.png true @@ -1023,6 +1019,16 @@ 0 + + + classes + 64 + + + classes + 64 + + classes @@ -1324,6 +1330,11 @@ 1 .framework + + Contents\MacOS + 1 + .framework + 0 @@ -1351,6 +1362,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .dll;.bpl @@ -1379,6 +1395,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .bpl @@ -1408,6 +1429,10 @@ Contents\Resources\StartUp\ 0 + + Contents\Resources\StartUp\ + 0 + 0 @@ -1673,6 +1698,10 @@ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + @@ -1683,6 +1712,10 @@ ..\ 1 + + ..\ + 1 + @@ -1693,6 +1726,10 @@ Contents 1 + + Contents + 1 + @@ -1703,6 +1740,10 @@ Contents\Resources 1 + + Contents\Resources + 1 + @@ -1733,6 +1774,10 @@ Contents\MacOS 1 + + Contents\MacOS + 1 + 0 @@ -1771,23 +1816,25 @@ 1 - + + + + + + + - - - - - True True True - True + False True + True True True diff --git a/Tests/FMX/Android/PythonLoad.pas b/Tests/FMX/Android/PythonLoad.pas index 30562a00..f8a33ac7 100644 --- a/Tests/FMX/Android/PythonLoad.pas +++ b/Tests/FMX/Android/PythonLoad.pas @@ -62,7 +62,7 @@ implementation System.IOUtils; const - PY_KNOWN_VER = 1; + PY_KNOWN_VER = 7; { TPythonLoad } @@ -118,18 +118,12 @@ class function TPythonLoad.HasPythonZip: boolean; class procedure TPythonLoad.Configure(const APythonEngine: TPythonEngine); begin - APythonEngine.AutoLoad := False; APythonEngine.UseLastKnownVersion := false; APythonEngine.ProgramName := TPythonLoad.GetPyBin(); APythonEngine.PythonHome := TPythonLoad.GetPyHome(); APythonEngine.RegVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].RegVersion; APythonEngine.DllName := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName; APythonEngine.APIVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].APIVersion; - APythonEngine.FatalAbort := False; - APythonEngine.FatalMsgDlg := False; - APythonEngine.AutoFinalize := True; - APythonEngine.InitThreads := True; - APythonEngine.PyFlags := [pfInteractive]; end; end. From c73d8bb01fb6638f3e83e238c85cd386777492f4 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 26 Dec 2022 19:46:50 +0200 Subject: [PATCH 021/174] Clarified installation instructions --- Install/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Install/README.md b/Install/README.md index 6c8003a3..e6196425 100644 --- a/Install/README.md +++ b/Install/README.md @@ -2,8 +2,8 @@ Use for Delphi Seattle (10.4) or later to install all packages in one step. -1. Clone or copy the Python4Delphi git repository to a folder of your choice. The setup.ini file assumes that the folder is called "P4D". If you chose to name your folder differently then modify the "Folder" option in setup.ini. +1. Clone or copy the Python4Delphi git repository to a folder of your choice. **The setup.ini file assumes that the folder is called "P4D"**. If you chose to name your folder differently then modify the "Folder" option in setup.ini. 2. Close all Delphi IDEs running. 3. Run MultiInstaller.exe 4. Select the packages you want and press Next -5. In the dialog box specify the parent folder of "P4D" (i.e. the folder containing the directory to which you have copied Python4Delphi) and the Delphi target version. Then press Next to install the components +5. In the dialog box specify the _**parent folder**_ of "P4D" (i.e. the folder containing the directory to which you have copied Python4Delphi) and the Delphi target version. Then press Next to install the components From ab86012f7fc186216b8018daba97989b42159735 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 27 Dec 2022 02:50:22 +0200 Subject: [PATCH 022/174] Fix #377 Added ExecFile method. --- Source/PythonEngine.pas | 131 ++++++++++++++++++++++++++-------------- 1 file changed, 87 insertions(+), 44 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 073b2ef3..5d6f358e 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1871,25 +1871,26 @@ TPythonEngine = class(TPythonInterface) procedure SetPythonHome(const PythonHome: UnicodeString); procedure SetProgramName(const ProgramName: UnicodeString); function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; - function Run_CommandAsString(const command : AnsiString; mode : Integer) : string; - function Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; - function Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; + function Run_CommandAsString(const command: AnsiString; mode: Integer; const FileName: string = ''): string; + function Run_CommandAsObject(const command: AnsiString; mode: Integer; const FileName: string = ''): PPyObject; + function Run_CommandAsObjectWithDict(const command: AnsiString; mode: Integer; locals, globals: PPyObject; const FileName: string = ''): PPyObject; function EncodeString (const str: UnicodeString): AnsiString; {$IFDEF FPC}overload;{$ENDIF} {$IFDEF FPC} overload; function EncodeString (const str: AnsiString): AnsiString; overload; {$ENDIF} - function EncodeWindowsFilePath (const str: string): AnsiString; - procedure ExecString(const command : AnsiString); overload; - procedure ExecStrings( strings : TStrings ); overload; - function EvalString(const command : AnsiString) : PPyObject; overload; - function EvalStringAsStr(const command : AnsiString) : string; - function EvalStrings( strings : TStrings ) : PPyObject; overload; - procedure ExecString(const command : AnsiString; locals, globals : PPyObject ); overload; - procedure ExecStrings( strings : TStrings; locals, globals : PPyObject ); overload; - function EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; overload; - function EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; overload; - function EvalStringsAsStr( strings : TStrings ) : string; + function EncodeWindowsFilePath(const str: string): AnsiString; + procedure ExecString(const command: AnsiString; const FileName: string = ''); overload; + procedure ExecStrings(strings: TStrings; const FileName: string = ''); overload; + procedure ExecString(const command: AnsiString; locals, globals: PPyObject; const FileName: string = ''); overload; + procedure ExecFile(const FileName: string; locals: PPyObject = nil; globals: PPyObject = nil); overload; + procedure ExecStrings(strings: TStrings; locals, globals: PPyObject; const FileName: string = ''); overload; + function EvalString(const command: AnsiString; const FileName: string = ''): PPyObject; overload; + function EvalStringAsStr(const command: AnsiString; const FileName: string = ''): string; + function EvalStrings(strings: TStrings; const FileName: string = ''): PPyObject; overload; + function EvalString(const command: AnsiString; locals, globals: PPyObject; const FileName: string = ''): PPyObject; overload; + function EvalStrings(strings: TStrings; locals, globals: PPyObject; const FileName: string = ''): PPyObject; overload; + function EvalStringsAsStr(strings: TStrings; const FileName: string = ''): string; function EvalPyFunction(pyfunc, pyargs:PPyObject): Variant; function EvalFunction(pyfunc:PPyObject; const args: array of const): Variant; function EvalFunctionNoArgs(pyfunc:PPyObject): Variant; @@ -4882,40 +4883,55 @@ function TPythonEngine.EvalFunctionNoArgs(pyfunc:PPyObject): Variant; end; end; -function TPythonEngine.EvalStringAsStr(const command : AnsiString) : string; +function TPythonEngine.EvalStringAsStr(const command: AnsiString; const + FileName: string = ''): string; begin - Result := Run_CommandAsString( command, eval_input ); + Result := Run_CommandAsString(command, eval_input, FileName); end; -function TPythonEngine.EvalString(const command : AnsiString) : PPyObject; +function TPythonEngine.EvalString(const command: AnsiString; const FileName: + string = ''): PPyObject; begin - Result := Run_CommandAsObject( command, eval_input ); + Result := Run_CommandAsObject(command, eval_input, FileName); end; -procedure TPythonEngine.ExecString(const command : AnsiString); +procedure TPythonEngine.ExecString(const command: AnsiString; const FileName: + string = ''); begin - Py_XDecRef( Run_CommandAsObject( command, file_input ) ); + Py_XDecRef(Run_CommandAsObject(command, file_input, FileName)); end; -function TPythonEngine.Run_CommandAsString(const command : AnsiString; mode : Integer) : string; +function TPythonEngine.Run_CommandAsString(const command: AnsiString; mode: + Integer; const FileName: string = ''): string; var - v : PPyObject; + PRes : PPyObject; begin Result := ''; - v := Run_CommandAsObject( command, mode ); - Result := PyObjectAsString( v ); - Py_XDECREF(v); + PRes := Run_CommandAsObject(command, mode, FileName); + Result := PyObjectAsString(PRes); + Py_XDECREF(PRes); end; -function TPythonEngine.Run_CommandAsObject(const command : AnsiString; mode : Integer) : PPyObject; +function TPythonEngine.Run_CommandAsObject(const command: AnsiString; mode: + Integer; const FileName: string = ''): PPyObject; begin - Result := Run_CommandAsObjectWithDict(command, mode, nil, nil); + Result := Run_CommandAsObjectWithDict(command, mode, nil, nil, FileName); end; -function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject; +function TPythonEngine.Run_CommandAsObjectWithDict(const command: AnsiString; + mode: Integer; locals, globals: PPyObject; const FileName: string = + ''): PPyObject; +{ + This is the core function for executing/evaluating python code + Parameters: + - command: utf-8 encoded AnsiString with the code that will be executed or evaluated + - mode: one of the constants file_input, single_input, eval_input + - locals, globals: python dictionaries with local/global namespaces. Can be nil. + - FileName; optional string used when debugging code with external debuggers +} var m : PPyObject; - _locals, _globals : PPyObject; + _locals, _globals, Code : PPyObject; begin CheckPython; Result := nil; @@ -4941,7 +4957,11 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m _globals := _locals; try - Result := PyRun_String(PAnsiChar(CleanString(command)), mode, _globals, _locals); + Code := Py_CompileString(PAnsiChar(CleanString(command)), + PAnsiChar(EncodeString(FileName)), mode); + if Code = nil then + CheckError(False); + Result := PyEval_EvalCode(Code, _globals, _locals ); if Result = nil then CheckError(False); except @@ -4952,39 +4972,62 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m end; end; -procedure TPythonEngine.ExecStrings( strings : TStrings ); +procedure TPythonEngine.ExecStrings(strings: TStrings; const FileName: string = + ''); +begin + Py_XDecRef(Run_CommandAsObject(EncodeString(strings.Text), file_input, FileName)); +end; + +function TPythonEngine.EvalStrings(strings: TStrings; const FileName: string = + ''): PPyObject; begin - Py_XDecRef( Run_CommandAsObject( EncodeString(strings.Text) , file_input ) ); + Result := Run_CommandAsObject(EncodeString(strings.Text) , eval_input, FileName); end; -function TPythonEngine.EvalStrings( strings : TStrings ) : PPyObject; +procedure TPythonEngine.ExecFile(const FileName: string; locals, + globals: PPyObject); +var + SL: TStringList; begin - Result := Run_CommandAsObject( EncodeString(strings.Text) , eval_input ); + SL := TStringList.Create; + try + SL.LoadFromFile(FileName); + ExecStrings(SL, locals, globals, FileName); + finally + SL.Free; + end; end; -procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals : PPyObject ); +procedure TPythonEngine.ExecString(const command: AnsiString; locals, globals: + PPyObject; const FileName: string = ''); begin - Py_XDecRef( Run_CommandAsObjectWithDict( command, file_input, locals, globals ) ); + Py_XDecRef(Run_CommandAsObjectWithDict(command, file_input, locals, globals, FileName)); end; -procedure TPythonEngine.ExecStrings( strings : TStrings; locals, globals : PPyObject ); +procedure TPythonEngine.ExecStrings(strings: TStrings; locals, globals: + PPyObject; const FileName: string = ''); begin - Py_XDecRef( Run_CommandAsObjectWithDict( EncodeString(strings.Text), file_input, locals, globals ) ); + Py_XDecRef( Run_CommandAsObjectWithDict(EncodeString(strings.Text), + file_input, locals, globals, FileName)); end; -function TPythonEngine.EvalString( const command : AnsiString; locals, globals : PPyObject ) : PPyObject; +function TPythonEngine.EvalString(const command: AnsiString; locals, globals: + PPyObject; const FileName: string = ''): PPyObject; begin - Result := Run_CommandAsObjectWithDict( command, eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict(command, eval_input, locals, globals, FileName); end; -function TPythonEngine.EvalStrings( strings : TStrings; locals, globals : PPyObject ) : PPyObject; +function TPythonEngine.EvalStrings(strings: TStrings; locals, globals: + PPyObject; const FileName: string = ''): PPyObject; begin - Result := Run_CommandAsObjectWithDict( EncodeString(strings.Text), eval_input, locals, globals ); + Result := Run_CommandAsObjectWithDict(EncodeString(strings.Text), + eval_input, locals, globals, FileName); end; -function TPythonEngine.EvalStringsAsStr( strings : TStrings ) : string; +function TPythonEngine.EvalStringsAsStr(strings: TStrings; const FileName: + string = ''): string; begin - Result := Run_CommandAsString( EncodeString(strings.Text), eval_input ); + Result := Run_CommandAsString(EncodeString(strings.Text), eval_input, FileName); end; function TPythonEngine.CheckEvalSyntax( const str : AnsiString ) : Boolean; From a945a651f329e744f352deb101be9e667434b263 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 28 Dec 2022 01:20:29 +0200 Subject: [PATCH 023/174] Fix #382 --- Demos/Demo31/Unit1.dfm | 22 +++++++++++----------- Source/PythonEngine.pas | 10 ++++++++++ Source/WrapDelphi.pas | 12 +++++++++++- Source/WrapDelphiClasses.pas | 2 +- Tests/WrapDelphiTest.pas | 15 ++++++++++++++- 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Demos/Demo31/Unit1.dfm b/Demos/Demo31/Unit1.dfm index 7d926a74..08ef253f 100644 --- a/Demos/Demo31/Unit1.dfm +++ b/Demos/Demo31/Unit1.dfm @@ -13,25 +13,22 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True Visible = True OnCreate = FormCreate - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 Top = 169 - Width = 721 + Width = 715 Height = 3 Cursor = crVSplit Align = alTop - ExplicitWidth = 677 end object Memo1: TMemo Left = 0 Top = 172 - Width = 721 - Height = 395 + Width = 715 + Height = 378 Align = alClient Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -42,8 +39,8 @@ object Form1: TForm1 Lines.Strings = ( 'from spam import DelphiVersion, MainForm, DVar, CreateComponent,' + - ' Application, Screen, mrOk, Form, Button, CheckBox, OpenDialog, ' + - 'caFree' + ' Application, Screen, mrOk, Component, Form, Button, CheckBox, O' + + 'penDialog, caFree' 'from spam import Point, Monitor, DrawGrid, gdSelected, clBlue, s' + 'sCtrl, PageControl, TabSheet' @@ -493,6 +490,9 @@ object Form1: TForm1 ' self.assertTrue(MainForm.Caption == '#39'From TTestRTTIAcc' + 'ess.ObjectField'#39')' '' + ' def testInheritance(self):' + ' self.assertTrue(issubclass(Form, Component))' + ' self.assertTrue(issubclass(Button, Component))' '' 'if __name__ == '#39'__main__'#39':' ' try:' @@ -506,8 +506,8 @@ object Form1: TForm1 end object Panel1: TPanel Left = 0 - Top = 567 - Width = 721 + Top = 550 + Width = 715 Height = 41 Align = alBottom BevelOuter = bvNone @@ -525,7 +525,7 @@ object Form1: TForm1 object Memo2: TMemo Left = 0 Top = 0 - Width = 721 + Width = 715 Height = 169 Align = alTop Font.Charset = DEFAULT_CHARSET diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 5d6f358e..89cc2272 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2560,6 +2560,7 @@ TPythonType = class(TGetSetContainer) procedure SetModule( val : TPythonModule ); procedure SetServices( val : TTypeServices ); procedure SetTypeName( const val : AnsiString ); + procedure SetBaseType(AType: TPythonType); function CreateMethod(pSelf, args, kwds: PPyObject): PPyObject; cdecl; procedure InitServices; procedure SetDocString( value : TStringList ); @@ -2591,6 +2592,7 @@ TPythonType = class(TGetSetContainer) property TheType : PyTypeObject read FType write FType; property TheTypePtr : PPyTypeObject read GetTypePtr; property PyObjectClass : TPyObjectClass read FPyObjectClass write SetPyObjectClass stored False; + property BaseType: TPythonType write SetBaseType; property InstanceCount : Integer read FInstanceCount; property CreateHits : Integer read FCreateHits; property DeleteHits : Integer read FDeleteHits; @@ -8024,6 +8026,14 @@ procedure TPythonType.ReallocMethods; FType.tp_methods := MethodsData; end; +procedure TPythonType.SetBaseType(AType: TPythonType); +begin + if AType = nil then + FType.tp_base := nil + else + FType.tp_base := @AType.FType; +end; + procedure TPythonType.SetDocString( value : TStringList ); begin FDocString.Assign( value ); diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index a9925f5c..bf0d9216 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3723,8 +3723,9 @@ procedure TPyDelphiWrapper.Notify(ADeletedObject: TObject); procedure TPyDelphiWrapper.RegisterDelphiWrapper( AWrapperClass: TPyDelphiObjectClass); -Var +var RegisteredClass : TRegisteredClass; + Index: Integer; begin Assert(Assigned(AWrapperClass)); @@ -3734,6 +3735,15 @@ procedure TPyDelphiWrapper.RegisterDelphiWrapper( RegisteredClass.PythonType.Engine := Engine; RegisteredClass.PythonType.Module := fModule; RegisteredClass.PythonType.PyObjectClass := AWrapperClass; + // Find nearest registered parent class and set it as base + for Index := fClassRegister.Count - 1 downto 0 do + with TRegisteredClass(fClassRegister[Index]) do + if RegisteredClass.DelphiClass.InheritsFrom(DelphiClass) then + begin + RegisteredClass.PythonType.BaseType := PythonType; + Break; + end; + fClassRegister.Add(RegisteredClass); if AWrapperClass.DelphiObjectClass.InheritsFrom(TPersistent) then Classes.RegisterClass(TPersistentClass(AWrapperClass.DelphiObjectClass)); diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 045e3a73..3c995829 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -1022,7 +1022,7 @@ class procedure TPyDelphiComponent.RegisterMethods( 'Indicates whether the component has a parent to handle its filing.'); PythonType.AddMethod('BindMethodsToEvents', @TPyDelphiComponent.BindMethodsToEvents, 'TComponent.BindMethodsToEvents(prefix)'#10 + - 'Connects methods to component events if they are named using the following patter: Prefix_ComponentName_EventName.'+#10+ + 'Connects methods to component events if they are named using the following pattern: Prefix_ComponentName_EventName.'+#10+ 'Example: def handle_button1_OnClick(Sender): pass'+#10+ 'The function returns a list of tuples. Each tuple contains the name of the component, the name of the event and the method object assigned to the event.'+#10+ 'Note that the prefix parameter is optional and will default to "handle_".'); diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 4ec90f70..62148a58 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -127,6 +127,8 @@ TTestWrapDelphi = class(TObject) procedure TestPassVariantArray; [Test] procedure TestClassRefParam; + [Test] + procedure TestInheritance; end; implementation @@ -205,7 +207,7 @@ procedure TTestWrapDelphi.SetupFixture; Py := PyDelphiWrapper.WrapInterface(TValue.From(FTestInterface)); DelphiModule.SetVar('rtti_interface', Py); PythonEngine.Py_DecRef(Py); - PythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface, Object, Collection, Strings'); + PythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface, Object, Persistent, Collection, Strings'); Rtti_Var := MainModule.rtti_var; Rtti_Rec := MainModule.rtti_rec; Rtti_Interface := MainModule.rtti_interface; @@ -277,6 +279,17 @@ procedure TTestWrapDelphi.TestGetStaticArray; Assert.AreEqual(Int64(999), Int64(PythonEngine.PyObjectAsVariant(PythonEngine.PyList_GetItem(ExtractPythonObjectFrom(List), 999)))); end; +procedure TTestWrapDelphi.TestInheritance; +var + Py_Strings, Py_Persistent, Py_Object: PPyObject; +begin + Py_Strings := ExtractPythonObjectFrom(MainModule.Strings); + Py_Persistent := ExtractPythonObjectFrom(MainModule.Persistent); + Py_Object := ExtractPythonObjectFrom(MainModule.Object); + Assert.AreEqual(PythonEngine.PyObject_IsSubclass(Py_Strings, Py_Persistent), 1); + Assert.AreEqual(PythonEngine.PyObject_IsSubclass(Py_Strings, Py_Object), 1); +end; + procedure TTestWrapDelphi.TestInterface; begin Rtti_Interface.SetString('Test'); From 45ca26c8ddea451af6279c4ff65c0e53fe251e22 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 28 Dec 2022 16:33:12 +0200 Subject: [PATCH 024/174] Call to inherited removed from RegisterMethods and RegisterGetSets, following the fix to #382 --- Source/PythonEngine.pas | 16 +- Source/WrapDelphi.pas | 35 +- Source/WrapDelphiClasses.pas | 9 - Source/WrapFireDAC.pas | 5 - Source/fmx/WrapFmxControls.pas | 4 - Source/fmx/WrapFmxDialogs.pas | 2 - Source/fmx/WrapFmxForms.pas | 2 - Source/fmx/WrapFmxMedia.pas | 2 - Source/fmx/WrapFmxStyles.pas | 292 +++-- Source/fmx/WrapFmxTypes.pas | 1825 ++++++++++++++++---------------- Source/vcl/WrapVclComCtrls.pas | 3 - Source/vcl/WrapVclControls.pas | 4 - Source/vcl/WrapVclDialogs.pas | 4 - Source/vcl/WrapVclForms.pas | 9 +- Source/vcl/WrapVclGraphics.pas | 12 - Source/vcl/WrapVclGrids.pas | 2 - Source/vcl/WrapVclThemes.pas | 1009 +++++++++--------- 17 files changed, 1577 insertions(+), 1658 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 89cc2272..65c8a0f1 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1492,6 +1492,8 @@ TPythonInterface=class(TDynamicDll) PyMapping_HasKeyString:function (ob:PPyObject;key:PAnsiChar):integer; cdecl; PyMapping_Length:function (ob:PPyObject):NativeInt; cdecl; PyMapping_SetItemString:function (ob:PPyObject; key:PAnsiChar; value:PPyObject):integer; cdecl; + PyMapping_Keys:function(mp: PPyObject):PPyObject; cdecl; + PyMapping_Values:function(mp: PPyObject):PPyObject; cdecl; PyMethod_Function:function (ob:PPyObject):PPyObject; cdecl; PyMethod_New:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; PyMethod_Self:function (ob:PPyObject):PPyObject; cdecl; @@ -1917,7 +1919,7 @@ TPythonEngine = class(TPythonInterface) function ArrayToPyDict( const items : array of const) : PPyObject; function StringsToPyList( strings : TStrings ) : PPyObject; function StringsToPyTuple( strings : TStrings ) : PPyObject; - procedure PyListToStrings( list : PPyObject; strings : TStrings ); + procedure PyListToStrings(list: PPyObject; Strings: TStrings; ClearStrings: Boolean = True); procedure PyTupleToStrings( tuple: PPyObject; strings : TStrings ); function ReturnNone : PPyObject; function ReturnTrue : PPyObject; @@ -3687,6 +3689,8 @@ procedure TPythonInterface.MapDll; PyMapping_HasKeyString := Import('PyMapping_HasKeyString'); PyMapping_Length := Import('PyMapping_Length'); PyMapping_SetItemString := Import('PyMapping_SetItemString'); + PyMapping_Keys := Import('PyMapping_Keys'); + PyMapping_Values := Import('PyMapping_Values'); PyMethod_Function := Import('PyMethod_Function'); PyMethod_New := Import('PyMethod_New'); PyMethod_Self := Import('PyMethod_Self'); @@ -6013,15 +6017,17 @@ function TPythonEngine.StringsToPyTuple( strings : TStrings ) : PPyObject; PyUnicodeFromString(strings.Strings[i])); end; -procedure TPythonEngine.PyListToStrings( list : PPyObject; strings : TStrings ); +procedure TPythonEngine.PyListToStrings(list: PPyObject; Strings: TStrings; + ClearStrings: Boolean = True); var i : Integer; begin if not PyList_Check(list) then raise EPythonError.Create('the python object is not a list'); - strings.Clear; + if ClearStrings then + Strings.Clear; for i := 0 to PyList_Size( list ) - 1 do - strings.Add( PyObjectAsString( PyList_GetItem( list, i ) ) ); + Strings.Add( PyObjectAsString( PyList_GetItem( list, i ) ) ); end; procedure TPythonEngine.PyTupleToStrings( tuple: PPyObject; strings : TStrings ); @@ -6279,7 +6285,7 @@ function TPythonEngine.GetMainModule : PPyObject; Result := PyImport_AddModule(PAnsiChar(ExecModule)); end; -function TPythonEngine.PyTimeStruct_Check( obj : PPyObject ) : Boolean; +function TPythonEngine.PyTimeStruct_Check(obj : PPyObject): Boolean; begin Result := Assigned(FTimeStruct) and (Pointer(obj^.ob_type) = FTimeStruct); end; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index bf0d9216..9ecd7a4f 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2352,8 +2352,27 @@ function TPyDelphiObject.Get_Owned(Acontext: Pointer): PPyObject; function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; var - i : Integer; SL : TStringList; + PyEngine: TPythonEngine; + + procedure AddItemsFromDict(PyObj: PPyObject); + var + PyDict: PPyObject; + PyList: PPyObject; + begin + if PyEngine.PyObject_HasAttrString(PyObj, '__dict__') = 1 then + begin + PyDict := PyEngine.PyObject_GetAttrString(PyObj, '__dict__'); + PyList := PyEngine.PyMapping_Keys(PyDict); + if Assigned(PyList) then + PyEngine.PyListToStrings(PyList, SL, False); + PyEngine.Py_XDECREF(PyList); + PyEngine.Py_XDECREF(PyDict); + end; + end; + +var + PyType: PPyTypeObject; {$IFDEF EXTENDED_RTTI} Context: TRttiContext; RttiType: TRTTIType; @@ -2366,12 +2385,16 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; SL := TStringList.Create; SL.Sorted := True; SL.Duplicates := dupIgnore; + PyEngine := GetPythonEngine; try - // Add methods - for i := 0 to PythonType.MethodCount - 1 do - SL.Add(string(AnsiString(PythonType.Methods[i].ml_name))); - for i := 0 to PythonType.GetSetCount - 1 do - SL.Add(string(AnsiString(PythonType.GetSet[i].name))); + AddItemsFromDict(GetSelf); + PyType := PythonType.TheTypePtr; + while PyType <> nil do + begin + AddItemsFromDict(PPyObject(PyType)); + PyType := PyType.tp_base; + end; + {$IFDEF EXTENDED_RTTI} Context := TRttiContext.Create(); try diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 3c995829..ce2fa488 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -391,7 +391,6 @@ function TPyDelphiPersistent.GetNamePath_Wrapper( class procedure TPyDelphiPersistent.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Assign', @TPyDelphiPersistent.Assign_Wrapper, 'TPersistent.Assign(persistent)'#10 + 'Assigns to this object the values of another TPersistent object'); @@ -584,7 +583,6 @@ function TPyDelphiCollection.Insert_Wrapper(args: PPyObject): PPyObject; class procedure TPyDelphiCollection.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Count', @TPyDelphiCollection.Get_Count, nil, @@ -599,7 +597,6 @@ class procedure TPyDelphiCollection.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiCollection.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Insert', @TPyDelphiCollection.Insert_Wrapper, 'TCollection.Insert(Index)'#10 + 'Inserts a new collection item to the collection at the Index position'); @@ -998,7 +995,6 @@ procedure TPyDelphiComponent.SetDelphiObject(const Value: TComponent); class procedure TPyDelphiComponent.RegisterGetSets( PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('ComponentCount', @TPyDelphiComponent.Get_ComponentCount, nil, @@ -1013,7 +1009,6 @@ class procedure TPyDelphiComponent.RegisterGetSets( class procedure TPyDelphiComponent.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('GetParentComponent', @TPyDelphiComponent.GetParentComponent_Wrapper, 'TComponent.GetParentComponent()'#10 + 'Returns the parent of a component.'); @@ -1462,7 +1457,6 @@ function TPyDelphiStrings.MpSubscript(obj: PPyObject): PPyObject; class procedure TPyDelphiStrings.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Capacity', @TPyDelphiStrings.Get_Capacity, @TPyDelphiStrings.Set_Capacity, @@ -1476,7 +1470,6 @@ class procedure TPyDelphiStrings.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiStrings.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Add', @TPyDelphiStrings.Add_Wrapper, 'TStrings.Add(s)'#10 + 'Adds a string to the TStrings object and returns the index position'); @@ -1573,7 +1566,6 @@ function TPyDelphiBasicAction.Get_ActionComponent(AContext: Pointer): PPyObject; class procedure TPyDelphiBasicAction.RegisterGetSets( PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('ActionComponent', @TPyDelphiBasicAction.Get_ActionComponent, @TPyDelphiBasicAction.Set_ActionComponent, @@ -1584,7 +1576,6 @@ class procedure TPyDelphiBasicAction.RegisterGetSets( class procedure TPyDelphiBasicAction.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Execute', @TPyDelphiBasicAction.Execute_Wrapper, 'TBasicAction.Execute()'#10 + 'Generates an OnExecute event.'); diff --git a/Source/WrapFireDAC.pas b/Source/WrapFireDAC.pas index 6f3277fc..195a1e45 100644 --- a/Source/WrapFireDAC.pas +++ b/Source/WrapFireDAC.pas @@ -570,7 +570,6 @@ procedure TPyDBField.SetDelphiObject(const Value: TField); class procedure TPyDBField.RegisterMethods( PythonType : TPythonType ); begin - inherited; with PythonType do begin AddMethod(AnsiString('Clear'), @TPyDBField.Do_Clear, AnsiString('DBField.Clear() -> None') ); @@ -836,7 +835,6 @@ function TPyDBDataset.Get_Rows(AContext: Pointer): PPyObject; class procedure TPyDBDataset.RegisterGetSets( PythonType : TPythonType ); begin - inherited; PythonType.AddGetSet(PAnsiChar('RowsCount'), @TPyDBDataset.Get_RowsCount, nil, PAnsiChar('Returns the count of contained dataset rows'), nil); PythonType.AddGetSet(PAnsiChar('Rows'), @TPyDBDataset.Get_Rows, nil, @@ -845,7 +843,6 @@ class procedure TPyDBDataset.RegisterGetSets( PythonType : TPythonType ); class procedure TPyDBDataset.RegisterMethods( PythonType : TPythonType ); begin - inherited; with PythonType do begin AddMethod(AnsiString('Fields'), @TPyDBDataset.Do_Fields, AnsiString('DBDataset.Fields( index : Integer ) -> TField') ); @@ -1341,7 +1338,6 @@ destructor TPyDBTable.Destroy; class procedure TPyDBTable.RegisterMethods( PythonType : TPythonType ); begin - inherited; with PythonType do begin AddMethod(AnsiString('Open'), @TPyDBTable.Do_Open, AnsiString('FDTable.Open() -> None') ); @@ -1925,7 +1921,6 @@ destructor TPyDBQuery.Destroy; class procedure TPyDBQuery.RegisterMethods( PythonType : TPythonType ); begin - inherited; with PythonType do begin AddMethod(AnsiString('Open'), @TPyDBQuery.Do_Open, AnsiString('FDQuery.Open() -> None') ); diff --git a/Source/fmx/WrapFmxControls.pas b/Source/fmx/WrapFmxControls.pas index 89a6ab9c..5da399b5 100644 --- a/Source/fmx/WrapFmxControls.pas +++ b/Source/fmx/WrapFmxControls.pas @@ -302,7 +302,6 @@ function TPyDelphiControl.Get_Visible(AContext: Pointer): PPyObject; class procedure TPyDelphiControl.RegisterGetSets(PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('Visible', @TPyDelphiControl.Get_Visible, @TPyDelphiControl.Set_Visible, 'Returns/Sets the Control Visibility', nil); PythonType.AddGetSet('ControlsCount', @TPyDelphiControl.Get_ControlsCount, nil, @@ -317,7 +316,6 @@ class procedure TPyDelphiControl.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiControl.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('BringToFront', @TPyDelphiControl.BringToFront_Wrapper, 'TControl.BringToFront()'#10 + 'Puts the control in front of all other controls in its parent control.'); @@ -628,7 +626,6 @@ function TPyDelphiStyledControl.NeedStyleLookup_Wrapper( class procedure TPyDelphiStyledControl.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('DefaultStyleLookupName', @TPyDelphiStyledControl.Get_StyleLookup, nil, 'Returns a string with the name of the default style of this control', nil); @@ -648,7 +645,6 @@ class procedure TPyDelphiStyledControl.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiStyledControl.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('ApplyStyleLookup', @TPyDelphiStyledControl.ApplyStyleLookup_Wrapper, 'TStyledControl.ApplyStyleLookup()'#10 + 'Gets and applies the style of a TStyledControl.'); diff --git a/Source/fmx/WrapFmxDialogs.pas b/Source/fmx/WrapFmxDialogs.pas index e7ee98d5..0e8efab3 100644 --- a/Source/fmx/WrapFmxDialogs.pas +++ b/Source/fmx/WrapFmxDialogs.pas @@ -92,14 +92,12 @@ function TPyDelphiOpenDialog.Get_filename(AContext: Pointer): PPyObject; class procedure TPyDelphiOpenDialog.RegisterGetSets(PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('FileName', @TPyDelphiOpenDialog.Get_filename, nil, '', nil); end; class procedure TPyDelphiOpenDialog.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Execute', @TPyDelphiOpenDialog.Execute_Wrapper, 'TOpenDialog.Execute()'#10 + 'Displays the dialog'); diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index f89ca34a..e7fae8ac 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -248,7 +248,6 @@ function TPyDelphiApplication.Run_Wrapper(AArgs: PPyObject): PPyObject; class procedure TPyDelphiApplication.RegisterMethods(APythonType: TPythonType); begin - inherited; with APythonType do begin AddMethod('Initialize', @TPyDelphiApplication.Initialize_Wrapper, 'TApplication.Initialize()'#10 + @@ -449,7 +448,6 @@ function TPyDelphiCommonCustomForm.LoadProps_Wrapper( class procedure TPyDelphiCommonCustomForm.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('LoadProps', @TPyDelphiCustomForm.LoadProps_Wrapper, 'TCommonCustomForm.LoadProps()'#10 + 'Load properties from a .pydfm file'); diff --git a/Source/fmx/WrapFmxMedia.pas b/Source/fmx/WrapFmxMedia.pas index 19b7f556..732ff279 100644 --- a/Source/fmx/WrapFmxMedia.pas +++ b/Source/fmx/WrapFmxMedia.pas @@ -247,13 +247,11 @@ class function TPyDelphiCameraComponent.DelphiObjectClass: TClass; class procedure TPyDelphiCameraComponent.RegisterGetSets (PythonType: TPythonType); begin - inherited; end; class procedure TPyDelphiCameraComponent.RegisterMethods (PythonType: TPythonType); begin - inherited; end; function TPyDelphiCameraComponent.GetDelphiObject: TCameraComponent; diff --git a/Source/fmx/WrapFmxStyles.pas b/Source/fmx/WrapFmxStyles.pas index edfe9222..3f989292 100644 --- a/Source/fmx/WrapFmxStyles.pas +++ b/Source/fmx/WrapFmxStyles.pas @@ -1,156 +1,140 @@ -{$I ..\Definition.Inc} - -unit WrapFmxStyles; - -interface - -uses - WrapDelphi, FMX.Styles, PythonEngine; - -type - TPyDelphiStyleStreaming = class(TPyDelphiObject) - private - function GetDelphiObject: TStyleStreaming; - procedure SetDelphiObject(const Value: TStyleStreaming); - public - constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - class function DelphiObjectClass : TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods(PythonType: TPythonType); override; - - property DelphiObject: TStyleStreaming read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiStyleManager = class(TPyDelphiObject) - private - function GetDelphiObject: TStyleManager; - procedure SetDelphiObject(const Value: TStyleManager); - public - constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - class function DelphiObjectClass : TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods(PythonType: TPythonType); override; - - property DelphiObject: TStyleManager read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - FMX.Types; - -{ Register the wrappers, the globals and the constants } -type - TFmxStylesRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TFmxStylesRegistration } - -procedure TFmxStylesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TFmxStylesRegistration.Name: string; -begin - Result := 'Styles'; -end; - -procedure TFmxStylesRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleStreaming); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleManager); -end; - -{ TPyDelphiStyleStreaming } - -constructor TPyDelphiStyleStreaming.Create(APythonType: TPythonType); -begin - inherited; -end; - -constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args, +{$I ..\Definition.Inc} +unit WrapFmxStyles; + +interface + +uses + WrapDelphi, FMX.Styles, PythonEngine; + +type + TPyDelphiStyleStreaming = class(TPyDelphiObject) + private + function GetDelphiObject: TStyleStreaming; + procedure SetDelphiObject(const Value: TStyleStreaming); + public + constructor Create( APythonType : TPythonType ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass : TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + property DelphiObject: TStyleStreaming read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStyleManager = class(TPyDelphiObject) + private + function GetDelphiObject: TStyleManager; + procedure SetDelphiObject(const Value: TStyleManager); + public + constructor Create( APythonType : TPythonType ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass : TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + property DelphiObject: TStyleManager read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + FMX.Types; + +{ Register the wrappers, the globals and the constants } +type + TFmxStylesRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TFmxStylesRegistration } +procedure TFmxStylesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TFmxStylesRegistration.Name: string; +begin + Result := 'Styles'; +end; + +procedure TFmxStylesRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleStreaming); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleManager); +end; + +{ TPyDelphiStyleStreaming } +constructor TPyDelphiStyleStreaming.Create(APythonType: TPythonType); +begin + inherited; +end; + +constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -begin - inherited; - DelphiObject := TStyleStreaming.Create(); -end; - -class function TPyDelphiStyleStreaming.DelphiObjectClass: TClass; -begin - Result := TStyleStreaming; -end; - -function TPyDelphiStyleStreaming.GetDelphiObject: TStyleStreaming; -begin - Result := TStyleStreaming(inherited DelphiObject); -end; - -class procedure TPyDelphiStyleStreaming.RegisterGetSets( - PythonType: TPythonType); -begin - inherited; -end; - -class procedure TPyDelphiStyleStreaming.RegisterMethods( - PythonType: TPythonType); -begin - inherited; -end; - -procedure TPyDelphiStyleStreaming.SetDelphiObject(const Value: TStyleStreaming); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiStyleManager } - -constructor TPyDelphiStyleManager.Create(APythonType: TPythonType); -begin - inherited; -end; - -constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, +begin + inherited; + DelphiObject := TStyleStreaming.Create(); +end; + +class function TPyDelphiStyleStreaming.DelphiObjectClass: TClass; +begin + Result := TStyleStreaming; +end; + +function TPyDelphiStyleStreaming.GetDelphiObject: TStyleStreaming; +begin + Result := TStyleStreaming(inherited DelphiObject); +end; + +class procedure TPyDelphiStyleStreaming.RegisterGetSets( + PythonType: TPythonType); +begin +end; + +class procedure TPyDelphiStyleStreaming.RegisterMethods( + PythonType: TPythonType); +begin +end; + +procedure TPyDelphiStyleStreaming.SetDelphiObject(const Value: TStyleStreaming); +begin + inherited DelphiObject := Value; +end; +{ TPyDelphiStyleManager } +constructor TPyDelphiStyleManager.Create(APythonType: TPythonType); +begin + inherited; +end; +constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -begin - inherited; - DelphiObject := TStyleManager.Create(); -end; - -class function TPyDelphiStyleManager.DelphiObjectClass: TClass; -begin - Result := TStyleManager; -end; - -function TPyDelphiStyleManager.GetDelphiObject: TStyleManager; -begin - Result := TStyleManager(inherited DelphiObject); -end; - -class procedure TPyDelphiStyleManager.RegisterGetSets(PythonType: TPythonType); -begin - inherited; -end; - -class procedure TPyDelphiStyleManager.RegisterMethods(PythonType: TPythonType); -begin - inherited; -end; - -procedure TPyDelphiStyleManager.SetDelphiObject(const Value: TStyleManager); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TFmxStylesRegistration.Create()); - -end. +begin + inherited; + DelphiObject := TStyleManager.Create(); +end; +class function TPyDelphiStyleManager.DelphiObjectClass: TClass; +begin + Result := TStyleManager; +end; +function TPyDelphiStyleManager.GetDelphiObject: TStyleManager; +begin + Result := TStyleManager(inherited DelphiObject); +end; +class procedure TPyDelphiStyleManager.RegisterGetSets(PythonType: TPythonType); +begin +end; + +class procedure TPyDelphiStyleManager.RegisterMethods(PythonType: TPythonType); +begin +end; + +procedure TPyDelphiStyleManager.SetDelphiObject(const Value: TStyleManager); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TFmxStylesRegistration.Create()); +end. diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 6ed6a564..61b0205e 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -1,927 +1,910 @@ -{$I ..\Definition.Inc} -unit WrapFmxTypes; - -interface - -uses - System.Types, FMX.Types, PythonEngine, WrapDelphi, WrapDelphiClasses; - -type - { - The TPointF type is primarily used for the coordinates of FireMonkey objects. - http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Types.TPointF - } - TPyDelphiPointF = class(TPyObject) - private - FValue: TPointF; - protected - // Exposed Getters - function Get_X(Acontext: Pointer): PPyObject; cdecl; - function Get_Y(Acontext: Pointer): PPyObject; cdecl; - // Exposed Setters - function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - function Compare(obj: PPyObject): Integer; override; - function Repr: PPyObject; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure SetupType(PythonType: TPythonType); override; - property Value : TPointF read FValue write FValue; - end; - - TPyDelphiSizeF = class(TPyObject) - private - FValue: TSizeF; - protected - // Exposed Getters - function Get_Width(Acontext: Pointer): PPyObject; cdecl; - function Get_Height(Acontext: Pointer): PPyObject; cdecl; - // Exposed Setters - function Set_Width(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Height(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - function Compare(obj: PPyObject): Integer; override; - function Repr: PPyObject; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure SetupType(PythonType: TPythonType); override; - property Value : TSizeF read FValue write FValue; - end; - - TPyDelphiRectF = class(TPyObject) - private - FValue: TRectF; - protected - // Exposed Getters - function Get_Top(Acontext: Pointer): PPyObject; cdecl; - function Get_Bottom(Acontext: Pointer): PPyObject; cdecl; - function Get_Left(Acontext: Pointer): PPyObject; cdecl; - function Get_Right(Acontext: Pointer): PPyObject; cdecl; - // Exposed Setters - function Set_Top(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Bottom(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Left(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Right(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - function Compare(obj: PPyObject): Integer; override; - function Repr: PPyObject; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure SetupType(PythonType: TPythonType); override; - property Value: TRectF read FValue write FValue; - end; - - TPyDelphiFmxObject = class(TPyDelphiComponent) - private - function GetDelphiObject: TFmxObject; - procedure SetDelphiObject(const Value: TFmxObject); - protected - // Property Getters - function Get_Parent(AContext: Pointer): PPyObject; cdecl; - // Property Setters - function Set_Parent(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods(PythonType: TPythonType); override; - // Properties - property DelphiObject: TFmxObject read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPosition = class(TPyDelphiPersistent) - private - function GetDelphiObject: TPosition; - procedure SetDelphiObject(const Value: TPosition); - protected - //Exposed Getters - function Get_X(Acontext: Pointer): PPyObject; cdecl; - function Get_Y(Acontext: Pointer): PPyObject; cdecl; - function Get_Point(Acontext: Pointer): PPyObject; cdecl; - //Exposed Setters - function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Point(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - class function DelphiObjectClass: TClass; override; - class procedure RegisterMethods(PythonType: TPythonType); override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TPosition read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPopupMenu = class(TPyDelphiFMXObject) - private - function GetDelphiObject: TCustomPopupMenu; - procedure SetDelphiObject(const Value: TCustomPopupMenu); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomPopupMenu read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiBounds = class(TPyDelphiPersistent) - private - function GetDelphiObject: TBounds; - procedure SetDelphiObject(const Value: TBounds); - protected - function Get_Rect(Acontext: Pointer): PPyObject; cdecl; - function Set_Rect(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - property DelphiObject: TBounds read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiControlSize = class(TPyDelphiPersistent) - private - function GetDelphiObject: TControlSize; - procedure SetDelphiObject(const Value: TControlSize); - protected - function Get_SizeF(Acontext: Pointer): PPyObject; cdecl; - function Set_SizeF(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - property DelphiObject: TControlSize read GetDelphiObject write SetDelphiObject; - end; - - {Helper functions} - function WrapPointF(APyDelphiWrapper: TPyDelphiWrapper; const APoint : TPointF) : PPyObject; - function WrapSizeF(APyDelphiWrapper: TPyDelphiWrapper; const ASize : TSizeF) : PPyObject; - function WrapRectF(APyDelphiWrapper: TPyDelphiWrapper; const ARect : TRectF) : PPyObject; - function CheckPointFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TPointF): Boolean; - function CheckSizeFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TSizeF): Boolean; - function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TRectF): Boolean; - -implementation - -uses - System.Math, System.SysUtils; - - { Register the wrappers, the globals and the constants } -type - TTypesRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TPyDelphiPointF } - -function TPyDelphiPointF.Compare(obj: PPyObject): Integer; -var - _other : TPyDelphiPointF; -begin - if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then - begin - _other := TPyDelphiPointF(PythonToDelphi(obj)); - Result := CompareValue(Value.X, _other.Value.X); - if Result = 0 then - Result := CompareValue(Value.Y, _other.Value.Y); - end - else - Result := 1; -end; - -constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args, kwds: +{$I ..\Definition.Inc} +unit WrapFmxTypes; + +interface + +uses + System.Types, FMX.Types, PythonEngine, WrapDelphi, WrapDelphiClasses; + +type + { + The TPointF type is primarily used for the coordinates of FireMonkey objects. + http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Types.TPointF + } + TPyDelphiPointF = class(TPyObject) + private + FValue: TPointF; + protected + // Exposed Getters + function Get_X(Acontext: Pointer): PPyObject; cdecl; + function Get_Y(Acontext: Pointer): PPyObject; cdecl; + // Exposed Setters + function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + function Compare(obj: PPyObject): Integer; override; + function Repr: PPyObject; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure SetupType(PythonType: TPythonType); override; + property Value : TPointF read FValue write FValue; + end; + + TPyDelphiSizeF = class(TPyObject) + private + FValue: TSizeF; + protected + // Exposed Getters + function Get_Width(Acontext: Pointer): PPyObject; cdecl; + function Get_Height(Acontext: Pointer): PPyObject; cdecl; + // Exposed Setters + function Set_Width(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Height(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + function Compare(obj: PPyObject): Integer; override; + function Repr: PPyObject; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure SetupType(PythonType: TPythonType); override; + property Value : TSizeF read FValue write FValue; + end; + + TPyDelphiRectF = class(TPyObject) + private + FValue: TRectF; + protected + // Exposed Getters + function Get_Top(Acontext: Pointer): PPyObject; cdecl; + function Get_Bottom(Acontext: Pointer): PPyObject; cdecl; + function Get_Left(Acontext: Pointer): PPyObject; cdecl; + function Get_Right(Acontext: Pointer): PPyObject; cdecl; + // Exposed Setters + function Set_Top(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Bottom(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Left(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Right(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + function Compare(obj: PPyObject): Integer; override; + function Repr: PPyObject; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure SetupType(PythonType: TPythonType); override; + property Value: TRectF read FValue write FValue; + end; + + TPyDelphiFmxObject = class(TPyDelphiComponent) + private + function GetDelphiObject: TFmxObject; + procedure SetDelphiObject(const Value: TFmxObject); + protected + // Property Getters + function Get_Parent(AContext: Pointer): PPyObject; cdecl; + // Property Setters + function Set_Parent(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + // Properties + property DelphiObject: TFmxObject read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPosition = class(TPyDelphiPersistent) + private + function GetDelphiObject: TPosition; + procedure SetDelphiObject(const Value: TPosition); + protected + //Exposed Getters + function Get_X(Acontext: Pointer): PPyObject; cdecl; + function Get_Y(Acontext: Pointer): PPyObject; cdecl; + function Get_Point(Acontext: Pointer): PPyObject; cdecl; + //Exposed Setters + function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Point(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass: TClass; override; + class procedure RegisterMethods(PythonType: TPythonType); override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TPosition read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPopupMenu = class(TPyDelphiFMXObject) + private + function GetDelphiObject: TCustomPopupMenu; + procedure SetDelphiObject(const Value: TCustomPopupMenu); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomPopupMenu read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiBounds = class(TPyDelphiPersistent) + private + function GetDelphiObject: TBounds; + procedure SetDelphiObject(const Value: TBounds); + protected + function Get_Rect(Acontext: Pointer): PPyObject; cdecl; + function Set_Rect(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + property DelphiObject: TBounds read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiControlSize = class(TPyDelphiPersistent) + private + function GetDelphiObject: TControlSize; + procedure SetDelphiObject(const Value: TControlSize); + protected + function Get_SizeF(Acontext: Pointer): PPyObject; cdecl; + function Set_SizeF(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + property DelphiObject: TControlSize read GetDelphiObject write SetDelphiObject; + end; + + {Helper functions} + function WrapPointF(APyDelphiWrapper: TPyDelphiWrapper; const APoint : TPointF) : PPyObject; + function WrapSizeF(APyDelphiWrapper: TPyDelphiWrapper; const ASize : TSizeF) : PPyObject; + function WrapRectF(APyDelphiWrapper: TPyDelphiWrapper; const ARect : TRectF) : PPyObject; + function CheckPointFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TPointF): Boolean; + function CheckSizeFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TSizeF): Boolean; + function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TRectF): Boolean; +implementation +uses + System.Math, System.SysUtils; + +{ Register the wrappers, the globals and the constants } +type + TTypesRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TPyDelphiPointF } +function TPyDelphiPointF.Compare(obj: PPyObject): Integer; +var + _other : TPyDelphiPointF; +begin + if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then + begin + _other := TPyDelphiPointF(PythonToDelphi(obj)); + Result := CompareValue(Value.X, _other.Value.X); + if Result = 0 then + Result := CompareValue(Value.Y, _other.Value.Y); + end + else + Result := 1; +end; + +constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - x, y : single; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'ff:Create', @x, @y) <> 0 then - begin - FValue.X := x; - FValue.Y := y; - end -end; - -function TPyDelphiPointF.Get_X(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.X); -end; - -function TPyDelphiPointF.Get_Y(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Y); -end; - -class procedure TPyDelphiPointF.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do - begin - AddGetSet('X', @TPyDelphiPointF.Get_X, @TPyDelphiPointF.Set_X, - 'Provides access to the X coordinate of a pointf', nil); - AddGetSet('Y', @TPyDelphiPointF.Get_Y, @TPyDelphiPointF.Set_Y, - 'Provides access to the Y coordinate of a pointf', nil); - end; -end; - -function TPyDelphiPointF.Repr: PPyObject; -begin - Result := GetPythonEngine.PyUnicodeFromString(Format('', - [Value.X, Value.Y])); -end; - -class procedure TPyDelphiPointF.SetupType(PythonType: TPythonType); -begin - inherited; - PythonType.TypeName := 'PointF'; - PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; - PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; - PythonType.GenerateCreateFunction := False; - PythonType.DocString.Text := 'wrapper for Delphi FMX TPointF type'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; -end; - -function TPyDelphiPointF.Set_X(AValue: PPyObject; AContext: Pointer): integer; -var - x: double; -begin - if CheckFloatAttribute(AValue, 'X', x) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.X := x; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiPointF.Set_Y(AValue: PPyObject; AContext: Pointer): integer; -var - y: double; -begin - if CheckFloatAttribute(AValue, 'Y', y) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Y := y; - Result := 0; - end - else - Result := -1; -end; - -{ TTypesRegistration } - -procedure TTypesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TTypesRegistration.Name: string; -begin - Result := 'FMX Types'; -end; - -procedure TTypesRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterHelperType(TPyDelphiPointF); - APyDelphiWrapper.RegisterHelperType(TPyDelphiSizeF); - APyDelphiWrapper.RegisterHelperType(TPyDelphiRectF); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFmxObject); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPosition); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupMenu); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBounds); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControlSize); -end; - -{ Helper functions } -function WrapPointF(APyDelphiWrapper : TPyDelphiWrapper; const APoint : TPointF) : PPyObject; -var - _type : TPythonType; -begin - _type := APyDelphiWrapper.GetHelperType('PointFType'); - Result := _type.CreateInstance; - (PythonToDelphi(Result) as TPyDelphiPointF).Value := APoint; -end; - -function WrapSizeF(APyDelphiWrapper: TPyDelphiWrapper; const ASize : TSizeF) : PPyObject; -var - LType : TPythonType; -begin - LType := APyDelphiWrapper.GetHelperType('SizeFType'); - Result := LType.CreateInstance; - (PythonToDelphi(Result) as TPyDelphiSizeF).Value := ASize; -end; - -function WrapRectF(APyDelphiWrapper: TPyDelphiWrapper; const ARect : TRectF) : PPyObject; -var - LType : TPythonType; -begin - LType := APyDelphiWrapper.GetHelperType('RectFType'); - Result := LType.CreateInstance; - (PythonToDelphi(Result) as TPyDelphiRectF).Value := ARect; -end; - -function CheckPointFAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TPointF) : Boolean; -begin - with GetPythonEngine do - begin - if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiPointF) then - begin - AValue := TPyDelphiPointF(PythonToDelphi(AAttribute)).Value; - Result := True; - end - else - begin - Result := False; - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only PointF objects', [AAttributeName])))); - end; - end; -end; - -function CheckSizeFAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TSizeF) : Boolean; -begin - with GetPythonEngine do - begin - if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiSizeF) then - begin - AValue := TPyDelphiSizeF(PythonToDelphi(AAttribute)).Value; - Result := True; - end - else - begin - Result := False; - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only SizeF objects', [AAttributeName])))); - end; - end; -end; - -function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TRectF): Boolean; -begin - with GetPythonEngine do - begin - if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiRectF) then - begin - AValue := TPyDelphiRectF(PythonToDelphi(AAttribute)).Value; - Result := True; - end - else - begin - Result := False; - with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only RectF objects', [AAttributeName])))); - end; - end; -end; - -{ TPyDelphiFmxObject } - -class function TPyDelphiFmxObject.DelphiObjectClass: TClass; -begin - Result := TFmxObject; -end; - -function TPyDelphiFmxObject.GetDelphiObject: TFmxObject; -begin - Result := TFmxObject(inherited DelphiObject); -end; - -function TPyDelphiFmxObject.Get_Parent(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Wrap(DelphiObject.Parent); -end; - -class procedure TPyDelphiFmxObject.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - PythonType.AddGetSet('Parent', @TPyDelphiFmxObject.Get_Parent, @TPyDelphiFmxObject.Set_Parent, - 'Returns/Sets the Control Visibility', nil); -end; - -class procedure TPyDelphiFmxObject.RegisterMethods(PythonType: TPythonType); -begin - inherited; -end; - -procedure TPyDelphiFmxObject.SetDelphiObject(const Value: TFmxObject); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiFmxObject.Set_Parent(AValue: PPyObject; - AContext: Pointer): integer; -var - LObject : TObject; -begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Parent', TFmxObject, LObject) then - begin - Self.DelphiObject.Parent := TFmxObject(LObject); - Result := 0; - end - else - Result := -1; -end; - -{ TPyDelphiPosition } - -constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args, kwds: +var + x, y : single; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'ff:Create', @x, @y) <> 0 then + begin + FValue.X := x; + FValue.Y := y; + end +end; + +function TPyDelphiPointF.Get_X(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.X); +end; + +function TPyDelphiPointF.Get_Y(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Y); +end; + +class procedure TPyDelphiPointF.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + with PythonType do + begin + AddGetSet('X', @TPyDelphiPointF.Get_X, @TPyDelphiPointF.Set_X, + 'Provides access to the X coordinate of a pointf', nil); + AddGetSet('Y', @TPyDelphiPointF.Get_Y, @TPyDelphiPointF.Set_Y, + 'Provides access to the Y coordinate of a pointf', nil); + end; +end; + +function TPyDelphiPointF.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString(Format('', + [Value.X, Value.Y])); +end; + +class procedure TPyDelphiPointF.SetupType(PythonType: TPythonType); +begin + inherited; + PythonType.TypeName := 'PointF'; + PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; + PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; + PythonType.GenerateCreateFunction := False; + PythonType.DocString.Text := 'wrapper for Delphi FMX TPointF type'; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; +end; + +function TPyDelphiPointF.Set_X(AValue: PPyObject; AContext: Pointer): integer; +var + x: double; +begin + if CheckFloatAttribute(AValue, 'X', x) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.X := x; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiPointF.Set_Y(AValue: PPyObject; AContext: Pointer): integer; +var + y: double; +begin + if CheckFloatAttribute(AValue, 'Y', y) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Y := y; + Result := 0; + end + else + Result := -1; +end; + +{ TTypesRegistration } +procedure TTypesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TTypesRegistration.Name: string; +begin + Result := 'FMX Types'; +end; + +procedure TTypesRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterHelperType(TPyDelphiPointF); + APyDelphiWrapper.RegisterHelperType(TPyDelphiSizeF); + APyDelphiWrapper.RegisterHelperType(TPyDelphiRectF); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFmxObject); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPosition); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupMenu); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBounds); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControlSize); +end; + +{ Helper functions } +function WrapPointF(APyDelphiWrapper : TPyDelphiWrapper; const APoint : TPointF) : PPyObject; +var + _type : TPythonType; +begin + _type := APyDelphiWrapper.GetHelperType('PointFType'); + Result := _type.CreateInstance; + (PythonToDelphi(Result) as TPyDelphiPointF).Value := APoint; +end; + +function WrapSizeF(APyDelphiWrapper: TPyDelphiWrapper; const ASize : TSizeF) : PPyObject; +var + LType : TPythonType; +begin + LType := APyDelphiWrapper.GetHelperType('SizeFType'); + Result := LType.CreateInstance; + (PythonToDelphi(Result) as TPyDelphiSizeF).Value := ASize; +end; + +function WrapRectF(APyDelphiWrapper: TPyDelphiWrapper; const ARect : TRectF) : PPyObject; +var + LType : TPythonType; +begin + LType := APyDelphiWrapper.GetHelperType('RectFType'); + Result := LType.CreateInstance; + (PythonToDelphi(Result) as TPyDelphiRectF).Value := ARect; +end; + +function CheckPointFAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TPointF) : Boolean; +begin + with GetPythonEngine do + begin + if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiPointF) then + begin + AValue := TPyDelphiPointF(PythonToDelphi(AAttribute)).Value; + Result := True; + end + else + begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_AttributeError^, + PAnsiChar(AnsiString(Format('%s receives only PointF objects', [AAttributeName])))); + end; + end; +end; + +function CheckSizeFAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TSizeF) : Boolean; +begin + with GetPythonEngine do + begin + if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiSizeF) then + begin + AValue := TPyDelphiSizeF(PythonToDelphi(AAttribute)).Value; + Result := True; + end + else + begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_AttributeError^, + PAnsiChar(AnsiString(Format('%s receives only SizeF objects', [AAttributeName])))); + end; + end; +end; + +function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TRectF): Boolean; +begin + with GetPythonEngine do + begin + if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiRectF) then + begin + AValue := TPyDelphiRectF(PythonToDelphi(AAttribute)).Value; + Result := True; + end + else + begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_AttributeError^, + PAnsiChar(AnsiString(Format('%s receives only RectF objects', [AAttributeName])))); + end; + end; +end; + +{ TPyDelphiFmxObject } +class function TPyDelphiFmxObject.DelphiObjectClass: TClass; +begin + Result := TFmxObject; +end; + +function TPyDelphiFmxObject.GetDelphiObject: TFmxObject; +begin + Result := TFmxObject(inherited DelphiObject); +end; + +function TPyDelphiFmxObject.Get_Parent(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.Parent); +end; + +class procedure TPyDelphiFmxObject.RegisterGetSets(PythonType: TPythonType); +begin + PythonType.AddGetSet('Parent', @TPyDelphiFmxObject.Get_Parent, @TPyDelphiFmxObject.Set_Parent, + 'Returns/Sets the Control Visibility', nil); +end; + +class procedure TPyDelphiFmxObject.RegisterMethods(PythonType: TPythonType); +begin +end; + +procedure TPyDelphiFmxObject.SetDelphiObject(const Value: TFmxObject); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiFmxObject.Set_Parent(AValue: PPyObject; + AContext: Pointer): integer; +var + LObject : TObject; +begin + Adjust(@Self); + if CheckObjAttribute(AValue, 'Parent', TFmxObject, LObject) then + begin + Self.DelphiObject.Parent := TFmxObject(LObject); + Result := 0; + end + else + Result := -1; +end; + +{ TPyDelphiPosition } +constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - LPPosition: PPyObject; - LPointF: TPointF; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPPosition) <> 0 then - if CheckPointFAttribute(LPPosition, 'PointF', LPointF) then - DelphiObject := TPosition.Create(LPointF); -end; - -class function TPyDelphiPosition.DelphiObjectClass: TClass; -begin - Result := TPosition; -end; - -function TPyDelphiPosition.GetDelphiObject: TPosition; -begin - Result := TPosition(inherited DelphiObject); -end; - -function TPyDelphiPosition.Get_Point(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := WrapPointF(PyDelphiWrapper, DelphiObject.Point); -end; - -function TPyDelphiPosition.Get_X(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(DelphiObject.X); -end; - -function TPyDelphiPosition.Get_Y(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(DelphiObject.Y); -end; - -class procedure TPyDelphiPosition.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do begin - AddGetSet('X', @TPyDelphiPosition.Get_X, @TPyDelphiPosition.Set_X, - 'Provides access to the X coordinate of a control inside its parent', nil); - AddGetSet('Y', @TPyDelphiPosition.Get_Y, @TPyDelphiPosition.Set_Y, - 'Provides access to the Y coordinate of a control inside its parent', nil); - AddGetSet('Point', @TPyDelphiPosition.Get_Point, @TPyDelphiPosition.Set_Point, - 'Provides access to the position of a control inside its parent', nil); - end; -end; - -class procedure TPyDelphiPosition.RegisterMethods(PythonType: TPythonType); -begin - inherited; -end; - -procedure TPyDelphiPosition.SetDelphiObject(const Value: TPosition); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiPosition.Set_Point(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: TPointF; -begin - Adjust(@Self); - if CheckPointFAttribute(AValue, 'Point', LValue) then - begin - DelphiObject.Point := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiPosition.Set_X(AValue: PPyObject; AContext: Pointer): integer; -var - x: double; -begin - if CheckFloatAttribute(AValue, 'X', x) then - with GetPythonEngine do begin - Adjust(@Self); - DelphiObject.X := x; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiPosition.Set_Y(AValue: PPyObject; AContext: Pointer): integer; -var - y: double; -begin - if CheckFloatAttribute(AValue, 'Y', y) then - with GetPythonEngine do begin - Adjust(@Self); - DelphiObject.Y := y; - Result := 0; - end - else - Result := -1; -end; - -{ TPyDelphiSizeF } - -function TPyDelphiSizeF.Compare(obj: PPyObject): Integer; -var - LOther : TPyDelphiSizeF; -begin - if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then - begin - LOther := TPyDelphiSizeF(PythonToDelphi(obj)); - Result := CompareValue(Value.Width, LOther.Value.Width); - if Result = 0 then - Result := CompareValue(Value.Height, LOther.Value.Height); - end - else - Result := 1; -end; - -constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args, kwds: +var + LPPosition: PPyObject; + LPointF: TPointF; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPPosition) <> 0 then + if CheckPointFAttribute(LPPosition, 'PointF', LPointF) then + DelphiObject := TPosition.Create(LPointF); +end; + +class function TPyDelphiPosition.DelphiObjectClass: TClass; +begin + Result := TPosition; +end; + +function TPyDelphiPosition.GetDelphiObject: TPosition; +begin + Result := TPosition(inherited DelphiObject); +end; + +function TPyDelphiPosition.Get_Point(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := WrapPointF(PyDelphiWrapper, DelphiObject.Point); +end; + +function TPyDelphiPosition.Get_X(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(DelphiObject.X); +end; + +function TPyDelphiPosition.Get_Y(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(DelphiObject.Y); +end; + +class procedure TPyDelphiPosition.RegisterGetSets(PythonType: TPythonType); +begin + with PythonType do begin + AddGetSet('X', @TPyDelphiPosition.Get_X, @TPyDelphiPosition.Set_X, + 'Provides access to the X coordinate of a control inside its parent', nil); + AddGetSet('Y', @TPyDelphiPosition.Get_Y, @TPyDelphiPosition.Set_Y, + 'Provides access to the Y coordinate of a control inside its parent', nil); + AddGetSet('Point', @TPyDelphiPosition.Get_Point, @TPyDelphiPosition.Set_Point, + 'Provides access to the position of a control inside its parent', nil); + end; +end; + +class procedure TPyDelphiPosition.RegisterMethods(PythonType: TPythonType); +begin +end; + +procedure TPyDelphiPosition.SetDelphiObject(const Value: TPosition); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiPosition.Set_Point(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: TPointF; +begin + Adjust(@Self); + if CheckPointFAttribute(AValue, 'Point', LValue) then + begin + DelphiObject.Point := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiPosition.Set_X(AValue: PPyObject; AContext: Pointer): integer; +var + x: double; +begin + if CheckFloatAttribute(AValue, 'X', x) then + with GetPythonEngine do begin + Adjust(@Self); + DelphiObject.X := x; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiPosition.Set_Y(AValue: PPyObject; AContext: Pointer): integer; +var + y: double; +begin + if CheckFloatAttribute(AValue, 'Y', y) then + with GetPythonEngine do begin + Adjust(@Self); + DelphiObject.Y := y; + Result := 0; + end + else + Result := -1; +end; + +{ TPyDelphiSizeF } +function TPyDelphiSizeF.Compare(obj: PPyObject): Integer; +var + LOther : TPyDelphiSizeF; +begin + if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then + begin + LOther := TPyDelphiSizeF(PythonToDelphi(obj)); + Result := CompareValue(Value.Width, LOther.Value.Width); + if Result = 0 then + Result := CompareValue(Value.Height, LOther.Value.Height); + end + else + Result := 1; +end; + +constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - LWidth, LHeight : single; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'ff:Create', @LWidth, @LHeight) <> 0 then - begin - FValue.Width := LWidth; - FValue.Height := LHeight; - end -end; - -function TPyDelphiSizeF.Get_Height(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Height); -end; - -function TPyDelphiSizeF.Get_Width(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Width); -end; - -class procedure TPyDelphiSizeF.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do - begin - AddGetSet('Width', @TPyDelphiSizeF.Get_Width, @TPyDelphiSizeF.Set_Width, - 'Provides access to the width of a sizef', nil); - AddGetSet('Height', @TPyDelphiSizeF.Get_Height, @TPyDelphiSizeF.Set_Height, - 'Provides access to the height of a sizef', nil); - end; -end; - -function TPyDelphiSizeF.Repr: PPyObject; -begin - Result := GetPythonEngine.PyUnicodeFromString(Format('', - [Value.Width, Value.Height])); -end; - -class procedure TPyDelphiSizeF.SetupType(PythonType: TPythonType); -begin - inherited; - PythonType.TypeName := 'SizeF'; - PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; - PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; - PythonType.GenerateCreateFunction := False; - PythonType.DocString.Text := 'wrapper for Delphi FMX TSizeF type'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; -end; - -function TPyDelphiSizeF.Set_Height(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: double; -begin - if CheckFloatAttribute(AValue, 'Height', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Height := LValue; - Result := 0; - end - else - Result := -1; -end; -function TPyDelphiSizeF.Set_Width(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: double; -begin - if CheckFloatAttribute(AValue, 'Width', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Width := LValue; - Result := 0; - end - else - Result := -1; -end; -{ TPyDelphiCustomPopupMenu } - -class function TPyDelphiCustomPopupMenu.DelphiObjectClass: TClass; -begin - Result := TCustomPopupMenu; -end; - -function TPyDelphiCustomPopupMenu.GetDelphiObject: TCustomPopupMenu; -begin - Result := TCustomPopupMenu(inherited DelphiObject) -end; - -procedure TPyDelphiCustomPopupMenu.SetDelphiObject( - const Value: TCustomPopupMenu); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBounds } - -constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args, kwds: +var + LWidth, LHeight : single; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'ff:Create', @LWidth, @LHeight) <> 0 then + begin + FValue.Width := LWidth; + FValue.Height := LHeight; + end +end; + +function TPyDelphiSizeF.Get_Height(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Height); +end; + +function TPyDelphiSizeF.Get_Width(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Width); +end; + +class procedure TPyDelphiSizeF.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + with PythonType do + begin + AddGetSet('Width', @TPyDelphiSizeF.Get_Width, @TPyDelphiSizeF.Set_Width, + 'Provides access to the width of a sizef', nil); + AddGetSet('Height', @TPyDelphiSizeF.Get_Height, @TPyDelphiSizeF.Set_Height, + 'Provides access to the height of a sizef', nil); + end; +end; + +function TPyDelphiSizeF.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString(Format('', + [Value.Width, Value.Height])); +end; + +class procedure TPyDelphiSizeF.SetupType(PythonType: TPythonType); +begin + inherited; + PythonType.TypeName := 'SizeF'; + PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; + PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; + PythonType.GenerateCreateFunction := False; + PythonType.DocString.Text := 'wrapper for Delphi FMX TSizeF type'; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; +end; + +function TPyDelphiSizeF.Set_Height(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: double; +begin + if CheckFloatAttribute(AValue, 'Height', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Height := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiSizeF.Set_Width(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: double; +begin + if CheckFloatAttribute(AValue, 'Width', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Width := LValue; + Result := 0; + end + else + Result := -1; +end; + +{ TPyDelphiCustomPopupMenu } +class function TPyDelphiCustomPopupMenu.DelphiObjectClass: TClass; +begin + Result := TCustomPopupMenu; +end; + +function TPyDelphiCustomPopupMenu.GetDelphiObject: TCustomPopupMenu; +begin + Result := TCustomPopupMenu(inherited DelphiObject) +end; + +procedure TPyDelphiCustomPopupMenu.SetDelphiObject( + const Value: TCustomPopupMenu); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBounds } +constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - LPBounds: PPyObject; - LRectF: TRectF; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPBounds) <> 0 then - if CheckRectFAttribute(LPBounds, 'RectF', LRectF) then - DelphiObject := TBounds.Create(LRectF); -end; - -class function TPyDelphiBounds.DelphiObjectClass: TClass; -begin - Result := TBounds -end; - -function TPyDelphiBounds.GetDelphiObject: TBounds; -begin - Result := TBounds(inherited DelphiObject); -end; - -function TPyDelphiBounds.Get_Rect(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := WrapRectF(PyDelphiWrapper, DelphiObject.Rect); -end; - -class procedure TPyDelphiBounds.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do begin - AddGetSet('Rect', @TPyDelphiBounds.Get_Rect, @TPyDelphiBounds.Set_Rect, - 'Provides access to the rect of a control', nil); - end; -end; - -procedure TPyDelphiBounds.SetDelphiObject(const Value: TBounds); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiBounds.Set_Rect(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: TRectF; -begin - Adjust(@Self); - if CheckRectFAttribute(AValue, 'Rect', LValue) then - begin - DelphiObject.Rect := LValue; - Result := 0; - end - else - Result := -1; -end; - -{ TPyDelphiControlSize } - -constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args, +var + LPBounds: PPyObject; + LRectF: TRectF; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPBounds) <> 0 then + if CheckRectFAttribute(LPBounds, 'RectF', LRectF) then + DelphiObject := TBounds.Create(LRectF); +end; + +class function TPyDelphiBounds.DelphiObjectClass: TClass; +begin + Result := TBounds +end; + +function TPyDelphiBounds.GetDelphiObject: TBounds; +begin + Result := TBounds(inherited DelphiObject); +end; + +function TPyDelphiBounds.Get_Rect(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := WrapRectF(PyDelphiWrapper, DelphiObject.Rect); +end; + +class procedure TPyDelphiBounds.RegisterGetSets(PythonType: TPythonType); +begin + with PythonType do begin + AddGetSet('Rect', @TPyDelphiBounds.Get_Rect, @TPyDelphiBounds.Set_Rect, + 'Provides access to the rect of a control', nil); + end; +end; + +procedure TPyDelphiBounds.SetDelphiObject(const Value: TBounds); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiBounds.Set_Rect(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: TRectF; +begin + Adjust(@Self); + if CheckRectFAttribute(AValue, 'Rect', LValue) then + begin + DelphiObject.Rect := LValue; + Result := 0; + end + else + Result := -1; +end; + +{ TPyDelphiControlSize } +constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - LPControlSize: PPyObject; - LSizeF: TSizeF; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPControlSize) <> 0 then - if CheckSizeFAttribute(LPControlSize, 'SizeF', LSizeF) then - DelphiObject := TControlSize.Create(LSizeF); -end; - -class function TPyDelphiControlSize.DelphiObjectClass: TClass; -begin - Result := TControlSize; -end; - -function TPyDelphiControlSize.GetDelphiObject: TControlSize; -begin - Result := TControlSize(inherited DelphiObject); -end; - -function TPyDelphiControlSize.Get_SizeF(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := WrapSizeF(PyDelphiWrapper, DelphiObject.Size); -end; - -class procedure TPyDelphiControlSize.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do begin - AddGetSet('Size', @TPyDelphiControlSize.Get_SizeF, @TPyDelphiControlSize.Set_SizeF, - 'Provides access to the size of a control', nil); - end; -end; - -procedure TPyDelphiControlSize.SetDelphiObject(const Value: TControlSize); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiControlSize.Set_SizeF(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: TSizeF; -begin - Adjust(@Self); - if CheckSizeFAttribute(AValue, 'Size', LValue) then - begin - DelphiObject.Size := LValue; - Result := 0; - end - else - Result := -1; -end; - -{ TPyDelphiRectF } - -function TPyDelphiRectF.Compare(obj: PPyObject): Integer; -var - LOther : TPyDelphiRectF; -begin - if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then - begin - LOther := TPyDelphiRectF(PythonToDelphi(obj)); - Result := CompareValue(Value.Left, LOther.Value.Left) - and CompareValue(Value.Top, LOther.Value.Top) - and CompareValue(Value.Right, LOther.Value.Right) - and CompareValue(Value.Bottom, LOther.Value.Bottom); - end - else - Result := 1; -end; - -constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args, kwds: +var + LPControlSize: PPyObject; + LSizeF: TSizeF; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPControlSize) <> 0 then + if CheckSizeFAttribute(LPControlSize, 'SizeF', LSizeF) then + DelphiObject := TControlSize.Create(LSizeF); +end; + +class function TPyDelphiControlSize.DelphiObjectClass: TClass; +begin + Result := TControlSize; +end; + +function TPyDelphiControlSize.GetDelphiObject: TControlSize; +begin + Result := TControlSize(inherited DelphiObject); +end; + +function TPyDelphiControlSize.Get_SizeF(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := WrapSizeF(PyDelphiWrapper, DelphiObject.Size); +end; + +class procedure TPyDelphiControlSize.RegisterGetSets(PythonType: TPythonType); +begin + with PythonType do begin + AddGetSet('Size', @TPyDelphiControlSize.Get_SizeF, @TPyDelphiControlSize.Set_SizeF, + 'Provides access to the size of a control', nil); + end; +end; + +procedure TPyDelphiControlSize.SetDelphiObject(const Value: TControlSize); +begin + inherited DelphiObject := Value; +end; +function TPyDelphiControlSize.Set_SizeF(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: TSizeF; +begin + Adjust(@Self); + if CheckSizeFAttribute(AValue, 'Size', LValue) then + begin + DelphiObject.Size := LValue; + Result := 0; + end + else + Result := -1; +end; + +{ TPyDelphiRectF } +function TPyDelphiRectF.Compare(obj: PPyObject): Integer; +var + LOther : TPyDelphiRectF; +begin + if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then + begin + LOther := TPyDelphiRectF(PythonToDelphi(obj)); + Result := CompareValue(Value.Left, LOther.Value.Left) + and CompareValue(Value.Top, LOther.Value.Top) + and CompareValue(Value.Right, LOther.Value.Right) + and CompareValue(Value.Bottom, LOther.Value.Bottom); + end + else + Result := 1; +end; + +constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - LLeft, LTop, LRight, LBottom : single; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'ffff:Create', @LLeft, @LTop, @LRight, @LBottom) <> 0 then - begin - FValue.Left := LLeft; - FValue.Top := LTop; - FValue.Right := LRight; - FValue.Bottom := LBottom; - end -end; - -function TPyDelphiRectF.Get_Bottom(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Bottom); -end; - -function TPyDelphiRectF.Get_Left(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Left); -end; - -function TPyDelphiRectF.Get_Right(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Right); -end; - -function TPyDelphiRectF.Get_Top(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyFloat_FromDouble(Value.Top); -end; - -class procedure TPyDelphiRectF.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do - begin - AddGetSet('Left', @TPyDelphiRectF.Get_Left, @TPyDelphiRectF.Set_Left, - 'Provides access to the left of a rectf', nil); - AddGetSet('Top', @TPyDelphiRectF.Get_Top, @TPyDelphiRectF.Set_Top, - 'Provides access to the top of a rectf', nil); - AddGetSet('Right', @TPyDelphiRectF.Get_Right, @TPyDelphiRectF.Set_Right, - 'Provides access to the right of a rectf', nil); - AddGetSet('Bottom', @TPyDelphiRectF.Get_Bottom, @TPyDelphiRectF.Set_Bottom, - 'Provides access to the bottom of a rectf', nil); - end; -end; - -function TPyDelphiRectF.Repr: PPyObject; -begin - Result := GetPythonEngine.PyUnicodeFromString(Format('', - [Value.Left, Value.Top, Value.Right, Value.Bottom])); -end; - -class procedure TPyDelphiRectF.SetupType(PythonType: TPythonType); -begin - inherited; - PythonType.TypeName := 'RectF'; - PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; - PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; - PythonType.GenerateCreateFunction := False; - PythonType.DocString.Text := 'wrapper for Delphi FMX TRectF type'; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; -end; - -function TPyDelphiRectF.Set_Bottom(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: double; -begin - if CheckFloatAttribute(AValue, 'Bottom', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Bottom := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiRectF.Set_Left(AValue: PPyObject; AContext: Pointer): integer; -var - LValue: double; -begin - if CheckFloatAttribute(AValue, 'Left', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Left := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiRectF.Set_Right(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: double; -begin - if CheckFloatAttribute(AValue, 'Right', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Right := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiRectF.Set_Top(AValue: PPyObject; AContext: Pointer): integer; -var - LValue: double; -begin - if CheckFloatAttribute(AValue, 'Top', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Top := LValue; - Result := 0; - end - else - Result := -1; -end; - -initialization - RegisteredUnits.Add(TTypesRegistration.Create); - -end. +var + LLeft, LTop, LRight, LBottom : single; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'ffff:Create', @LLeft, @LTop, @LRight, @LBottom) <> 0 then + begin + FValue.Left := LLeft; + FValue.Top := LTop; + FValue.Right := LRight; + FValue.Bottom := LBottom; + end +end; + +function TPyDelphiRectF.Get_Bottom(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Bottom); +end; + +function TPyDelphiRectF.Get_Left(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Left); +end; + +function TPyDelphiRectF.Get_Right(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Right); +end; + +function TPyDelphiRectF.Get_Top(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyFloat_FromDouble(Value.Top); +end; + +class procedure TPyDelphiRectF.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + with PythonType do + begin + AddGetSet('Left', @TPyDelphiRectF.Get_Left, @TPyDelphiRectF.Set_Left, + 'Provides access to the left of a rectf', nil); + AddGetSet('Top', @TPyDelphiRectF.Get_Top, @TPyDelphiRectF.Set_Top, + 'Provides access to the top of a rectf', nil); + AddGetSet('Right', @TPyDelphiRectF.Get_Right, @TPyDelphiRectF.Set_Right, + 'Provides access to the right of a rectf', nil); + AddGetSet('Bottom', @TPyDelphiRectF.Get_Bottom, @TPyDelphiRectF.Set_Bottom, + 'Provides access to the bottom of a rectf', nil); + end; +end; + +function TPyDelphiRectF.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString(Format('', + [Value.Left, Value.Top, Value.Right, Value.Bottom])); +end; + +class procedure TPyDelphiRectF.SetupType(PythonType: TPythonType); +begin + inherited; + PythonType.TypeName := 'RectF'; + PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; + PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; + PythonType.GenerateCreateFunction := False; + PythonType.DocString.Text := 'wrapper for Delphi FMX TRectF type'; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; +end; + +function TPyDelphiRectF.Set_Bottom(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: double; +begin + if CheckFloatAttribute(AValue, 'Bottom', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Bottom := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiRectF.Set_Left(AValue: PPyObject; AContext: Pointer): integer; +var + LValue: double; +begin + if CheckFloatAttribute(AValue, 'Left', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Left := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiRectF.Set_Right(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: double; +begin + if CheckFloatAttribute(AValue, 'Right', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Right := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiRectF.Set_Top(AValue: PPyObject; AContext: Pointer): integer; +var + LValue: double; +begin + if CheckFloatAttribute(AValue, 'Top', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Top := LValue; + Result := 0; + end + else + Result := -1; +end; + +initialization + RegisteredUnits.Add(TTypesRegistration.Create); +end. diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index 8dfec06b..aec2033b 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -408,7 +408,6 @@ function TPyDelphiPageControl.IndexOfTabAt_Wrapper( class procedure TPyDelphiPageControl.RegisterGetSets( PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('ActivePage', @TPyDelphiPageControl.Get_ActivePage, @TPyDelphiPageControl.Set_ActivePage, 'Specifies the page currently displayed by the page control.', nil); PythonType.AddGetSet('ActivePageIndex', @TPyDelphiPageControl.Get_ActivePageIndex, @TPyDelphiPageControl.Set_ActivePageIndex, @@ -430,7 +429,6 @@ class procedure TPyDelphiPageControl.RegisterGetSets( class procedure TPyDelphiPageControl.RegisterMethods( PythonType: TPythonType); begin - inherited; {$IFNDEF FPC} PythonType.AddMethod('IndexOfTabAt', @TPyDelphiPageControl.IndexOfTabAt_Wrapper, 'TPageControl.IndexOfTabAt()'#10 + @@ -834,7 +832,6 @@ function TPyDelphiToolbar.Get_ButtonCount(AContext: Pointer): PPyObject; class procedure TPyDelphiToolbar.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('ButtonCount', @TPyDelphiToolbar.Get_ButtonCount, nil, diff --git a/Source/vcl/WrapVclControls.pas b/Source/vcl/WrapVclControls.pas index 21310b5d..07494a3d 100644 --- a/Source/vcl/WrapVclControls.pas +++ b/Source/vcl/WrapVclControls.pas @@ -295,14 +295,12 @@ function TPyDelphiControl.Invalidate_Wrapper(args: PPyObject): PPyObject; class procedure TPyDelphiControl.RegisterGetSets(PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('Parent', @TPyDelphiControl.Get_Parent, @TPyDelphiControl.Set_Parent, 'Returns/Sets the Control Parent', nil); end; class procedure TPyDelphiControl.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Show', @TPyDelphiControl.Show_Wrapper, 'TControl.Show()'#10 + 'Shows the wrapped Control'); @@ -589,7 +587,6 @@ function TPyDelphiWinControl.Get_Showing(AContext: Pointer): PPyObject; class procedure TPyDelphiWinControl.RegisterGetSets( PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('ControlCount', @TPyDelphiWinControl.Get_ControlCount, nil, 'Returns the count of contained controls', nil); PythonType.AddGetSet('Controls', @TPyDelphiWinControl.Get_Controls, nil, @@ -609,7 +606,6 @@ class procedure TPyDelphiWinControl.RegisterGetSets( class procedure TPyDelphiWinControl.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('CanFocus', @TPyDelphiWinControl.CanFocus_Wrapper, 'TWinControl.CanFocus()'#10 + 'Indicates whether a control can receive focus. '); diff --git a/Source/vcl/WrapVclDialogs.pas b/Source/vcl/WrapVclDialogs.pas index cfedc8dd..1e37942b 100644 --- a/Source/vcl/WrapVclDialogs.pas +++ b/Source/vcl/WrapVclDialogs.pas @@ -148,14 +148,12 @@ function TPyDelphiOpenDialog.Get_filename(AContext: Pointer): PPyObject; class procedure TPyDelphiOpenDialog.RegisterGetSets(PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('FileName', @TPyDelphiOpenDialog.Get_filename, nil, '', nil); end; class procedure TPyDelphiOpenDialog.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Execute', @TPyDelphiOpenDialog.Execute_Wrapper, 'TOpenDialog.Execute()'#10 + 'Displays the dialog'); @@ -199,7 +197,6 @@ function TPyDelphiFileOpenDialog.Get_filename(AContext: Pointer): PPyObject; class procedure TPyDelphiFileOpenDialog.RegisterGetSets( PythonType: TPythonType); begin - inherited; PythonType.AddGetSet('FileName', @TPyDelphiFileOpenDialog.Get_filename, nil, '', nil); end; @@ -207,7 +204,6 @@ class procedure TPyDelphiFileOpenDialog.RegisterGetSets( class procedure TPyDelphiFileOpenDialog.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Execute', @TPyDelphiFileOpenDialog.Execute_Wrapper, 'TFileOpenDialog.Execute()'#10 + 'Displays the dialog'); diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index d40e9ef9..cd9bd33a 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -1,4 +1,4 @@ -{$I ..\Definition.Inc} +{$I ..\Definition.Inc} unit WrapVclForms; @@ -529,7 +529,6 @@ procedure TPyDelphiCustomForm.SetDelphiObject(const Value: TCustomForm); class procedure TPyDelphiCustomForm.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('ModalResult', @TPyDelphiCustomForm.Get_ModalResult, @TPyDelphiCustomForm.Set_ModalResult, @@ -539,7 +538,6 @@ class procedure TPyDelphiCustomForm.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiCustomForm.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Close', @TPyDelphiCustomForm.Close_Wrapper, 'TForm.Close()'#10 + 'Closes the wrapped Form'); @@ -1019,7 +1017,6 @@ function TPyDelphiScreen.ResetFonts_Wrapper(args: PPyObject): PPyObject; class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('ActiveControl', @TPyDelphiScreen.Get_ActiveControl, nil, @@ -1103,7 +1100,6 @@ class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiScreen.RegisterMethods(PythonType: TPythonType); begin - inherited; {$IFNDEF FPC} PythonType.AddMethod('DisableAlign', @TPyDelphiScreen.DisableAlign_Wrapper, 'TScreen.DisableAlign()'#10 + @@ -1400,7 +1396,6 @@ function TPyDelphiMonitor.GetDelphiObject: TMonitor; class procedure TPyDelphiMonitor.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Handle', @TPyDelphiMonitor.Get_Handle, nil, @@ -1769,7 +1764,6 @@ function TPyDelphiApplication.ProcessMessages_Wrapper( class procedure TPyDelphiApplication.RegisterGetSets( PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Active', @TPyDelphiApplication.Get_Active, nil, @@ -1836,7 +1830,6 @@ class procedure TPyDelphiApplication.RegisterGetSets( class procedure TPyDelphiApplication.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('ActivateHint', @TPyDelphiApplication.ActivateHint_Wrapper, 'TApplication.ActivateHint()'#10 + 'Displays a hint window for the control at a specified position.'); diff --git a/Source/vcl/WrapVclGraphics.pas b/Source/vcl/WrapVclGraphics.pas index a3330d09..55f7b2d7 100644 --- a/Source/vcl/WrapVclGraphics.pas +++ b/Source/vcl/WrapVclGraphics.pas @@ -485,7 +485,6 @@ function TPyDelphiGraphic.LoadFromStream_Wrapper( class procedure TPyDelphiGraphic.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Empty', @TPyDelphiGraphic.Get_Empty, nil, @@ -507,7 +506,6 @@ class procedure TPyDelphiGraphic.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiGraphic.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('LoadFromFile', @TPyDelphiGraphic.LoadFromFile_Wrapper, 'TGraphic.LoadFromFile()'#10 + ''); @@ -889,7 +887,6 @@ function TPyDelphiBitmap.Mask_Wrapper(args: PPyObject): PPyObject; class procedure TPyDelphiBitmap.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Canvas', @TPyDelphiBitmap.Get_Canvas, nil, @@ -919,7 +916,6 @@ class procedure TPyDelphiBitmap.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiBitmap.RegisterMethods(PythonType: TPythonType); begin - inherited; {$IFNDEF FPC} PythonType.AddMethod('Dormant', @TPyDelphiBitmap.Dormant_Wrapper, 'TBitmap.Dormant()'#10 + @@ -1767,7 +1763,6 @@ function TPyDelphiCanvas.Refresh_Wrapper(args: PPyObject): PPyObject; class procedure TPyDelphiCanvas.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('HandleAllocated', @TPyDelphiCanvas.Get_HandleAllocated, nil, @@ -1797,7 +1792,6 @@ class procedure TPyDelphiCanvas.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiCanvas.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Arc', @TPyDelphiCanvas.Arc_Wrapper, 'TCanvas.Arc()'#10 + ''); @@ -2218,7 +2212,6 @@ function TPyDelphiMetaFile.Get_MMWidth(AContext: Pointer): PPyObject; class procedure TPyDelphiMetaFile.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('CreatedBy', @TPyDelphiMetaFile.Get_CreatedBy, nil, @@ -2242,7 +2235,6 @@ class procedure TPyDelphiMetaFile.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiMetaFile.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('Clear', @TPyDelphiMetaFile.Clear_Wrapper, 'TMetaFile.Clear()'#10 + ''); @@ -2373,7 +2365,6 @@ function TPyDelphiIcon.Get_HandleAllocated(AContext: Pointer): PPyObject; class procedure TPyDelphiIcon.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Handle', @TPyDelphiIcon.Get_Handle, @TPyDelphiIcon.Set_Handle, @@ -2385,7 +2376,6 @@ class procedure TPyDelphiIcon.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiIcon.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('ReleaseHandle', @TPyDelphiIcon.ReleaseHandle_Wrapper, 'TIcon.ReleaseHandle()'#10 + ''); @@ -2494,7 +2484,6 @@ function TPyDelphiPicture.LoadFromFile_Wrapper(args: PPyObject): PPyObject; class procedure TPyDelphiPicture.RegisterGetSets(PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Bitmap', @TPyDelphiPicture.Get_Bitmap, @TPyDelphiPicture.Set_Bitmap, @@ -2516,7 +2505,6 @@ class procedure TPyDelphiPicture.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiPicture.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('LoadFromFile', @TPyDelphiPicture.LoadFromFile_Wrapper, 'TPicture.LoadFromFile()'#10 + ''); diff --git a/Source/vcl/WrapVclGrids.pas b/Source/vcl/WrapVclGrids.pas index 8daa885d..46410f66 100644 --- a/Source/vcl/WrapVclGrids.pas +++ b/Source/vcl/WrapVclGrids.pas @@ -518,7 +518,6 @@ class function TPyDelphiCustomDrawGrid.GetTypeName : string; class procedure TPyDelphiCustomDrawGrid.RegisterGetSets( PythonType: TPythonType); begin - inherited; with PythonType do begin AddGetSet('Canvas', @TPyDelphiCustomDrawGrid.Get_Canvas, nil, @@ -678,7 +677,6 @@ function TPyDelphiStringGrid.GetDelphiObject: TStringGrid; class procedure TPyDelphiStringGrid.RegisterMethods( PythonType : TPythonType ); begin - inherited; PythonType.AddMethod('GetCell', @TPyDelphiStringGrid.GetCell, 'TStringGrid.GetCell(col, row)'#10 + 'Returns the content of a cell'); diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index 381af5ab..01157a2d 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -1,518 +1,497 @@ -{$I ..\Definition.Inc} -unit WrapVclThemes; - -interface - -uses - PythonEngine, WrapDelphi, Vcl.Themes, Vcl.Styles; - -type - TPyDelphiStyleInfo = class(TPyObject) - private - FValue: TStyleInfo; - protected - // Exposed Getters - function Get_Name(Acontext: Pointer): PPyObject; cdecl; - function Get_Author(Acontext: Pointer): PPyObject; cdecl; - function Get_AuthorEMail(Acontext: Pointer): PPyObject; cdecl; - function Get_AuthorUrl(Acontext: Pointer): PPyObject; cdecl; - function Get_Version(Acontext: Pointer): PPyObject; cdecl; - // Exposed Setters - function Set_Name(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; - function Set_Author(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; - function Set_AuthorEMail(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; - function Set_AuthorUrl(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; - function Set_Version(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - - function Compare(AObj: PPyObject) : Integer; override; - function Repr: PPyObject; override; - - class procedure RegisterGetSets(APythonType: TPythonType ); override; - class procedure SetupType(APythonType: TPythonType ); override; - - property Value: TStyleInfo read fValue write fValue; - end; - - TPyDelphiCustomStyleServices = class(TPyDelphiObject) - private - function GetDelphiObject: TCustomStyleServices; - procedure SetDelphiObject(const Value: TCustomStyleServices); - public - constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - - class function DelphiObjectClass : TClass; override; - class procedure RegisterMethods( PythonType : TPythonType ); override; - // Properties - property DelphiObject: TCustomStyleServices read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiStyleManager = class(TPyDelphiObject) - private - function GetDelphiObject: TStyleManager; - procedure SetDelphiObject(const Value: TStyleManager); - protected - function Get_StyleNames(AContext: Pointer): PPyObject; cdecl; - function Get_ActiveStyle(AContext: Pointer): PPyObject; cdecl; - // Exposed Methods - function LoadFromFileName_Wrapper(AArgs: PPyObject): PPyObject; cdecl; - function IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; cdecl; - public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; - - class function DelphiObjectClass : TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods(PythonType: TPythonType); override; - - property DelphiObject: TStyleManager read GetDelphiObject write SetDelphiObject; - end; - - TStyleManagerStyleNamesAccess = class(TContainerAccess) - private - function GetContainer: TStyleManager; - public - class function ExpectedContainerClass: TClass; override; - class function Name: string; override; - - function GetItem(AIndex: Integer): PPyObject; override; - function GetSize: Integer; override; - - property Container : TStyleManager read GetContainer; - end; - - { Helper functions } - function WrapStyleInfo(APyDelphiWrapper: TPyDelphiWrapper; [ref] AStyleInfo: TStyleInfo): PPyObject; - -implementation - -uses - System.SysUtils, Vcl.Controls, MethodCallBack; - -{ Global Functions } - -function StyleServices_Wrapper(pself, args: PPyObject): PPyObject; cdecl; -var - LPyObj: PPyObject; - LControl: TControl; -begin - LControl := nil; - with GetPythonEngine do - begin - if PyTuple_Check(args) then begin - if PyTuple_Size(args) = 0 then - Result := GlobalDelphiWrapper.Wrap(StyleServices()) -{$IF CompilerVersion > 33} - else if (PyArg_ParseTuple(args, 'O:StyleServices', @LPyObj) <> 0) - and CheckObjAttribute(LPyObj, 'AControl', TControl, TObject(LControl)) - then - Result := GlobalDelphiWrapper.Wrap(StyleServices(LControl)) -{$IFEND} - else - Result := nil; - end else - Result := nil; - end; -end; - -{ Helper functions } - -function WrapStyleInfo(APyDelphiWrapper: TPyDelphiWrapper; [ref] AStyleInfo: TStyleInfo) : PPyObject; -var - LType: TPythonType; -begin - LType := APyDelphiWrapper.GetHelperType('StyleInfoType'); - Result := LType.CreateInstance(); - (PythonToDelphi(Result) as TPyDelphiStyleInfo).Value := AStyleInfo; -end; - -{ Register the wrappers, the globals and the constants } -type - TVclThemesRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineFunctions(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TVclThemesRegistration } - -procedure TVclThemesRegistration.DefineFunctions( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterFunction(PAnsiChar('StyleServices'), - StyleServices_Wrapper, - PAnsiChar('StyleServices_Wrapper()'#10 + - 'Get a StyleServices instance.')); -end; - -procedure TVclThemesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TVclThemesRegistration.Name: string; -begin - Result := 'VclThemes'; -end; - -procedure TVclThemesRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleManager); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStyleServices); - APyDelphiWrapper.RegisterHelperType(TPyDelphiStyleInfo); -end; - -{ TPyDelphiStyleManager } - -constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, +{$I ..\Definition.Inc} +unit WrapVclThemes; + +interface + +uses + PythonEngine, WrapDelphi, Vcl.Themes, Vcl.Styles; + + type + TPyDelphiStyleInfo = class(TPyObject) + private + FValue: TStyleInfo; + protected + // Exposed Getters + function Get_Name(Acontext: Pointer): PPyObject; cdecl; + function Get_Author(Acontext: Pointer): PPyObject; cdecl; + function Get_AuthorEMail(Acontext: Pointer): PPyObject; cdecl; + function Get_AuthorUrl(Acontext: Pointer): PPyObject; cdecl; + function Get_Version(Acontext: Pointer): PPyObject; cdecl; + // Exposed Setters + function Set_Name(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; + function Set_Author(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; + function Set_AuthorEMail(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; + function Set_AuthorUrl(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; + function Set_Version(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + function Compare(AObj: PPyObject) : Integer; override; + function Repr: PPyObject; override; + class procedure RegisterGetSets(APythonType: TPythonType ); override; + class procedure SetupType(APythonType: TPythonType ); override; + property Value: TStyleInfo read fValue write fValue; + end; + + TPyDelphiCustomStyleServices = class(TPyDelphiObject) + private + function GetDelphiObject: TCustomStyleServices; + procedure SetDelphiObject(const Value: TCustomStyleServices); + public + constructor Create( APythonType : TPythonType ); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass : TClass; override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + // Properties + property DelphiObject: TCustomStyleServices read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStyleManager = class(TPyDelphiObject) + private + function GetDelphiObject: TStyleManager; + procedure SetDelphiObject(const Value: TStyleManager); + protected + function Get_StyleNames(AContext: Pointer): PPyObject; cdecl; + function Get_ActiveStyle(AContext: Pointer): PPyObject; cdecl; + // Exposed Methods + function LoadFromFileName_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + function IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + class function DelphiObjectClass : TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + property DelphiObject: TStyleManager read GetDelphiObject write SetDelphiObject; + end; + + TStyleManagerStyleNamesAccess = class(TContainerAccess) + private + function GetContainer: TStyleManager; + public + class function ExpectedContainerClass: TClass; override; + class function Name: string; override; + function GetItem(AIndex: Integer): PPyObject; override; + function GetSize: Integer; override; + property Container : TStyleManager read GetContainer; + end; + +{ Helper functions } +function WrapStyleInfo(APyDelphiWrapper: TPyDelphiWrapper; [ref] AStyleInfo: TStyleInfo): PPyObject; + +implementation + +uses + System.SysUtils, Vcl.Controls, MethodCallBack; + +{ Global Functions } +function StyleServices_Wrapper(pself, args: PPyObject): PPyObject; cdecl; +var + LPyObj: PPyObject; + LControl: TControl; +begin + LControl := nil; + with GetPythonEngine do + begin + if PyTuple_Check(args) then begin + if PyTuple_Size(args) = 0 then + Result := GlobalDelphiWrapper.Wrap(StyleServices()) +{$IF CompilerVersion > 33} + else if (PyArg_ParseTuple(args, 'O:StyleServices', @LPyObj) <> 0) + and CheckObjAttribute(LPyObj, 'AControl', TControl, TObject(LControl)) + then + Result := GlobalDelphiWrapper.Wrap(StyleServices(LControl)) +{$IFEND} + else + Result := nil; + end else + Result := nil; + end; +end; + +{ Helper functions } +function WrapStyleInfo(APyDelphiWrapper: TPyDelphiWrapper; [ref] AStyleInfo: TStyleInfo) : PPyObject; +var + LType: TPythonType; +begin + LType := APyDelphiWrapper.GetHelperType('StyleInfoType'); + Result := LType.CreateInstance(); + (PythonToDelphi(Result) as TPyDelphiStyleInfo).Value := AStyleInfo; +end; + +{ Register the wrappers, the globals and the constants } +type + TVclThemesRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineFunctions(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + + { TVclThemesRegistration } +procedure TVclThemesRegistration.DefineFunctions( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterFunction(PAnsiChar('StyleServices'), + StyleServices_Wrapper, + PAnsiChar('StyleServices_Wrapper()'#10 + + 'Get a StyleServices instance.')); +end; + +procedure TVclThemesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TVclThemesRegistration.Name: string; +begin + Result := 'VclThemes'; +end; + +procedure TVclThemesRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleManager); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStyleServices); + APyDelphiWrapper.RegisterHelperType(TPyDelphiStyleInfo); +end; + +{ TPyDelphiStyleManager } +constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -begin - inherited; - DelphiObject := TStyleManager.Create(); -end; - -class function TPyDelphiStyleManager.DelphiObjectClass: TClass; -begin - Result := TStyleManager; -end; - -function TPyDelphiStyleManager.GetDelphiObject: TStyleManager; -begin - Result := TStyleManager(inherited DelphiObject); -end; - -function TPyDelphiStyleManager.Get_ActiveStyle( - AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Wrap(DelphiObject.ActiveStyle); -end; - -function TPyDelphiStyleManager.Get_StyleNames(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, - TStyleManagerStyleNamesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); -end; - -function TPyDelphiStyleManager.IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; -var - LFileName: PAnsiChar; - LIsValid: Boolean; - LStyleInfo: TStyleInfo; -begin - Adjust(@Self); - with GetPythonEngine do - begin - if PyArg_ParseTuple(AArgs, 's:IsValidStyle', @LFileName) <> 0 then - begin - LIsValid := TStyleManager.IsValidStyle(string(LFileName), LStyleInfo); - Result := PyTuple_New(2); - PyTuple_SetItem(Result, 0, PyBool_FromLong(Ord(LIsValid))); - PyTuple_SetItem(Result, 1, WrapStyleInfo(PyDelphiWrapper, LStyleInfo)); - end else - Result := nil; - end; -end; - -function TPyDelphiStyleManager.LoadFromFileName_Wrapper( - AArgs: PPyObject): PPyObject; -var - LFileName: PAnsiChar; -begin - with GetPythonEngine do - begin - if PyArg_ParseTuple(AArgs, 's:LoadFromFile', @LFileName) <> 0 then - begin - TStyleManager.LoadFromFile(string(LFileName)); - Result := GetPythonEngine().ReturnNone(); - end else - Result := nil; - end; -end; - -class procedure TPyDelphiStyleManager.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - with PythonType do begin - AddGetSet('StyleNames', @TPyDelphiStyleManager.Get_StyleNames, nil, - 'Provides access to the VCL style names.', nil); - AddGetSet('ActiveStyle', @TPyDelphiStyleManager.Get_ActiveStyle, nil, - 'Returns the current style.', nil); - end; -end; - -class procedure TPyDelphiStyleManager.RegisterMethods(PythonType: TPythonType); -begin - inherited; - PythonType.AddMethod('LoadFromFile', @TPyDelphiStyleManager.LoadFromFileName_Wrapper, - 'TStyleManager.LoadFromFile()'#10 + - 'Loads a VCL style from a file'); - PythonType.AddMethod('IsValidStyle', @TPyDelphiStyleManager.IsValidStyle_Wrapper, - 'TStyleManager.IsValidStyle()'#10 + - 'Check if a Vcl Style file is valid'); -end; - -procedure TPyDelphiStyleManager.SetDelphiObject(const Value: TStyleManager); -begin - inherited DelphiObject := Value; -end; - -{ TStyleManagerStyleNamesAccess } - -class function TStyleManagerStyleNamesAccess.ExpectedContainerClass: TClass; -begin - Result := TStyleManager; -end; - -function TStyleManagerStyleNamesAccess.GetContainer: TStyleManager; -begin - Result := TStyleManager(inherited Container); -end; - -function TStyleManagerStyleNamesAccess.GetItem(AIndex: Integer): PPyObject; -begin - Result := GetPythonEngine().PyUnicodeFromString(Container.StyleNames[AIndex]); -end; - -function TStyleManagerStyleNamesAccess.GetSize: Integer; -begin - Result := Length(Container.StyleNames); -end; - -class function TStyleManagerStyleNamesAccess.Name: string; -begin - Result := 'TStyleManager.StyleNames'; -end; - -{ TPyDelphiStyleInfo } - -constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args, kwds: +begin + inherited; + DelphiObject := TStyleManager.Create(); +end; + +class function TPyDelphiStyleManager.DelphiObjectClass: TClass; +begin + Result := TStyleManager; +end; + +function TPyDelphiStyleManager.GetDelphiObject: TStyleManager; +begin + Result := TStyleManager(inherited DelphiObject); +end; + +function TPyDelphiStyleManager.Get_ActiveStyle( + AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.ActiveStyle); +end; + +function TPyDelphiStyleManager.Get_StyleNames(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, + TStyleManagerStyleNamesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); +end; + +function TPyDelphiStyleManager.IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; +var + LFileName: PAnsiChar; + LIsValid: Boolean; + LStyleInfo: TStyleInfo; +begin + Adjust(@Self); + with GetPythonEngine do + begin + if PyArg_ParseTuple(AArgs, 's:IsValidStyle', @LFileName) <> 0 then + begin + LIsValid := TStyleManager.IsValidStyle(string(LFileName), LStyleInfo); + Result := PyTuple_New(2); + PyTuple_SetItem(Result, 0, PyBool_FromLong(Ord(LIsValid))); + PyTuple_SetItem(Result, 1, WrapStyleInfo(PyDelphiWrapper, LStyleInfo)); + end else + Result := nil; + end; +end; + +function TPyDelphiStyleManager.LoadFromFileName_Wrapper( + AArgs: PPyObject): PPyObject; +var + LFileName: PAnsiChar; +begin + with GetPythonEngine do + begin + if PyArg_ParseTuple(AArgs, 's:LoadFromFile', @LFileName) <> 0 then + begin + TStyleManager.LoadFromFile(string(LFileName)); + Result := GetPythonEngine().ReturnNone(); + end else + Result := nil; + end; +end; + +class procedure TPyDelphiStyleManager.RegisterGetSets(PythonType: TPythonType); +begin + with PythonType do begin + AddGetSet('StyleNames', @TPyDelphiStyleManager.Get_StyleNames, nil, + 'Provides access to the VCL style names.', nil); + AddGetSet('ActiveStyle', @TPyDelphiStyleManager.Get_ActiveStyle, nil, + 'Returns the current style.', nil); + end; +end; + +class procedure TPyDelphiStyleManager.RegisterMethods(PythonType: TPythonType); +begin + PythonType.AddMethod('LoadFromFile', @TPyDelphiStyleManager.LoadFromFileName_Wrapper, + 'TStyleManager.LoadFromFile()'#10 + + 'Loads a VCL style from a file'); + PythonType.AddMethod('IsValidStyle', @TPyDelphiStyleManager.IsValidStyle_Wrapper, + 'TStyleManager.IsValidStyle()'#10 + + 'Check if a Vcl Style file is valid'); +end; + +procedure TPyDelphiStyleManager.SetDelphiObject(const Value: TStyleManager); +begin + inherited DelphiObject := Value; +end; + +{ TStyleManagerStyleNamesAccess } +class function TStyleManagerStyleNamesAccess.ExpectedContainerClass: TClass; +begin + Result := TStyleManager; +end; + +function TStyleManagerStyleNamesAccess.GetContainer: TStyleManager; +begin + Result := TStyleManager(inherited Container); +end; + +function TStyleManagerStyleNamesAccess.GetItem(AIndex: Integer): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString(Container.StyleNames[AIndex]); +end; + +function TStyleManagerStyleNamesAccess.GetSize: Integer; +begin + Result := Length(Container.StyleNames); +end; + +class function TStyleManagerStyleNamesAccess.Name: string; +begin + Result := 'TStyleManager.StyleNames'; +end; + +{ TPyDelphiStyleInfo } +constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -var - LName: PAnsiChar; - LAuthor: PAnsiChar; - LAuthorEMail: PAnsiChar; - LAuthorURL: PAnsiChar; - LVersion: PAnsiChar; -begin - inherited; - if APythonType.Engine.PyArg_ParseTuple(args, 'sssss:Create', @LName, @LAuthor, @LAuthorEMail, @LAuthorURL, @LVersion) <> 0 then - begin - FValue.Name := string(LName); - FValue.Author := string(LAuthor); - FValue.AuthorEMail := string(LAuthorEMail); - FValue.AuthorURL := string(LAuthorURL); - FValue.Version := string(LVersion); - end -end; - -function TPyDelphiStyleInfo.Compare(AObj: PPyObject): Integer; -var - LOther : TPyDelphiStyleInfo; -begin - if IsDelphiObject(AObj) and (PythonToDelphi(AObj) is TPyDelphiStyleInfo) then - begin - LOther := TPyDelphiStyleInfo(PythonToDelphi(AObj)); - - Result := Ord( - (LOther.Value.Name = Value.Name) - and (LOther.Value.Author = Value.Author) - and (LOther.Value.AuthorEMail = Value.AuthorEMail) - and (LOther.Value.AuthorURL = Value.AuthorURL) - and (LOther.Value.Version = Value.Version) - ); - end - else - Result := 1; -end; - -function TPyDelphiStyleInfo.Repr: PPyObject; -begin - Result := GetPythonEngine.PyUnicodeFromString(Format( - '', - [Value.Name, Value.Author, Value.AuthorEMail, Value.AuthorURL, Value.Version])); -end; - -function TPyDelphiStyleInfo.Get_Name(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(Value.Name); -end; - -function TPyDelphiStyleInfo.Get_Author(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(Value.Author); -end; - -function TPyDelphiStyleInfo.Get_AuthorEMail(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(Value.AuthorEMail); -end; - -function TPyDelphiStyleInfo.Get_AuthorUrl(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(Value.AuthorURL); -end; - -function TPyDelphiStyleInfo.Get_Version(Acontext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(Value.Version); -end; - -function TPyDelphiStyleInfo.Set_Name(AValue: PPyObject; - AContext: Pointer): Integer; -var - LValue : string; -begin - if CheckStrAttribute(AValue, 'Name', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Name := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiStyleInfo.Set_Author(AValue: PPyObject; - AContext: Pointer): Integer; -var - LValue : string; -begin - if CheckStrAttribute(AValue, 'Author', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Author := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiStyleInfo.Set_AuthorEMail(AValue: PPyObject; - AContext: Pointer): Integer; -var - LValue : string; -begin - if CheckStrAttribute(AValue, 'AuthorEMAil', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.AuthorEMAil := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiStyleInfo.Set_AuthorUrl(AValue: PPyObject; - AContext: Pointer): Integer; -var - LValue : string; -begin - if CheckStrAttribute(AValue, 'AuthorUrl', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.AuthorUrl := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiStyleInfo.Set_Version(AValue: PPyObject; - AContext: Pointer): Integer; -var - LValue : string; -begin - if CheckStrAttribute(AValue, 'Version', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - FValue.Version := LValue; - Result := 0; - end - else - Result := -1; -end; - -class procedure TPyDelphiStyleInfo.RegisterGetSets(APythonType: TPythonType); -begin - inherited; - with APythonType do - begin - AddGetSet('Name', @TPyDelphiStyleInfo.Get_Name, @TPyDelphiStyleInfo.Set_Name, - 'Provides access to the Name of a Style Info', nil); - AddGetSet('Author', @TPyDelphiStyleInfo.Get_Author, @TPyDelphiStyleInfo.Set_Author, - 'Provides access to the Author of a Style Info', nil); - AddGetSet('AuthorEMail', @TPyDelphiStyleInfo.Get_AuthorEMail, @TPyDelphiStyleInfo.Set_AuthorEMail, - 'Provides access to the Author E-Mail of a Style Info', nil); - AddGetSet('AuthorUrl', @TPyDelphiStyleInfo.Get_AuthorUrl, @TPyDelphiStyleInfo.Set_AuthorUrl, - 'Provides access to the Author URL of a Style Info', nil); - AddGetSet('Version', @TPyDelphiStyleInfo.Get_Version, @TPyDelphiStyleInfo.Set_Version, - 'Provides access to the Version of a Style Info', nil); - end; -end; - -class procedure TPyDelphiStyleInfo.SetupType(APythonType: TPythonType); -begin - inherited; - APythonType.TypeName := 'StyleInfo'; - APythonType.Name := string(APythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; - APythonType.TypeFlags := APythonType.TypeFlags + [tpfBaseType]; - APythonType.GenerateCreateFunction := False; - APythonType.DocString.Text := 'wrapper for Delphi TStyleInfo type'; - APythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; -end; - -{ TPyDelphiStyleServices } - -constructor TPyDelphiCustomStyleServices.Create(APythonType: TPythonType); -begin - inherited; -end; - -constructor TPyDelphiCustomStyleServices.CreateWith(APythonType: TPythonType; +var + LName: PAnsiChar; + LAuthor: PAnsiChar; + LAuthorEMail: PAnsiChar; + LAuthorURL: PAnsiChar; + LVersion: PAnsiChar; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'sssss:Create', @LName, @LAuthor, @LAuthorEMail, @LAuthorURL, @LVersion) <> 0 then + begin + FValue.Name := string(LName); + FValue.Author := string(LAuthor); + FValue.AuthorEMail := string(LAuthorEMail); + FValue.AuthorURL := string(LAuthorURL); + FValue.Version := string(LVersion); + end +end; + +function TPyDelphiStyleInfo.Compare(AObj: PPyObject): Integer; +var + LOther : TPyDelphiStyleInfo; +begin + if IsDelphiObject(AObj) and (PythonToDelphi(AObj) is TPyDelphiStyleInfo) then + begin + LOther := TPyDelphiStyleInfo(PythonToDelphi(AObj)); + Result := Ord( + (LOther.Value.Name = Value.Name) + and (LOther.Value.Author = Value.Author) + and (LOther.Value.AuthorEMail = Value.AuthorEMail) + and (LOther.Value.AuthorURL = Value.AuthorURL) + and (LOther.Value.Version = Value.Version) + ); + end + else + Result := 1; +end; + +function TPyDelphiStyleInfo.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString(Format( + '', + [Value.Name, Value.Author, Value.AuthorEMail, Value.AuthorURL, Value.Version])); +end; + +function TPyDelphiStyleInfo.Get_Name(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(Value.Name); +end; + +function TPyDelphiStyleInfo.Get_Author(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(Value.Author); +end; + +function TPyDelphiStyleInfo.Get_AuthorEMail(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(Value.AuthorEMail); +end; + +function TPyDelphiStyleInfo.Get_AuthorUrl(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(Value.AuthorURL); +end; + +function TPyDelphiStyleInfo.Get_Version(Acontext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(Value.Version); +end; + +function TPyDelphiStyleInfo.Set_Name(AValue: PPyObject; + AContext: Pointer): Integer; +var + LValue : string; +begin + if CheckStrAttribute(AValue, 'Name', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Name := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiStyleInfo.Set_Author(AValue: PPyObject; + AContext: Pointer): Integer; +var + LValue : string; +begin + if CheckStrAttribute(AValue, 'Author', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Author := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiStyleInfo.Set_AuthorEMail(AValue: PPyObject; + AContext: Pointer): Integer; +var + LValue : string; +begin + if CheckStrAttribute(AValue, 'AuthorEMAil', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.AuthorEMAil := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiStyleInfo.Set_AuthorUrl(AValue: PPyObject; + AContext: Pointer): Integer; +var + LValue : string; +begin + if CheckStrAttribute(AValue, 'AuthorUrl', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.AuthorUrl := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiStyleInfo.Set_Version(AValue: PPyObject; + AContext: Pointer): Integer; +var + LValue : string; +begin + if CheckStrAttribute(AValue, 'Version', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Version := LValue; + Result := 0; + end + else + Result := -1; +end; + +class procedure TPyDelphiStyleInfo.RegisterGetSets(APythonType: TPythonType); +begin + with APythonType do + begin + AddGetSet('Name', @TPyDelphiStyleInfo.Get_Name, @TPyDelphiStyleInfo.Set_Name, + 'Provides access to the Name of a Style Info', nil); + AddGetSet('Author', @TPyDelphiStyleInfo.Get_Author, @TPyDelphiStyleInfo.Set_Author, + 'Provides access to the Author of a Style Info', nil); + AddGetSet('AuthorEMail', @TPyDelphiStyleInfo.Get_AuthorEMail, @TPyDelphiStyleInfo.Set_AuthorEMail, + 'Provides access to the Author E-Mail of a Style Info', nil); + AddGetSet('AuthorUrl', @TPyDelphiStyleInfo.Get_AuthorUrl, @TPyDelphiStyleInfo.Set_AuthorUrl, + 'Provides access to the Author URL of a Style Info', nil); + AddGetSet('Version', @TPyDelphiStyleInfo.Get_Version, @TPyDelphiStyleInfo.Set_Version, + 'Provides access to the Version of a Style Info', nil); + end; +end; + +class procedure TPyDelphiStyleInfo.SetupType(APythonType: TPythonType); +begin + inherited; + APythonType.TypeName := 'StyleInfo'; + APythonType.Name := string(APythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; + APythonType.TypeFlags := APythonType.TypeFlags + [tpfBaseType]; + APythonType.GenerateCreateFunction := False; + APythonType.DocString.Text := 'wrapper for Delphi TStyleInfo type'; + APythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; +end; + +{ TPyDelphiStyleServices } +constructor TPyDelphiCustomStyleServices.Create(APythonType: TPythonType); +begin + inherited; +end; + +constructor TPyDelphiCustomStyleServices.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); -begin - inherited; - DelphiObject := StyleServices(); -end; - -class function TPyDelphiCustomStyleServices.DelphiObjectClass: TClass; -begin - Result := TCustomStyleServices; -end; - -function TPyDelphiCustomStyleServices.GetDelphiObject: TCustomStyleServices; -begin - Result := TCustomStyleServices(inherited DelphiObject); -end; - -procedure TPyDelphiCustomStyleServices.SetDelphiObject( - const Value: TCustomStyleServices); -begin - inherited DelphiObject := Value; -end; - -class procedure TPyDelphiCustomStyleServices.RegisterMethods( - PythonType: TPythonType); -begin - inherited; -end; - -initialization - RegisteredUnits.Add(TVclThemesRegistration.Create()); - -end. +begin + inherited; + DelphiObject := StyleServices(); +end; + +class function TPyDelphiCustomStyleServices.DelphiObjectClass: TClass; +begin + Result := TCustomStyleServices; +end; + +function TPyDelphiCustomStyleServices.GetDelphiObject: TCustomStyleServices; +begin + Result := TCustomStyleServices(inherited DelphiObject); +end; + +procedure TPyDelphiCustomStyleServices.SetDelphiObject( + const Value: TCustomStyleServices); +begin + inherited DelphiObject := Value; +end; + +class procedure TPyDelphiCustomStyleServices.RegisterMethods( + PythonType: TPythonType); +begin +end; + +initialization + RegisteredUnits.Add(TVclThemesRegistration.Create()); +end. From a966dd708b8d9517f106abf93e70f6ce37c4dd39 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 28 Dec 2022 17:05:51 +0200 Subject: [PATCH 025/174] Fix #397 --- Source/fmx/WrapFmxForms.pas | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index e7fae8ac..a149222c 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -122,7 +122,14 @@ EInvalidFormClass = class(Exception); implementation uses - System.Types, System.IOUtils, System.Rtti, System.Messaging; + {$IFDEF OSX} + Macapi.AppKit, + FMX.Platform.Mac, + {$ENDIF OSX} + System.Types, + System.IOUtils, + System.Rtti, + System.Messaging; {$IFDEF OSX} var @@ -225,10 +232,17 @@ procedure TPyDelphiApplication.SetDelphiObject(const Value: TApplication); end; function TPyDelphiApplication.Initialize_Wrapper(AArgs: PPyObject): PPyObject; +{$IFDEF OSX} +var + App: NSApplication; +{$ENDIF OSX} begin Application.Initialize(); {$IFDEF OSX} - //The application initialization routine in macOS requires + // #397 + App := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication); + if App.ActivationPolicy > 0 then + App.setActivationPolicy(0); //the main form standard creation way, //due to MainMenu creation and others. Application.CreateForm(TInternalMainForm, gDelphiMainForm); From 287628dad5dab0b426c3936cc6aff605524c96ae Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 29 Dec 2022 13:32:48 +0200 Subject: [PATCH 026/174] Deal with https://github.com/Embarcadero/python4delphi/pull/6 __owned__ is now Read-Write property --- Source/WrapDelphi.pas | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 9ecd7a4f..41e00154 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -538,6 +538,7 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) // Exposed Getters function Get_ClassName(Acontext : Pointer) : PPyObject; cdecl; function Get_Owned(Acontext : Pointer) : PPyObject; cdecl; + function Set_Owned(AValue: PPyObject; AContext: Pointer): Integer; function Get_Bound(Acontext : Pointer) : PPyObject; cdecl; // implementation of interface IFreeNotificationSubscriber procedure Notify(ADeletedObject : TObject); @@ -2496,7 +2497,7 @@ class procedure TPyDelphiObject.RegisterGetSets(PythonType: TPythonType); 'Returns the TObject.ClassName', nil); AddGetSet('__bound__', @TPyDelphiObject.Get_Bound, nil, 'Returns True if the wrapper is still bound to the Delphi instance.', nil); - AddGetSet('__owned__', @TPyDelphiObject.Get_Owned, nil, + AddGetSet('__owned__', @TPyDelphiObject.Get_Owned, @TPyDelphiObject.Set_Owned, 'Returns True if the wrapper owns the Delphi instance.', nil); end; end; @@ -2743,6 +2744,21 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); end; end; +function TPyDelphiObject.Set_Owned(AValue: PPyObject; + AContext: Pointer): Integer; +var + _value : Boolean; +begin + Adjust(@Self); + if CheckBoolAttribute(AValue, '__owned__', _value) then + begin + Owned := _value; + Result := 0; + end + else + Result := -1; +end; + function TPyDelphiObject.SqAssItem(idx: NativeInt; obj: PPyObject): integer; begin if HasContainerAccessClass then From 1dda80934f703123e6adc8ed394b29579d85a82f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 1 Jan 2023 15:55:05 +0200 Subject: [PATCH 027/174] Python 3.12 compatibility --- Source/PythonEngine.pas | 106 +++++++++++++++------------------------- 1 file changed, 39 insertions(+), 67 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 65c8a0f1..2f175c27 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -116,7 +116,7 @@ TPythonVersionProp = record end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..9] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = ( (DllName: 'python33.dll'; RegVersion: '3.3'; APIVersion: 1013), (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013), @@ -126,11 +126,12 @@ TPythonVersionProp = record (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'python39.dll'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'python310.dll'; RegVersion: '3.10'; APIVersion: 1013), - (DllName: 'python311.dll'; RegVersion: '3.11'; APIVersion: 1013) + (DllName: 'python311.dll'; RegVersion: '3.11'; APIVersion: 1013), + (DllName: 'python312.dll'; RegVersion: '3.12'; APIVersion: 1013) ); {$ENDIF} {$IFDEF _so_files} - PYTHON_KNOWN_VERSIONS: array[1..9] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = ( (DllName: 'libpython3.3m.so'; RegVersion: '3.3'; APIVersion: 1013), (DllName: 'libpython3.4m.so'; RegVersion: '3.4'; APIVersion: 1013), @@ -140,11 +141,12 @@ TPythonVersionProp = record (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), - (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013) + (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013), + (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013) ); {$ENDIF} {$IFDEF DARWIN} - PYTHON_KNOWN_VERSIONS: array[1..9] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = ( (DllName: 'libpython3.3.dylib'; RegVersion: '3.3'; APIVersion: 1013), (DllName: 'libpython3.4.dylib'; RegVersion: '3.4'; APIVersion: 1013), @@ -154,16 +156,18 @@ TPythonVersionProp = record (DllName: 'libpython3.8.dylib'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.dylib'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.dylib'; RegVersion: '3.10'; APIVersion: 1013), - (DllName: 'libpython3.11.dylib'; RegVersion: '3.11'; APIVersion: 1013) + (DllName: 'libpython3.11.dylib'; RegVersion: '3.11'; APIVersion: 1013), + (DllName: 'libpython3.12.dylib'; RegVersion: '3.12'; APIVersion: 1013) ); {$ENDIF} {$IFDEF ANDROID} - PYTHON_KNOWN_VERSIONS: array[6..9] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[6..10] of TPythonVersionProp = ( (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), - (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013) + (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013), + (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013) ); {$ENDIF} @@ -1274,7 +1278,6 @@ TPythonInterface=class(TDynamicDll) procedure AfterLoad; override; function GetQuitMessage : string; override; procedure CheckPython; - function GetUnicodeTypeSuffix : string; public // define Python flags. See file pyDebug.h @@ -1607,7 +1610,7 @@ TPythonInterface=class(TDynamicDll) PyUnicode_DecodeUTF16:function (const s:PAnsiChar; size: NativeInt; const errors: PAnsiChar; byteoder: PInteger):PPyObject; cdecl; PyUnicode_AsEncodedString:function (unicode:PPyObject; const encoding:PAnsiChar; const errors:PAnsiChar):PPyObject; cdecl; PyUnicode_FromOrdinal:function (ordinal:integer):PPyObject; cdecl; - PyUnicode_GetSize:function (unicode:PPyObject):NativeInt; cdecl; + PyUnicode_GetLength:function (unicode:PPyObject):NativeInt; cdecl; PyWeakref_GetObject: function ( ref : PPyObject) : PPyObject; cdecl; PyWeakref_NewProxy: function ( ob, callback : PPyObject) : PPyObject; cdecl; PyWeakref_NewRef: function ( ob, callback : PPyObject) : PPyObject; cdecl; @@ -3464,28 +3467,8 @@ procedure TPythonInterface.CheckPython; raise Exception.Create('Python is not properly initialized' ); end; -function TPythonInterface.GetUnicodeTypeSuffix : string; -begin - if (fMajorVersion > 3) or ((fMajorVersion = 3) and (fMinorVersion >= 3)) then - Result := '' - else if APIVersion >= 1011 then - Result := - {$IF DEFINED(MSWINDOWS) or DEFINED(DARWIN) or DEFINED(SOLARIS)} - 'UCS2' - {$ELSE} - 'UCS4' - {$IFEND} - else - Result := ''; -end; - procedure TPythonInterface.MapDll; -Var - UnicodeSuffix : string; - begin - UnicodeSuffix := GetUnicodeTypeSuffix; - Py_DebugFlag := Import('Py_DebugFlag'); Py_VerboseFlag := Import('Py_VerboseFlag'); Py_InteractiveFlag := Import('Py_InteractiveFlag'); @@ -3796,18 +3779,18 @@ procedure TPythonInterface.MapDll; PyType_GenericAlloc := Import('PyType_GenericAlloc'); PyType_GenericNew := Import('PyType_GenericNew'); PyType_Ready := Import('PyType_Ready'); - PyUnicode_FromWideChar := Import(AnsiString(Format('PyUnicode%s_FromWideChar',[UnicodeSuffix]))); - PyUnicode_FromString := Import(AnsiString(Format('PyUnicode%s_FromString',[UnicodeSuffix]))); - PyUnicode_FromStringAndSize := Import(AnsiString(Format('PyUnicode%s_FromStringAndSize',[UnicodeSuffix]))); - PyUnicode_FromKindAndData := Import(AnsiString(Format('PyUnicode%s_FromKindAndData',[UnicodeSuffix]))); - PyUnicode_AsWideChar := Import(AnsiString(Format('PyUnicode%s_AsWideChar',[UnicodeSuffix]))); - PyUnicode_AsUTF8 := Import(AnsiString(Format('PyUnicode%s_AsUTF8',[UnicodeSuffix]))); - PyUnicode_AsUTF8AndSize := Import(AnsiString(Format('PyUnicode%s_AsUTF8AndSize',[UnicodeSuffix]))); - PyUnicode_Decode := Import(AnsiString(Format('PyUnicode%s_Decode',[UnicodeSuffix]))); - PyUnicode_DecodeUTF16 := Import(AnsiString(Format('PyUnicode%s_DecodeUTF16',[UnicodeSuffix]))); - PyUnicode_AsEncodedString := Import(AnsiString(Format('PyUnicode%s_AsEncodedString',[UnicodeSuffix]))); - PyUnicode_FromOrdinal := Import(AnsiString(Format('PyUnicode%s_FromOrdinal',[UnicodeSuffix]))); - PyUnicode_GetSize := Import(AnsiString(Format('PyUnicode%s_GetSize',[UnicodeSuffix]))); + PyUnicode_FromWideChar := Import('PyUnicode_FromWideChar'); + PyUnicode_FromString := Import('PyUnicode_FromString'); + PyUnicode_FromStringAndSize := Import('PyUnicode_FromStringAndSize'); + PyUnicode_FromKindAndData := Import('PyUnicode_FromKindAndData'); + PyUnicode_AsWideChar := Import('PyUnicode_AsWideChar'); + PyUnicode_AsUTF8 := Import('PyUnicode_AsUTF8'); + PyUnicode_AsUTF8AndSize := Import('PyUnicode_AsUTF8AndSize'); + PyUnicode_Decode := Import('PyUnicode_Decode'); + PyUnicode_DecodeUTF16 := Import('PyUnicode_DecodeUTF16'); + PyUnicode_AsEncodedString := Import('PyUnicode_AsEncodedString'); + PyUnicode_FromOrdinal := Import('PyUnicode_FromOrdinal'); + PyUnicode_GetLength := Import('PyUnicode_GetLength'); PyWeakref_GetObject := Import('PyWeakref_GetObject'); PyWeakref_NewProxy := Import('PyWeakref_NewProxy'); PyWeakref_NewRef := Import('PyWeakref_NewRef'); @@ -6055,35 +6038,24 @@ function TPythonEngine.PyBytesAsAnsiString(obj: PPyObject): AnsiString; raise EPythonError.CreateFmt(SPyConvertionError, ['PyBytesAsAnsiString', 'Bytes']); end; -function TPythonEngine.PyUnicodeAsString( obj : PPyObject ) : UnicodeString; +function TPythonEngine.PyUnicodeAsString(obj : PPyObject): UnicodeString; var - _size : Integer; -{$IFDEF POSIX} - _ucs4Str : UCS4String; -{$ENDIF} + Buffer: PAnsiChar; + Size: NativeInt; + NewSize: Cardinal; begin if PyUnicode_Check(obj) then begin - _size := PyUnicode_GetSize(obj); - if _size > 0 then - begin -{$IFDEF POSIX} - // Note that Linux uses UCS4 strings, whereas it declares using UCS2 strings!!! - SetLength(_ucs4Str, _size+1); - if PyUnicode_AsWideChar(obj, @_ucs4Str[0], _size) <> _size then - raise EPythonError.Create('Could not copy the whole Unicode string into its buffer'); - Result := UCS4StringToWideString(_ucs4Str); - // remove trailing zeros - while (Length(Result) > 0) and (Result[Length(Result)] = #0) do - Delete(Result, Length(Result), 1); -{$ELSE} - SetLength(Result, _size); - if PyUnicode_AsWideChar(obj, @Result[1], _size) <> _size then - raise EPythonError.Create('Could not copy the whole Unicode string into its buffer'); -{$ENDIF} - end - else - Result := ''; + // Size does not include the final #0 + Buffer := PyUnicode_AsUTF8AndSize(obj, @Size); + SetLength(Result, Size); + if (Size = 0) or (Buffer = nil) then + Exit; + + // The second argument is the size of the destination (Result) including #0 + NewSize := Utf8ToUnicode(PChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); + // NewSize includes #0 + SetLength(Result, NewSize - 1); end else raise EPythonError.CreateFmt(SPyConvertionError, ['PyUnicodeAsString', 'Unicode']); From a2f3b82912b7f87c1b5e85f62863ddba755aaac2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 2 Jan 2023 01:07:55 +0200 Subject: [PATCH 028/174] Fix DefineSyntaxError --- Source/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 2f175c27..bba9dd94 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -5129,7 +5129,7 @@ procedure TPythonEngine.RaiseError; if Assigned(tmp) and PyUnicode_Check(tmp) then s_value := PyUnicodeAsString(tmp); Py_XDECREF(tmp); - if MajorVersion >= 10 then + if (MajorVersion > 3) or (MinorVersion >= 10) then begin // Get the end offset of the error tmp := PyObject_GetAttrString(err_value, 'end_offset' ); From 958d87d24e69e1a74a427ae77efcf5f01933a656 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 12 Jan 2023 17:54:33 +0200 Subject: [PATCH 029/174] Better fix for https://github.com/python/cpython/issues/100171 --- Source/PythonEngine.pas | 23 +++-------------------- Source/PythonVersions.pas | 9 +++++---- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index bba9dd94..ce0dab9f 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -3033,7 +3033,9 @@ function TDynamicDll.GetDllPath : string; if (DLLPath = '') and not FInExtensionModule then begin {$IFDEF MSWINDOWS} - IsPythonVersionRegistered(RegVersion, Result, AllUserInstall); + if IsPythonVersionRegistered(RegVersion, Result, AllUserInstall) and (Self is TPythonEngine) then + // https://github.com/python/cpython/issues/100171 + TPythonEngine(Self).SetPythonHome(Result); {$ENDIF} {$IFDEF DARWIN} Result := '/Library/Frameworks/Python.framework/Versions/' + RegVersion + '/lib/'; @@ -4466,7 +4468,6 @@ procedure TPythonEngine.Initialize; var i : Integer; - WorkAround: AnsiString; begin if Assigned(gPythonEngine) then raise Exception.Create('There is already one instance of TPythonEngine running' ); @@ -4505,24 +4506,6 @@ procedure TPythonEngine.Initialize; if not Initialized then Initialize; - // WorkAround for https://github.com/python/cpython/issues/100171 - if (MajorVersion = 3) and (MinorVersion >= 11) then - begin - WorkAround := - 'import sys'#13#10 + //0 - 'if sys.version_info > (3,11,0):'#13#10 + //1 - ' import os'#13#10 + //2 - ''#13#10 + //3 - ' dllpath = os.path.join(sys.base_prefix, ''DLLs'')'#13#10 + //4 - ' if dllpath not in sys.path:'#13#10 + //5 - ' sys.path.insert(3, dllpath)'#13#10 + //6 - ''#13#10 + //7 - ' del dllpath'#13#10 + //8 - ' del os'#13#10 + //9 - 'del sys'#13#10; //10 - ExecString(WorkAround); - end; - if InitScript.Count > 0 then ExecStrings(InitScript); if Assigned(FOnAfterInit) then diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index e6be6d41..2a596d5d 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -123,13 +123,14 @@ procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); if Is_venv then begin TPythonEngine(PythonEngine).VenvPythonExe := PythonExecutable; TPythonEngine(PythonEngine).SetPythonHome(DLLPath); - end else if not IsRegistered or Is_conda then + end else { - Not sure why but PythonHome needs to be set even for - registered conda distributions - Note also that for conda distributions to work properly, + Note that for conda distributions to work properly, you need to add Format('%s;%0:s\Library\bin;', [Version.InstallPath] to your Windows path if it is not there already. + + Following the advice in https://github.com/python/cpython/issues/100171 + SetPythonHome is called even for registered versions } TPythonEngine(PythonEngine).SetPythonHome(InstallPath); end; From c8edaa5c650d0ee2417302c6e7447a0e67a8d64f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Jan 2023 21:58:54 +0200 Subject: [PATCH 030/174] Added CreateWith overload for backward compatibility as in the Embarcadero fork Reversed earlier changes. Where CreateWith is overwritten use the simpler version of CreateWith Fixed TPythonType.AddTypeVar (METH_KEYWORDS needs to be combined with METH_VARARGS) Fixed Demo28 --- Demos/Demo08/Unit1.pas | 4 +- Demos/Demo21/Unit1.pas | 4 +- Demos/Demo26/Unit1.pas | 4 +- Demos/Demo28/Unit1.pas | 15 +- Demos/Demo34/Unit1.pas | 4 +- Source/PythonEngine.pas | 27 +- Source/WrapDelphiTypes.pas | 14 +- Source/fmx/WrapFmxStyles.pas | 5 +- Source/fmx/WrapFmxTypes.pas | 26 +- Source/vcl/WrapVclThemes.pas | 14 +- Tests/FMX/Android/NumberServicesTest.pas | 1529 ++++++++++------------ Tests/NumberServicesTest.pas | 4 +- 12 files changed, 770 insertions(+), 880 deletions(-) diff --git a/Demos/Demo08/Unit1.pas b/Demos/Demo08/Unit1.pas index 18621f3a..a8b2bc73 100644 --- a/Demos/Demo08/Unit1.pas +++ b/Demos/Demo08/Unit1.pas @@ -38,7 +38,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; // Type services //////////////// @@ -88,7 +88,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Demos/Demo21/Unit1.pas b/Demos/Demo21/Unit1.pas index bc9a7055..351e451b 100644 --- a/Demos/Demo21/Unit1.pas +++ b/Demos/Demo21/Unit1.pas @@ -46,7 +46,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject ); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; // Type services //////////////// @@ -81,7 +81,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Demos/Demo26/Unit1.pas b/Demos/Demo26/Unit1.pas index 783c8f03..45c5e641 100644 --- a/Demos/Demo26/Unit1.pas +++ b/Demos/Demo26/Unit1.pas @@ -35,7 +35,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; // Type services //////////////// @@ -84,7 +84,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Demos/Demo28/Unit1.pas b/Demos/Demo28/Unit1.pas index 0726eb2d..7ca2799c 100644 --- a/Demos/Demo28/Unit1.pas +++ b/Demos/Demo28/Unit1.pas @@ -18,7 +18,7 @@ TPyStringList = class(TPyObject) public // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; destructor Destroy; override; // Basic services @@ -46,7 +46,7 @@ TPyStringListIterator = class(TPyObject) procedure SetStringList(const Value: TPyStringList); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; destructor Destroy; override; // Basic services @@ -145,8 +145,7 @@ constructor TPyStringList.Create(APythonType: TPythonType); fStrings := TStringList.Create; end; -constructor TPyStringList.CreateWith(PythonType: TPythonType; args, kwds: - PPyObject); +constructor TPyStringList.CreateWith(PythonType: TPythonType; args: PPyObject); var i : Integer; begin @@ -170,12 +169,15 @@ function TPyStringList.Iter: PPyObject; var // _iter : TPyStringListIterator; _args : PPyObject; + _kwrds: PPyObject; begin _args := GetPythonEngine.MakePyTuple([Self.GetSelf]); + _kwrds := GetPythonEngine.PyDict_New; try - Result := Form1.ptStringListIterator.CreateInstanceWith(_args); + Result := Form1.ptStringListIterator.CreateInstanceWith(_args, _kwrds); finally GetPythonEngine.Py_DECREF(_args); + GetPythonEngine.Py_DECREF(_kwrds); end; {_iter := Form1.ptStringListIterator.CreateInstance as TPyStringListIterator; _iter.StringList := Self; @@ -239,8 +241,7 @@ constructor TPyStringListIterator.Create(APythonType: TPythonType); inherited; end; -constructor TPyStringListIterator.CreateWith(PythonType: TPythonType; args, - kwds: PPyObject); +constructor TPyStringListIterator.CreateWith(PythonType: TPythonType; args: PPyObject); var _obj : PPyObject; _stringList : TPyStringList; diff --git a/Demos/Demo34/Unit1.pas b/Demos/Demo34/Unit1.pas index 0ac121c5..e971946a 100644 --- a/Demos/Demo34/Unit1.pas +++ b/Demos/Demo34/Unit1.pas @@ -43,7 +43,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; // Type services //////////////// @@ -158,7 +158,7 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ce0dab9f..821e4b3a 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2363,6 +2363,7 @@ TPythonModule = class(TMethodsContainer) - Properties ob_refcnt and ob_type will call GetSelf to access their data. } // The base class of all new Python types + TPyObjectClass = class of TPyObject; TPyObject = class private function Get_ob_refcnt: NativeInt; @@ -2375,9 +2376,9 @@ TPyObject = class PythonAlloc : Boolean; // Constructors & Destructors - constructor Create( APythonType : TPythonType ); virtual; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); - virtual; + constructor Create(APythonType: TPythonType); virtual; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); overload; virtual; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); overload; virtual; destructor Destroy; override; class function NewInstance: TObject; override; @@ -2469,7 +2470,6 @@ TPyObject = class class procedure RegisterGetSets( APythonType : TPythonType ); virtual; class procedure SetupType( APythonType : TPythonType ); virtual; end; - TPyObjectClass = class of TPyObject; TBasicServices = set of (bsGetAttr, bsSetAttr, bsRepr, bsCompare, bsHash, @@ -2680,7 +2680,7 @@ TPyVar = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; destructor Destroy; override; // Type services @@ -7385,7 +7385,7 @@ function TPythonModule.GetVarAsVariant( const varName : AnsiString ) : Variant; // TPyObject // Constructors & Destructors -constructor TPyObject.Create( APythonType : TPythonType ); +constructor TPyObject.Create(APythonType: TPythonType); begin inherited Create; if Assigned(APythonType) then @@ -7400,10 +7400,15 @@ constructor TPyObject.Create( APythonType : TPythonType ); end; end; -constructor TPyObject.CreateWith(APythonType: TPythonType; args, kwds: - PPyObject); +constructor TPyObject.CreateWith(APythonType: TPythonType; args: PPyObject); +begin + Create(APythonType); +end; + +constructor TPyObject.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); begin - Create( APythonType ); + CreateWith(APythonType, args); end; destructor TPyObject.Destroy; @@ -8649,7 +8654,7 @@ procedure TPythonType.AddTypeVar; meth := CreateMethod; FCreateFuncDef.ml_name := PAnsiChar(FCreateFuncName); FCreateFuncDef.ml_meth := GetOfObjectCallBack(TCallBack(meth), 3, DEFAULT_CALLBACK_TYPE); - FCreateFuncDef.ml_flags := METH_KEYWORDS; + FCreateFuncDef.ml_flags := METH_VARARGS or METH_KEYWORDS; FCreateFuncDef.ml_doc := PAnsiChar(FCreateFuncDoc); FCreateFunc := Engine.PyCFunction_NewEx(@FCreateFuncDef, nil, nil); Engine.Py_INCREF(FCreateFunc); @@ -8888,7 +8893,7 @@ constructor TPyVar.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyVar.Create will be automatically be called. -constructor TPyVar.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); +constructor TPyVar.CreateWith(APythonType: TPythonType; args: PPyObject); begin inherited; with GetPythonEngine do diff --git a/Source/WrapDelphiTypes.pas b/Source/WrapDelphiTypes.pas index 57d6a3ae..55ef30aa 100644 --- a/Source/WrapDelphiTypes.pas +++ b/Source/WrapDelphiTypes.pas @@ -23,7 +23,7 @@ TPyDelphiPoint = class(TPyObject) function Set_X(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_Y(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -55,7 +55,7 @@ TPyDelphiRect = class(TPyObject) public PyDelphiWrapper : TPyDelphiWrapper; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -77,7 +77,7 @@ TPyDelphiSize = class(TPyObject) function Set_CX(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_CY(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -235,7 +235,7 @@ function TPyDelphiPoint.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; args: PPyObject); var x, y : Integer; @@ -340,8 +340,7 @@ function TPyDelphiRect.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; args, kwds: - PPyObject); +constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; args: PPyObject); begin inherited; APythonType.Engine.PyArg_ParseTuple( args, 'iiii:Create',@fValue.Left, @fValue.Top, @fValue.Right, @fValue.Bottom ); @@ -528,8 +527,7 @@ function TPyDelphiSize.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; args, kwds: - PPyObject); +constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; args: PPyObject); var cx, cy : Integer; begin diff --git a/Source/fmx/WrapFmxStyles.pas b/Source/fmx/WrapFmxStyles.pas index 3f989292..36965919 100644 --- a/Source/fmx/WrapFmxStyles.pas +++ b/Source/fmx/WrapFmxStyles.pas @@ -13,7 +13,7 @@ TPyDelphiStyleStreaming = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TStyleStreaming); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; class procedure RegisterMethods(PythonType: TPythonType); override; @@ -72,8 +72,7 @@ constructor TPyDelphiStyleStreaming.Create(APythonType: TPythonType); inherited; end; -constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args, - kwds: PPyObject); +constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args: PPyObject); begin inherited; DelphiObject := TStyleStreaming.Create(); diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 61b0205e..7496fae3 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -22,7 +22,7 @@ TPyDelphiPointF = class(TPyObject) function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -41,7 +41,7 @@ TPyDelphiSizeF = class(TPyObject) function Set_Width(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Height(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -64,7 +64,7 @@ TPyDelphiRectF = class(TPyObject) function Set_Left(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Right(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -103,7 +103,7 @@ TPyDelphiPosition = class(TPyDelphiPersistent) function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Point(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterMethods(PythonType: TPythonType); override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -128,7 +128,7 @@ TPyDelphiBounds = class(TPyDelphiPersistent) function Get_Rect(Acontext: Pointer): PPyObject; cdecl; function Set_Rect(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; property DelphiObject: TBounds read GetDelphiObject write SetDelphiObject; @@ -142,7 +142,7 @@ TPyDelphiControlSize = class(TPyDelphiPersistent) function Get_SizeF(Acontext: Pointer): PPyObject; cdecl; function Set_SizeF(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; property DelphiObject: TControlSize read GetDelphiObject write SetDelphiObject; @@ -184,7 +184,7 @@ function TPyDelphiPointF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args: PPyObject); var x, y : single; @@ -424,7 +424,7 @@ function TPyDelphiFmxObject.Set_Parent(AValue: PPyObject; end; { TPyDelphiPosition } -constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args: PPyObject); var LPPosition: PPyObject; @@ -544,7 +544,7 @@ function TPyDelphiSizeF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args: PPyObject); var LWidth, LHeight : single; @@ -646,7 +646,7 @@ procedure TPyDelphiCustomPopupMenu.SetDelphiObject( end; { TPyDelphiBounds } -constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args: PPyObject); var LPBounds: PPyObject; @@ -703,8 +703,8 @@ function TPyDelphiBounds.Set_Rect(AValue: PPyObject; end; { TPyDelphiControlSize } -constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args, - kwds: PPyObject); +constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args: + PPyObject); var LPControlSize: PPyObject; LSizeF: TSizeF; @@ -775,7 +775,7 @@ function TPyDelphiRectF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args: PPyObject); var LLeft, LTop, LRight, LBottom : single; diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index 01157a2d..f77b49ee 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -24,7 +24,7 @@ TPyDelphiStyleInfo = class(TPyObject) function Set_AuthorUrl(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; function Set_Version(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; function Compare(AObj: PPyObject) : Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(APythonType: TPythonType ); override; @@ -38,7 +38,7 @@ TPyDelphiCustomStyleServices = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TCustomStyleServices); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterMethods( PythonType : TPythonType ); override; // Properties @@ -56,7 +56,7 @@ TPyDelphiStyleManager = class(TPyDelphiObject) function LoadFromFileName_Wrapper(AArgs: PPyObject): PPyObject; cdecl; function IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; cdecl; public - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; class procedure RegisterMethods(PythonType: TPythonType); override; @@ -158,8 +158,8 @@ procedure TVclThemesRegistration.RegisterWrappers( end; { TPyDelphiStyleManager } -constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, - kwds: PPyObject); +constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args: + PPyObject); begin inherited; DelphiObject := TStyleManager.Create(); @@ -279,7 +279,7 @@ class function TStyleManagerStyleNamesAccess.Name: string; end; { TPyDelphiStyleInfo } -constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args, kwds: +constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args: PPyObject); var LName: PAnsiChar; @@ -465,7 +465,7 @@ constructor TPyDelphiCustomStyleServices.Create(APythonType: TPythonType); end; constructor TPyDelphiCustomStyleServices.CreateWith(APythonType: TPythonType; - args, kwds: PPyObject); + args: PPyObject); begin inherited; DelphiObject := StyleServices(); diff --git a/Tests/FMX/Android/NumberServicesTest.pas b/Tests/FMX/Android/NumberServicesTest.pas index df4e6828..1fb9cbc8 100644 --- a/Tests/FMX/Android/NumberServicesTest.pas +++ b/Tests/FMX/Android/NumberServicesTest.pas @@ -1,822 +1,709 @@ -(**************************************************************************) -(* *) -(* Module: Unit 'NumberServicesTest' Copyright (c) 2021 *) -(* *) -(* Lucas Moura Belo - lmbelo *) -(* lucas.belo@live.com *) -(* BH, Brazil *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project pages: https://github.com/Embarcadero/python4delphi *) -(* https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Test unit for numeric operations *) -(* *) -(* *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) - -unit NumberServicesTest; - -interface - -uses - DUnitX.TestFramework, - PythonEngine; - -type - TRandomInteger = class(TObject) - strict private - FValue: Integer; - private - procedure SetValue(const Value: Integer); - public - constructor Create; - property Value: Integer read FValue write SetValue; - end; - - PyTRandomInteger = class(TPyObject) - private - FRandomInteger: TRandomInteger; - - public - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; - - // Basic services - function Repr: PPyObject; override; - - // Number services - function NbAdd(obj: PPyObject): PPyObject; override; // 0 - function NbSubtract(obj: PPyObject): PPyObject; override; // 1 - function NbMultiply(obj: PPyObject): PPyObject; override; // 2 - function NbRemainder(obj: PPyObject): PPyObject; override; // 4 {3 is for obsolete nsDivide} - function NbDivmod(obj: PPyObject): PPyObject; override; // 5 - function NbPower(ob1, ob2: PPyObject): PPyObject; override; // 6 - function NbNegative: PPyObject; override; // 7 - function NbPositive: PPyObject; override; // 8 - function NbAbsolute: PPyObject; override; // 9 - function NbInvert: PPyObject; override; // 11 (10 for obsolete nsNonZero) - function NbLShift(obj: PPyObject): PPyObject; override; // 12 - function NbRShift(obj: PPyObject): PPyObject; override; // 13 - function NbAnd(obj: PPyObject): PPyObject; override; // 14 - function NbXor(obj: PPyObject): PPyObject; override; // 15 - function NbOr(obj: PPyObject): PPyObject; override; // 16 - function NbInt : PPyObject; override; // 18 (17 is for obsolete nsCoerce) - function NbFloat : PPyObject; override; // 20 (19 is for obsolete nsLong) - function NbFloorDivide(obj: PPyObject): PPyObject; override; // 23 (21 is for obsolete nsOct, 22 for nsHex) - function NbTrueDivide(obj: PPyObject): PPyObject; override; // 24 - function NbMatrixMultiply(obj: PPyObject): PPyObject; override; // 25 - function NbBool: Integer; override; // 26 - private - function PerformArithmeticOp(obj: PPyObject; op: string): PPyObject; - public - destructor Destroy; override; - end; - - [TestFixture] - TTestNumberServices = class(TObject) - private - PythonType_TRndInt: TPythonType; - FPythonModule : TPythonModule; - PythonEngine : TPythonEngine; - pdvainteger: integer; - pdvbinteger: integer; - pdvc : TPythonDelphiVar; - public - [SetupFixture] - procedure SetupFixture; - - [TearDownFixture] - procedure TearDownFixture; - - [Test] - procedure TestAdd; // 0 - [Test] - procedure TestSubtract; // 1 - [Test] - procedure TestMultiply; // 2 - [Test] - procedure TestRemainder; // 4 - [Test] - procedure TestDivMod; // 5 - [Test] - procedure TestPower; // 6 - [Test] - procedure TestNegative; // 7 - [Test] - procedure TestPositive; // 8 - [Test] - procedure TestAbsolute; // 9 - [Test] - procedure TestInvert; // 11 - [Test] - procedure TestLShift; // 12 - [Test] - procedure TestRShift; // 13 - [Test] - procedure TestAnd; // 14 - [Test] - procedure TestXor; // 15 - [Test] - procedure TestOr; // 16 - [Test] - procedure TestInt; // 18 - [Test] - procedure TestFloat; // 20 - [Test] - procedure TestFloorDivide; // 23 - [Test] - procedure TestTrueDivide; // 24 - [Test] - procedure TestMatrixMultiply; // 25 - [Test] - procedure TestBool; // 26 - end; - -var PrintResults: Boolean = False; - -implementation - -uses - System.Variants, - System.SysUtils, - System.Math, - PythonLoad; - -procedure AddPythonType(var PythonType: TPythonType; - Name: string; - TypeName: AnsiString; - Engine: TPythonEngine; - Module: TPythonModule; - PyObjectClass: TPyObjectClass; - Basic: TBasicServices; - Number: TNumberServices); -begin - if not Assigned(PythonType) then - begin - PythonType := TPythonType.Create(Module); - PythonType.Engine := Engine; - PythonType.Module := Module; - PythonType.Name := Name; - PythonType.Services.Basic := Basic; - PythonType.Services.Mapping := []; - PythonType.Services.Sequence := []; - PythonType.Services.Number := Number; - PythonType.TypeName := TypeName; - PythonType.PyObjectClass := PyObjectClass; - PythonType.GenerateCreateFunction := False; - - PythonType.Initialize; - end; -end; - - function GetVal(AModule : PPyObject; AVarName : AnsiString) : PPyObject; - begin - with GetPythonEngine do - begin - Result := PyObject_GetAttrString(AModule, PAnsiChar(AVarName)); - if PyErr_Occurred <> nil then - PyErr_Clear - else - Py_XDecRef(Result); // keep a borrowed reference. - end - end; - -procedure TTestNumberServices.SetupFixture; -var - Py : PPyObject; - valpy: TPyObject; - val: PyTRandomInteger; -begin - PythonEngine := TPythonEngine.Create(nil); - PythonEngine.Name := 'PythonEngine'; - TPythonLoad.Configure(PythonEngine); - PythonEngine.LoadDll; - - // python module - FPythonModule := TPythonModule.Create(GetPythonEngine); - FPythonModule.Engine := GetPythonEngine; - FPythonModule.ModuleName := 'testing123'; - FPythonModule.Initialize; - - PythonType_TRndInt := nil; - AddPythonType(PythonType_TRndInt, 'PythonType_RndInt', 'TRandomInteger', - GetPythonEngine, FPythonModule, PyTRandomInteger, - [ bsGetAttrO, bsSetAttrO, bsRepr ], - [ nsAdd, - nsSubtract, - nsMultiply, - nsTrueDivide, - nsRemainder, - nsDivmod, - nsPower, - nsNegative, - nsPositive, - nsAbsolute, - nsInvert, - nsLShift, - nsRShift, - nsAnd, - nsXor, - nsOr, - nsInt, - nsFloat, - nsFloorDivide, - nsMatrixMultiply, - nsBool ]); - - // import our module - GetPythonEngine.Run_CommandAsString('import ' + FPythonModule.ModuleName, single_input); - - pdvc := TPythonDelphiVar.Create(nil); - pdvc.Engine := GetPythonEngine; - pdvc.Module := '__main__'; - pdvc.VarName := 'c'; - pdvc.Initialize; - - GetPythonEngine.Run_CommandAsString('aa = testing123.TRandomInteger()', single_input); - GetPythonEngine.Run_CommandAsString('bb = testing123.TRandomInteger()', single_input); - - py := GetVal(GetPythonEngine.GetMainModule, 'aa'); - valpy := PythonToDelphi(py); - val := valpy as PyTRandomInteger; - if Assigned(Py) then - begin - pdvainteger := val.FRandomInteger.Value; - end; - - py := GetVal(GetPythonEngine.GetMainModule, 'bb'); - valpy := PythonToDelphi(py); - val := valpy as PyTRandomInteger; - if Assigned(Py) then - begin - pdvbinteger := val.FRandomInteger.Value; - end; -end; - -{ PyTRandomInteger } - -function PythonToTRandomInteger(obj: PPyObject): TRandomInteger; -begin - if obj = GetPythonEngine.Py_None then - Result := nil - else - Result := TRandomInteger(PyTRandomInteger(PythonToDelphi(obj)).FRandomInteger); -end; - -function PyTRandomInteger.Repr: PPyObject; -var - info: string; -begin - with GetPythonEngine do - begin - info := 'NIL'; - - // regular - if Assigned(FRandomInteger) then - begin - info := IntToStr(FRandomInteger.Value); - end; - - Result := VariantAsPyObject(info); - end; -end; - - -{ PyTRandomInteger } - -constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, kwds: +(**************************************************************************) +(* *) +(* Module: Unit 'NumberServicesTest' Copyright (c) 2021 *) +(* *) +(* Lucas Moura Belo - lmbelo *) +(* lucas.belo@live.com *) +(* BH, Brazil *) +(* *) +(* PyScripter *) +(* e-mail: pyscripter@gmail.com *) +(* *) +(* Project pages: https://github.com/Embarcadero/python4delphi *) +(* https://github.com/pyscripter/python4delphi *) +(**************************************************************************) +(* Functionality: Test unit for numeric operations *) +(* *) +(* *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(**************************************************************************) +unit NumberServicesTest; +interface +uses + DUnitX.TestFramework, + PythonEngine; +type + TRandomInteger = class(TObject) + strict private + FValue: Integer; + private + procedure SetValue(const Value: Integer); + public + constructor Create; + property Value: Integer read FValue write SetValue; + end; + PyTRandomInteger = class(TPyObject) + private + FRandomInteger: TRandomInteger; + public + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + // Basic services + function Repr: PPyObject; override; + // Number services + function NbAdd(obj: PPyObject): PPyObject; override; // 0 + function NbSubtract(obj: PPyObject): PPyObject; override; // 1 + function NbMultiply(obj: PPyObject): PPyObject; override; // 2 + function NbRemainder(obj: PPyObject): PPyObject; override; // 4 {3 is for obsolete nsDivide} + function NbDivmod(obj: PPyObject): PPyObject; override; // 5 + function NbPower(ob1, ob2: PPyObject): PPyObject; override; // 6 + function NbNegative: PPyObject; override; // 7 + function NbPositive: PPyObject; override; // 8 + function NbAbsolute: PPyObject; override; // 9 + function NbInvert: PPyObject; override; // 11 (10 for obsolete nsNonZero) + function NbLShift(obj: PPyObject): PPyObject; override; // 12 + function NbRShift(obj: PPyObject): PPyObject; override; // 13 + function NbAnd(obj: PPyObject): PPyObject; override; // 14 + function NbXor(obj: PPyObject): PPyObject; override; // 15 + function NbOr(obj: PPyObject): PPyObject; override; // 16 + function NbInt : PPyObject; override; // 18 (17 is for obsolete nsCoerce) + function NbFloat : PPyObject; override; // 20 (19 is for obsolete nsLong) + function NbFloorDivide(obj: PPyObject): PPyObject; override; // 23 (21 is for obsolete nsOct, 22 for nsHex) + function NbTrueDivide(obj: PPyObject): PPyObject; override; // 24 + function NbMatrixMultiply(obj: PPyObject): PPyObject; override; // 25 + function NbBool: Integer; override; // 26 + private + function PerformArithmeticOp(obj: PPyObject; op: string): PPyObject; + public + destructor Destroy; override; + end; + [TestFixture] + TTestNumberServices = class(TObject) + private + PythonType_TRndInt: TPythonType; + FPythonModule : TPythonModule; + PythonEngine : TPythonEngine; + pdvainteger: integer; + pdvbinteger: integer; + pdvc : TPythonDelphiVar; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure TearDownFixture; + [Test] + procedure TestAdd; // 0 + [Test] + procedure TestSubtract; // 1 + [Test] + procedure TestMultiply; // 2 + [Test] + procedure TestRemainder; // 4 + [Test] + procedure TestDivMod; // 5 + [Test] + procedure TestPower; // 6 + [Test] + procedure TestNegative; // 7 + [Test] + procedure TestPositive; // 8 + [Test] + procedure TestAbsolute; // 9 + [Test] + procedure TestInvert; // 11 + [Test] + procedure TestLShift; // 12 + [Test] + procedure TestRShift; // 13 + [Test] + procedure TestAnd; // 14 + [Test] + procedure TestXor; // 15 + [Test] + procedure TestOr; // 16 + [Test] + procedure TestInt; // 18 + [Test] + procedure TestFloat; // 20 + [Test] + procedure TestFloorDivide; // 23 + [Test] + procedure TestTrueDivide; // 24 + [Test] + procedure TestMatrixMultiply; // 25 + [Test] + procedure TestBool; // 26 + end; +var PrintResults: Boolean = False; +implementation +uses + System.Variants, + System.SysUtils, + System.Math, + PythonLoad; +procedure AddPythonType(var PythonType: TPythonType; + Name: string; + TypeName: AnsiString; + Engine: TPythonEngine; + Module: TPythonModule; + PyObjectClass: TPyObjectClass; + Basic: TBasicServices; + Number: TNumberServices); +begin + if not Assigned(PythonType) then + begin + PythonType := TPythonType.Create(Module); + PythonType.Engine := Engine; + PythonType.Module := Module; + PythonType.Name := Name; + PythonType.Services.Basic := Basic; + PythonType.Services.Mapping := []; + PythonType.Services.Sequence := []; + PythonType.Services.Number := Number; + PythonType.TypeName := TypeName; + PythonType.PyObjectClass := PyObjectClass; + PythonType.GenerateCreateFunction := False; + PythonType.Initialize; + end; +end; + function GetVal(AModule : PPyObject; AVarName : AnsiString) : PPyObject; + begin + with GetPythonEngine do + begin + Result := PyObject_GetAttrString(AModule, PAnsiChar(AVarName)); + if PyErr_Occurred <> nil then + PyErr_Clear + else + Py_XDecRef(Result); // keep a borrowed reference. + end + end; +procedure TTestNumberServices.SetupFixture; +var + Py : PPyObject; + valpy: TPyObject; + val: PyTRandomInteger; +begin + PythonEngine := TPythonEngine.Create(nil); + PythonEngine.Name := 'PythonEngine'; + TPythonLoad.Configure(PythonEngine); + PythonEngine.LoadDll; + // python module + FPythonModule := TPythonModule.Create(GetPythonEngine); + FPythonModule.Engine := GetPythonEngine; + FPythonModule.ModuleName := 'testing123'; + FPythonModule.Initialize; + PythonType_TRndInt := nil; + AddPythonType(PythonType_TRndInt, 'PythonType_RndInt', 'TRandomInteger', + GetPythonEngine, FPythonModule, PyTRandomInteger, + [ bsGetAttrO, bsSetAttrO, bsRepr ], + [ nsAdd, + nsSubtract, + nsMultiply, + nsTrueDivide, + nsRemainder, + nsDivmod, + nsPower, + nsNegative, + nsPositive, + nsAbsolute, + nsInvert, + nsLShift, + nsRShift, + nsAnd, + nsXor, + nsOr, + nsInt, + nsFloat, + nsFloorDivide, + nsMatrixMultiply, + nsBool ]); + // import our module + GetPythonEngine.Run_CommandAsString('import ' + FPythonModule.ModuleName, single_input); + pdvc := TPythonDelphiVar.Create(nil); + pdvc.Engine := GetPythonEngine; + pdvc.Module := '__main__'; + pdvc.VarName := 'c'; + pdvc.Initialize; + GetPythonEngine.Run_CommandAsString('aa = testing123.TRandomInteger()', single_input); + GetPythonEngine.Run_CommandAsString('bb = testing123.TRandomInteger()', single_input); + py := GetVal(GetPythonEngine.GetMainModule, 'aa'); + valpy := PythonToDelphi(py); + val := valpy as PyTRandomInteger; + if Assigned(Py) then + begin + pdvainteger := val.FRandomInteger.Value; + end; + py := GetVal(GetPythonEngine.GetMainModule, 'bb'); + valpy := PythonToDelphi(py); + val := valpy as PyTRandomInteger; + if Assigned(Py) then + begin + pdvbinteger := val.FRandomInteger.Value; + end; +end; +{ PyTRandomInteger } +function PythonToTRandomInteger(obj: PPyObject): TRandomInteger; +begin + if obj = GetPythonEngine.Py_None then + Result := nil + else + Result := TRandomInteger(PyTRandomInteger(PythonToDelphi(obj)).FRandomInteger); +end; +function PyTRandomInteger.Repr: PPyObject; +var + info: string; +begin + with GetPythonEngine do + begin + info := 'NIL'; + // regular + if Assigned(FRandomInteger) then + begin + info := IntToStr(FRandomInteger.Value); + end; + Result := VariantAsPyObject(info); + end; +end; + +{ PyTRandomInteger } +constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args: PPyObject); -var - val1: PPyObject; -begin - with GetPythonEngine do - begin - try - inherited; - - // create object - FRandomInteger := TRandomInteger.Create; - - // try to parse the parameter - val1 := nil; - if Assigned(args) then - // try to parse - if (PyArg_ParseTuple(args, '|O:CreateWith', @val1) <> 0) and Assigned(val1) then - FRandomInteger.Value := PythonToTRandomInteger(val1).Value; - except - on e: Exception do - PyErr_SetString(PyExc_Exception^, PAnsiChar(AnsiString(e.Message))); - end; - end; -end; - -function PyTRandomInteger.NbAdd(obj: PPyObject): PPyObject; // 0 -begin - Result := PerformArithmeticOp(obj, '+'); -end; - -function PyTRandomInteger.NbSubtract(obj: PPyObject): PPyObject; // 1 -begin - Result := PerformArithmeticOp(obj, '-'); -end; - -function PyTRandomInteger.NbMultiply(obj: PPyObject): PPyObject; // 2 -begin - Result := PerformArithmeticOp(obj, '*'); -end; - -function PyTRandomInteger.NbRemainder(obj: PPyObject): PPyObject; // 4 -begin - Result := PerformArithmeticOp(obj, '%'); -end; - -function PyTRandomInteger.NbDivmod(obj: PPyObject): PPyObject; // 5 -begin - Result := PerformArithmeticOp(obj, 'divmod'); -end; - -function PyTRandomInteger.NbPower(ob1, ob2: PPyObject): PPyObject; // 6 -begin - Result := PerformArithmeticOp(ob1, '^'); -end; - -function PyTRandomInteger.NbNegative: PPyObject; // 7 -var - arg1: Integer; -begin - with GetPythonEngine do - begin - arg1 := FRandomInteger.Value; - Result := VariantAsPyObject(-arg1); - end -end; - -function PyTRandomInteger.NbPositive: PPyObject; // 8 -var - arg1: Integer; -begin - with GetPythonEngine do - begin - arg1 := FRandomInteger.Value; - Result := VariantAsPyObject(+arg1); - end -end; - -destructor PyTRandomInteger.Destroy; -begin - FRandomInteger.Free; - inherited; -end; - -function PyTRandomInteger.NbAbsolute: PPyObject; // 9 -begin - with GetPythonEngine do - begin - Result := VariantAsPyObject(Abs(FRandomInteger.Value)); - end; -end; - -function PyTRandomInteger.NbInvert: PPyObject; // 11 -begin - with GetPythonEngine do - begin - Result := VariantAsPyObject(1-(FRandomInteger.Value+1)); - end; -end; - -function PyTRandomInteger.NbLShift(obj: PPyObject): PPyObject; // 12 -begin - Result := PerformArithmeticOp(obj, '<<'); -end; - -function PyTRandomInteger.NbRShift(obj: PPyObject): PPyObject; // 13 -begin - Result := PerformArithmeticOp(obj, '>>'); -end; - -function PyTRandomInteger.NbAnd(obj: PPyObject): PPyObject; // 14 -begin - Result := PerformArithmeticOp(obj, 'and'); -end; - -function PyTRandomInteger.NbXor(obj: PPyObject): PPyObject; // 15 -begin - Result := PerformArithmeticOp(obj, 'xor'); -end; - -function PyTRandomInteger.NbOr(obj: PPyObject): PPyObject; // 16 -begin - Result := PerformArithmeticOp(obj, 'or'); -end; - -function PyTRandomInteger.NbInt: PPyObject; // 18 -begin - with GetPythonEngine do - begin - Result := VariantAsPyObject(FRandomInteger.Value); - end; -end; - -function PyTRandomInteger.NbFloat: PPyObject; // 20 -begin - with GetPythonEngine do - begin - Result := VariantAsPyObject(Single(FRandomInteger.Value)); - end; -end; - -function PyTRandomInteger.nbFloorDivide(obj: PPyObject): PPyObject; // 23 -begin - Result := PerformArithmeticOp(obj, 'floordivide'); -end; - -function PyTRandomInteger.NbTrueDivide(obj: PPyObject) : PPyObject; // 24 -begin - Result := PerformArithmeticOp(obj, '/'); -end; - -function PyTRandomInteger.NbMatrixMultiply(obj: PPyObject): PPyObject; // 25 -begin - Result := PerformArithmeticOp(obj, '@'); -end; - - -function PyTRandomInteger.NbBool: Integer; // 26 -begin - with GetPythonEngine do - begin - Result := IfThen(FRandomInteger.Value=0, Ord(False), Ord(True)); - end; -end; - - -function PyTRandomInteger.PerformArithmeticOp(obj: PPyObject; op: string): PPyObject; -var - val: TPyObject; - arg1, arg2: Integer; - VarArray: Variant; -begin - with GetPythonEngine do - begin - Result := ReturnNone; - // convert to delphi object - val := PythonToDelphi(obj); - // we can only add the same type - if (val.PythonType = Self.PythonType) then - begin - arg1 := FRandomInteger.Value; - arg2 := PyTRandomInteger(val).FRandomInteger.Value; - case op[1] of - '+': Result := VariantAsPyObject(arg1 + arg2); - '-': Result := VariantAsPyObject(arg1 - arg2); - '/': Result := VariantAsPyObject(arg1 div arg2); - '*': Result := VariantAsPyObject(arg1 * arg2); - '@': Result := VariantAsPyObject(not (arg1 * arg2)); // intentionally different from '*' - '%': Result := VariantAsPyObject(arg1 mod arg2); - '^': Result := VariantAsPyObject(System.Math.Power(Double(arg1), Double(arg2))); - else - begin - if op='divmod' then - begin - VarArray := VarArrayCreate([0, 1], varInteger); - VarArrayPut(VarArray, arg1 div arg2, [0]); - VarArrayPut(VarArray, arg1 mod arg2, [1]); - Result := VariantAsPyObject(VarArray); - end - - else if op='>>' then - begin - Result := VariantAsPyObject(arg1 shr arg2); - end - - else if op='<<' then - begin - Result := VariantAsPyObject(arg1 shl arg2); - end - - else if op='and' then - begin - Result := VariantAsPyObject(arg1 and arg2); - end - - else if op='xor' then - begin - Result := VariantAsPyObject(arg1 xor arg2); - end - - else if op='or' then - begin - Result := VariantAsPyObject(arg1 or arg2); - end - - else if op='floordivide' then - begin - Result := VariantAsPyObject(arg1 div arg2); - end; - end; - end; - end - else // the arguments were not right - Result := nil; - end; -end; - -{ TRandomInteger } - -constructor TRandomInteger.Create; -begin - inherited; - FValue := 1+Random(100); // Result interval [1, 101] so safe to test division -end; - -procedure TRandomInteger.SetValue(const Value: Integer); -begin - FValue := Value; -end; - -procedure TTestNumberServices.TearDownFixture; -begin - PythonEngine.Free; - pdvc.Free; -end; - -// nsAdd -procedure TTestNumberServices.TestAdd; // 0 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa+bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger+pdvbinteger); -end; - -// nsSubtract -procedure TTestNumberServices.TestSubtract; // 1 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa-bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger-pdvbinteger); -end; - -// nsMultiply -procedure TTestNumberServices.TestMultiply; // 2 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa*bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger*pdvbinteger); -end; - -// nsRemainder -procedure TTestNumberServices.TestRemainder; // 4 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa%bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger mod pdvbinteger); -end; - -// nsDivmod -procedure TTestNumberServices.TestDivMod; // 5 -var - VarArr: Variant; - res0, res1: Integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=divmod(aa,bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - VarArr := pdvc.Value; - res0 := VarArr[0]; - res1 := VarArr[1]; - - Assert.AreEqual(res0, pdvainteger div pdvbinteger); - Assert.AreEqual(res1, pdvainteger mod pdvbinteger); -end; - -// nsPower -procedure TTestNumberServices.TestPower; // 6 -var - pdvdouble: double; -begin - GetPythonEngine.Run_CommandAsString('c.Value=float(aa**bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvdouble := pdvc.Value; - Assert.AreEqual(Double(pdvdouble), {Round}(System.Math.Power(Double(pdvainteger), Double(pdvbinteger)))); - -end; - -// nsNegative -procedure TTestNumberServices.TestNegative; // 7 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(-aa)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, -pdvainteger); -end; - -// nsPositive -procedure TTestNumberServices.TestPositive; // 8 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=int(+aa)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, +pdvainteger); -end; - -// nsAbsolute -procedure TTestNumberServices.TestAbsolute; // 9 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=abs(-aa)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, +pdvainteger); -end; - -// nsInvert -procedure TTestNumberServices.TestInvert; // 11 -var - pdvinteger: Integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=~aa', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, 1-(pdvainteger+1)); -end; - -// nsLShift -procedure TTestNumberServices.TestLShift; // 12 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa<>bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger shr pdvbinteger); -end; - -// nsAnd -procedure TTestNumberServices.TestAnd; // 14 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa&bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger and pdvbinteger); -end; - -// nsXor -procedure TTestNumberServices.TestXor; // 15 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa^bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger xor pdvbinteger); -end; - -// nsOr -procedure TTestNumberServices.TestOr; // 16 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa|bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger or pdvbinteger); -end; - -// nsInt -procedure TTestNumberServices.TestInt; // 18 -var - pdvinteger: Integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=int(aa)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger); -end; - -// nsFloat -procedure TTestNumberServices.TestFloat; // 20 -var - pdvsingle: Single; -begin - GetPythonEngine.Run_CommandAsString('c.Value=float(aa)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvsingle := pdvc.Value; - Assert.AreEqual(pdvsingle, single(pdvainteger)); -end; - -// nsFloorDivide -procedure TTestNumberServices.TestFloorDivide; // 23 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa//bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger div pdvbinteger); -end; - -// nsTrueDivide -procedure TTestNumberServices.TestTrueDivide; // 24 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa/bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, pdvainteger div pdvbinteger); -end; - -// nsMatrixMultiply -procedure TTestNumberServices.TestMatrixMultiply; // 25 -var - pdvinteger: integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value=(aa @ bb)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger, not (pdvainteger * pdvbinteger)); // not really a matrix mult, but who cares! -end; - -// nsBool -procedure TTestNumberServices.TestBool; // 26 -var - pdvinteger: Integer; -begin - GetPythonEngine.Run_CommandAsString('c.Value= bool(aa)', single_input); - if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); - - pdvinteger := pdvc.Value; - Assert.AreEqual(pdvinteger=0, pdvainteger=0) -end; - -initialization - TDUnitX.RegisterTestFixture(TTestNumberServices); - ReportMemoryLeaksOnShutdown := True; - -end. +var + val1: PPyObject; +begin + with GetPythonEngine do + begin + try + inherited; + // create object + FRandomInteger := TRandomInteger.Create; + // try to parse the parameter + val1 := nil; + if Assigned(args) then + // try to parse + if (PyArg_ParseTuple(args, '|O:CreateWith', @val1) <> 0) and Assigned(val1) then + FRandomInteger.Value := PythonToTRandomInteger(val1).Value; + except + on e: Exception do + PyErr_SetString(PyExc_Exception^, PAnsiChar(AnsiString(e.Message))); + end; + end; +end; +function PyTRandomInteger.NbAdd(obj: PPyObject): PPyObject; // 0 +begin + Result := PerformArithmeticOp(obj, '+'); +end; +function PyTRandomInteger.NbSubtract(obj: PPyObject): PPyObject; // 1 +begin + Result := PerformArithmeticOp(obj, '-'); +end; +function PyTRandomInteger.NbMultiply(obj: PPyObject): PPyObject; // 2 +begin + Result := PerformArithmeticOp(obj, '*'); +end; +function PyTRandomInteger.NbRemainder(obj: PPyObject): PPyObject; // 4 +begin + Result := PerformArithmeticOp(obj, '%'); +end; +function PyTRandomInteger.NbDivmod(obj: PPyObject): PPyObject; // 5 +begin + Result := PerformArithmeticOp(obj, 'divmod'); +end; +function PyTRandomInteger.NbPower(ob1, ob2: PPyObject): PPyObject; // 6 +begin + Result := PerformArithmeticOp(ob1, '^'); +end; +function PyTRandomInteger.NbNegative: PPyObject; // 7 +var + arg1: Integer; +begin + with GetPythonEngine do + begin + arg1 := FRandomInteger.Value; + Result := VariantAsPyObject(-arg1); + end +end; +function PyTRandomInteger.NbPositive: PPyObject; // 8 +var + arg1: Integer; +begin + with GetPythonEngine do + begin + arg1 := FRandomInteger.Value; + Result := VariantAsPyObject(+arg1); + end +end; +destructor PyTRandomInteger.Destroy; +begin + FRandomInteger.Free; + inherited; +end; +function PyTRandomInteger.NbAbsolute: PPyObject; // 9 +begin + with GetPythonEngine do + begin + Result := VariantAsPyObject(Abs(FRandomInteger.Value)); + end; +end; +function PyTRandomInteger.NbInvert: PPyObject; // 11 +begin + with GetPythonEngine do + begin + Result := VariantAsPyObject(1-(FRandomInteger.Value+1)); + end; +end; +function PyTRandomInteger.NbLShift(obj: PPyObject): PPyObject; // 12 +begin + Result := PerformArithmeticOp(obj, '<<'); +end; +function PyTRandomInteger.NbRShift(obj: PPyObject): PPyObject; // 13 +begin + Result := PerformArithmeticOp(obj, '>>'); +end; +function PyTRandomInteger.NbAnd(obj: PPyObject): PPyObject; // 14 +begin + Result := PerformArithmeticOp(obj, 'and'); +end; +function PyTRandomInteger.NbXor(obj: PPyObject): PPyObject; // 15 +begin + Result := PerformArithmeticOp(obj, 'xor'); +end; +function PyTRandomInteger.NbOr(obj: PPyObject): PPyObject; // 16 +begin + Result := PerformArithmeticOp(obj, 'or'); +end; +function PyTRandomInteger.NbInt: PPyObject; // 18 +begin + with GetPythonEngine do + begin + Result := VariantAsPyObject(FRandomInteger.Value); + end; +end; +function PyTRandomInteger.NbFloat: PPyObject; // 20 +begin + with GetPythonEngine do + begin + Result := VariantAsPyObject(Single(FRandomInteger.Value)); + end; +end; +function PyTRandomInteger.nbFloorDivide(obj: PPyObject): PPyObject; // 23 +begin + Result := PerformArithmeticOp(obj, 'floordivide'); +end; +function PyTRandomInteger.NbTrueDivide(obj: PPyObject) : PPyObject; // 24 +begin + Result := PerformArithmeticOp(obj, '/'); +end; +function PyTRandomInteger.NbMatrixMultiply(obj: PPyObject): PPyObject; // 25 +begin + Result := PerformArithmeticOp(obj, '@'); +end; + +function PyTRandomInteger.NbBool: Integer; // 26 +begin + with GetPythonEngine do + begin + Result := IfThen(FRandomInteger.Value=0, Ord(False), Ord(True)); + end; +end; + +function PyTRandomInteger.PerformArithmeticOp(obj: PPyObject; op: string): PPyObject; +var + val: TPyObject; + arg1, arg2: Integer; + VarArray: Variant; +begin + with GetPythonEngine do + begin + Result := ReturnNone; + // convert to delphi object + val := PythonToDelphi(obj); + // we can only add the same type + if (val.PythonType = Self.PythonType) then + begin + arg1 := FRandomInteger.Value; + arg2 := PyTRandomInteger(val).FRandomInteger.Value; + case op[1] of + '+': Result := VariantAsPyObject(arg1 + arg2); + '-': Result := VariantAsPyObject(arg1 - arg2); + '/': Result := VariantAsPyObject(arg1 div arg2); + '*': Result := VariantAsPyObject(arg1 * arg2); + '@': Result := VariantAsPyObject(not (arg1 * arg2)); // intentionally different from '*' + '%': Result := VariantAsPyObject(arg1 mod arg2); + '^': Result := VariantAsPyObject(System.Math.Power(Double(arg1), Double(arg2))); + else + begin + if op='divmod' then + begin + VarArray := VarArrayCreate([0, 1], varInteger); + VarArrayPut(VarArray, arg1 div arg2, [0]); + VarArrayPut(VarArray, arg1 mod arg2, [1]); + Result := VariantAsPyObject(VarArray); + end + else if op='>>' then + begin + Result := VariantAsPyObject(arg1 shr arg2); + end + else if op='<<' then + begin + Result := VariantAsPyObject(arg1 shl arg2); + end + else if op='and' then + begin + Result := VariantAsPyObject(arg1 and arg2); + end + else if op='xor' then + begin + Result := VariantAsPyObject(arg1 xor arg2); + end + else if op='or' then + begin + Result := VariantAsPyObject(arg1 or arg2); + end + else if op='floordivide' then + begin + Result := VariantAsPyObject(arg1 div arg2); + end; + end; + end; + end + else // the arguments were not right + Result := nil; + end; +end; +{ TRandomInteger } +constructor TRandomInteger.Create; +begin + inherited; + FValue := 1+Random(100); // Result interval [1, 101] so safe to test division +end; +procedure TRandomInteger.SetValue(const Value: Integer); +begin + FValue := Value; +end; +procedure TTestNumberServices.TearDownFixture; +begin + PythonEngine.Free; + pdvc.Free; +end; +// nsAdd +procedure TTestNumberServices.TestAdd; // 0 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa+bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger+pdvbinteger); +end; +// nsSubtract +procedure TTestNumberServices.TestSubtract; // 1 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa-bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger-pdvbinteger); +end; +// nsMultiply +procedure TTestNumberServices.TestMultiply; // 2 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa*bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger*pdvbinteger); +end; +// nsRemainder +procedure TTestNumberServices.TestRemainder; // 4 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa%bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger mod pdvbinteger); +end; +// nsDivmod +procedure TTestNumberServices.TestDivMod; // 5 +var + VarArr: Variant; + res0, res1: Integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=divmod(aa,bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + VarArr := pdvc.Value; + res0 := VarArr[0]; + res1 := VarArr[1]; + Assert.AreEqual(res0, pdvainteger div pdvbinteger); + Assert.AreEqual(res1, pdvainteger mod pdvbinteger); +end; +// nsPower +procedure TTestNumberServices.TestPower; // 6 +var + pdvdouble: double; +begin + GetPythonEngine.Run_CommandAsString('c.Value=float(aa**bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvdouble := pdvc.Value; + Assert.AreEqual(Double(pdvdouble), {Round}(System.Math.Power(Double(pdvainteger), Double(pdvbinteger)))); +end; +// nsNegative +procedure TTestNumberServices.TestNegative; // 7 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(-aa)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, -pdvainteger); +end; +// nsPositive +procedure TTestNumberServices.TestPositive; // 8 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=int(+aa)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, +pdvainteger); +end; +// nsAbsolute +procedure TTestNumberServices.TestAbsolute; // 9 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=abs(-aa)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, +pdvainteger); +end; +// nsInvert +procedure TTestNumberServices.TestInvert; // 11 +var + pdvinteger: Integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=~aa', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, 1-(pdvainteger+1)); +end; +// nsLShift +procedure TTestNumberServices.TestLShift; // 12 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa<>bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger shr pdvbinteger); +end; +// nsAnd +procedure TTestNumberServices.TestAnd; // 14 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa&bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger and pdvbinteger); +end; +// nsXor +procedure TTestNumberServices.TestXor; // 15 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa^bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger xor pdvbinteger); +end; +// nsOr +procedure TTestNumberServices.TestOr; // 16 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa|bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger or pdvbinteger); +end; +// nsInt +procedure TTestNumberServices.TestInt; // 18 +var + pdvinteger: Integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=int(aa)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger); +end; +// nsFloat +procedure TTestNumberServices.TestFloat; // 20 +var + pdvsingle: Single; +begin + GetPythonEngine.Run_CommandAsString('c.Value=float(aa)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvsingle := pdvc.Value; + Assert.AreEqual(pdvsingle, single(pdvainteger)); +end; +// nsFloorDivide +procedure TTestNumberServices.TestFloorDivide; // 23 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa//bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger div pdvbinteger); +end; +// nsTrueDivide +procedure TTestNumberServices.TestTrueDivide; // 24 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa/bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, pdvainteger div pdvbinteger); +end; +// nsMatrixMultiply +procedure TTestNumberServices.TestMatrixMultiply; // 25 +var + pdvinteger: integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value=(aa @ bb)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger, not (pdvainteger * pdvbinteger)); // not really a matrix mult, but who cares! +end; +// nsBool +procedure TTestNumberServices.TestBool; // 26 +var + pdvinteger: Integer; +begin + GetPythonEngine.Run_CommandAsString('c.Value= bool(aa)', single_input); + if PrintResults then GetPythonEngine.Run_CommandAsString('print(c)', single_input); + pdvinteger := pdvc.Value; + Assert.AreEqual(pdvinteger=0, pdvainteger=0) +end; +initialization + TDUnitX.RegisterTestFixture(TTestNumberServices); + ReportMemoryLeaksOnShutdown := True; +end. diff --git a/Tests/NumberServicesTest.pas b/Tests/NumberServicesTest.pas index 0bbfee7a..0b3848d0 100644 --- a/Tests/NumberServicesTest.pas +++ b/Tests/NumberServicesTest.pas @@ -22,7 +22,7 @@ PyTRandomInteger = class(TPyObject) FRandomInteger: TRandomInteger; public - constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; // Basic services function Repr: PPyObject; override; @@ -272,7 +272,7 @@ function PyTRandomInteger.Repr: PPyObject; { PyTRandomInteger } -constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, kwds: +constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args: PPyObject); var val1: PPyObject; From 20651a750da5152c3d0ecf6805ef8f7645dbb8d7 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Jan 2023 22:12:37 +0200 Subject: [PATCH 031/174] Added AddClassMethodWithKeywords, AddClassMethodWithKeywords from the Embarcadero fork. --- Source/PythonEngine.pas | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 821e4b3a..f1ac3ff1 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -179,6 +179,8 @@ TPythonVersionProp = record METH_VARARGS = $0001; METH_KEYWORDS = $0002; + METH_CLASS = $0010; + METH_STATIC = $0020; // Masks for the co_flags field of PyCodeObject CO_OPTIMIZED = $0001; @@ -2110,6 +2112,12 @@ TMethodsContainer = class(TEngineClient) function AddMethodWithKeywords( AMethodName : PAnsiChar; AMethod : PyCFunctionWithKW; ADocString : PAnsiChar ) : PPyMethodDef; + function AddClassMethodWithKeywords( AMethodName : PAnsiChar; + AMethod : PyCFunctionWithKW; + ADocString : PAnsiChar ) : PPyMethodDef; + function AddStaticMethodWithKeywords( AMethodName : PAnsiChar; + AMethod : PyCFunctionWithKW; + ADocString : PAnsiChar ) : PPyMethodDef; function AddDelphiMethod( AMethodName : PAnsiChar; ADelphiMethod: TDelphiMethod; ADocString : PAnsiChar ) : PPyMethodDef; @@ -2363,7 +2371,6 @@ TPythonModule = class(TMethodsContainer) - Properties ob_refcnt and ob_type will call GetSelf to access their data. } // The base class of all new Python types - TPyObjectClass = class of TPyObject; TPyObject = class private function Get_ob_refcnt: NativeInt; @@ -2470,6 +2477,7 @@ TPyObject = class class procedure RegisterGetSets( APythonType : TPythonType ); virtual; class procedure SetupType( APythonType : TPythonType ); virtual; end; + TPyObjectClass = class of TPyObject; TBasicServices = set of (bsGetAttr, bsSetAttr, bsRepr, bsCompare, bsHash, @@ -6594,6 +6602,20 @@ function TMethodsContainer.AddMethodWithKeywords( AMethodName : PAnsiChar; Result^.ml_flags := Result^.ml_flags or METH_KEYWORDS; end; +function TMethodsContainer.AddStaticMethodWithKeywords(AMethodName: PAnsiChar; + AMethod: PyCFunctionWithKW; ADocString: PAnsiChar): PPyMethodDef; +begin + Result := AddMethodWithKeywords(AMethodName, AMethod, ADocString); + Result^.ml_flags := Result^.ml_flags or METH_STATIC; +end; + +function TMethodsContainer.AddClassMethodWithKeywords(AMethodName: PAnsiChar; + AMethod: PyCFunctionWithKW; ADocString: PAnsiChar): PPyMethodDef; +begin + Result := AddMethodWithKeywords(AMethodName, AMethod, ADocString); + Result^.ml_flags := Result^.ml_flags or METH_CLASS; +end; + function TMethodsContainer.AddDelphiMethod( AMethodName : PAnsiChar; ADelphiMethod: TDelphiMethod; ADocString : PAnsiChar ) : PPyMethodDef; From b8c07b3f7b547ac6cf341f90506458d60aaf5bd8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Jan 2023 22:20:45 +0200 Subject: [PATCH 032/174] Synced WrapDelphiClasses.pas with the Embarcadero fork --- Source/WrapDelphiClasses.pas | 670 +++++++++++++++++++++++++++++++++++ 1 file changed, 670 insertions(+) diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index ce2fa488..23ca2d56 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -239,6 +239,125 @@ TPyDelphiBasicAction = class (TPyDelphiComponent) property DelphiObject: TBasicAction read GetDelphiObject write SetDelphiObject; end; + TPyDelphiStream = class(TPyDelphiObject) + private + function GetDelphiObject: TStream; + procedure SetDelphiObject(const Value: TStream); + + function GetReadCount(const AArgs: PPyObject): integer; inline; + protected + function ReadBytes_Wrapper(const AArgs: PPyObject): PPyObject; + function ReadInt_Wrapper(const AArgs: PPyObject): PPyObject; + function ReadString_Wrapper(const AArgs: PPyObject): PPyObject; + function ReadFloat_Wrapper(const AArgs: PPyObject): PPyObject; + + function WriteBytes_Wrapper(const AArgs: PPyObject): PPyObject; + function WriteInt_Wrapper(const AArgs: PPyObject): PPyObject; + function WriteString_Wrapper(const AArgs: PPyObject): PPyObject; + function WriteFloat_Wrapper(const AArgs: PPyObject): PPyObject; + public + // Class methods + class function DelphiObjectClass : TClass; override; + class procedure SetupType(PythonType: TPythonType); override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + // Properties + property DelphiObject: TStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiHandleStream = class(TPyDelphiStream) + private + function GetDelphiObject: THandleStream; + procedure SetDelphiObject(const Value: THandleStream); + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: THandleStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiFileStream = class(TPyDelphiHandleStream) + private + function GetDelphiObject: TFileStream; + procedure SetDelphiObject(const Value: TFileStream); + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TFileStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiBufferedFileStream = class(TPyDelphiFileStream) + private + function GetDelphiObject: TBufferedFileStream; + procedure SetDelphiObject(const Value: TBufferedFileStream); + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TBufferedFileStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomMemoryStream = class(TPyDelphiStream) + private + function GetDelphiObject: TCustomMemoryStream; + procedure SetDelphiObject(const Value: TCustomMemoryStream); + public + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomMemoryStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiMemoryStream = class(TPyDelphiCustomMemoryStream) + private + function GetDelphiObject: TMemoryStream; + procedure SetDelphiObject(const Value: TMemoryStream); + public + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TMemoryStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiByteStream = class(TPyDelphiMemoryStream) + private + function GetDelphiObject: TBytesStream; + procedure SetDelphiObject(const Value: TBytesStream); + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TBytesStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStringStream = class(TPyDelphiByteStream) + private + function GetDelphiObject: TStringStream; + procedure SetDelphiObject(const Value: TStringStream); + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TStringStream read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiResourceStream = class(TPyDelphiCustomMemoryStream) + private + function GetDelphiObject: TResourceStream; + procedure SetDelphiObject(const Value: TResourceStream); + public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; + // Class methods + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TResourceStream read GetDelphiObject write SetDelphiObject; + end; + { Helper functions } function ShiftToPython(AShift : TShiftState) : PPyObject; @@ -284,6 +403,24 @@ procedure TClassesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); APyDelphiWrapper.DefineVar('ssRight', 'ssRight'); APyDelphiWrapper.DefineVar('ssMiddle', 'ssMiddle'); APyDelphiWrapper.DefineVar('ssDouble', 'ssDouble'); + //TFileStream mode + APyDelphiWrapper.DefineVar('fmCreate', fmCreate); + APyDelphiWrapper.DefineVar('fmOpenRead', fmOpenRead); + APyDelphiWrapper.DefineVar('fmOpenWrite', fmOpenWrite); + APyDelphiWrapper.DefineVar('fmOpenReadWrite', fmOpenReadWrite); + {$WARN SYMBOL_PLATFORM OFF} + {$IFDEF MSWINDOWS} + APyDelphiWrapper.DefineVar('fmShareCompat', fmShareCompat); + {$ENDIF MSWINDOWS} + {$WARN SYMBOL_PLATFORM ON} + APyDelphiWrapper.DefineVar('fmShareExclusive', fmShareExclusive); + APyDelphiWrapper.DefineVar('fmShareDenyWrite', fmShareDenyWrite); + {$WARN SYMBOL_PLATFORM OFF} + {$IFDEF MSWINDOWS} + APyDelphiWrapper.DefineVar('fmShareDenyRead', fmShareDenyRead); + {$ENDIF MSWINDOWS} + {$WARN SYMBOL_PLATFORM ON} + APyDelphiWrapper.DefineVar('fmShareDenyNone', fmShareDenyNone); end; function TClassesRegistration.Name: string; @@ -299,6 +436,15 @@ procedure TClassesRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapp APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComponent); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStrings); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBasicAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiHandleStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBufferedFileStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMemoryStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMemoryStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiByteStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStringStream); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiResourceStream); end; { Helper functions } @@ -1750,6 +1896,530 @@ procedure TPyReader.SetName(Component: TComponent; var Name: string); end; {$ENDIF} +{ TPyDelphiStream } + +class function TPyDelphiStream.DelphiObjectClass: TClass; +begin + Result := TStream; +end; + +function TPyDelphiStream.GetDelphiObject: TStream; +begin + Result := TStream(inherited DelphiObject); +end; + +procedure TPyDelphiStream.SetDelphiObject(const Value: TStream); +begin + inherited DelphiObject := Value; +end; + +class procedure TPyDelphiStream.SetupType(PythonType: TPythonType); +begin + inherited; + if (PythonType.PyObjectClass = TPyDelphiStream) then + PythonType.TypeFlags := PythonType.TypeFlags + [TPFlag.tpIsAbstract] + else + PythonType.TypeFlags := PythonType.TypeFlags + [TPFlag.tpTypeSubclass] +end; + +class procedure TPyDelphiStream.RegisterMethods(PythonType: TPythonType); +begin + inherited; + PythonType.AddMethod('ReadBytes', @TPyDelphiStream.ReadBytes_Wrapper, + 'TPyDelphiStream.ReadBytes()' + #10 + 'Read content as bytearray.'); + PythonType.AddMethod('ReadInt', @TPyDelphiStream.ReadInt_Wrapper, + 'TPyDelphiStream.ReadInt()' + #10 + 'Read content as integer.'); + PythonType.AddMethod('ReadString', @TPyDelphiStream.ReadString_Wrapper, + 'TPyDelphiStream.ReadString()' + #10 + 'Read content as string.'); + PythonType.AddMethod('ReadFloat', @TPyDelphiStream.ReadFloat_Wrapper, + 'TPyDelphiStream.ReadFloat()' + #10 + 'Read content as float.'); + + PythonType.AddMethod('WriteBytes', @TPyDelphiStream.WriteBytes_Wrapper, + 'TPyDelphiStream.WriteBytes()' + #10 + 'Write content as bytearray.'); + PythonType.AddMethod('WriteInt', @TPyDelphiStream.WriteInt_Wrapper, + 'TPyDelphiStream.WriteInt()' + #10 + 'Write content as integer.'); + PythonType.AddMethod('WriteString', @TPyDelphiStream.WriteString_Wrapper, + 'TPyDelphiStream.WriteString()' + #10 + 'Write content as string.'); + PythonType.AddMethod('WriteFloat', @TPyDelphiStream.WriteFloat_Wrapper, + 'TPyDelphiStream.WriteFloat()' + #10 + 'Write content as float.'); +end; + +function TPyDelphiStream.GetReadCount(const AArgs: PPyObject): integer; +begin + if GetPythonEngine().PyArg_ParseTuple(AArgs, 'i:Create', @Result) = 0 then + Result := 0; +end; + +function TPyDelphiStream.ReadBytes_Wrapper(const AArgs: PPyObject): PPyObject; +var + LCount: Integer; + LValue: TBytes; + LItem: PPyObject; + LBytes: PPyObject; + LByte: byte; +begin + Adjust(@Self); + //Returns multiple results + with GetPythonEngine() do begin + Result := PyList_New(0); + LCount := GetReadCount(AArgs); + if (LCount > 0) then begin + //The read result + SetLength(LValue, LCount); + LItem := PyLong_FromLong(DelphiObject.Read(LValue, LCount)); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + //Create a list of bytes, then convert it to bytearray + LBytes := PyList_New(0); + for LByte in LValue do begin + LItem := PyLong_FromLong(LByte); + PyList_Append(LBytes, LItem); + Py_XDecRef(LItem); + end; + //The content + LItem := PyByteArray_FromObject(LBytes); + Py_XDecRef(LBytes); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + end; + end; +end; + +function TPyDelphiStream.ReadFloat_Wrapper(const AArgs: PPyObject): PPyObject; +var + LValue: single; + LItem: PPyObject; +begin + Adjust(@Self); + //Returns multiple results + with GetPythonEngine() do begin + Result := PyList_New(0); + //The read result + LItem := PyLong_FromLong(DelphiObject.Read(LValue, SizeOf(single))); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + //The content + LItem := PyFloat_FromDouble(LValue); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + end; +end; + +function TPyDelphiStream.ReadInt_Wrapper(const AArgs: PPyObject): PPyObject; +var + LValue: integer; + LItem: PPyObject; +begin + Adjust(@Self); + //Returns multiple results + with GetPythonEngine() do begin + Result := PyList_New(0); + //The read result + LItem := PyLong_FromLong(DelphiObject.Read(LValue, SizeOf(Integer))); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + //The content + LItem := PyLong_FromLong(LValue); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + end; +end; + +function TPyDelphiStream.ReadString_Wrapper(const AArgs: PPyObject): PPyObject; +var + LCount: Integer; + LValue: string; + LItem: PPyObject; +begin + Adjust(@Self); + //Returns multiple results + with GetPythonEngine() do begin + Result := PyList_New(0); + LCount := GetReadCount(AArgs); + if (LCount > 0) then begin + //The read result + SetLength(LValue, LCount); + LItem := PyLong_FromLong(DelphiObject.Read(Pointer(LValue)^, LCount * SizeOf(Char))); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + //The content + LItem := PyUnicodeFromString(LValue); + PyList_Append(Result, LItem); + Py_XDecRef(LItem); + end; + end; +end; + +function TPyDelphiStream.WriteBytes_Wrapper(const AArgs: PPyObject): PPyObject; +var + LValue: PPyObject; + LCount: integer; + LBuffer: TBytes; +begin + Adjust(@Self); + Result := nil; + with GetPythonEngine() do begin + if PyArg_ParseTuple(AArgs, 'Yi:Create', @LValue, @LCount) <> 0 then + if PyByteArray_Check(LValue) then begin + LBuffer := TEncoding.Default.GetBytes(String(PyByteArray_AsString(LValue))); + Result := PyLong_FromLong(DelphiObject.Write(LBuffer, LCount)); + end; + end; +end; + +function TPyDelphiStream.WriteFloat_Wrapper(const AArgs: PPyObject): PPyObject; +var + LValue: single; +begin + Adjust(@Self); + Result := nil; + with GetPythonEngine() do begin + if PyArg_ParseTuple(AArgs, 'f:Create', @LValue) <> 0 then + Result := PyLong_FromLong(DelphiObject.Write(LValue, SizeOf(Single))); + end; +end; + +function TPyDelphiStream.WriteInt_Wrapper(const AArgs: PPyObject): PPyObject; +var + LValue: integer; +begin + Adjust(@Self); + Result := nil; + with GetPythonEngine() do begin + if PyArg_ParseTuple(AArgs, 'i:Create', @LValue) <> 0 then + Result := PyLong_FromLong(DelphiObject.Write(LValue, SizeOf(Integer))); + end; +end; + +function TPyDelphiStream.WriteString_Wrapper( + const AArgs: PPyObject): PPyObject; +var + LValue: PAnsiChar; + LCount: integer; + LStr: string; +begin + Adjust(@Self); + Result := nil; + with GetPythonEngine() do begin + if PyArg_ParseTuple(AArgs, 'si:Create', @LValue, @LCount) <> 0 then begin + LStr := String(LValue); + Result := PyLong_FromLong(DelphiObject.Write(Pointer(LStr)^, LCount * SizeOf(Char))); + end; + end; +end; + +{ TPyDelphiHandleStream } + +constructor TPyDelphiHandleStream.CreateWith(APythonType: TPythonType; + args, kwds: PPyObject); +type + THandleStreamClass = class of THandleStream; +var + LParamCount: NativeInt; + LHandle: THandle; +begin + inherited; + //Clear unsuccessful overloaded constructor error + APythonType.Engine.PyErr_Clear(); + + LParamCount := APythonType.Engine.PyTuple_Size(args); + if (LParamCount = 1) then + {$IFDEF CPUX64} + if APythonType.Engine.PyArg_ParseTuple(args, 'K:Create', @LHandle) <> 0 then + {$ELSE} + if APythonType.Engine.PyArg_ParseTuple(args, 'I:Create', @LHandle) <> 0 then + {$ENDIF} + DelphiObject := THandleStreamClass(DelphiObjectClass).Create(LHandle); +end; + +class function TPyDelphiHandleStream.DelphiObjectClass: TClass; +begin + Result := THandleStream; +end; + +function TPyDelphiHandleStream.GetDelphiObject: THandleStream; +begin + Result := THandleStream(inherited DelphiObject); +end; + +procedure TPyDelphiHandleStream.SetDelphiObject(const Value: THandleStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileStream } + +constructor TPyDelphiFileStream.CreateWith(APythonType: TPythonType; + args, kwds: PPyObject); +type + TFileStreamClass = class of TFileStream; +var + LParamCount: NativeInt; + LMode: Word; + LRights: Cardinal; + LFileName: PAnsiChar; +begin + inherited; + //Clear unsuccessful overloaded constructor error + APythonType.Engine.PyErr_Clear(); + + if (APythonType.PyObjectClass <> TPyDelphiFileStream) then + Exit; + + LParamCount := APythonType.Engine.PyTuple_Size(args); + if (LParamCount = 2) then begin + if APythonType.Engine.PyArg_ParseTuple(args, 'sH:Create', @LFileName, @LMode) <> 0 then + DelphiObject := TFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode); + end else if (LParamCount = 3) then begin + if APythonType.Engine.PyArg_ParseTuple(args, 'sHI:Create', @LFileName, @LMode, @LRights) <> 0 then + DelphiObject := TFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights); + end; + + //Maybe it was created on the next attempt... + if Assigned(DelphiObject) then + APythonType.Engine.PyErr_Clear(); +end; + +class function TPyDelphiFileStream.DelphiObjectClass: TClass; +begin + Result := TFileStream; +end; + +function TPyDelphiFileStream.GetDelphiObject: TFileStream; +begin + Result := TFileStream(inherited DelphiObject); +end; + +procedure TPyDelphiFileStream.SetDelphiObject(const Value: TFileStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBufferedFileStream } + +constructor TPyDelphiBufferedFileStream.CreateWith(APythonType: TPythonType; + args, kwds: PPyObject); +type + TBufferedFileStreamClass = class of TBufferedFileStream; +const + LKwArgs1: array[0..3] of PAnsiChar = ('FileName', 'Mode', 'BufferSize', PAnsiChar(nil)); + LKwArgs2: array[0..4] of PAnsiChar = ('FileName', 'Mode', 'Rights', 'BufferSize', PAnsiChar(nil)); +var + LArgCount: NativeInt; + LMode: Word; + LRights: Cardinal; + LFileName: PAnsiChar; + LBufferSize: integer; +begin + inherited; //We MUST use the overloaded constructor + //Clear unsuccessful overloaded constructor error + APythonType.Engine.PyErr_Clear(); + + //We need kwargs here due to constructor overloads with default value (BufferSize) + LBufferSize := 32768; + LArgCount := APythonType.Engine.PyTuple_Size(args); + if (LArgCount = 2) then begin + if (APythonType.Engine.PyArg_ParseTupleAndKeywords(args, kwds, 'sH|i:Create', @LKwArgs1[0], @LFileName, @LMode, @LBufferSize) <> 0) then + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LBufferSize); + end else if (LArgCount = 3) then begin + if (APythonType.Engine.PyArg_ParseTupleAndKeywords(args, kwds, 'sHI|i:Create', @LKwArgs2[0], @LFileName, @LMode, @LRights, @LBufferSize) <> 0) then + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights, LBufferSize); + end; + + //Maybe it was created on the next attempt... + if Assigned(DelphiObject) then + APythonType.Engine.PyErr_Clear(); +end; + +class function TPyDelphiBufferedFileStream.DelphiObjectClass: TClass; +begin + Result := TBufferedFileStream; +end; + +function TPyDelphiBufferedFileStream.GetDelphiObject: TBufferedFileStream; +begin + Result := TBufferedFileStream(inherited DelphiObject); +end; + +procedure TPyDelphiBufferedFileStream.SetDelphiObject( + const Value: TBufferedFileStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomMemoryStream } + +class function TPyDelphiCustomMemoryStream.DelphiObjectClass: TClass; +begin + Result := TCustomMemoryStream; +end; + +function TPyDelphiCustomMemoryStream.GetDelphiObject: TCustomMemoryStream; +begin + Result := TCustomMemoryStream(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMemoryStream.SetDelphiObject( + const Value: TCustomMemoryStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMemoryStream } + +class function TPyDelphiMemoryStream.DelphiObjectClass: TClass; +begin + Result := TMemoryStream; +end; + +function TPyDelphiMemoryStream.GetDelphiObject: TMemoryStream; +begin + Result := TMemoryStream(inherited DelphiObject); +end; + +procedure TPyDelphiMemoryStream.SetDelphiObject(const Value: TMemoryStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiByteStream } + +constructor TPyDelphiByteStream.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); +type + TBytesStreamClass = class of TBytesStream; +var + LBytes: PPyObject; +begin + inherited; + //Clear unsuccessful overloaded constructor error + APythonType.Engine.PyErr_Clear(); + + if (APythonType.Engine.PyTuple_Size(args) = 1) then + if APythonType.Engine.PyArg_ParseTuple(args, 'Y:Create', @LBytes) <> 0 then begin + if APythonType.Engine.PyByteArray_Check(LBytes) then begin + DelphiObject := TBytesStreamClass(DelphiObjectClass).Create( + TEncoding.Default.GetBytes( + String(APythonType.Engine.PyByteArray_AsString(LBytes)))); + end; + end else if APythonType.Engine.PyArg_ParseTuple(args, 'S:Create', @LBytes) <> 0 then begin + if APythonType.Engine.PyBytes_Check(LBytes) then begin + DelphiObject := TBytesStreamClass(DelphiObjectClass).Create( + TEncoding.Default.GetBytes( + String(APythonType.Engine.PyBytes_AsString(LBytes)))); + end; + end; + + //Maybe it was created on the next attempt... + if Assigned(DelphiObject) then + APythonType.Engine.PyErr_Clear(); +end; + +class function TPyDelphiByteStream.DelphiObjectClass: TClass; +begin + Result := TBytesStream; +end; + +function TPyDelphiByteStream.GetDelphiObject: TBytesStream; +begin + Result := TBytesStream(inherited DelphiObject); +end; + +procedure TPyDelphiByteStream.SetDelphiObject(const Value: TBytesStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiStringStream } + +constructor TPyDelphiStringStream.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); +type + TStringStreamClass = class of TStringStream; +var + LDataString: PAnsiChar; +begin + inherited; + //Clear unsuccessful overloaded constructor error + APythonType.Engine.PyErr_Clear(); + + if (APythonType.Engine.PyTuple_Size(args) = 1) then + if APythonType.Engine.PyArg_ParseTuple(args, 's:Create', @LDataString) <> 0 then + DelphiObject := TStringStreamClass(DelphiObjectClass).Create(String(LDataString)); +end; + +class function TPyDelphiStringStream.DelphiObjectClass: TClass; +begin + Result := TStringStream; +end; + +function TPyDelphiStringStream.GetDelphiObject: TStringStream; +begin + Result := TStringStream(inherited DelphiObject); +end; + +procedure TPyDelphiStringStream.SetDelphiObject(const Value: TStringStream); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiResourceStream } + +constructor TPyDelphiResourceStream.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); +type + TResourceStreamClass = class of TResourceStream; +var + LHandle: THandle; + LResName: PAnsiChar; + LResId: Integer; + LResType: PAnsiChar; +begin + inherited; + //Clear unsuccessful overloaded constructor error + APythonType.Engine.PyErr_Clear(); + + try + {$IFDEF CPUX64} + if APythonType.Engine.PyArg_ParseTuple(args, 'Kss:Create', @LHandle, @LResName, @LResType) <> 0 then + {$ELSE} + if APythonType.Engine.PyArg_ParseTuple(args, 'Iss:Create', @LHandle, @LResName, @LResType) <> 0 then + {$ENDIF} + DelphiObject := TResourceStreamClass(DelphiObjectClass).Create(LHandle, String(LResName), PWideChar(String(LResType))) + else + {$IFDEF CPUX64} + if APythonType.Engine.PyArg_ParseTuple(args, 'Kis:Create', @LHandle, @LResId, @LResType) <> 0 then + {$ELSE} + if APythonType.Engine.PyArg_ParseTuple(args, 'Iis:Create', @LHandle, @LResId, @LResType) <> 0 then + {$ENDIF} + DelphiObject := TResourceStreamClass(DelphiObjectClass).CreateFromID(LHandle, LResId, PWideChar(String(LResType))); + except + on E: Exception do + with GetPythonEngine do + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); + end; + + //Maybe it was created on the next attempt... + if Assigned(DelphiObject) then + APythonType.Engine.PyErr_Clear(); +end; + +class function TPyDelphiResourceStream.DelphiObjectClass: TClass; +begin + Result := TResourceStream; +end; + +function TPyDelphiResourceStream.GetDelphiObject: TResourceStream; +begin + Result := TResourceStream(inherited DelphiObject); +end; + +procedure TPyDelphiResourceStream.SetDelphiObject(const Value: TResourceStream); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TClassesRegistration.Create); + end. From 4e512a679fe1bd95f76f303553c6da06b059b3f6 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Jan 2023 22:34:22 +0200 Subject: [PATCH 033/174] Sync FMX units with the Embarcadero fork. --- Source/fmx/WrapDelphiFmx.pas | 6 ++++-- Source/fmx/WrapFmxGrids.pas | 2 +- Source/fmx/WrapFmxTypes.pas | 28 ++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index c77c8957..13966c8d 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -11,6 +11,9 @@ implementation WrapDelphiWindows, {$ENDIF MSWINDOWS} WrapDelphiDataBind, + {$IFNDEF LINUX} + WrapFmxDataBind, + {$ENDIF LINUX} WrapFmxTypes, WrapFmxControls, WrapFmxStdCtrls, @@ -30,7 +33,6 @@ implementation WrapFmxMenus, WrapFmxStyles, WrapFmxMemo, - WrapFmxColors, - WrapFmxDataBind; + WrapFmxColors; end. diff --git a/Source/fmx/WrapFmxGrids.pas b/Source/fmx/WrapFmxGrids.pas index d7b714c8..2cf7d676 100644 --- a/Source/fmx/WrapFmxGrids.pas +++ b/Source/fmx/WrapFmxGrids.pas @@ -3,7 +3,7 @@ interface uses - FMX.Grid, WrapFmxControls, WrapFmxScrollBox; + FMX.Grid, FMX.Grid.Style, WrapFmxControls, WrapFmxScrollBox; type TPyDelphiColumn = class(TPyDelphiControl) diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 7496fae3..5ab014a4 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -148,6 +148,16 @@ TPyDelphiControlSize = class(TPyDelphiPersistent) property DelphiObject: TControlSize read GetDelphiObject write SetDelphiObject; end; + TPyDelphiTimer = class (TPyDelphiComponent) + private + function GetDelphiObject: TTimer; + procedure SetDelphiObject(const Value: TTimer); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TTimer read GetDelphiObject write SetDelphiObject; + end; + {Helper functions} function WrapPointF(APyDelphiWrapper: TPyDelphiWrapper; const APoint : TPointF) : PPyObject; function WrapSizeF(APyDelphiWrapper: TPyDelphiWrapper; const ASize : TSizeF) : PPyObject; @@ -289,6 +299,7 @@ procedure TTypesRegistration.RegisterWrappers( APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupMenu); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBounds); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControlSize); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimer); end; { Helper functions } @@ -905,6 +916,23 @@ function TPyDelphiRectF.Set_Top(AValue: PPyObject; AContext: Pointer): integer; Result := -1; end; +{ TPyDelphiTimer } + +class function TPyDelphiTimer.DelphiObjectClass: TClass; +begin + Result := TTimer; +end; + +function TPyDelphiTimer.GetDelphiObject: TTimer; +begin + Result := TTimer(inherited DelphiObject); +end; + +procedure TPyDelphiTimer.SetDelphiObject(const Value: TTimer); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TTypesRegistration.Create); end. From da1bfe2ffb6f79f8d89201c50c4998d494ba1131 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 16 Jan 2023 22:44:03 +0200 Subject: [PATCH 034/174] Android 3.7 added. --- Source/PythonEngine.pas | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index f1ac3ff1..ed08cdb7 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -161,8 +161,9 @@ TPythonVersionProp = record ); {$ENDIF} {$IFDEF ANDROID} - PYTHON_KNOWN_VERSIONS: array[6..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[5..10] of TPythonVersionProp = ( + (DllName: 'libpython3.7m.so'; RegVersion: '3.7'; APIVersion: 1013), (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), From 85a2374c98f5d275ce4d2f3efa6091903fef372d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 17 Jan 2023 03:52:52 +0200 Subject: [PATCH 035/174] PyByteArray added. --- Source/PythonEngine.pas | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ed08cdb7..654f892b 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -230,6 +230,7 @@ TPythonVersionProp = record WCharTString = UnicodeString; {$ENDIF} + Py_ssize_t = NativeInt; const { @@ -940,6 +941,27 @@ TPythonVersionProp = record end; PPyDateTime_DateTime = ^PyDateTime_DateTime; + //bytearrayobject.h + + //typedef struct { + // PyObject_VAR_HEAD + // Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + // char *ob_bytes; /* Physical backing buffer */ + // char *ob_start; /* Logical start inside ob_bytes */ + // Py_ssize_t ob_exports; /* How many buffer exports */ + //} PyByteArrayObject; + + PyByteArrayObject = {$IFDEF CPUX86}packed{$ENDIF} record + // Start of PyObject_VAR_HEAD + // Start of the Head of an object + ob_base: PyObject; + ob_size: Py_ssize_t; + // End of the Head of an object + ob_bytes: PAnsiChar; + ob_start: PAnsiChar; + ob_exports: Py_ssize_t; + end; + //####################################################### //## ## //## GIL state ## @@ -1361,6 +1383,7 @@ TPythonInterface=class(TDynamicDll) PyRange_Type: PPyTypeObject; PySlice_Type: PPyTypeObject; PyBytes_Type: PPyTypeObject; + PyByteArray_Type: PPyTypeObject; PyTuple_Type: PPyTypeObject; PyBaseObject_Type: PPyTypeObject; PyCallIter_Type: PPyTypeObject; @@ -1440,6 +1463,7 @@ TPythonInterface=class(TDynamicDll) PyRun_SimpleString: function( str: PAnsiChar): Integer; cdecl; PyBytes_AsString: function( ob: PPyObject): PAnsiChar; cdecl; PyBytes_AsStringAndSize: function( ob: PPyObject; var buffer: PAnsiChar; var size: NativeInt): integer; cdecl; + PyByteArray_AsString: function(ob: PPyObject): PAnsiChar; cdecl; PySys_SetArgv: procedure( argc: Integer; argv: PPWCharT); cdecl; PyCFunction_NewEx: function(md:PPyMethodDef;self, ob:PPyObject):PPyObject; cdecl; @@ -1588,6 +1612,11 @@ TPythonInterface=class(TDynamicDll) PyBytes_Size:function (ob:PPyObject):NativeInt; cdecl; PyBytes_DecodeEscape:function(s:PAnsiChar; len:NativeInt; errors:PAnsiChar; unicode:NativeInt; recode_encoding:PAnsiChar):PPyObject; cdecl; PyBytes_Repr:function(ob:PPyObject; smartquotes:integer):PPyObject; cdecl; + PyByteArray_Concat: procedure(var ob1: PPyObject; ob2: PPyObject); cdecl; + PyByteArray_Resize: procedure(var ob1: PPyObject; len: Py_ssize_t); cdecl; + PyByteArray_FromObject: function(ob:PPyObject): PPyObject; cdecl; + PyByteArray_FromStringAndSize: function(s: PAnsiChar; i: Py_ssize_t): PPyObject; cdecl; + PyByteArray_Size: function(ob: PPyObject): Py_ssize_t; cdecl; PySys_GetObject:function (s:PAnsiChar):PPyObject; cdecl; PySys_SetObject:function (s:PAnsiChar;ob:PPyObject):integer; cdecl; PySys_SetPath:procedure(path:PAnsiChar); cdecl; @@ -1715,6 +1744,8 @@ TPythonInterface=class(TDynamicDll) function PyBytes_Check( obj : PPyObject ) : Boolean; function PyBytes_CheckExact( obj : PPyObject ) : Boolean; + function PyByteArray_Check(obj: PPyObject): Boolean; + function PyByteArray_CheckExact(obj: PPyObject): Boolean; function PyFloat_Check( obj : PPyObject ) : Boolean; function PyFloat_CheckExact( obj : PPyObject ) : Boolean; function PyLong_Check( obj : PPyObject ) : Boolean; @@ -3557,6 +3588,7 @@ procedure TPythonInterface.MapDll; PyRange_Type := Import('PyRange_Type'); PySlice_Type := Import('PySlice_Type'); PyBytes_Type := Import('PyBytes_Type'); + PyByteArray_Type := Import('PyByteArray_Type'); PyTuple_Type := Import('PyTuple_Type'); PyUnicode_Type := Import('PyUnicode_Type'); PyBaseObject_Type := Import('PyBaseObject_Type'); @@ -3776,6 +3808,12 @@ procedure TPythonInterface.MapDll; PyBytes_DecodeEscape := Import('PyBytes_DecodeEscape'); PyBytes_Repr := Import('PyBytes_Repr'); _PyBytes_Resize := Import('_PyBytes_Resize'); + PyByteArray_AsString := Import('PyByteArray_AsString'); + PyByteArray_Concat := Import('PyByteArray_Concat'); + PyByteArray_Resize := Import('PyByteArray_Resize'); + PyByteArray_FromObject := Import('PyByteArray_FromObject'); + PyByteArray_FromStringAndSize := Import('PyByteArray_FromStringAndSize'); + PyByteArray_Size := Import('PyByteArray_Size'); PySys_GetObject := Import('PySys_GetObject'); PySys_SetObject := Import('PySys_SetObject'); PySys_SetPath := Import('PySys_SetPath'); @@ -3909,6 +3947,16 @@ class procedure TPythonInterface.Py_CLEAR(var op: PPyObject); end; end; +function TPythonInterface.PyByteArray_Check(obj: PPyObject): Boolean; +begin + Result := PyObject_TypeCheck(obj, PyByteArray_Type); +end; + +function TPythonInterface.PyByteArray_CheckExact(obj: PPyObject): Boolean; +begin + Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyByteArray_Type)); +end; + function TPythonInterface.PyBytes_Check( obj : PPyObject ) : Boolean; begin Result := PyObject_TypeCheck(obj, PyBytes_Type); From 424b8e0dc8f6f28d07ef091f0e954c9632e25a7b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 17 Jan 2023 18:10:18 +0200 Subject: [PATCH 036/174] Removed unneeded TEngineClient.Notification Simplified TPythonEngine.Notification and fixed FClients related bug. --- Source/PythonEngine.pas | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 654f892b..883e249d 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2032,8 +2032,6 @@ TEngineClient = class(TComponent) procedure SetEngine( val : TPythonEngine ); virtual; procedure Loaded; override; - procedure Notification( AComponent: TComponent; - Operation: TOperation); override; procedure ModuleReady(Sender : TObject); virtual; public // Constructors & destructors @@ -4616,24 +4614,10 @@ function TPythonEngine.GetClients( idx : Integer ) : TEngineClient; procedure TPythonEngine.Notification( AComponent: TComponent; Operation: TOperation); -var - i : Integer; begin inherited; - if Operation = opRemove then - begin - if AComponent = IO then - IO := nil - else - begin - for i := 0 to ClientCount - 1 do - if Clients[i] = AComponent then - begin - RemoveClient( Clients[i] ); - Break; - end; - end; - end; + if (Operation = opRemove) and (AComponent = IO) then + IO := nil end; procedure TPythonEngine.CheckRegistry; @@ -6410,14 +6394,6 @@ procedure TEngineClient.Loaded; FOnCreate( Self ); end; -procedure TEngineClient.Notification( AComponent: TComponent; Operation: TOperation); -begin - inherited; - if Operation = opRemove then - if AComponent = FEngine then - FEngine := nil; -end; - procedure TEngineClient.Initialize; begin if FInitialized then From 081604066396da5608cd7822a19d4b78816e3cfb Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 18 Jan 2023 03:14:22 +0200 Subject: [PATCH 037/174] Cleanup module notifications for TPythonType and TDelphiWrapper. --- Source/PythonEngine.pas | 25 +++++++++++++++++++++---- Source/WrapDelphi.pas | 4 ++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 883e249d..be1f4724 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2342,7 +2342,8 @@ TPythonModule = class(TMethodsContainer) procedure DefineDocString; procedure Initialize; override; procedure InitializeForNewInterpreter; - procedure AddClient( client : TEngineClient ); + procedure AddClient(Client : TEngineClient); + procedure RemoveClient(Client : TEngineClient); function ErrorByName( const AName : AnsiString ) : TError; procedure RaiseError( const error, msg : AnsiString ); procedure RaiseErrorFmt( const error, format : AnsiString; const Args : array of const ); @@ -5387,7 +5388,7 @@ procedure TPythonEngine.RemoveClient( client : TEngineClient ); // is not predictable and may cause some memory crashes ! if (csDesigning in ComponentState) then FClients.Remove( client ) - else if (Initialized) then begin + else if Initialized then begin FClients.Remove( client ); if (ClientCount = 0) then Finalize; @@ -7282,9 +7283,10 @@ procedure TPythonModule.InitializeForNewInterpreter; end; end; -procedure TPythonModule.AddClient( client : TEngineClient ); +procedure TPythonModule.AddClient(Client : TEngineClient); begin - FClients.Add( client ); + if FClients.IndexOf(Client) < 0 then + FClients.Add(Client); end; function TPythonModule.ErrorByName( const AName : AnsiString ) : TError; @@ -7315,6 +7317,12 @@ procedure TPythonModule.RaiseErrorObj( const error, msg : AnsiString; obj : PPyO ErrorByName( error ).RaiseErrorObj( msg, obj ); end; +procedure TPythonModule.RemoveClient(Client: TEngineClient); +begin + // Remove does not raise an exception if not found + FClients.Remove(Client); +end; + procedure TPythonModule.BuildErrors; var i : Integer; @@ -7984,13 +7992,21 @@ procedure TPythonType.SetModule( val : TPythonModule ); begin if val <> FModule then begin + if Assigned(FModule) then + begin + FModule.RemoveFreeNotification(Self); + FModule.RemoveClient(Self); + end; FModule := val; if Assigned(val) then + begin + val.FreeNotification(Self); if Initialized and not (csLoading in ComponentState) then if val.Initialized then AddTypeVar else val.AddClient(Self); + end; end; end; @@ -8608,6 +8624,7 @@ destructor TPythonType.Destroy; begin if gVarType = Self then gVarType := nil; + Module := nil; FDocString.Free; FServices.Free; inherited; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 41e00154..5d2394a9 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3679,6 +3679,7 @@ destructor TPyDelphiWrapper.Destroy; FreeAndNil(fClassRegister); FreeAndNil(fHelperClassRegister); FreeAndNil(fEventHandlerList); + Module := nil; //No need to free PythonType objects since they are owned; inherited; @@ -3835,7 +3836,10 @@ procedure TPyDelphiWrapper.SetModule(const Value: TPythonModule); begin if Value <> FModule then begin if Assigned(FModule) then + begin FModule.RemoveFreeNotification(Self); + FModule.RemoveClient(Self); + end; FModule := Value; if Assigned(FModule) then FModule.FreeNotification(Self); From 9a5d473c9e59b27d4a7839cdaddb61e21b80687f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 18 Jan 2023 03:29:17 +0200 Subject: [PATCH 038/174] Moved the detachment of clients to TPythonEngine.Destroy --- Source/PythonEngine.pas | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index be1f4724..4ce8aba2 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4319,11 +4319,15 @@ constructor TPythonEngine.Create(AOwner: TComponent); end; destructor TPythonEngine.Destroy; +var + I: Integer; begin LocalVars := nil; GlobalVars := nil; Destroying; Finalize; + for I := 0 to ClientCount - 1 do + Clients[I].ClearEngine; FClients.Free; FInitScript.Free; FTraceback.Free; @@ -4333,7 +4337,6 @@ destructor TPythonEngine.Destroy; procedure TPythonEngine.Finalize; var i: integer; - canDetachClients : Boolean; begin // switch off redirection when the component is destroying, // because the form or datamodule is beeing closed, and @@ -4368,21 +4371,6 @@ procedure TPythonEngine.Finalize; except end; end; - // Detach our clients, when engine is being destroyed or one of its clients. - canDetachClients := csDestroying in ComponentState; - if not canDetachClients then - for i := 0 to ClientCount - 1 do - if csDestroying in Clients[i].ComponentState then - begin - canDetachClients := True; - Break; - end; - if canDetachClients then - begin - for i := 0 to ClientCount - 1 do - Clients[i].ClearEngine; - FClients.Clear; - end; // Free our reference gPythonEngine := nil; FTimeStruct := nil; From 96bac03bece7dde5c2aa937e7de67e33b403661e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 18 Jan 2023 04:56:24 +0200 Subject: [PATCH 039/174] Fix source code line endings. Everything crlf. Added .gitattributes to make sure that no line ending conversions take place. --- .gitattributes | 2 + Source/PythonReg.pas | 38 +- Source/WrapActions.pas | 520 +++---- Source/WrapDelphiDataBind.pas | 1196 +++++++------- Source/fmx/FMX.PythonGUIInputOutput.pas | 416 ++--- Source/fmx/FMX.PythonReg.pas | 36 +- Source/fmx/WrapDelphiFmx.pas | 76 +- Source/fmx/WrapFmxActnList.pas | 366 ++--- Source/fmx/WrapFmxColors.pas | 940 +++++------ Source/fmx/WrapFmxComCtrls.pas | 318 ++-- Source/fmx/WrapFmxControls.pas | 1706 ++++++++++---------- Source/fmx/WrapFmxDataBind.pas | 846 +++++----- Source/fmx/WrapFmxDialogs.pas | 228 +-- Source/fmx/WrapFmxEdit.pas | 562 +++---- Source/fmx/WrapFmxForms.pas | 1160 +++++++------- Source/fmx/WrapFmxGrids.pas | 1100 ++++++------- Source/fmx/WrapFmxLayouts.pas | 836 +++++----- Source/fmx/WrapFmxListBox.pas | 382 ++--- Source/fmx/WrapFmxListView.pas | 534 +++---- Source/fmx/WrapFmxMedia.pas | 936 +++++------ Source/fmx/WrapFmxMemo.pas | 188 +-- Source/fmx/WrapFmxMenus.pas | 308 ++-- Source/fmx/WrapFmxScrollBox.pas | 668 ++++---- Source/fmx/WrapFmxShapes.pas | 1022 ++++++------ Source/fmx/WrapFmxStdActns.pas | 908 +++++------ Source/fmx/WrapFmxStdCtrls.pas | 1884 +++++++++++------------ Source/lcl/Lcl.PythonGUIInputOutput.pas | 498 +++--- Source/vcl/Vcl.PythonGUIInputOutput.pas | 512 +++--- Source/vcl/Vcl.PythonReg.pas | 40 +- Source/vcl/WrapVclMedia.pas | 384 ++--- Source/vcl/WrapVclSamplesSpin.pas | 200 +-- Source/vcl/WrapVclWinXCtrls.pas | 446 +++--- 32 files changed, 9629 insertions(+), 9627 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..1870c80a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Disable any line endings auto conversion. +* -text \ No newline at end of file diff --git a/Source/PythonReg.pas b/Source/PythonReg.pas index 07287669..6e2bbe0a 100644 --- a/Source/PythonReg.pas +++ b/Source/PythonReg.pas @@ -1,19 +1,19 @@ -unit PythonReg; - -interface - -procedure Register(); - -implementation - -uses - Classes, PythonEngine, WrapDelphi; - -procedure Register(); -begin - RegisterComponents('Python', [TPythonEngine, TPythonType, TPythonModule, - TPythonDelphiVar, TPythonInputOutput, - TPyDelphiWrapper]); -end; - -end. +unit PythonReg; + +interface + +procedure Register(); + +implementation + +uses + Classes, PythonEngine, WrapDelphi; + +procedure Register(); +begin + RegisterComponents('Python', [TPythonEngine, TPythonType, TPythonModule, + TPythonDelphiVar, TPythonInputOutput, + TPyDelphiWrapper]); +end; + +end. diff --git a/Source/WrapActions.pas b/Source/WrapActions.pas index 26482174..ff7ac700 100644 --- a/Source/WrapActions.pas +++ b/Source/WrapActions.pas @@ -1,260 +1,260 @@ -unit WrapActions; - -interface - -uses - System.Classes, - System.Actions, - System.TypInfo, - PythonEngine, - WrapDelphi, - WrapDelphiClasses; - -type - TPyDelphiContainedAction = class(TPyDelphiBasicAction) - private - function GetDelphiObject: TContainedAction; - procedure SetDelphiObject(const Value: TContainedAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TContainedAction read GetDelphiObject - write SetDelphiObject; - end; - - TActionEventHandler = class(TEventHandler) - protected - procedure DoEvent(Action: TBasicAction; var Handled: Boolean); - public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; - end; - - TActionListAccess = class(TContainerAccess) - private - function GetContainer: TContainedActionList; - public - function GetItem(AIndex: Integer): PPyObject; override; - function GetSize: Integer; override; - function IndexOf(AValue: PPyObject): Integer; override; - class function ExpectedContainerClass: TClass; override; - class function SupportsIndexOf: Boolean; override; - class function Name: string; override; - property Container: TContainedActionList read GetContainer; - end; - - TPyDelphiContainedActionList = class(TPyDelphiComponent) - private - function GetDelphiObject: TContainedActionList; - procedure SetDelphiObject(const Value: TContainedActionList); - protected - function Get_ActionCount(AContext: Pointer): PPyObject; cdecl; - function Get_Actions(AContext: Pointer): PPyObject; cdecl; - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class function GetContainerAccessClass: TContainerAccessClass; override; - - property DelphiObject: TContainedActionList read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -type - TActionsRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TClassesRegistration } - -function TActionsRegistration.Name: string; -begin - Result := 'Actions'; -end; - -procedure TActionsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedActionList); - APyDelphiWrapper.EventHandlers.RegisterHandler(TActionEventHandler); -end; - -{ TPyDelphiContainedAction } - -class function TPyDelphiContainedAction.DelphiObjectClass: TClass; -begin - Result := TContainedAction; -end; - -function TPyDelphiContainedAction.GetDelphiObject: TContainedAction; -begin - Result := TContainedAction(inherited DelphiObject); -end; - -procedure TPyDelphiContainedAction.SetDelphiObject - (const Value: TContainedAction); -begin - inherited DelphiObject := Value; -end; - -{ TActionListAccess } - -class function TActionListAccess.ExpectedContainerClass: TClass; -begin - Result := TContainedActionList; -end; - -function TActionListAccess.GetContainer: TContainedActionList; -begin - Result := TContainedActionList(inherited Container); -end; - -function TActionListAccess.GetItem(AIndex: Integer): PPyObject; -begin - Result := Wrap(Container.Actions[AIndex]); -end; - -function TActionListAccess.GetSize: Integer; -begin - Result := Container.ActionCount; -end; - -function TActionListAccess.IndexOf(AValue: PPyObject): Integer; -var - _obj: TPyObject; - _item: TContainedAction; -begin - Result := -1; - with GetPythonEngine do - begin - if IsDelphiObject(AValue) then - begin - _obj := PythonToDelphi(AValue); - if (_obj is TPyDelphiObject) and - (TPyDelphiObject(_obj).DelphiObject is TContainedAction) then - begin - _item := TContainedAction(TPyDelphiObject(_obj).DelphiObject); - Result := _item.Index; - end; - end; - end; -end; - -class function TActionListAccess.Name: string; -begin - Result := 'TContainedActionList.Actions'; -end; - -class function TActionListAccess.SupportsIndexOf: Boolean; -begin - Result := True; -end; - - -{ TPyDelphiContainedActionList } - -class function TPyDelphiContainedActionList.DelphiObjectClass: TClass; -begin - Result := TContainedActionList; -end; - -class function TPyDelphiContainedActionList.GetContainerAccessClass: TContainerAccessClass; -begin - Result := TActionListAccess; -end; - -function TPyDelphiContainedActionList.GetDelphiObject: TContainedActionList; -begin - Result := TContainedActionList(inherited DelphiObject); -end; - -function TPyDelphiContainedActionList.Get_ActionCount( - AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ActionCount); -end; - -function TPyDelphiContainedActionList.Get_Actions(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TActionListAccess.Create(Self.PyDelphiWrapper, - Self.DelphiObject)); -end; - -class procedure TPyDelphiContainedActionList.RegisterGetSets( - PythonType: TPythonType); -begin - inherited; - with PythonType do - begin - AddGetSet('ActionCount', @TPyDelphiContainedActionList.Get_ActionCount, nil, - 'Indicates the number of actions in the action list.', nil); - AddGetSet('Actions', @TPyDelphiContainedActionList.Get_Actions, nil, - 'Lists the actions maintained by the action list.', nil); - end; -end; - -procedure TPyDelphiContainedActionList.SetDelphiObject( - const Value: TContainedActionList); -begin - inherited DelphiObject := Value; -end; - -{ TActionEventHandler } - -constructor TActionEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; - Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); -var - Method : TMethod; -begin - inherited; - Method.Code := @TActionEventHandler.DoEvent; - Method.Data := Self; - SetMethodProp(Component, PropertyInfo, Method); -end; - -procedure TActionEventHandler.DoEvent(Action: TBasicAction; var Handled: Boolean); -var - PyAction, PyTuple, PyResult, PyHandled : PPyObject; - LVarParam : TPyDelphiVarParameter; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - PyAction := PyDelphiWrapper.Wrap(Action); - PyHandled := CreateVarParam(PyDelphiWrapper, Handled); - LVarParam := PythonToDelphi(PyHandled) as TPyDelphiVarParameter; - PyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PyAction); - GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyHandled); - try - PyResult := PyObject_CallObject(Callable, PyTuple); - if Assigned(PyResult) then - begin - Py_DECREF(PyResult); - Handled := PyObject_IsTrue(LVarParam.Value) = 1; - end; - finally - Py_DECREF(PyTuple); - end; - CheckError; - end; -end; - -class function TActionEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TActionEvent); -end; - -initialization - RegisteredUnits.Add(TActionsRegistration.Create()); - -end. +unit WrapActions; + +interface + +uses + System.Classes, + System.Actions, + System.TypInfo, + PythonEngine, + WrapDelphi, + WrapDelphiClasses; + +type + TPyDelphiContainedAction = class(TPyDelphiBasicAction) + private + function GetDelphiObject: TContainedAction; + procedure SetDelphiObject(const Value: TContainedAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TContainedAction read GetDelphiObject + write SetDelphiObject; + end; + + TActionEventHandler = class(TEventHandler) + protected + procedure DoEvent(Action: TBasicAction; var Handled: Boolean); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TActionListAccess = class(TContainerAccess) + private + function GetContainer: TContainedActionList; + public + function GetItem(AIndex: Integer): PPyObject; override; + function GetSize: Integer; override; + function IndexOf(AValue: PPyObject): Integer; override; + class function ExpectedContainerClass: TClass; override; + class function SupportsIndexOf: Boolean; override; + class function Name: string; override; + property Container: TContainedActionList read GetContainer; + end; + + TPyDelphiContainedActionList = class(TPyDelphiComponent) + private + function GetDelphiObject: TContainedActionList; + procedure SetDelphiObject(const Value: TContainedActionList); + protected + function Get_ActionCount(AContext: Pointer): PPyObject; cdecl; + function Get_Actions(AContext: Pointer): PPyObject; cdecl; + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class function GetContainerAccessClass: TContainerAccessClass; override; + + property DelphiObject: TContainedActionList read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +type + TActionsRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TClassesRegistration } + +function TActionsRegistration.Name: string; +begin + Result := 'Actions'; +end; + +procedure TActionsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedActionList); + APyDelphiWrapper.EventHandlers.RegisterHandler(TActionEventHandler); +end; + +{ TPyDelphiContainedAction } + +class function TPyDelphiContainedAction.DelphiObjectClass: TClass; +begin + Result := TContainedAction; +end; + +function TPyDelphiContainedAction.GetDelphiObject: TContainedAction; +begin + Result := TContainedAction(inherited DelphiObject); +end; + +procedure TPyDelphiContainedAction.SetDelphiObject + (const Value: TContainedAction); +begin + inherited DelphiObject := Value; +end; + +{ TActionListAccess } + +class function TActionListAccess.ExpectedContainerClass: TClass; +begin + Result := TContainedActionList; +end; + +function TActionListAccess.GetContainer: TContainedActionList; +begin + Result := TContainedActionList(inherited Container); +end; + +function TActionListAccess.GetItem(AIndex: Integer): PPyObject; +begin + Result := Wrap(Container.Actions[AIndex]); +end; + +function TActionListAccess.GetSize: Integer; +begin + Result := Container.ActionCount; +end; + +function TActionListAccess.IndexOf(AValue: PPyObject): Integer; +var + _obj: TPyObject; + _item: TContainedAction; +begin + Result := -1; + with GetPythonEngine do + begin + if IsDelphiObject(AValue) then + begin + _obj := PythonToDelphi(AValue); + if (_obj is TPyDelphiObject) and + (TPyDelphiObject(_obj).DelphiObject is TContainedAction) then + begin + _item := TContainedAction(TPyDelphiObject(_obj).DelphiObject); + Result := _item.Index; + end; + end; + end; +end; + +class function TActionListAccess.Name: string; +begin + Result := 'TContainedActionList.Actions'; +end; + +class function TActionListAccess.SupportsIndexOf: Boolean; +begin + Result := True; +end; + + +{ TPyDelphiContainedActionList } + +class function TPyDelphiContainedActionList.DelphiObjectClass: TClass; +begin + Result := TContainedActionList; +end; + +class function TPyDelphiContainedActionList.GetContainerAccessClass: TContainerAccessClass; +begin + Result := TActionListAccess; +end; + +function TPyDelphiContainedActionList.GetDelphiObject: TContainedActionList; +begin + Result := TContainedActionList(inherited DelphiObject); +end; + +function TPyDelphiContainedActionList.Get_ActionCount( + AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ActionCount); +end; + +function TPyDelphiContainedActionList.Get_Actions(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TActionListAccess.Create(Self.PyDelphiWrapper, + Self.DelphiObject)); +end; + +class procedure TPyDelphiContainedActionList.RegisterGetSets( + PythonType: TPythonType); +begin + inherited; + with PythonType do + begin + AddGetSet('ActionCount', @TPyDelphiContainedActionList.Get_ActionCount, nil, + 'Indicates the number of actions in the action list.', nil); + AddGetSet('Actions', @TPyDelphiContainedActionList.Get_Actions, nil, + 'Lists the actions maintained by the action list.', nil); + end; +end; + +procedure TPyDelphiContainedActionList.SetDelphiObject( + const Value: TContainedActionList); +begin + inherited DelphiObject := Value; +end; + +{ TActionEventHandler } + +constructor TActionEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + Method : TMethod; +begin + inherited; + Method.Code := @TActionEventHandler.DoEvent; + Method.Data := Self; + SetMethodProp(Component, PropertyInfo, Method); +end; + +procedure TActionEventHandler.DoEvent(Action: TBasicAction; var Handled: Boolean); +var + PyAction, PyTuple, PyResult, PyHandled : PPyObject; + LVarParam : TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + PyAction := PyDelphiWrapper.Wrap(Action); + PyHandled := CreateVarParam(PyDelphiWrapper, Handled); + LVarParam := PythonToDelphi(PyHandled) as TPyDelphiVarParameter; + PyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PyAction); + GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyHandled); + try + PyResult := PyObject_CallObject(Callable, PyTuple); + if Assigned(PyResult) then + begin + Py_DECREF(PyResult); + Handled := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(PyTuple); + end; + CheckError; + end; +end; + +class function TActionEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TActionEvent); +end; + +initialization + RegisteredUnits.Add(TActionsRegistration.Create()); + +end. diff --git a/Source/WrapDelphiDataBind.pas b/Source/WrapDelphiDataBind.pas index f81173c7..01dd5fb3 100644 --- a/Source/WrapDelphiDataBind.pas +++ b/Source/WrapDelphiDataBind.pas @@ -1,598 +1,598 @@ -unit WrapDelphiDataBind; - -interface - -uses - Data.Bind.Components, Data.Bind.ObjectScope, - WrapDelphiClasses; - -type - TPyDelphiBaseBindScopeComponent = class(TPyDelphiComponent) - private - function GetDelphiObject: TBaseBindScopeComponent; - procedure SetDelphiObject(const Value: TBaseBindScopeComponent); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TBaseBindScopeComponent read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiBaseLinkingBindSource = class(TPyDelphiBaseBindScopeComponent) - private - function GetDelphiObject: TBaseLinkingBindSource; - procedure SetDelphiObject(const Value: TBaseLinkingBindSource); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TBaseLinkingBindSource read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiBaseObjectBindSource = class(TPyDelphiBaseLinkingBindSource) - private - function GetDelphiObject: TBaseObjectBindSource; - procedure SetDelphiObject(const Value: TBaseObjectBindSource); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TBaseObjectBindSource read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomPrototypeBindSource = class(TPyDelphiBaseObjectBindSource) - private - function GetDelphiObject: TCustomPrototypeBindSource; - procedure SetDelphiObject(const Value: TCustomPrototypeBindSource); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomPrototypeBindSource read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiPrototypeBindSource = class(TPyDelphiCustomPrototypeBindSource) - private - function GetDelphiObject: TPrototypeBindSource; - procedure SetDelphiObject(const Value: TPrototypeBindSource); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TPrototypeBindSource read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomBindingsList = class(TPyDelphiComponent) - private - function GetDelphiObject: TCustomBindingsList; - procedure SetDelphiObject(const Value: TCustomBindingsList); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomBindingsList read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiBindingsList = class(TPyDelphiCustomBindingsList) - private - function GetDelphiObject: TBindingsList; - procedure SetDelphiObject(const Value: TBindingsList); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TBindingsList read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiBasicBindComponent = class(TPyDelphiComponent) - private - function GetDelphiObject: TBasicBindComponent; - procedure SetDelphiObject(const Value: TBasicBindComponent); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TBasicBindComponent read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiContainedBindComponent = class(TPyDelphiBasicBindComponent) - private - function GetDelphiObject: TContainedBindComponent; - procedure SetDelphiObject(const Value: TContainedBindComponent); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TContainedBindComponent read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiBindComponentDelegate = class(TPyDelphiContainedBindComponent) - private - function GetDelphiObject: TBindComponentDelegate; - procedure SetDelphiObject(const Value: TBindComponentDelegate); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TBindComponentDelegate read GetDelphiObject - write SetDelphiObject; - end; - - //Link property - TPyDelphiLinkPropertyToFieldDelegate = class(TPyDelphiBindComponentDelegate) - private - function GetDelphiObject: TLinkPropertyToFieldDelegate; - procedure SetDelphiObject(const Value: TLinkPropertyToFieldDelegate); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TLinkPropertyToFieldDelegate read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomLinkPropertyToField = class(TPyDelphiLinkPropertyToFieldDelegate) - private - function GetDelphiObject: TCustomLinkPropertyToField; - procedure SetDelphiObject(const Value: TCustomLinkPropertyToField); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomLinkPropertyToField read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiLinkPropertyToField = class(TPyDelphiCustomLinkPropertyToField) - private - function GetDelphiObject: TLinkPropertyToField; - procedure SetDelphiObject(const Value: TLinkPropertyToField); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TLinkPropertyToField read GetDelphiObject - write SetDelphiObject; - end; - - //Link control - TPyDelphiLinkControlDelegate = class(TPyDelphiBindComponentDelegate) - private - function GetDelphiObject: TLinkControlDelegate; - procedure SetDelphiObject(const Value: TLinkControlDelegate); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TLinkControlDelegate read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiLinkControlToFieldDelegate = class(TPyDelphiLinkControlDelegate) - private - function GetDelphiObject: TLinkControlToFieldDelegate; - procedure SetDelphiObject(const Value: TLinkControlToFieldDelegate); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TLinkControlToFieldDelegate read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomLinkControlToField = class(TPyDelphiLinkControlToFieldDelegate) - private - function GetDelphiObject: TCustomLinkControlToField; - procedure SetDelphiObject(const Value: TCustomLinkControlToField); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomLinkControlToField read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiLinkControlToField = class(TPyDelphiCustomLinkControlToField) - private - function GetDelphiObject: TLinkControlToField; - procedure SetDelphiObject(const Value: TLinkControlToField); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TLinkControlToField read GetDelphiObject - write SetDelphiObject; - end; - - //Link list control - TPyDelphiCustomLinkListControlToField = class(TPyDelphiLinkControlToFieldDelegate) - private - function GetDelphiObject: TCustomLinkListControlToField; - procedure SetDelphiObject(const Value: TCustomLinkListControlToField); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomLinkListControlToField read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiLinkListControlToField = class(TPyDelphiCustomLinkListControlToField) - private - function GetDelphiObject: TLinkListControlToField; - procedure SetDelphiObject(const Value: TLinkListControlToField); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TLinkListControlToField read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TDataBindRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TDataBindRegistration } - -procedure TDataBindRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TDataBindRegistration.Name: string; -begin - Result := 'DataBind'; -end; - -procedure TDataBindRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseBindScopeComponent); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseLinkingBindSource); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseObjectBindSource); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPrototypeBindSource); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPrototypeBindSource); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomBindingsList); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBindingsList); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBasicBindComponent); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedBindComponent); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBindComponentDelegate); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkPropertyToFieldDelegate); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkPropertyToField); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkPropertyToField); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkControlDelegate); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkControlToFieldDelegate); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkControlToField); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkControlToField); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkListControlToField); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkListControlToField); -end; - -{ TPyDelphiBaseBindScopeComponent } - -class function TPyDelphiBaseBindScopeComponent.DelphiObjectClass: TClass; -begin - Result := TBaseBindScopeComponent; -end; - -function TPyDelphiBaseBindScopeComponent.GetDelphiObject: TBaseBindScopeComponent; -begin - Result := TBaseBindScopeComponent(inherited DelphiObject); -end; - -procedure TPyDelphiBaseBindScopeComponent.SetDelphiObject( - const Value: TBaseBindScopeComponent); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBaseLinkingBindSource } - -class function TPyDelphiBaseLinkingBindSource.DelphiObjectClass: TClass; -begin - Result := TBaseLinkingBindSource; -end; - -function TPyDelphiBaseLinkingBindSource.GetDelphiObject: TBaseLinkingBindSource; -begin - Result := TBaseLinkingBindSource(inherited DelphiObject); -end; - -procedure TPyDelphiBaseLinkingBindSource.SetDelphiObject( - const Value: TBaseLinkingBindSource); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBaseObjectBindSource } - -class function TPyDelphiBaseObjectBindSource.DelphiObjectClass: TClass; -begin - Result := TBaseObjectBindSource; -end; - -function TPyDelphiBaseObjectBindSource.GetDelphiObject: TBaseObjectBindSource; -begin - Result := TBaseObjectBindSource(inherited DelphiObject); -end; - -procedure TPyDelphiBaseObjectBindSource.SetDelphiObject( - const Value: TBaseObjectBindSource); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPrototypeBindSource } - -class function TPyDelphiCustomPrototypeBindSource.DelphiObjectClass: TClass; -begin - Result := TCustomPrototypeBindSource; -end; - -function TPyDelphiCustomPrototypeBindSource.GetDelphiObject: TCustomPrototypeBindSource; -begin - Result := TCustomPrototypeBindSource(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPrototypeBindSource.SetDelphiObject( - const Value: TCustomPrototypeBindSource); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPrototypeBindSource } - -class function TPyDelphiPrototypeBindSource.DelphiObjectClass: TClass; -begin - Result := TPrototypeBindSource; -end; - -function TPyDelphiPrototypeBindSource.GetDelphiObject: TPrototypeBindSource; -begin - Result := TPrototypeBindSource(inherited DelphiObject); -end; - -procedure TPyDelphiPrototypeBindSource.SetDelphiObject( - const Value: TPrototypeBindSource); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomBindingsList } - -class function TPyDelphiCustomBindingsList.DelphiObjectClass: TClass; -begin - Result := TCustomBindingsList; -end; - -function TPyDelphiCustomBindingsList.GetDelphiObject: TCustomBindingsList; -begin - Result := TCustomBindingsList(inherited DelphiObject); -end; - -procedure TPyDelphiCustomBindingsList.SetDelphiObject( - const Value: TCustomBindingsList); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBindingsList } - -class function TPyDelphiBindingsList.DelphiObjectClass: TClass; -begin - Result := TBindingsList; -end; - -function TPyDelphiBindingsList.GetDelphiObject: TBindingsList; -begin - Result := TBindingsList(inherited DelphiObject); -end; - -procedure TPyDelphiBindingsList.SetDelphiObject(const Value: TBindingsList); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBasicBindComponent } - -class function TPyDelphiBasicBindComponent.DelphiObjectClass: TClass; -begin - Result := TBasicBindComponent; -end; - -function TPyDelphiBasicBindComponent.GetDelphiObject: TBasicBindComponent; -begin - Result := TBasicBindComponent(inherited DelphiObject); -end; - -procedure TPyDelphiBasicBindComponent.SetDelphiObject( - const Value: TBasicBindComponent); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiContainedBindComponent } - -class function TPyDelphiContainedBindComponent.DelphiObjectClass: TClass; -begin - Result := TContainedBindComponent; -end; - -function TPyDelphiContainedBindComponent.GetDelphiObject: TContainedBindComponent; -begin - Result := TContainedBindComponent(inherited DelphiObject); -end; - -procedure TPyDelphiContainedBindComponent.SetDelphiObject( - const Value: TContainedBindComponent); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBindComponentDelegate } - -class function TPyDelphiBindComponentDelegate.DelphiObjectClass: TClass; -begin - Result := TBindComponentDelegate; -end; - -function TPyDelphiBindComponentDelegate.GetDelphiObject: TBindComponentDelegate; -begin - Result := TBindComponentDelegate(inherited DelphiObject); -end; - -procedure TPyDelphiBindComponentDelegate.SetDelphiObject( - const Value: TBindComponentDelegate); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLinkPropertyToFieldDelegate } - -class function TPyDelphiLinkPropertyToFieldDelegate.DelphiObjectClass: TClass; -begin - Result := TLinkPropertyToFieldDelegate; -end; - -function TPyDelphiLinkPropertyToFieldDelegate.GetDelphiObject: TLinkPropertyToFieldDelegate; -begin - Result := TLinkPropertyToFieldDelegate(inherited DelphiObject); -end; - -procedure TPyDelphiLinkPropertyToFieldDelegate.SetDelphiObject( - const Value: TLinkPropertyToFieldDelegate); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomLinkPropertyToField } - -class function TPyDelphiCustomLinkPropertyToField.DelphiObjectClass: TClass; -begin - Result := TCustomLinkPropertyToField; -end; - -function TPyDelphiCustomLinkPropertyToField.GetDelphiObject: TCustomLinkPropertyToField; -begin - Result := TCustomLinkPropertyToField(inherited DelphiObject); -end; - -procedure TPyDelphiCustomLinkPropertyToField.SetDelphiObject( - const Value: TCustomLinkPropertyToField); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLinkPropertyToField } - -class function TPyDelphiLinkPropertyToField.DelphiObjectClass: TClass; -begin - Result := TLinkPropertyToField; -end; - -function TPyDelphiLinkPropertyToField.GetDelphiObject: TLinkPropertyToField; -begin - Result := TLinkPropertyToField(inherited DelphiObject); -end; - -procedure TPyDelphiLinkPropertyToField.SetDelphiObject( - const Value: TLinkPropertyToField); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLinkControlDelegate } - -class function TPyDelphiLinkControlDelegate.DelphiObjectClass: TClass; -begin - Result := TLinkControlDelegate; -end; - -function TPyDelphiLinkControlDelegate.GetDelphiObject: TLinkControlDelegate; -begin - Result := TLinkControlDelegate(inherited DelphiObject); -end; - -procedure TPyDelphiLinkControlDelegate.SetDelphiObject( - const Value: TLinkControlDelegate); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLinkControlToFieldDelegate } - -class function TPyDelphiLinkControlToFieldDelegate.DelphiObjectClass: TClass; -begin - Result := TLinkControlToFieldDelegate; -end; - -function TPyDelphiLinkControlToFieldDelegate.GetDelphiObject: TLinkControlToFieldDelegate; -begin - Result := TLinkControlToFieldDelegate(inherited DelphiObject); -end; - -procedure TPyDelphiLinkControlToFieldDelegate.SetDelphiObject( - const Value: TLinkControlToFieldDelegate); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomLinkControlToField } - -class function TPyDelphiCustomLinkControlToField.DelphiObjectClass: TClass; -begin - Result := TCustomLinkControlToField; -end; - -function TPyDelphiCustomLinkControlToField.GetDelphiObject: TCustomLinkControlToField; -begin - Result := TCustomLinkControlToField(inherited DelphiObject); -end; - -procedure TPyDelphiCustomLinkControlToField.SetDelphiObject( - const Value: TCustomLinkControlToField); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLinkControlToField } - -class function TPyDelphiLinkControlToField.DelphiObjectClass: TClass; -begin - Result := TLinkControlToField; -end; - -function TPyDelphiLinkControlToField.GetDelphiObject: TLinkControlToField; -begin - Result := TLinkControlToField(inherited DelphiObject); -end; - -procedure TPyDelphiLinkControlToField.SetDelphiObject( - const Value: TLinkControlToField); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomLinkListControlToField } - -class function TPyDelphiCustomLinkListControlToField.DelphiObjectClass: TClass; -begin - Result := TCustomLinkListControlToField; -end; - -function TPyDelphiCustomLinkListControlToField.GetDelphiObject: TCustomLinkListControlToField; -begin - Result := TCustomLinkListControlToField(inherited DelphiObject); -end; - -procedure TPyDelphiCustomLinkListControlToField.SetDelphiObject( - const Value: TCustomLinkListControlToField); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLinkListControlToField } - -class function TPyDelphiLinkListControlToField.DelphiObjectClass: TClass; -begin - Result := TLinkListControlToField; -end; - -function TPyDelphiLinkListControlToField.GetDelphiObject: TLinkListControlToField; -begin - Result := TLinkListControlToField(inherited DelphiObject); -end; - -procedure TPyDelphiLinkListControlToField.SetDelphiObject( - const Value: TLinkListControlToField); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TDataBindRegistration.Create); - -end. +unit WrapDelphiDataBind; + +interface + +uses + Data.Bind.Components, Data.Bind.ObjectScope, + WrapDelphiClasses; + +type + TPyDelphiBaseBindScopeComponent = class(TPyDelphiComponent) + private + function GetDelphiObject: TBaseBindScopeComponent; + procedure SetDelphiObject(const Value: TBaseBindScopeComponent); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TBaseBindScopeComponent read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBaseLinkingBindSource = class(TPyDelphiBaseBindScopeComponent) + private + function GetDelphiObject: TBaseLinkingBindSource; + procedure SetDelphiObject(const Value: TBaseLinkingBindSource); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TBaseLinkingBindSource read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBaseObjectBindSource = class(TPyDelphiBaseLinkingBindSource) + private + function GetDelphiObject: TBaseObjectBindSource; + procedure SetDelphiObject(const Value: TBaseObjectBindSource); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TBaseObjectBindSource read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomPrototypeBindSource = class(TPyDelphiBaseObjectBindSource) + private + function GetDelphiObject: TCustomPrototypeBindSource; + procedure SetDelphiObject(const Value: TCustomPrototypeBindSource); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomPrototypeBindSource read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiPrototypeBindSource = class(TPyDelphiCustomPrototypeBindSource) + private + function GetDelphiObject: TPrototypeBindSource; + procedure SetDelphiObject(const Value: TPrototypeBindSource); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TPrototypeBindSource read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomBindingsList = class(TPyDelphiComponent) + private + function GetDelphiObject: TCustomBindingsList; + procedure SetDelphiObject(const Value: TCustomBindingsList); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomBindingsList read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBindingsList = class(TPyDelphiCustomBindingsList) + private + function GetDelphiObject: TBindingsList; + procedure SetDelphiObject(const Value: TBindingsList); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TBindingsList read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBasicBindComponent = class(TPyDelphiComponent) + private + function GetDelphiObject: TBasicBindComponent; + procedure SetDelphiObject(const Value: TBasicBindComponent); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TBasicBindComponent read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiContainedBindComponent = class(TPyDelphiBasicBindComponent) + private + function GetDelphiObject: TContainedBindComponent; + procedure SetDelphiObject(const Value: TContainedBindComponent); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TContainedBindComponent read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBindComponentDelegate = class(TPyDelphiContainedBindComponent) + private + function GetDelphiObject: TBindComponentDelegate; + procedure SetDelphiObject(const Value: TBindComponentDelegate); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TBindComponentDelegate read GetDelphiObject + write SetDelphiObject; + end; + + //Link property + TPyDelphiLinkPropertyToFieldDelegate = class(TPyDelphiBindComponentDelegate) + private + function GetDelphiObject: TLinkPropertyToFieldDelegate; + procedure SetDelphiObject(const Value: TLinkPropertyToFieldDelegate); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TLinkPropertyToFieldDelegate read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomLinkPropertyToField = class(TPyDelphiLinkPropertyToFieldDelegate) + private + function GetDelphiObject: TCustomLinkPropertyToField; + procedure SetDelphiObject(const Value: TCustomLinkPropertyToField); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomLinkPropertyToField read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiLinkPropertyToField = class(TPyDelphiCustomLinkPropertyToField) + private + function GetDelphiObject: TLinkPropertyToField; + procedure SetDelphiObject(const Value: TLinkPropertyToField); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TLinkPropertyToField read GetDelphiObject + write SetDelphiObject; + end; + + //Link control + TPyDelphiLinkControlDelegate = class(TPyDelphiBindComponentDelegate) + private + function GetDelphiObject: TLinkControlDelegate; + procedure SetDelphiObject(const Value: TLinkControlDelegate); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TLinkControlDelegate read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiLinkControlToFieldDelegate = class(TPyDelphiLinkControlDelegate) + private + function GetDelphiObject: TLinkControlToFieldDelegate; + procedure SetDelphiObject(const Value: TLinkControlToFieldDelegate); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TLinkControlToFieldDelegate read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomLinkControlToField = class(TPyDelphiLinkControlToFieldDelegate) + private + function GetDelphiObject: TCustomLinkControlToField; + procedure SetDelphiObject(const Value: TCustomLinkControlToField); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomLinkControlToField read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiLinkControlToField = class(TPyDelphiCustomLinkControlToField) + private + function GetDelphiObject: TLinkControlToField; + procedure SetDelphiObject(const Value: TLinkControlToField); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TLinkControlToField read GetDelphiObject + write SetDelphiObject; + end; + + //Link list control + TPyDelphiCustomLinkListControlToField = class(TPyDelphiLinkControlToFieldDelegate) + private + function GetDelphiObject: TCustomLinkListControlToField; + procedure SetDelphiObject(const Value: TCustomLinkListControlToField); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomLinkListControlToField read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiLinkListControlToField = class(TPyDelphiCustomLinkListControlToField) + private + function GetDelphiObject: TLinkListControlToField; + procedure SetDelphiObject(const Value: TLinkListControlToField); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TLinkListControlToField read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TDataBindRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TDataBindRegistration } + +procedure TDataBindRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TDataBindRegistration.Name: string; +begin + Result := 'DataBind'; +end; + +procedure TDataBindRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseBindScopeComponent); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseLinkingBindSource); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseObjectBindSource); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPrototypeBindSource); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPrototypeBindSource); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomBindingsList); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBindingsList); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBasicBindComponent); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedBindComponent); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBindComponentDelegate); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkPropertyToFieldDelegate); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkPropertyToField); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkPropertyToField); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkControlDelegate); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkControlToFieldDelegate); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkControlToField); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkControlToField); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkListControlToField); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkListControlToField); +end; + +{ TPyDelphiBaseBindScopeComponent } + +class function TPyDelphiBaseBindScopeComponent.DelphiObjectClass: TClass; +begin + Result := TBaseBindScopeComponent; +end; + +function TPyDelphiBaseBindScopeComponent.GetDelphiObject: TBaseBindScopeComponent; +begin + Result := TBaseBindScopeComponent(inherited DelphiObject); +end; + +procedure TPyDelphiBaseBindScopeComponent.SetDelphiObject( + const Value: TBaseBindScopeComponent); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBaseLinkingBindSource } + +class function TPyDelphiBaseLinkingBindSource.DelphiObjectClass: TClass; +begin + Result := TBaseLinkingBindSource; +end; + +function TPyDelphiBaseLinkingBindSource.GetDelphiObject: TBaseLinkingBindSource; +begin + Result := TBaseLinkingBindSource(inherited DelphiObject); +end; + +procedure TPyDelphiBaseLinkingBindSource.SetDelphiObject( + const Value: TBaseLinkingBindSource); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBaseObjectBindSource } + +class function TPyDelphiBaseObjectBindSource.DelphiObjectClass: TClass; +begin + Result := TBaseObjectBindSource; +end; + +function TPyDelphiBaseObjectBindSource.GetDelphiObject: TBaseObjectBindSource; +begin + Result := TBaseObjectBindSource(inherited DelphiObject); +end; + +procedure TPyDelphiBaseObjectBindSource.SetDelphiObject( + const Value: TBaseObjectBindSource); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPrototypeBindSource } + +class function TPyDelphiCustomPrototypeBindSource.DelphiObjectClass: TClass; +begin + Result := TCustomPrototypeBindSource; +end; + +function TPyDelphiCustomPrototypeBindSource.GetDelphiObject: TCustomPrototypeBindSource; +begin + Result := TCustomPrototypeBindSource(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPrototypeBindSource.SetDelphiObject( + const Value: TCustomPrototypeBindSource); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPrototypeBindSource } + +class function TPyDelphiPrototypeBindSource.DelphiObjectClass: TClass; +begin + Result := TPrototypeBindSource; +end; + +function TPyDelphiPrototypeBindSource.GetDelphiObject: TPrototypeBindSource; +begin + Result := TPrototypeBindSource(inherited DelphiObject); +end; + +procedure TPyDelphiPrototypeBindSource.SetDelphiObject( + const Value: TPrototypeBindSource); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomBindingsList } + +class function TPyDelphiCustomBindingsList.DelphiObjectClass: TClass; +begin + Result := TCustomBindingsList; +end; + +function TPyDelphiCustomBindingsList.GetDelphiObject: TCustomBindingsList; +begin + Result := TCustomBindingsList(inherited DelphiObject); +end; + +procedure TPyDelphiCustomBindingsList.SetDelphiObject( + const Value: TCustomBindingsList); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBindingsList } + +class function TPyDelphiBindingsList.DelphiObjectClass: TClass; +begin + Result := TBindingsList; +end; + +function TPyDelphiBindingsList.GetDelphiObject: TBindingsList; +begin + Result := TBindingsList(inherited DelphiObject); +end; + +procedure TPyDelphiBindingsList.SetDelphiObject(const Value: TBindingsList); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBasicBindComponent } + +class function TPyDelphiBasicBindComponent.DelphiObjectClass: TClass; +begin + Result := TBasicBindComponent; +end; + +function TPyDelphiBasicBindComponent.GetDelphiObject: TBasicBindComponent; +begin + Result := TBasicBindComponent(inherited DelphiObject); +end; + +procedure TPyDelphiBasicBindComponent.SetDelphiObject( + const Value: TBasicBindComponent); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiContainedBindComponent } + +class function TPyDelphiContainedBindComponent.DelphiObjectClass: TClass; +begin + Result := TContainedBindComponent; +end; + +function TPyDelphiContainedBindComponent.GetDelphiObject: TContainedBindComponent; +begin + Result := TContainedBindComponent(inherited DelphiObject); +end; + +procedure TPyDelphiContainedBindComponent.SetDelphiObject( + const Value: TContainedBindComponent); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBindComponentDelegate } + +class function TPyDelphiBindComponentDelegate.DelphiObjectClass: TClass; +begin + Result := TBindComponentDelegate; +end; + +function TPyDelphiBindComponentDelegate.GetDelphiObject: TBindComponentDelegate; +begin + Result := TBindComponentDelegate(inherited DelphiObject); +end; + +procedure TPyDelphiBindComponentDelegate.SetDelphiObject( + const Value: TBindComponentDelegate); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkPropertyToFieldDelegate } + +class function TPyDelphiLinkPropertyToFieldDelegate.DelphiObjectClass: TClass; +begin + Result := TLinkPropertyToFieldDelegate; +end; + +function TPyDelphiLinkPropertyToFieldDelegate.GetDelphiObject: TLinkPropertyToFieldDelegate; +begin + Result := TLinkPropertyToFieldDelegate(inherited DelphiObject); +end; + +procedure TPyDelphiLinkPropertyToFieldDelegate.SetDelphiObject( + const Value: TLinkPropertyToFieldDelegate); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomLinkPropertyToField } + +class function TPyDelphiCustomLinkPropertyToField.DelphiObjectClass: TClass; +begin + Result := TCustomLinkPropertyToField; +end; + +function TPyDelphiCustomLinkPropertyToField.GetDelphiObject: TCustomLinkPropertyToField; +begin + Result := TCustomLinkPropertyToField(inherited DelphiObject); +end; + +procedure TPyDelphiCustomLinkPropertyToField.SetDelphiObject( + const Value: TCustomLinkPropertyToField); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkPropertyToField } + +class function TPyDelphiLinkPropertyToField.DelphiObjectClass: TClass; +begin + Result := TLinkPropertyToField; +end; + +function TPyDelphiLinkPropertyToField.GetDelphiObject: TLinkPropertyToField; +begin + Result := TLinkPropertyToField(inherited DelphiObject); +end; + +procedure TPyDelphiLinkPropertyToField.SetDelphiObject( + const Value: TLinkPropertyToField); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkControlDelegate } + +class function TPyDelphiLinkControlDelegate.DelphiObjectClass: TClass; +begin + Result := TLinkControlDelegate; +end; + +function TPyDelphiLinkControlDelegate.GetDelphiObject: TLinkControlDelegate; +begin + Result := TLinkControlDelegate(inherited DelphiObject); +end; + +procedure TPyDelphiLinkControlDelegate.SetDelphiObject( + const Value: TLinkControlDelegate); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkControlToFieldDelegate } + +class function TPyDelphiLinkControlToFieldDelegate.DelphiObjectClass: TClass; +begin + Result := TLinkControlToFieldDelegate; +end; + +function TPyDelphiLinkControlToFieldDelegate.GetDelphiObject: TLinkControlToFieldDelegate; +begin + Result := TLinkControlToFieldDelegate(inherited DelphiObject); +end; + +procedure TPyDelphiLinkControlToFieldDelegate.SetDelphiObject( + const Value: TLinkControlToFieldDelegate); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomLinkControlToField } + +class function TPyDelphiCustomLinkControlToField.DelphiObjectClass: TClass; +begin + Result := TCustomLinkControlToField; +end; + +function TPyDelphiCustomLinkControlToField.GetDelphiObject: TCustomLinkControlToField; +begin + Result := TCustomLinkControlToField(inherited DelphiObject); +end; + +procedure TPyDelphiCustomLinkControlToField.SetDelphiObject( + const Value: TCustomLinkControlToField); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkControlToField } + +class function TPyDelphiLinkControlToField.DelphiObjectClass: TClass; +begin + Result := TLinkControlToField; +end; + +function TPyDelphiLinkControlToField.GetDelphiObject: TLinkControlToField; +begin + Result := TLinkControlToField(inherited DelphiObject); +end; + +procedure TPyDelphiLinkControlToField.SetDelphiObject( + const Value: TLinkControlToField); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomLinkListControlToField } + +class function TPyDelphiCustomLinkListControlToField.DelphiObjectClass: TClass; +begin + Result := TCustomLinkListControlToField; +end; + +function TPyDelphiCustomLinkListControlToField.GetDelphiObject: TCustomLinkListControlToField; +begin + Result := TCustomLinkListControlToField(inherited DelphiObject); +end; + +procedure TPyDelphiCustomLinkListControlToField.SetDelphiObject( + const Value: TCustomLinkListControlToField); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkListControlToField } + +class function TPyDelphiLinkListControlToField.DelphiObjectClass: TClass; +begin + Result := TLinkListControlToField; +end; + +function TPyDelphiLinkListControlToField.GetDelphiObject: TLinkListControlToField; +begin + Result := TLinkListControlToField(inherited DelphiObject); +end; + +procedure TPyDelphiLinkListControlToField.SetDelphiObject( + const Value: TLinkListControlToField); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TDataBindRegistration.Create); + +end. diff --git a/Source/fmx/FMX.PythonGUIInputOutput.pas b/Source/fmx/FMX.PythonGUIInputOutput.pas index bd0307fe..36aa61c1 100644 --- a/Source/fmx/FMX.PythonGUIInputOutput.pas +++ b/Source/fmx/FMX.PythonGUIInputOutput.pas @@ -1,208 +1,208 @@ -{$I ..\Definition.Inc} -unit FMX.PythonGUIInputOutput; - -interface - -uses - Classes, - {$IFDEF MSWINDOWS} - Winapi.Messages, - Winapi.Windows, - {$ENDIF} - Fmx.Memo, - PythonEngine; - -const - PID_SUPPORTED_PLATFORMS = pidAllPlatforms; - -type - [ComponentPlatformsAttribute(PID_SUPPORTED_PLATFORMS)] - TPythonGUIInputOutput = class(TPythonInputOutput) - private - { Private declarations } - FCustomMemo : TCustomMemo; - {$IFDEF MSWINDOWS} - FWinHandle : THandle; - {$ENDIF} - protected - { Protected declarations } - {$IFDEF MSWINDOWS} - procedure pyGUIOutputWndProc (var Message: TMessage); - {$ENDIF} - procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure SendData( const Data : AnsiString ); override; - procedure SendUniData( const Data : UnicodeString ); override; - procedure AddPendingWrite; override; - procedure WriteOutput; - public - function ReceiveData: AnsiString; override; - function ReceiveUniData: UnicodeString; override; - public - { Public declarations } - constructor Create( AOwner : TComponent ); override; - destructor Destroy; override; - - procedure DisplayString( const str : string ); - - published - { Published declarations } - property Output : TCustomMemo read FCustomMemo write FCustomMemo; - end; - -implementation - -uses - System.SysUtils, System.UITypes, FMX.DialogService; - -{$IFDEF MSWINDOWS} -const - WM_WriteOutput = WM_USER + 1; -{$ENDIF} - -{ TPythonGUIInputOutput } - - -{PROTECTED METHODS} - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.Notification(AComponent: TComponent; Operation: TOperation); -begin - inherited; - if Operation = opRemove then - if aComponent = fCustomMemo then - fCustomMemo := nil; -end; - -{------------------------------------------------------------------------------} -{$IFDEF MSWINDOWS} -procedure TPythonGUIInputOutput.pyGUIOutputWndProc(var Message: TMessage); -begin - case Message.Msg of - WM_WriteOutput : WriteOutput; - end;{case} -end; -{$ENDIF} -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.SendData( const Data : AnsiString ); -begin - if Assigned(FOnSendData) then - inherited - else - DisplayString( string(Data) ); -end; - -procedure TPythonGUIInputOutput.SendUniData(const Data: UnicodeString); -begin - if Assigned(FOnSendUniData) then - inherited - else - DisplayString( string(Data) ); -end; - -{------------------------------------------------------------------------------} -function TPythonGUIInputOutput.ReceiveData : AnsiString; -Var - LResult : AnsiString; -begin - if Assigned(FOnReceiveData) then - Result := inherited ReceiveData - else - begin - TDialogService.InputQuery('Query from Python', ['Enter text'], [''], - procedure(const AResult: TModalResult; const AValues: array of string) begin - LResult := AnsiString(AValues[0]); - end - ); - Result := LResult; - end; -end; - -function TPythonGUIInputOutput.ReceiveUniData: UnicodeString; -Var - LResult: string; -begin - if Assigned( FOnReceiveUniData ) then - Result := inherited ReceiveUniData - else - begin - TDialogService.InputQuery('Query from Python', ['Enter text'], [''], - procedure(const AResult: TModalResult; const AValues: array of string) begin - LResult := AValues[0]; - end - ); - Result := LResult; - end; -end; - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.AddPendingWrite; -begin -{$IFDEF MSWINDOWS} - PostMessage( fWinHandle, WM_WriteOutput, 0, 0 ); -{$ENDIF} -end; - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.WriteOutput; -var - S : string; -begin - if FQueue.Count = 0 then - Exit; - - Lock; - try - while FQueue.Count > 0 do - begin - S := FQueue.Strings[ 0 ]; - FQueue.Delete(0); - DisplayString( S ); - end; - finally - Unlock; - end; -end; - -{PUBLIC METHODS} - -{------------------------------------------------------------------------------} -constructor TPythonGUIInputOutput.Create( AOwner : TComponent ); -begin - inherited Create(AOwner); -{$IFDEF MSWINDOWS} - // Create an internal window for use in delayed writes - // This will allow writes from multiple threads to be queue up and - // then written out to the associated TCustomMemo by the main UI thread. - fWinHandle := System.Classes.AllocateHWnd(pyGUIOutputWndProc); -{$ENDIF} - UnicodeIO := True; -end; - -{------------------------------------------------------------------------------} -destructor TPythonGUIInputOutput.Destroy; -begin -{$IFDEF MSWINDOWS} - // Destroy the internal window used for Delayed write operations - System.Classes.DeallocateHWnd(fWinHandle); -{$ENDIF} - inherited Destroy; -end; - -{------------------------------------------------------------------------------} -type - TMyCustomMemo = class(TCustomMemo); - -procedure TPythonGUIInputOutput.DisplayString( const str : string ); -begin - if Assigned(Output) then - begin - if TMyCustomMemo(Output).Lines.Count >= MaxLines then - TMyCustomMemo(Output).Lines.Delete(0); - TMyCustomMemo(Output).Lines.Add(str); - Output.GoToTextEnd(); - end; -end; - -{------------------------------------------------------------------------------} - -end. +{$I ..\Definition.Inc} +unit FMX.PythonGUIInputOutput; + +interface + +uses + Classes, + {$IFDEF MSWINDOWS} + Winapi.Messages, + Winapi.Windows, + {$ENDIF} + Fmx.Memo, + PythonEngine; + +const + PID_SUPPORTED_PLATFORMS = pidAllPlatforms; + +type + [ComponentPlatformsAttribute(PID_SUPPORTED_PLATFORMS)] + TPythonGUIInputOutput = class(TPythonInputOutput) + private + { Private declarations } + FCustomMemo : TCustomMemo; + {$IFDEF MSWINDOWS} + FWinHandle : THandle; + {$ENDIF} + protected + { Protected declarations } + {$IFDEF MSWINDOWS} + procedure pyGUIOutputWndProc (var Message: TMessage); + {$ENDIF} + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SendData( const Data : AnsiString ); override; + procedure SendUniData( const Data : UnicodeString ); override; + procedure AddPendingWrite; override; + procedure WriteOutput; + public + function ReceiveData: AnsiString; override; + function ReceiveUniData: UnicodeString; override; + public + { Public declarations } + constructor Create( AOwner : TComponent ); override; + destructor Destroy; override; + + procedure DisplayString( const str : string ); + + published + { Published declarations } + property Output : TCustomMemo read FCustomMemo write FCustomMemo; + end; + +implementation + +uses + System.SysUtils, System.UITypes, FMX.DialogService; + +{$IFDEF MSWINDOWS} +const + WM_WriteOutput = WM_USER + 1; +{$ENDIF} + +{ TPythonGUIInputOutput } + + +{PROTECTED METHODS} + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if aComponent = fCustomMemo then + fCustomMemo := nil; +end; + +{------------------------------------------------------------------------------} +{$IFDEF MSWINDOWS} +procedure TPythonGUIInputOutput.pyGUIOutputWndProc(var Message: TMessage); +begin + case Message.Msg of + WM_WriteOutput : WriteOutput; + end;{case} +end; +{$ENDIF} +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.SendData( const Data : AnsiString ); +begin + if Assigned(FOnSendData) then + inherited + else + DisplayString( string(Data) ); +end; + +procedure TPythonGUIInputOutput.SendUniData(const Data: UnicodeString); +begin + if Assigned(FOnSendUniData) then + inherited + else + DisplayString( string(Data) ); +end; + +{------------------------------------------------------------------------------} +function TPythonGUIInputOutput.ReceiveData : AnsiString; +Var + LResult : AnsiString; +begin + if Assigned(FOnReceiveData) then + Result := inherited ReceiveData + else + begin + TDialogService.InputQuery('Query from Python', ['Enter text'], [''], + procedure(const AResult: TModalResult; const AValues: array of string) begin + LResult := AnsiString(AValues[0]); + end + ); + Result := LResult; + end; +end; + +function TPythonGUIInputOutput.ReceiveUniData: UnicodeString; +Var + LResult: string; +begin + if Assigned( FOnReceiveUniData ) then + Result := inherited ReceiveUniData + else + begin + TDialogService.InputQuery('Query from Python', ['Enter text'], [''], + procedure(const AResult: TModalResult; const AValues: array of string) begin + LResult := AValues[0]; + end + ); + Result := LResult; + end; +end; + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.AddPendingWrite; +begin +{$IFDEF MSWINDOWS} + PostMessage( fWinHandle, WM_WriteOutput, 0, 0 ); +{$ENDIF} +end; + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.WriteOutput; +var + S : string; +begin + if FQueue.Count = 0 then + Exit; + + Lock; + try + while FQueue.Count > 0 do + begin + S := FQueue.Strings[ 0 ]; + FQueue.Delete(0); + DisplayString( S ); + end; + finally + Unlock; + end; +end; + +{PUBLIC METHODS} + +{------------------------------------------------------------------------------} +constructor TPythonGUIInputOutput.Create( AOwner : TComponent ); +begin + inherited Create(AOwner); +{$IFDEF MSWINDOWS} + // Create an internal window for use in delayed writes + // This will allow writes from multiple threads to be queue up and + // then written out to the associated TCustomMemo by the main UI thread. + fWinHandle := System.Classes.AllocateHWnd(pyGUIOutputWndProc); +{$ENDIF} + UnicodeIO := True; +end; + +{------------------------------------------------------------------------------} +destructor TPythonGUIInputOutput.Destroy; +begin +{$IFDEF MSWINDOWS} + // Destroy the internal window used for Delayed write operations + System.Classes.DeallocateHWnd(fWinHandle); +{$ENDIF} + inherited Destroy; +end; + +{------------------------------------------------------------------------------} +type + TMyCustomMemo = class(TCustomMemo); + +procedure TPythonGUIInputOutput.DisplayString( const str : string ); +begin + if Assigned(Output) then + begin + if TMyCustomMemo(Output).Lines.Count >= MaxLines then + TMyCustomMemo(Output).Lines.Delete(0); + TMyCustomMemo(Output).Lines.Add(str); + Output.GoToTextEnd(); + end; +end; + +{------------------------------------------------------------------------------} + +end. diff --git a/Source/fmx/FMX.PythonReg.pas b/Source/fmx/FMX.PythonReg.pas index 4f571762..61257618 100644 --- a/Source/fmx/FMX.PythonReg.pas +++ b/Source/fmx/FMX.PythonReg.pas @@ -1,18 +1,18 @@ -unit FMX.PythonReg; - -interface - -procedure Register; - -implementation - -uses - System.Classes, FMX.Controls, FMX.PythonGUIInputOutput; - -procedure Register; -begin - GroupDescendentsWith(TPythonGUIInputOutput, TControl); - RegisterComponents('Python',[TPythonGUIInputOutput]); -end; - -end. +unit FMX.PythonReg; + +interface + +procedure Register; + +implementation + +uses + System.Classes, FMX.Controls, FMX.PythonGUIInputOutput; + +procedure Register; +begin + GroupDescendentsWith(TPythonGUIInputOutput, TControl); + RegisterComponents('Python',[TPythonGUIInputOutput]); +end; + +end. diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index 13966c8d..558ea03d 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -1,38 +1,38 @@ -unit WrapDelphiFmx; - -interface - -implementation - -uses - WrapDelphiTypes, - WrapDelphiClasses, - {$IFDEF MSWINDOWS} - WrapDelphiWindows, - {$ENDIF MSWINDOWS} - WrapDelphiDataBind, - {$IFNDEF LINUX} - WrapFmxDataBind, - {$ENDIF LINUX} - WrapFmxTypes, - WrapFmxControls, - WrapFmxStdCtrls, - WrapFmxEdit, - WrapFmxListBox, - WrapFmxListView, - WrapFmxActnList, - WrapFmxStdActns, - WrapFmxComCtrls, - WrapFmxDialogs, - WrapFmxForms, - WrapFmxShapes, - WrapFmxLayouts, - WrapFmxScrollBox, - WrapFmxGrids, - WrapFmxMedia, - WrapFmxMenus, - WrapFmxStyles, - WrapFmxMemo, - WrapFmxColors; - -end. +unit WrapDelphiFmx; + +interface + +implementation + +uses + WrapDelphiTypes, + WrapDelphiClasses, + {$IFDEF MSWINDOWS} + WrapDelphiWindows, + {$ENDIF MSWINDOWS} + WrapDelphiDataBind, + {$IFNDEF LINUX} + WrapFmxDataBind, + {$ENDIF LINUX} + WrapFmxTypes, + WrapFmxControls, + WrapFmxStdCtrls, + WrapFmxEdit, + WrapFmxListBox, + WrapFmxListView, + WrapFmxActnList, + WrapFmxStdActns, + WrapFmxComCtrls, + WrapFmxDialogs, + WrapFmxForms, + WrapFmxShapes, + WrapFmxLayouts, + WrapFmxScrollBox, + WrapFmxGrids, + WrapFmxMedia, + WrapFmxMenus, + WrapFmxStyles, + WrapFmxMemo, + WrapFmxColors; + +end. diff --git a/Source/fmx/WrapFmxActnList.pas b/Source/fmx/WrapFmxActnList.pas index 3fc5c32b..0083be93 100644 --- a/Source/fmx/WrapFmxActnList.pas +++ b/Source/fmx/WrapFmxActnList.pas @@ -1,183 +1,183 @@ -{$I ..\Definition.Inc} -unit WrapFmxActnList; - -interface - -uses - System.Classes, FMX.ActnList, PythonEngine, WrapDelphi, WrapDelphiClasses, - System.Actions, WrapActions; - -type - TPyDelphiCustomActionList = class(TPyDelphiContainedActionList) - private - function GetDelphiObject: TCustomActionList; - procedure SetDelphiObject(const Value: TCustomActionList); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomActionList read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiActionList = class(TPyDelphiCustomActionList) - private - function GetDelphiObject: TActionList; - procedure SetDelphiObject(const Value: TActionList); - public - // Class methods - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TActionList read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomAction = class(TPyDelphiContainedAction) - private - function GetDelphiObject: TCustomAction; - procedure SetDelphiObject(const Value: TCustomAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiAction = class(TPyDelphiContainedAction) - private - function GetDelphiObject: TAction; - procedure SetDelphiObject(const Value: TAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TAction read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomViewAction = class(TPyDelphiCustomAction) - private - function GetDelphiObject: TCustomViewAction; - procedure SetDelphiObject(const Value: TCustomViewAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomViewAction read GetDelphiObject write SetDelphiObject; - end; - -implementation - -{ Register the wrappers, the globals and the constants } -type - TActnListRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - - { TActnListRegistration } -procedure TActnListRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TActnListRegistration.Name: string; -begin - Result := 'FMX ActnList'; -end; - -procedure TActnListRegistration.RegisterWrappers(APyDelphiWrapper - : TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomActionList); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActionList); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomViewAction); -end; - -{ TPyDelphiCustomActionList } -class function TPyDelphiCustomActionList.DelphiObjectClass: TClass; -begin - Result := TCustomActionList; -end; - -function TPyDelphiCustomActionList.GetDelphiObject: TCustomActionList; -begin - Result := TCustomActionList(inherited DelphiObject); -end; - -procedure TPyDelphiCustomActionList.SetDelphiObject - (const Value: TCustomActionList); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiActionList } - -class function TPyDelphiActionList.DelphiObjectClass: TClass; -begin - Result := TActionList; -end; - -function TPyDelphiActionList.GetDelphiObject: TActionList; -begin - Result := TActionList(inherited DelphiObject); -end; - -procedure TPyDelphiActionList.SetDelphiObject(const Value: TActionList); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomAction } - -class function TPyDelphiCustomAction.DelphiObjectClass: TClass; -begin - Result := TCustomAction; -end; - -function TPyDelphiCustomAction.GetDelphiObject: TCustomAction; -begin - Result := TCustomAction(inherited DelphiObject); -end; - -procedure TPyDelphiCustomAction.SetDelphiObject(const Value: TCustomAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiAction } - -class function TPyDelphiAction.DelphiObjectClass: TClass; -begin - Result := TAction; -end; - -function TPyDelphiAction.GetDelphiObject: TAction; -begin - Result := TAction(inherited DelphiObject); -end; - -procedure TPyDelphiAction.SetDelphiObject(const Value: TAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomViewAction } - -class function TPyDelphiCustomViewAction.DelphiObjectClass: TClass; -begin - Result := TCustomViewAction; -end; - -function TPyDelphiCustomViewAction.GetDelphiObject: TCustomViewAction; -begin - Result := TCustomViewAction(inherited DelphiObject); -end; - -procedure TPyDelphiCustomViewAction.SetDelphiObject( - const Value: TCustomViewAction); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TActnListRegistration.Create()); - -end. +{$I ..\Definition.Inc} +unit WrapFmxActnList; + +interface + +uses + System.Classes, FMX.ActnList, PythonEngine, WrapDelphi, WrapDelphiClasses, + System.Actions, WrapActions; + +type + TPyDelphiCustomActionList = class(TPyDelphiContainedActionList) + private + function GetDelphiObject: TCustomActionList; + procedure SetDelphiObject(const Value: TCustomActionList); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomActionList read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiActionList = class(TPyDelphiCustomActionList) + private + function GetDelphiObject: TActionList; + procedure SetDelphiObject(const Value: TActionList); + public + // Class methods + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TActionList read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomAction = class(TPyDelphiContainedAction) + private + function GetDelphiObject: TCustomAction; + procedure SetDelphiObject(const Value: TCustomAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiAction = class(TPyDelphiContainedAction) + private + function GetDelphiObject: TAction; + procedure SetDelphiObject(const Value: TAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TAction read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomViewAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TCustomViewAction; + procedure SetDelphiObject(const Value: TCustomViewAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomViewAction read GetDelphiObject write SetDelphiObject; + end; + +implementation + +{ Register the wrappers, the globals and the constants } +type + TActnListRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + + { TActnListRegistration } +procedure TActnListRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TActnListRegistration.Name: string; +begin + Result := 'FMX ActnList'; +end; + +procedure TActnListRegistration.RegisterWrappers(APyDelphiWrapper + : TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomActionList); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActionList); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomViewAction); +end; + +{ TPyDelphiCustomActionList } +class function TPyDelphiCustomActionList.DelphiObjectClass: TClass; +begin + Result := TCustomActionList; +end; + +function TPyDelphiCustomActionList.GetDelphiObject: TCustomActionList; +begin + Result := TCustomActionList(inherited DelphiObject); +end; + +procedure TPyDelphiCustomActionList.SetDelphiObject + (const Value: TCustomActionList); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiActionList } + +class function TPyDelphiActionList.DelphiObjectClass: TClass; +begin + Result := TActionList; +end; + +function TPyDelphiActionList.GetDelphiObject: TActionList; +begin + Result := TActionList(inherited DelphiObject); +end; + +procedure TPyDelphiActionList.SetDelphiObject(const Value: TActionList); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomAction } + +class function TPyDelphiCustomAction.DelphiObjectClass: TClass; +begin + Result := TCustomAction; +end; + +function TPyDelphiCustomAction.GetDelphiObject: TCustomAction; +begin + Result := TCustomAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomAction.SetDelphiObject(const Value: TCustomAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiAction } + +class function TPyDelphiAction.DelphiObjectClass: TClass; +begin + Result := TAction; +end; + +function TPyDelphiAction.GetDelphiObject: TAction; +begin + Result := TAction(inherited DelphiObject); +end; + +procedure TPyDelphiAction.SetDelphiObject(const Value: TAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomViewAction } + +class function TPyDelphiCustomViewAction.DelphiObjectClass: TClass; +begin + Result := TCustomViewAction; +end; + +function TPyDelphiCustomViewAction.GetDelphiObject: TCustomViewAction; +begin + Result := TCustomViewAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomViewAction.SetDelphiObject( + const Value: TCustomViewAction); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TActnListRegistration.Create()); + +end. diff --git a/Source/fmx/WrapFmxColors.pas b/Source/fmx/WrapFmxColors.pas index 1289d3a6..bef6dad8 100644 --- a/Source/fmx/WrapFmxColors.pas +++ b/Source/fmx/WrapFmxColors.pas @@ -1,470 +1,470 @@ -unit WrapFmxColors; - -interface - -uses - FMX.Colors, - PythonEngine, WrapFmxControls, WrapFmxStdCtrls, WrapFmxListBox; - -type - TPyDelphiColorBox = class(TPyDelphiControl) - private - function GetDelphiObject: TColorBox; - procedure SetDelphiObject(const Value: TColorBox); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TColorBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiColorQuad = class(TPyDelphiControl) - private - function GetDelphiObject: TColorQuad; - procedure SetDelphiObject(const Value: TColorQuad); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TColorQuad read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiColorPicker = class(TPyDelphiControl) - private - function GetDelphiObject: TColorPicker; - procedure SetDelphiObject(const Value: TColorPicker); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TColorPicker read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiGradientEdit = class(TPyDelphiControl) - private - function GetDelphiObject: TGradientEdit; - procedure SetDelphiObject(const Value: TGradientEdit); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TGradientEdit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiColorPanel = class(TPyDelphiControl) - private - function GetDelphiObject: TColorPanel; - procedure SetDelphiObject(const Value: TColorPanel); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TColorPanel read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiComboColorBox = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TComboColorBox; - procedure SetDelphiObject(const Value: TComboColorBox); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TComboColorBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiColorButton = class(TPyDelphiCustomButton) - private - function GetDelphiObject: TColorButton; - procedure SetDelphiObject(const Value: TColorButton); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TColorButton read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiColorListBox = class(TPyDelphiCustomListBox) - private - function GetDelphiObject: TColorListBox; - procedure SetDelphiObject(const Value: TColorListBox); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TColorListBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomColorComboBox = class(TPyDelphiCustomComboBox) - private - function GetDelphiObject: TCustomColorComboBox; - procedure SetDelphiObject(const Value: TCustomColorComboBox); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TCustomColorComboBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiColorComboBox = class(TPyDelphiCustomColorComboBox) - private - function GetDelphiObject: TColorComboBox; - procedure SetDelphiObject(const Value: TColorComboBox); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - // Properties - property DelphiObject: TColorComboBox read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -uses - System.Rtti, WrapDelphi; - -type - { Type extension } - TPyDelphiCommonColorEx = class - protected - // Property Getters - class function Get_Color(AContext: Pointer): PPyObject; cdecl; - // Property Setters - class function Set_Color(AValue: PPyObject; AContext: Pointer): integer; cdecl; - protected - class procedure RegisterGetSets(const APythonType: TPythonType); - end; - - { Register the wrappers, the globals and the constants } - TColorsRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TColorsRegistration } - -procedure TColorsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TColorsRegistration.Name: string; -begin - Result := 'Colors'; -end; - -procedure TColorsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorQuad); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorPicker); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGradientEdit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorPanel); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboColorBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorListBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomColorComboBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorComboBox); -end; - -{ TPyDelphiColorBox } - -class function TPyDelphiColorBox.DelphiObjectClass: TClass; -begin - Result := TColorBox; -end; - -function TPyDelphiColorBox.GetDelphiObject: TColorBox; -begin - Result := TColorBox(inherited DelphiObject); -end; - -class procedure TPyDelphiColorBox.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiColorBox.SetDelphiObject(const Value: TColorBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiColorQuad } - -class function TPyDelphiColorQuad.DelphiObjectClass: TClass; -begin - Result := TColorQuad; -end; - -function TPyDelphiColorQuad.GetDelphiObject: TColorQuad; -begin - Result := TColorQuad(inherited DelphiObject); -end; - -procedure TPyDelphiColorQuad.SetDelphiObject(const Value: TColorQuad); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiColorPicker } - -class function TPyDelphiColorPicker.DelphiObjectClass: TClass; -begin - Result := TColorPicker; -end; - -function TPyDelphiColorPicker.GetDelphiObject: TColorPicker; -begin - Result := TColorPicker(inherited DelphiObject); -end; - -class procedure TPyDelphiColorPicker.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiColorPicker.SetDelphiObject(const Value: TColorPicker); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGradientEdit } - -class function TPyDelphiGradientEdit.DelphiObjectClass: TClass; -begin - Result := TGradientEdit; -end; - -function TPyDelphiGradientEdit.GetDelphiObject: TGradientEdit; -begin - Result := TGradientEdit(inherited DelphiObject); -end; - -procedure TPyDelphiGradientEdit.SetDelphiObject( - const Value: TGradientEdit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiColorPanel } - -class function TPyDelphiColorPanel.DelphiObjectClass: TClass; -begin - Result := TColorPanel; -end; - -function TPyDelphiColorPanel.GetDelphiObject: TColorPanel; -begin - Result := TColorPanel(inherited DelphiObject); -end; - -class procedure TPyDelphiColorPanel.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiColorPanel.SetDelphiObject(const Value: TColorPanel); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiComboColorBox } - -class function TPyDelphiComboColorBox.DelphiObjectClass: TClass; -begin - Result := TComboColorBox; -end; - -function TPyDelphiComboColorBox.GetDelphiObject: TComboColorBox; -begin - Result := TComboColorBox(inherited DelphiObject); -end; - -class procedure TPyDelphiComboColorBox.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiComboColorBox.SetDelphiObject(const Value: TComboColorBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiColorButton } - -class function TPyDelphiColorButton.DelphiObjectClass: TClass; -begin - Result := TColorButton; -end; - -function TPyDelphiColorButton.GetDelphiObject: TColorButton; -begin - Result := TColorButton(inherited DelphiObject); -end; - -class procedure TPyDelphiColorButton.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiColorButton.SetDelphiObject(const Value: TColorButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiColorListBox } - -class function TPyDelphiColorListBox.DelphiObjectClass: TClass; -begin - Result := TColorListBox; -end; - -function TPyDelphiColorListBox.GetDelphiObject: TColorListBox; -begin - Result := TColorListBox(inherited DelphiObject); -end; - -class procedure TPyDelphiColorListBox.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiColorListBox.SetDelphiObject(const Value: TColorListBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomColorComboBox } - -class function TPyDelphiCustomColorComboBox.DelphiObjectClass: TClass; -begin - Result := TCustomColorComboBox; -end; - -function TPyDelphiCustomColorComboBox.GetDelphiObject: TCustomColorComboBox; -begin - Result := TCustomColorComboBox(inherited DelphiObject); -end; - -class procedure TPyDelphiCustomColorComboBox.RegisterGetSets( - PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -procedure TPyDelphiCustomColorComboBox.SetDelphiObject( - const Value: TCustomColorComboBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiColorComboBox } - -class function TPyDelphiColorComboBox.DelphiObjectClass: TClass; -begin - Result := TColorComboBox; -end; - -class procedure TPyDelphiColorComboBox.RegisterGetSets(PythonType: TPythonType); -begin - inherited; - TPyDelphiCommonColorEx.RegisterGetSets(PythonType); -end; - -function TPyDelphiColorComboBox.GetDelphiObject: TColorComboBox; -begin - Result := TColorComboBox(inherited DelphiObject); -end; - -procedure TPyDelphiColorComboBox.SetDelphiObject(const Value: TColorComboBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCommonColorEx } - -class procedure TPyDelphiCommonColorEx.RegisterGetSets( - const APythonType: TPythonType); -begin - with APythonType do begin - //Fixing the cardinal->variant/variant->cardinal conversion error - AddGetSet('Color', - @TPyDelphiCommonColorEx.Get_Color, - @TPyDelphiCommonColorEx.Set_Color, - 'Returns a integer with the color value', nil); - end; -end; - -class function TPyDelphiCommonColorEx.Get_Color(AContext: Pointer): PPyObject; -var - LSelf: TPyDelphiControl; - LRttiCtx: TRttiContext; - LRttiType: TRttiType; - LRttiProp: TRttiProperty; -begin - LSelf := PythonToDelphi(PPyObject(Self)) as TPyDelphiControl; - LRttiCtx := TRttiContext.Create(); - try - LRttiType := LRttiCtx.GetType(LSelf.DelphiObject.ClassInfo); - LRttiProp := LRttiType.GetProperty('Color'); - if not Assigned(LRttiProp) then - Exit(GetPythonEngine().Py_None); - - Result := GetPythonEngine().PyLong_FromLong( - LRttiProp.GetValue(LSelf.DelphiObject).AsInteger); - finally - LRttiCtx.Free(); - end; -end; - -class function TPyDelphiCommonColorEx.Set_Color(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: integer; - LSelf: TPyDelphiControl; - LRttiCtx: TRttiContext; - LRttiType: TRttiType; - LRttiProp: TRttiProperty; -begin - if CheckIntAttribute(AValue, 'Color', LValue) then begin - with GetPythonEngine() do begin - LSelf := PythonToDelphi(PPyObject(Self)) as TPyDelphiControl; - LRttiCtx := TRttiContext.Create(); - try - LRttiType := LRttiCtx.GetType(LSelf.DelphiObject.ClassInfo); - LRttiProp := LRttiType.GetProperty('Color'); - if not Assigned(LRttiProp) then - Exit(-1); - - LRttiProp.SetValue(LSelf.DelphiObject, LValue); - finally - LRttiCtx.Free(); - end; - Result := 0; - end; - end else - Result := -1; -end; - -initialization - RegisteredUnits.Add(TColorsRegistration.Create()); - -end. +unit WrapFmxColors; + +interface + +uses + FMX.Colors, + PythonEngine, WrapFmxControls, WrapFmxStdCtrls, WrapFmxListBox; + +type + TPyDelphiColorBox = class(TPyDelphiControl) + private + function GetDelphiObject: TColorBox; + procedure SetDelphiObject(const Value: TColorBox); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TColorBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiColorQuad = class(TPyDelphiControl) + private + function GetDelphiObject: TColorQuad; + procedure SetDelphiObject(const Value: TColorQuad); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TColorQuad read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiColorPicker = class(TPyDelphiControl) + private + function GetDelphiObject: TColorPicker; + procedure SetDelphiObject(const Value: TColorPicker); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TColorPicker read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiGradientEdit = class(TPyDelphiControl) + private + function GetDelphiObject: TGradientEdit; + procedure SetDelphiObject(const Value: TGradientEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TGradientEdit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiColorPanel = class(TPyDelphiControl) + private + function GetDelphiObject: TColorPanel; + procedure SetDelphiObject(const Value: TColorPanel); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TColorPanel read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiComboColorBox = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TComboColorBox; + procedure SetDelphiObject(const Value: TComboColorBox); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TComboColorBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiColorButton = class(TPyDelphiCustomButton) + private + function GetDelphiObject: TColorButton; + procedure SetDelphiObject(const Value: TColorButton); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TColorButton read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiColorListBox = class(TPyDelphiCustomListBox) + private + function GetDelphiObject: TColorListBox; + procedure SetDelphiObject(const Value: TColorListBox); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TColorListBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomColorComboBox = class(TPyDelphiCustomComboBox) + private + function GetDelphiObject: TCustomColorComboBox; + procedure SetDelphiObject(const Value: TCustomColorComboBox); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TCustomColorComboBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiColorComboBox = class(TPyDelphiCustomColorComboBox) + private + function GetDelphiObject: TColorComboBox; + procedure SetDelphiObject(const Value: TColorComboBox); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + // Properties + property DelphiObject: TColorComboBox read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + System.Rtti, WrapDelphi; + +type + { Type extension } + TPyDelphiCommonColorEx = class + protected + // Property Getters + class function Get_Color(AContext: Pointer): PPyObject; cdecl; + // Property Setters + class function Set_Color(AValue: PPyObject; AContext: Pointer): integer; cdecl; + protected + class procedure RegisterGetSets(const APythonType: TPythonType); + end; + + { Register the wrappers, the globals and the constants } + TColorsRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TColorsRegistration } + +procedure TColorsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TColorsRegistration.Name: string; +begin + Result := 'Colors'; +end; + +procedure TColorsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorQuad); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorPicker); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGradientEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorPanel); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboColorBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorListBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomColorComboBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorComboBox); +end; + +{ TPyDelphiColorBox } + +class function TPyDelphiColorBox.DelphiObjectClass: TClass; +begin + Result := TColorBox; +end; + +function TPyDelphiColorBox.GetDelphiObject: TColorBox; +begin + Result := TColorBox(inherited DelphiObject); +end; + +class procedure TPyDelphiColorBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiColorBox.SetDelphiObject(const Value: TColorBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiColorQuad } + +class function TPyDelphiColorQuad.DelphiObjectClass: TClass; +begin + Result := TColorQuad; +end; + +function TPyDelphiColorQuad.GetDelphiObject: TColorQuad; +begin + Result := TColorQuad(inherited DelphiObject); +end; + +procedure TPyDelphiColorQuad.SetDelphiObject(const Value: TColorQuad); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiColorPicker } + +class function TPyDelphiColorPicker.DelphiObjectClass: TClass; +begin + Result := TColorPicker; +end; + +function TPyDelphiColorPicker.GetDelphiObject: TColorPicker; +begin + Result := TColorPicker(inherited DelphiObject); +end; + +class procedure TPyDelphiColorPicker.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiColorPicker.SetDelphiObject(const Value: TColorPicker); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGradientEdit } + +class function TPyDelphiGradientEdit.DelphiObjectClass: TClass; +begin + Result := TGradientEdit; +end; + +function TPyDelphiGradientEdit.GetDelphiObject: TGradientEdit; +begin + Result := TGradientEdit(inherited DelphiObject); +end; + +procedure TPyDelphiGradientEdit.SetDelphiObject( + const Value: TGradientEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiColorPanel } + +class function TPyDelphiColorPanel.DelphiObjectClass: TClass; +begin + Result := TColorPanel; +end; + +function TPyDelphiColorPanel.GetDelphiObject: TColorPanel; +begin + Result := TColorPanel(inherited DelphiObject); +end; + +class procedure TPyDelphiColorPanel.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiColorPanel.SetDelphiObject(const Value: TColorPanel); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiComboColorBox } + +class function TPyDelphiComboColorBox.DelphiObjectClass: TClass; +begin + Result := TComboColorBox; +end; + +function TPyDelphiComboColorBox.GetDelphiObject: TComboColorBox; +begin + Result := TComboColorBox(inherited DelphiObject); +end; + +class procedure TPyDelphiComboColorBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiComboColorBox.SetDelphiObject(const Value: TComboColorBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiColorButton } + +class function TPyDelphiColorButton.DelphiObjectClass: TClass; +begin + Result := TColorButton; +end; + +function TPyDelphiColorButton.GetDelphiObject: TColorButton; +begin + Result := TColorButton(inherited DelphiObject); +end; + +class procedure TPyDelphiColorButton.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiColorButton.SetDelphiObject(const Value: TColorButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiColorListBox } + +class function TPyDelphiColorListBox.DelphiObjectClass: TClass; +begin + Result := TColorListBox; +end; + +function TPyDelphiColorListBox.GetDelphiObject: TColorListBox; +begin + Result := TColorListBox(inherited DelphiObject); +end; + +class procedure TPyDelphiColorListBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiColorListBox.SetDelphiObject(const Value: TColorListBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomColorComboBox } + +class function TPyDelphiCustomColorComboBox.DelphiObjectClass: TClass; +begin + Result := TCustomColorComboBox; +end; + +function TPyDelphiCustomColorComboBox.GetDelphiObject: TCustomColorComboBox; +begin + Result := TCustomColorComboBox(inherited DelphiObject); +end; + +class procedure TPyDelphiCustomColorComboBox.RegisterGetSets( + PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +procedure TPyDelphiCustomColorComboBox.SetDelphiObject( + const Value: TCustomColorComboBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiColorComboBox } + +class function TPyDelphiColorComboBox.DelphiObjectClass: TClass; +begin + Result := TColorComboBox; +end; + +class procedure TPyDelphiColorComboBox.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + TPyDelphiCommonColorEx.RegisterGetSets(PythonType); +end; + +function TPyDelphiColorComboBox.GetDelphiObject: TColorComboBox; +begin + Result := TColorComboBox(inherited DelphiObject); +end; + +procedure TPyDelphiColorComboBox.SetDelphiObject(const Value: TColorComboBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCommonColorEx } + +class procedure TPyDelphiCommonColorEx.RegisterGetSets( + const APythonType: TPythonType); +begin + with APythonType do begin + //Fixing the cardinal->variant/variant->cardinal conversion error + AddGetSet('Color', + @TPyDelphiCommonColorEx.Get_Color, + @TPyDelphiCommonColorEx.Set_Color, + 'Returns a integer with the color value', nil); + end; +end; + +class function TPyDelphiCommonColorEx.Get_Color(AContext: Pointer): PPyObject; +var + LSelf: TPyDelphiControl; + LRttiCtx: TRttiContext; + LRttiType: TRttiType; + LRttiProp: TRttiProperty; +begin + LSelf := PythonToDelphi(PPyObject(Self)) as TPyDelphiControl; + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(LSelf.DelphiObject.ClassInfo); + LRttiProp := LRttiType.GetProperty('Color'); + if not Assigned(LRttiProp) then + Exit(GetPythonEngine().Py_None); + + Result := GetPythonEngine().PyLong_FromLong( + LRttiProp.GetValue(LSelf.DelphiObject).AsInteger); + finally + LRttiCtx.Free(); + end; +end; + +class function TPyDelphiCommonColorEx.Set_Color(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: integer; + LSelf: TPyDelphiControl; + LRttiCtx: TRttiContext; + LRttiType: TRttiType; + LRttiProp: TRttiProperty; +begin + if CheckIntAttribute(AValue, 'Color', LValue) then begin + with GetPythonEngine() do begin + LSelf := PythonToDelphi(PPyObject(Self)) as TPyDelphiControl; + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(LSelf.DelphiObject.ClassInfo); + LRttiProp := LRttiType.GetProperty('Color'); + if not Assigned(LRttiProp) then + Exit(-1); + + LRttiProp.SetValue(LSelf.DelphiObject, LValue); + finally + LRttiCtx.Free(); + end; + Result := 0; + end; + end else + Result := -1; +end; + +initialization + RegisteredUnits.Add(TColorsRegistration.Create()); + +end. diff --git a/Source/fmx/WrapFmxComCtrls.pas b/Source/fmx/WrapFmxComCtrls.pas index f4f752d1..0093e614 100644 --- a/Source/fmx/WrapFmxComCtrls.pas +++ b/Source/fmx/WrapFmxComCtrls.pas @@ -1,159 +1,159 @@ -{$I ..\Definition.Inc} - -unit WrapFmxComCtrls; - -interface - -uses - FMX.Controls.Presentation, FMX.MultiView, FMX.TabControl, WrapFmxControls; - -type - TPyDelphiTabControl = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TTabControl; - procedure SetDelphiObject(const Value: TTabControl); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TTabControl read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiTabItem = class(TPyDelphiTextControl) - private - function GetDelphiObject: TTabItem; - procedure SetDelphiObject(const Value: TTabItem); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TTabItem read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomMultiView = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TCustomMultiView; - procedure SetDelphiObject(const Value: TCustomMultiView); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomMultiView read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiMultiView = class(TPyDelphiCustomMultiView) - private - function GetDelphiObject: TMultiView; - procedure SetDelphiObject(const Value: TMultiView); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TMultiView read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TComCtrlsRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TComCtrlsRegistration } - -procedure TComCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TComCtrlsRegistration.Name: string; -begin - Result := 'ComCtrls'; -end; - -procedure TComCtrlsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabItem); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMultiView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMultiView); -end; - -{ TPyDelphiTabControl } - -class function TPyDelphiTabControl.DelphiObjectClass: TClass; -begin - Result := TTabControl; -end; - -function TPyDelphiTabControl.GetDelphiObject: TTabControl; -begin - Result := TTabControl(inherited DelphiObject); -end; - -procedure TPyDelphiTabControl.SetDelphiObject(const Value: TTabControl); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiTabItem } - -class function TPyDelphiTabItem.DelphiObjectClass: TClass; -begin - Result := TTabItem; -end; - -function TPyDelphiTabItem.GetDelphiObject: TTabItem; -begin - Result := TTabItem(inherited DelphiObject); -end; - -procedure TPyDelphiTabItem.SetDelphiObject(const Value: TTabItem); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomMultiView } - -class function TPyDelphiCustomMultiView.DelphiObjectClass: TClass; -begin - Result := TCustomMultiView; -end; - -function TPyDelphiCustomMultiView.GetDelphiObject: TCustomMultiView; -begin - Result := TCustomMultiView(inherited DelphiObject); -end; - -procedure TPyDelphiCustomMultiView.SetDelphiObject( - const Value: TCustomMultiView); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMultiView } - -class function TPyDelphiMultiView.DelphiObjectClass: TClass; -begin - Result := TMultiView; -end; - -function TPyDelphiMultiView.GetDelphiObject: TMultiView; -begin - Result := TMultiView(inherited DelphiObject); -end; - -procedure TPyDelphiMultiView.SetDelphiObject(const Value: TMultiView); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add( TComCtrlsRegistration.Create ); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxComCtrls; + +interface + +uses + FMX.Controls.Presentation, FMX.MultiView, FMX.TabControl, WrapFmxControls; + +type + TPyDelphiTabControl = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TTabControl; + procedure SetDelphiObject(const Value: TTabControl); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TTabControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTabItem = class(TPyDelphiTextControl) + private + function GetDelphiObject: TTabItem; + procedure SetDelphiObject(const Value: TTabItem); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TTabItem read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomMultiView = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TCustomMultiView; + procedure SetDelphiObject(const Value: TCustomMultiView); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomMultiView read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiMultiView = class(TPyDelphiCustomMultiView) + private + function GetDelphiObject: TMultiView; + procedure SetDelphiObject(const Value: TMultiView); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TMultiView read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TComCtrlsRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TComCtrlsRegistration } + +procedure TComCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TComCtrlsRegistration.Name: string; +begin + Result := 'ComCtrls'; +end; + +procedure TComCtrlsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabItem); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMultiView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMultiView); +end; + +{ TPyDelphiTabControl } + +class function TPyDelphiTabControl.DelphiObjectClass: TClass; +begin + Result := TTabControl; +end; + +function TPyDelphiTabControl.GetDelphiObject: TTabControl; +begin + Result := TTabControl(inherited DelphiObject); +end; + +procedure TPyDelphiTabControl.SetDelphiObject(const Value: TTabControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTabItem } + +class function TPyDelphiTabItem.DelphiObjectClass: TClass; +begin + Result := TTabItem; +end; + +function TPyDelphiTabItem.GetDelphiObject: TTabItem; +begin + Result := TTabItem(inherited DelphiObject); +end; + +procedure TPyDelphiTabItem.SetDelphiObject(const Value: TTabItem); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomMultiView } + +class function TPyDelphiCustomMultiView.DelphiObjectClass: TClass; +begin + Result := TCustomMultiView; +end; + +function TPyDelphiCustomMultiView.GetDelphiObject: TCustomMultiView; +begin + Result := TCustomMultiView(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMultiView.SetDelphiObject( + const Value: TCustomMultiView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMultiView } + +class function TPyDelphiMultiView.DelphiObjectClass: TClass; +begin + Result := TMultiView; +end; + +function TPyDelphiMultiView.GetDelphiObject: TMultiView; +begin + Result := TMultiView(inherited DelphiObject); +end; + +procedure TPyDelphiMultiView.SetDelphiObject(const Value: TMultiView); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add( TComCtrlsRegistration.Create ); + +end. diff --git a/Source/fmx/WrapFmxControls.pas b/Source/fmx/WrapFmxControls.pas index 5da399b5..3ae4a506 100644 --- a/Source/fmx/WrapFmxControls.pas +++ b/Source/fmx/WrapFmxControls.pas @@ -1,853 +1,853 @@ -{$I ..\Definition.Inc} - -unit WrapFmxControls; - -interface - -uses - Classes, SysUtils, TypInfo, Types, - FMX.Types, FMX.Controls, FMX.Controls.Presentation, - PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxTypes, WrapFmxActnList; - -type - { - PyObject wrapping FMX.Controls.TControl - Exposes methods BringToFront, SendToBack, LocalToAbsolute, AbsoluteToLocal, - SetBounds and Repaint - Exposes properties Parent and Visible - } - - { TKeyEvent wrapper } - TKeyEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState); - public - constructor Create(APyDelphiWrapper: TPyDelphiWrapper; AComponent: TObject; - APropertyInfo: PPropInfo; ACallable: PPyObject); override; - class function GetTypeInfo: PTypeInfo; override; - end; - - TPyDelphiControl = class (TPyDelphiFmxObject) - private - function GetDelphiObject: TControl; - procedure SetDelphiObject(const Value: TControl); - protected - // Exposed Methods - function LocalToAbsolute_Wrapper(args : PPyObject) : PPyObject; cdecl; - function AbsoluteToLocal_Wrapper(args : PPyObject) : PPyObject; cdecl; - function BringToFront_Wrapper(args : PPyObject) : PPyObject; cdecl; - function SendToBack_Wrapper(args : PPyObject) : PPyObject; cdecl; - function SetBounds_Wrapper(args : PPyObject) : PPyObject; cdecl; - function Repaint_Wrapper(args : PPyObject) : PPyObject; cdecl; - function CanFocus_Wrapper(args: PPyObject): PPyObject; cdecl; - function SetFocus_Wrapper(args: PPyObject): PPyObject; cdecl; - function ResetFocus_Wrapper(args: PPyObject): PPyObject; cdecl; - function PrepareForPaint_Wrapper(args : PPyObject) : PPyObject; cdecl; - // Property Getters - function Get_Visible(AContext: Pointer): PPyObject; cdecl; - function Get_ControlsCount( AContext : Pointer) : PPyObject; cdecl; - function Get_Controls(AContext: Pointer): PPyObject; cdecl; - function Get_IsFocused( AContext : Pointer) : PPyObject; cdecl; - function Get_ParentControl( AContext : Pointer) : PPyObject; cdecl; - function Get_Position(AContext: Pointer): PPyObject; cdecl; - // Property Setters - function Set_Visible(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_Position(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - class function DelphiObjectClass : TClass; override; - class procedure RegisterGetSets( PythonType : TPythonType ); override; - class procedure RegisterMethods( PythonType : TPythonType ); override; - // Properties - property DelphiObject: TControl read GetDelphiObject write SetDelphiObject; - end; - - { - Access to the child controls of a FMX.Controls.TControl.Controls collection. - } - TControlsAccess = class(TContainerAccess) - private - function GetContainer: TControl; - public - function GetItem(AIndex : Integer) : PPyObject; override; - function GetSize : Integer; override; - function IndexOf(AValue : PPyObject) : Integer; override; - - class function ExpectedContainerClass : TClass; override; - class function SupportsIndexOf : Boolean; override; - class function Name : string; override; - - property Container : TControl read GetContainer; - end; - - TPyDelphiStyledControl = class(TPyDelphiControl) - private - function GetDelphiObject: TStyledControl; - procedure SetDelphiObject(const Value: TStyledControl); - protected - // Exposed Methods - function ApplyStyleLookup_Wrapper(args : PPyObject) : PPyObject; cdecl; - function NeedStyleLookup_Wrapper(args : PPyObject) : PPyObject; cdecl; - function Inflate_Wrapper(args : PPyObject) : PPyObject; cdecl; - // Property Getters - function Get_DefaultStyleLookupName(AContext: Pointer): PPyObject; cdecl; - function Get_StyleLookup(AContext: Pointer): PPyObject; cdecl; - function Get_AutoTranslate(AContext: Pointer): PPyObject; cdecl; - function Get_AdjustSizeValue(AContext: Pointer): PPyObject; cdecl; - function Get_AdjustType(AContext: Pointer): PPyObject; cdecl; - function Get_StyleState(AContext: Pointer): PPyObject; cdecl; - // Property Setters - function Set_StyleLookup(AValue: PPyObject; AContext: Pointer): integer; cdecl; - function Set_AutoTranslate(AValue: PPyObject; AContext: Pointer): integer; cdecl; - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods(PythonType: TPythonType); override; - // Properties - property DelphiObject: TStyledControl read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiTextControl = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TTextControl; - procedure SetDelphiObject(const Value: TTextControl); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TTextControl read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiStyleBook = class(TPyDelphiFmxObject) - private - function GetDelphiObject: TStyleBook; - procedure SetDelphiObject(const Value: TStyleBook); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TStyleBook read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPopup = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TPopup; - procedure SetDelphiObject(const Value: TPopup); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TPopup read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPresentedControl = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TPresentedControl; - procedure SetDelphiObject(const Value: TPresentedControl); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TPresentedControl read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomControlAction = class(TPyDelphiCustomAction) - private - function GetDelphiObject: TCustomControlAction; - procedure SetDelphiObject(const Value: TCustomControlAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TCustomControlAction read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -type -{ Register the wrappers, the globals and the constants } - TControlsRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TControlsRegistration } - -procedure TControlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TControlsRegistration.Name: string; -begin - Result := 'Controls'; -end; - -procedure TControlsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyledControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTextControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleBook); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopup); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControlAction); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); -end; - -{ TPyDelphiControl } - -function TPyDelphiControl.BringToFront_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':BringToFront') <> 0 then begin - DelphiObject.BringToFront; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -function TPyDelphiControl.CanFocus_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':CanFocus') <> 0 then begin - Result := VariantAsPyObject(DelphiObject.CanFocus) - end else - Result := nil; - end; -end; - -function TPyDelphiControl.LocalToAbsolute_Wrapper( - args: PPyObject): PPyObject; -var - p : TPointF; - pt : PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple(args, 'O:LocalToAbsolute', @pt) <> 0 then begin - if CheckPointFAttribute(pt, 'pointf', p) then - Result := WrapPointF(PyDelphiWrapper, DelphiObject.LocalToAbsolute(p)) - else - Result := nil; - end else - Result := nil; - end; -end; - -function TPyDelphiControl.PrepareForPaint_Wrapper(args: PPyObject): PPyObject; -begin - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':PrepareForPaint') <> 0 then begin - DelphiObject.PrepareForPaint; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -class function TPyDelphiControl.DelphiObjectClass: TClass; -begin - Result := TControl; -end; - -function TPyDelphiControl.GetDelphiObject: TControl; -begin - Result := TControl(inherited DelphiObject); -end; - -function TPyDelphiControl.Get_ControlsCount(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ControlsCount); -end; - -function TPyDelphiControl.Get_IsFocused(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.VariantAsPyObject(DelphiObject.IsFocused); -end; - -function TPyDelphiControl.Get_Controls(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TControlsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); -end; - -function TPyDelphiControl.Get_ParentControl(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Wrap(DelphiObject.ParentControl); -end; - -function TPyDelphiControl.Get_Position(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Wrap(DelphiObject.Position); -end; - -function TPyDelphiControl.Get_Visible(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.VariantAsPyObject(Self.DelphiObject.Visible); -end; - -class procedure TPyDelphiControl.RegisterGetSets(PythonType: TPythonType); -begin - PythonType.AddGetSet('Visible', @TPyDelphiControl.Get_Visible, @TPyDelphiControl.Set_Visible, - 'Returns/Sets the Control Visibility', nil); - PythonType.AddGetSet('ControlsCount', @TPyDelphiControl.Get_ControlsCount, nil, - 'Returns the count of contained controls', nil); - PythonType.AddGetSet('Controls', @TPyDelphiControl.Get_Controls, nil, - 'Returns an iterator over contained controls', nil); - PythonType.AddGetSet('IsFocused', @TPyDelphiControl.Get_IsFocused, nil, - 'Determines whether the control has input focus.', nil); - PythonType.AddGetSet('Position', @TPyDelphiControl.Get_Position, @TPyDelphiControl.Set_Position, - 'Returns an access to the position of the control inside its parent', nil); -end; - -class procedure TPyDelphiControl.RegisterMethods(PythonType: TPythonType); -begin - PythonType.AddMethod('BringToFront', @TPyDelphiControl.BringToFront_Wrapper, - 'TControl.BringToFront()'#10 + - 'Puts the control in front of all other controls in its parent control.'); - PythonType.AddMethod('SendToBack', @TPyDelphiControl.SendToBack_Wrapper, - 'TControl.SendToBack()'#10 + - 'Puts a windowed control behind all other windowed controls, or puts a non-windowed control behind all other non-windowed controls.'); - PythonType.AddMethod('SetBounds', @TPyDelphiControl.SetBounds_Wrapper, - 'TControl.SetBounds(Left, Top, Width, Height)'#10 + - 'Sets the Left, Top, Width, and Height properties all at once.'); - PythonType.AddMethod('Repaint', @TPyDelphiControl.Repaint_Wrapper, - 'TControl.Repaint()'#10 + - 'Forces the control to repaint its image on the screen. '); - PythonType.AddMethod('LocalToAbsolute', @TPyDelphiControl.LocalToAbsolute_Wrapper, - 'TControl.LocalToAbsolute()'#10 + - 'Translates a given point from client area coordinates to global screen coordinates.'); - PythonType.AddMethod('AbsoluteToLocal', @TPyDelphiControl.AbsoluteToLocal_Wrapper, - 'TControl.AbsoluteToLocal()'#10 + - 'Converts the screen coordinates of a specified point on the screen to client coordinates.'); - PythonType.AddMethod('CanFocus', @TPyDelphiControl.CanFocus_Wrapper, - 'TControl.CanFocus()'#10 + - 'Indicates whether a control can receive focus. '); - PythonType.AddMethod('SetFocus', @TPyDelphiControl.SetFocus_Wrapper, - 'TControl.SetFocus()'#10 + - 'Gives the input focus to the control.'); - PythonType.AddMethod('ResetFocus', @TPyDelphiControl.ResetFocus_Wrapper, - 'TControl.ResetFocus()'#10 + - 'Removes the focus from a control of from any children of the control.'); - PythonType.AddMethod('PrepareForPaint', @TPyDelphiControl.PrepareForPaint_Wrapper, - 'TControl.PrepareForPaint()'#10 + - 'Prepares the current control for painting.'); -end; - -function TPyDelphiControl.Repaint_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':Repaint') <> 0 then begin - DelphiObject.Repaint; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -function TPyDelphiControl.ResetFocus_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':ResetFocus') <> 0 then begin - DelphiObject.ResetFocus(); - Result := ReturnNone; - end else - Result := nil; - end; -end; - -function TPyDelphiControl.AbsoluteToLocal_Wrapper( - args: PPyObject): PPyObject; -var - p : TPointF; - pt : PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 'O:AbsoluteToLocal', @pt) <> 0 then begin - if CheckPointFAttribute(pt, 'pointf', p) then - Result := WrapPointF(PyDelphiWrapper, DelphiObject.AbsoluteToLocal(p)) - else - Result := nil; - end else - Result := nil; -end; - -function TPyDelphiControl.SendToBack_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':SendToBack') <> 0 then begin - DelphiObject.SendToBack; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -function TPyDelphiControl.SetBounds_Wrapper(args: PPyObject): PPyObject; -var - _left : Integer; - _top : Integer; - _width : Integer; - _height : Integer; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, 'iiii:SetBounds',@_left, @_top, @_width, @_height ) <> 0 then begin - DelphiObject.SetBounds(_left, _top, _width, _height); - Result := ReturnNone; - end else - Result := nil; - end; -end; - -procedure TPyDelphiControl.SetDelphiObject(const Value: TControl); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiControl.SetFocus_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':SetFocus') <> 0 then begin - DelphiObject.SetFocus; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -function TPyDelphiControl.Set_Position(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: TObject; -begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'Position', TPosition, LValue) then - begin - DelphiObject.Position := TPosition(LValue); - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiControl.Set_Visible(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: Boolean; -begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'Visible', LValue) then - begin - DelphiObject.Visible := LValue; - Result := 0; - end - else - Result := -1; -end; - -{ TControlsAccess } - -class function TControlsAccess.ExpectedContainerClass: TClass; -begin - Result := TControl; -end; - -function TControlsAccess.GetContainer: TControl; -begin - Result := TControl(inherited Container); -end; - -function TControlsAccess.GetItem(AIndex: Integer): PPyObject; -begin - Result := Wrap(Container.Controls[AIndex]); -end; - -function TControlsAccess.GetSize: Integer; -begin - Result := Container.ControlsCount; -end; - -function TControlsAccess.IndexOf(AValue: PPyObject): Integer; -var - i : Integer; - S : string; - _obj : TPyObject; - _value : TObject; - _ctrl : TControl; -begin - Result := -1; - with GetPythonEngine do begin - if PyUnicode_Check(AValue) then begin - S := PyUnicodeAsString(AValue); - for i := 0 to Container.ControlsCount - 1 do - if SameText(Container.Controls[i].Name, S) then begin - Result := i; - Break; - end; - end else if IsDelphiObject(AValue) then begin - _obj := PythonToDelphi(AValue); - if _obj is TPyDelphiObject then begin - _value := TPyDelphiObject(_obj).DelphiObject; - if _value is TControl then begin - _ctrl := TControl(_value); - for i := 0 to Container.ControlsCount-1 do - if Container.Controls[i] = _ctrl then begin - Result := i; - Break; - end; - end; - end; - end; - end; -end; - -class function TControlsAccess.Name: string; -begin - Result := 'Controls'; -end; - -class function TControlsAccess.SupportsIndexOf: Boolean; -begin - Result := True; -end; - -{ TPyDelphiStyledControl } - -function TPyDelphiStyledControl.ApplyStyleLookup_Wrapper( - args: PPyObject): PPyObject; -begin - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':ApplyStyleLookup') <> 0 then begin - DelphiObject.ApplyStyleLookup; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -class function TPyDelphiStyledControl.DelphiObjectClass: TClass; -begin - Result := TStyledControl; -end; - -function TPyDelphiStyledControl.GetDelphiObject: TStyledControl; -begin - Result := TStyledControl(inherited DelphiObject); -end; - -function TPyDelphiStyledControl.Get_AdjustSizeValue( - AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := WrapSizeF(PyDelphiWrapper, DelphiObject.AdjustSizeValue); -end; - -function TPyDelphiStyledControl.Get_AdjustType(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(Ord(DelphiObject.AdjustType)); -end; - -function TPyDelphiStyledControl.Get_AutoTranslate(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.VariantAsPyObject(Self.DelphiObject.AutoTranslate); -end; - -function TPyDelphiStyledControl.Get_DefaultStyleLookupName( - AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.DefaultStyleLookupName); -end; - -function TPyDelphiStyledControl.Get_StyleLookup(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.StyleLookup); -end; - -function TPyDelphiStyledControl.Get_StyleState(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(Ord(DelphiObject.StyleState)); -end; - -function TPyDelphiStyledControl.Inflate_Wrapper(args: PPyObject): PPyObject; -begin - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':Inflate') <> 0 then begin - DelphiObject.Inflate; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -function TPyDelphiStyledControl.NeedStyleLookup_Wrapper( - args: PPyObject): PPyObject; -begin - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':NeedStyleLookup') <> 0 then begin - DelphiObject.NeedStyleLookup; - Result := ReturnNone; - end else - Result := nil; - end; -end; - -class procedure TPyDelphiStyledControl.RegisterGetSets(PythonType: TPythonType); -begin - with PythonType do begin - AddGetSet('DefaultStyleLookupName', @TPyDelphiStyledControl.Get_StyleLookup, nil, - 'Returns a string with the name of the default style of this control', nil); - AddGetSet('StyleLookup', @TPyDelphiStyledControl.Get_StyleLookup, @TPyDelphiStyledControl.Set_StyleLookup, - 'Specifies the name of the resource object to which the current TStyledControl is linked', nil); - AddGetSet('AutoTranslate', @TPyDelphiStyledControl.Get_AutoTranslate, @TPyDelphiStyledControl.Set_AutoTranslate, - 'Specifies whether the control''s text should be translated', nil); - AddGetSet('AdjustSizeValue', @TPyDelphiStyledControl.Get_AdjustSizeValue, nil, - 'Updates the width and height of this control according to its current style', nil); - AddGetSet('AdjustType', @TPyDelphiStyledControl.Get_AdjustType, nil, - 'Determines if and how the width and height of this control should be ' - + 'modified to take the fixed space dictated by the style of this control', nil); - AddGetSet('StyleState', @TPyDelphiStyledControl.Get_StyleState, nil, - 'This property allows you to define the current state of style', nil); - end; -end; - -class procedure TPyDelphiStyledControl.RegisterMethods(PythonType: TPythonType); -begin - PythonType.AddMethod('ApplyStyleLookup', @TPyDelphiStyledControl.ApplyStyleLookup_Wrapper, - 'TStyledControl.ApplyStyleLookup()'#10 + - 'Gets and applies the style of a TStyledControl.'); - PythonType.AddMethod('NeedStyleLookup', @TPyDelphiStyledControl.NeedStyleLookup_Wrapper, - 'TStyledControl.NeedStyleLookup()'#10 + - 'Call this procedure to indicate that this control requires to get and apply its style lookup.'); - PythonType.AddMethod('Inflate', @TPyDelphiStyledControl.Inflate_Wrapper, - 'TStyledControl.Inflate()'#10 + - 'Call this procedure to get and apply its style lookup.'); -end; - -procedure TPyDelphiStyledControl.SetDelphiObject(const Value: TStyledControl); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiStyledControl.Set_AutoTranslate(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: Boolean; -begin - Adjust(@Self); - if CheckBoolAttribute(AValue, 'AutoTranslate', LValue) then - begin - DelphiObject.AutoTranslate := LValue; - Result := 0; - end - else - Result := -1; -end; - -function TPyDelphiStyledControl.Set_StyleLookup(AValue: PPyObject; - AContext: Pointer): integer; -var - LValue: string; -begin - if CheckStrAttribute(AValue, 'StyleLookup', LValue) then - with GetPythonEngine do begin - Adjust(@Self); - DelphiObject.StyleLookup := LValue; - Result := 0; - end - else - Result := -1; -end; - -{ TPyDelphiTextControl } - -class function TPyDelphiTextControl.DelphiObjectClass: TClass; -begin - Result := TTextControl; -end; - -function TPyDelphiTextControl.GetDelphiObject: TTextControl; -begin - Result := TTextControl(inherited DelphiObject); -end; - -procedure TPyDelphiTextControl.SetDelphiObject(const Value: TTextControl); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiStyleBook } - -class function TPyDelphiStyleBook.DelphiObjectClass: TClass; -begin - Result := TStyleBook; -end; - -function TPyDelphiStyleBook.GetDelphiObject: TStyleBook; -begin - Result := TStyleBook(inherited DelphiObject); -end; - -procedure TPyDelphiStyleBook.SetDelphiObject(const Value: TStyleBook); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPopup } - -class function TPyDelphiPopup.DelphiObjectClass: TClass; -begin - Result := TPopup; -end; - -function TPyDelphiPopup.GetDelphiObject: TPopup; -begin - Result := TPopup(inherited DelphiObject); -end; - -procedure TPyDelphiPopup.SetDelphiObject(const Value: TPopup); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedControl } - -class function TPyDelphiPresentedControl.DelphiObjectClass: TClass; -begin - Result := TPresentedControl; -end; - -function TPyDelphiPresentedControl.GetDelphiObject: TPresentedControl; -begin - Result := TPresentedControl(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedControl.SetDelphiObject( - const Value: TPresentedControl); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomControlAction } - -class function TPyDelphiCustomControlAction.DelphiObjectClass: TClass; -begin - Result := TCustomControlAction; -end; - -function TPyDelphiCustomControlAction.GetDelphiObject: TCustomControlAction; -begin - Result := TCustomControlAction(inherited DelphiObject); -end; - -procedure TPyDelphiCustomControlAction.SetDelphiObject( - const Value: TCustomControlAction); -begin - inherited DelphiObject := Value; -end; - -{ TKeyEventHandler } - -constructor TKeyEventHandler.Create(APyDelphiWrapper: TPyDelphiWrapper; - AComponent: TObject; APropertyInfo: PPropInfo; ACallable: PPyObject); -var - LMethod : TMethod; -begin - inherited; - LMethod.Code := @TKeyEventHandler.DoEvent; - LMethod.Data := Self; - SetMethodProp(AComponent, APropertyInfo, LMethod); -end; - -class function TKeyEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TKeyEvent); -end; - -procedure TKeyEventHandler.DoEvent(Sender: TObject; var Key: Word; - var KeyChar: WideChar; Shift: TShiftState); -var - LPyObject: PPyObject; - LPyTuple: PPyObject; - LPyResult: PPyObject; - LPyKey: PPyObject; - LVarKeyParam: TPyDelphiVarParameter; - LPyKeyChar: PPyObject; - LVarKeyCharParam: TPyDelphiVarParameter; - LKeyCharStr: string; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - LPyObject := PyDelphiWrapper.Wrap(Sender); - //var parameters - LPyKey := CreateVarParam(PyDelphiWrapper, Key); - LVarKeyParam := PythonToDelphi(LPyKey) as TPyDelphiVarParameter; - LPyKeyChar := CreateVarParam(PyDelphiWrapper, KeyChar); - LVarKeyCharParam := PythonToDelphi(LPyKeyChar) as TPyDelphiVarParameter; - - LPyTuple := PyTuple_New(4); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyKey); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyKeyChar); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, ShiftToPython(Shift)); - try - LPyResult := PyObject_CallObject(Callable, LPyTuple); - if Assigned(LPyResult) then - begin - Py_DECREF(LPyResult); - if PyLong_Check(LVarKeyParam.Value) then - Key := PyLong_AsLong(LVarKeyParam.Value); - - if (LVarKeyCharParam.Value = Py_None) then - KeyChar := #0 - else if PyUnicode_Check(LVarKeyCharParam.Value) then - begin - LKeyCharStr := PyUnicodeAsString(LVarKeyCharParam.Value); - if Length(LKeyCharStr) > 0 then - KeyChar := LKeyCharStr[1]; - end; - end; - finally - Py_DECREF(LPyTuple); - end; - CheckError(); - end; -end; - -initialization - RegisteredUnits.Add(TControlsRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxControls; + +interface + +uses + Classes, SysUtils, TypInfo, Types, + FMX.Types, FMX.Controls, FMX.Controls.Presentation, + PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxTypes, WrapFmxActnList; + +type + { + PyObject wrapping FMX.Controls.TControl + Exposes methods BringToFront, SendToBack, LocalToAbsolute, AbsoluteToLocal, + SetBounds and Repaint + Exposes properties Parent and Visible + } + + { TKeyEvent wrapper } + TKeyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState); + public + constructor Create(APyDelphiWrapper: TPyDelphiWrapper; AComponent: TObject; + APropertyInfo: PPropInfo; ACallable: PPyObject); override; + class function GetTypeInfo: PTypeInfo; override; + end; + + TPyDelphiControl = class (TPyDelphiFmxObject) + private + function GetDelphiObject: TControl; + procedure SetDelphiObject(const Value: TControl); + protected + // Exposed Methods + function LocalToAbsolute_Wrapper(args : PPyObject) : PPyObject; cdecl; + function AbsoluteToLocal_Wrapper(args : PPyObject) : PPyObject; cdecl; + function BringToFront_Wrapper(args : PPyObject) : PPyObject; cdecl; + function SendToBack_Wrapper(args : PPyObject) : PPyObject; cdecl; + function SetBounds_Wrapper(args : PPyObject) : PPyObject; cdecl; + function Repaint_Wrapper(args : PPyObject) : PPyObject; cdecl; + function CanFocus_Wrapper(args: PPyObject): PPyObject; cdecl; + function SetFocus_Wrapper(args: PPyObject): PPyObject; cdecl; + function ResetFocus_Wrapper(args: PPyObject): PPyObject; cdecl; + function PrepareForPaint_Wrapper(args : PPyObject) : PPyObject; cdecl; + // Property Getters + function Get_Visible(AContext: Pointer): PPyObject; cdecl; + function Get_ControlsCount( AContext : Pointer) : PPyObject; cdecl; + function Get_Controls(AContext: Pointer): PPyObject; cdecl; + function Get_IsFocused( AContext : Pointer) : PPyObject; cdecl; + function Get_ParentControl( AContext : Pointer) : PPyObject; cdecl; + function Get_Position(AContext: Pointer): PPyObject; cdecl; + // Property Setters + function Set_Visible(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_Position(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + class function DelphiObjectClass : TClass; override; + class procedure RegisterGetSets( PythonType : TPythonType ); override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + // Properties + property DelphiObject: TControl read GetDelphiObject write SetDelphiObject; + end; + + { + Access to the child controls of a FMX.Controls.TControl.Controls collection. + } + TControlsAccess = class(TContainerAccess) + private + function GetContainer: TControl; + public + function GetItem(AIndex : Integer) : PPyObject; override; + function GetSize : Integer; override; + function IndexOf(AValue : PPyObject) : Integer; override; + + class function ExpectedContainerClass : TClass; override; + class function SupportsIndexOf : Boolean; override; + class function Name : string; override; + + property Container : TControl read GetContainer; + end; + + TPyDelphiStyledControl = class(TPyDelphiControl) + private + function GetDelphiObject: TStyledControl; + procedure SetDelphiObject(const Value: TStyledControl); + protected + // Exposed Methods + function ApplyStyleLookup_Wrapper(args : PPyObject) : PPyObject; cdecl; + function NeedStyleLookup_Wrapper(args : PPyObject) : PPyObject; cdecl; + function Inflate_Wrapper(args : PPyObject) : PPyObject; cdecl; + // Property Getters + function Get_DefaultStyleLookupName(AContext: Pointer): PPyObject; cdecl; + function Get_StyleLookup(AContext: Pointer): PPyObject; cdecl; + function Get_AutoTranslate(AContext: Pointer): PPyObject; cdecl; + function Get_AdjustSizeValue(AContext: Pointer): PPyObject; cdecl; + function Get_AdjustType(AContext: Pointer): PPyObject; cdecl; + function Get_StyleState(AContext: Pointer): PPyObject; cdecl; + // Property Setters + function Set_StyleLookup(AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_AutoTranslate(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + // Properties + property DelphiObject: TStyledControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTextControl = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TTextControl; + procedure SetDelphiObject(const Value: TTextControl); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TTextControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStyleBook = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TStyleBook; + procedure SetDelphiObject(const Value: TStyleBook); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TStyleBook read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPopup = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TPopup; + procedure SetDelphiObject(const Value: TPopup); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TPopup read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPresentedControl = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TPresentedControl; + procedure SetDelphiObject(const Value: TPresentedControl); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TPresentedControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomControlAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TCustomControlAction; + procedure SetDelphiObject(const Value: TCustomControlAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomControlAction read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +type +{ Register the wrappers, the globals and the constants } + TControlsRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TControlsRegistration } + +procedure TControlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TControlsRegistration.Name: string; +begin + Result := 'Controls'; +end; + +procedure TControlsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyledControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTextControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleBook); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopup); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControlAction); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); +end; + +{ TPyDelphiControl } + +function TPyDelphiControl.BringToFront_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':BringToFront') <> 0 then begin + DelphiObject.BringToFront; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +function TPyDelphiControl.CanFocus_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':CanFocus') <> 0 then begin + Result := VariantAsPyObject(DelphiObject.CanFocus) + end else + Result := nil; + end; +end; + +function TPyDelphiControl.LocalToAbsolute_Wrapper( + args: PPyObject): PPyObject; +var + p : TPointF; + pt : PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple(args, 'O:LocalToAbsolute', @pt) <> 0 then begin + if CheckPointFAttribute(pt, 'pointf', p) then + Result := WrapPointF(PyDelphiWrapper, DelphiObject.LocalToAbsolute(p)) + else + Result := nil; + end else + Result := nil; + end; +end; + +function TPyDelphiControl.PrepareForPaint_Wrapper(args: PPyObject): PPyObject; +begin + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':PrepareForPaint') <> 0 then begin + DelphiObject.PrepareForPaint; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +class function TPyDelphiControl.DelphiObjectClass: TClass; +begin + Result := TControl; +end; + +function TPyDelphiControl.GetDelphiObject: TControl; +begin + Result := TControl(inherited DelphiObject); +end; + +function TPyDelphiControl.Get_ControlsCount(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ControlsCount); +end; + +function TPyDelphiControl.Get_IsFocused(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.IsFocused); +end; + +function TPyDelphiControl.Get_Controls(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TControlsAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); +end; + +function TPyDelphiControl.Get_ParentControl(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.ParentControl); +end; + +function TPyDelphiControl.Get_Position(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.Position); +end; + +function TPyDelphiControl.Get_Visible(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(Self.DelphiObject.Visible); +end; + +class procedure TPyDelphiControl.RegisterGetSets(PythonType: TPythonType); +begin + PythonType.AddGetSet('Visible', @TPyDelphiControl.Get_Visible, @TPyDelphiControl.Set_Visible, + 'Returns/Sets the Control Visibility', nil); + PythonType.AddGetSet('ControlsCount', @TPyDelphiControl.Get_ControlsCount, nil, + 'Returns the count of contained controls', nil); + PythonType.AddGetSet('Controls', @TPyDelphiControl.Get_Controls, nil, + 'Returns an iterator over contained controls', nil); + PythonType.AddGetSet('IsFocused', @TPyDelphiControl.Get_IsFocused, nil, + 'Determines whether the control has input focus.', nil); + PythonType.AddGetSet('Position', @TPyDelphiControl.Get_Position, @TPyDelphiControl.Set_Position, + 'Returns an access to the position of the control inside its parent', nil); +end; + +class procedure TPyDelphiControl.RegisterMethods(PythonType: TPythonType); +begin + PythonType.AddMethod('BringToFront', @TPyDelphiControl.BringToFront_Wrapper, + 'TControl.BringToFront()'#10 + + 'Puts the control in front of all other controls in its parent control.'); + PythonType.AddMethod('SendToBack', @TPyDelphiControl.SendToBack_Wrapper, + 'TControl.SendToBack()'#10 + + 'Puts a windowed control behind all other windowed controls, or puts a non-windowed control behind all other non-windowed controls.'); + PythonType.AddMethod('SetBounds', @TPyDelphiControl.SetBounds_Wrapper, + 'TControl.SetBounds(Left, Top, Width, Height)'#10 + + 'Sets the Left, Top, Width, and Height properties all at once.'); + PythonType.AddMethod('Repaint', @TPyDelphiControl.Repaint_Wrapper, + 'TControl.Repaint()'#10 + + 'Forces the control to repaint its image on the screen. '); + PythonType.AddMethod('LocalToAbsolute', @TPyDelphiControl.LocalToAbsolute_Wrapper, + 'TControl.LocalToAbsolute()'#10 + + 'Translates a given point from client area coordinates to global screen coordinates.'); + PythonType.AddMethod('AbsoluteToLocal', @TPyDelphiControl.AbsoluteToLocal_Wrapper, + 'TControl.AbsoluteToLocal()'#10 + + 'Converts the screen coordinates of a specified point on the screen to client coordinates.'); + PythonType.AddMethod('CanFocus', @TPyDelphiControl.CanFocus_Wrapper, + 'TControl.CanFocus()'#10 + + 'Indicates whether a control can receive focus. '); + PythonType.AddMethod('SetFocus', @TPyDelphiControl.SetFocus_Wrapper, + 'TControl.SetFocus()'#10 + + 'Gives the input focus to the control.'); + PythonType.AddMethod('ResetFocus', @TPyDelphiControl.ResetFocus_Wrapper, + 'TControl.ResetFocus()'#10 + + 'Removes the focus from a control of from any children of the control.'); + PythonType.AddMethod('PrepareForPaint', @TPyDelphiControl.PrepareForPaint_Wrapper, + 'TControl.PrepareForPaint()'#10 + + 'Prepares the current control for painting.'); +end; + +function TPyDelphiControl.Repaint_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':Repaint') <> 0 then begin + DelphiObject.Repaint; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +function TPyDelphiControl.ResetFocus_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':ResetFocus') <> 0 then begin + DelphiObject.ResetFocus(); + Result := ReturnNone; + end else + Result := nil; + end; +end; + +function TPyDelphiControl.AbsoluteToLocal_Wrapper( + args: PPyObject): PPyObject; +var + p : TPointF; + pt : PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine.PyArg_ParseTuple( args, 'O:AbsoluteToLocal', @pt) <> 0 then begin + if CheckPointFAttribute(pt, 'pointf', p) then + Result := WrapPointF(PyDelphiWrapper, DelphiObject.AbsoluteToLocal(p)) + else + Result := nil; + end else + Result := nil; +end; + +function TPyDelphiControl.SendToBack_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':SendToBack') <> 0 then begin + DelphiObject.SendToBack; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +function TPyDelphiControl.SetBounds_Wrapper(args: PPyObject): PPyObject; +var + _left : Integer; + _top : Integer; + _width : Integer; + _height : Integer; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, 'iiii:SetBounds',@_left, @_top, @_width, @_height ) <> 0 then begin + DelphiObject.SetBounds(_left, _top, _width, _height); + Result := ReturnNone; + end else + Result := nil; + end; +end; + +procedure TPyDelphiControl.SetDelphiObject(const Value: TControl); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiControl.SetFocus_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':SetFocus') <> 0 then begin + DelphiObject.SetFocus; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +function TPyDelphiControl.Set_Position(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: TObject; +begin + Adjust(@Self); + if CheckObjAttribute(AValue, 'Position', TPosition, LValue) then + begin + DelphiObject.Position := TPosition(LValue); + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiControl.Set_Visible(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: Boolean; +begin + Adjust(@Self); + if CheckBoolAttribute(AValue, 'Visible', LValue) then + begin + DelphiObject.Visible := LValue; + Result := 0; + end + else + Result := -1; +end; + +{ TControlsAccess } + +class function TControlsAccess.ExpectedContainerClass: TClass; +begin + Result := TControl; +end; + +function TControlsAccess.GetContainer: TControl; +begin + Result := TControl(inherited Container); +end; + +function TControlsAccess.GetItem(AIndex: Integer): PPyObject; +begin + Result := Wrap(Container.Controls[AIndex]); +end; + +function TControlsAccess.GetSize: Integer; +begin + Result := Container.ControlsCount; +end; + +function TControlsAccess.IndexOf(AValue: PPyObject): Integer; +var + i : Integer; + S : string; + _obj : TPyObject; + _value : TObject; + _ctrl : TControl; +begin + Result := -1; + with GetPythonEngine do begin + if PyUnicode_Check(AValue) then begin + S := PyUnicodeAsString(AValue); + for i := 0 to Container.ControlsCount - 1 do + if SameText(Container.Controls[i].Name, S) then begin + Result := i; + Break; + end; + end else if IsDelphiObject(AValue) then begin + _obj := PythonToDelphi(AValue); + if _obj is TPyDelphiObject then begin + _value := TPyDelphiObject(_obj).DelphiObject; + if _value is TControl then begin + _ctrl := TControl(_value); + for i := 0 to Container.ControlsCount-1 do + if Container.Controls[i] = _ctrl then begin + Result := i; + Break; + end; + end; + end; + end; + end; +end; + +class function TControlsAccess.Name: string; +begin + Result := 'Controls'; +end; + +class function TControlsAccess.SupportsIndexOf: Boolean; +begin + Result := True; +end; + +{ TPyDelphiStyledControl } + +function TPyDelphiStyledControl.ApplyStyleLookup_Wrapper( + args: PPyObject): PPyObject; +begin + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':ApplyStyleLookup') <> 0 then begin + DelphiObject.ApplyStyleLookup; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +class function TPyDelphiStyledControl.DelphiObjectClass: TClass; +begin + Result := TStyledControl; +end; + +function TPyDelphiStyledControl.GetDelphiObject: TStyledControl; +begin + Result := TStyledControl(inherited DelphiObject); +end; + +function TPyDelphiStyledControl.Get_AdjustSizeValue( + AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := WrapSizeF(PyDelphiWrapper, DelphiObject.AdjustSizeValue); +end; + +function TPyDelphiStyledControl.Get_AdjustType(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(Ord(DelphiObject.AdjustType)); +end; + +function TPyDelphiStyledControl.Get_AutoTranslate(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.VariantAsPyObject(Self.DelphiObject.AutoTranslate); +end; + +function TPyDelphiStyledControl.Get_DefaultStyleLookupName( + AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.DefaultStyleLookupName); +end; + +function TPyDelphiStyledControl.Get_StyleLookup(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.StyleLookup); +end; + +function TPyDelphiStyledControl.Get_StyleState(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(Ord(DelphiObject.StyleState)); +end; + +function TPyDelphiStyledControl.Inflate_Wrapper(args: PPyObject): PPyObject; +begin + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':Inflate') <> 0 then begin + DelphiObject.Inflate; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +function TPyDelphiStyledControl.NeedStyleLookup_Wrapper( + args: PPyObject): PPyObject; +begin + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':NeedStyleLookup') <> 0 then begin + DelphiObject.NeedStyleLookup; + Result := ReturnNone; + end else + Result := nil; + end; +end; + +class procedure TPyDelphiStyledControl.RegisterGetSets(PythonType: TPythonType); +begin + with PythonType do begin + AddGetSet('DefaultStyleLookupName', @TPyDelphiStyledControl.Get_StyleLookup, nil, + 'Returns a string with the name of the default style of this control', nil); + AddGetSet('StyleLookup', @TPyDelphiStyledControl.Get_StyleLookup, @TPyDelphiStyledControl.Set_StyleLookup, + 'Specifies the name of the resource object to which the current TStyledControl is linked', nil); + AddGetSet('AutoTranslate', @TPyDelphiStyledControl.Get_AutoTranslate, @TPyDelphiStyledControl.Set_AutoTranslate, + 'Specifies whether the control''s text should be translated', nil); + AddGetSet('AdjustSizeValue', @TPyDelphiStyledControl.Get_AdjustSizeValue, nil, + 'Updates the width and height of this control according to its current style', nil); + AddGetSet('AdjustType', @TPyDelphiStyledControl.Get_AdjustType, nil, + 'Determines if and how the width and height of this control should be ' + + 'modified to take the fixed space dictated by the style of this control', nil); + AddGetSet('StyleState', @TPyDelphiStyledControl.Get_StyleState, nil, + 'This property allows you to define the current state of style', nil); + end; +end; + +class procedure TPyDelphiStyledControl.RegisterMethods(PythonType: TPythonType); +begin + PythonType.AddMethod('ApplyStyleLookup', @TPyDelphiStyledControl.ApplyStyleLookup_Wrapper, + 'TStyledControl.ApplyStyleLookup()'#10 + + 'Gets and applies the style of a TStyledControl.'); + PythonType.AddMethod('NeedStyleLookup', @TPyDelphiStyledControl.NeedStyleLookup_Wrapper, + 'TStyledControl.NeedStyleLookup()'#10 + + 'Call this procedure to indicate that this control requires to get and apply its style lookup.'); + PythonType.AddMethod('Inflate', @TPyDelphiStyledControl.Inflate_Wrapper, + 'TStyledControl.Inflate()'#10 + + 'Call this procedure to get and apply its style lookup.'); +end; + +procedure TPyDelphiStyledControl.SetDelphiObject(const Value: TStyledControl); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiStyledControl.Set_AutoTranslate(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: Boolean; +begin + Adjust(@Self); + if CheckBoolAttribute(AValue, 'AutoTranslate', LValue) then + begin + DelphiObject.AutoTranslate := LValue; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiStyledControl.Set_StyleLookup(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: string; +begin + if CheckStrAttribute(AValue, 'StyleLookup', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + DelphiObject.StyleLookup := LValue; + Result := 0; + end + else + Result := -1; +end; + +{ TPyDelphiTextControl } + +class function TPyDelphiTextControl.DelphiObjectClass: TClass; +begin + Result := TTextControl; +end; + +function TPyDelphiTextControl.GetDelphiObject: TTextControl; +begin + Result := TTextControl(inherited DelphiObject); +end; + +procedure TPyDelphiTextControl.SetDelphiObject(const Value: TTextControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiStyleBook } + +class function TPyDelphiStyleBook.DelphiObjectClass: TClass; +begin + Result := TStyleBook; +end; + +function TPyDelphiStyleBook.GetDelphiObject: TStyleBook; +begin + Result := TStyleBook(inherited DelphiObject); +end; + +procedure TPyDelphiStyleBook.SetDelphiObject(const Value: TStyleBook); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPopup } + +class function TPyDelphiPopup.DelphiObjectClass: TClass; +begin + Result := TPopup; +end; + +function TPyDelphiPopup.GetDelphiObject: TPopup; +begin + Result := TPopup(inherited DelphiObject); +end; + +procedure TPyDelphiPopup.SetDelphiObject(const Value: TPopup); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedControl } + +class function TPyDelphiPresentedControl.DelphiObjectClass: TClass; +begin + Result := TPresentedControl; +end; + +function TPyDelphiPresentedControl.GetDelphiObject: TPresentedControl; +begin + Result := TPresentedControl(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedControl.SetDelphiObject( + const Value: TPresentedControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomControlAction } + +class function TPyDelphiCustomControlAction.DelphiObjectClass: TClass; +begin + Result := TCustomControlAction; +end; + +function TPyDelphiCustomControlAction.GetDelphiObject: TCustomControlAction; +begin + Result := TCustomControlAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomControlAction.SetDelphiObject( + const Value: TCustomControlAction); +begin + inherited DelphiObject := Value; +end; + +{ TKeyEventHandler } + +constructor TKeyEventHandler.Create(APyDelphiWrapper: TPyDelphiWrapper; + AComponent: TObject; APropertyInfo: PPropInfo; ACallable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TKeyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(AComponent, APropertyInfo, LMethod); +end; + +class function TKeyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TKeyEvent); +end; + +procedure TKeyEventHandler.DoEvent(Sender: TObject; var Key: Word; + var KeyChar: WideChar; Shift: TShiftState); +var + LPyObject: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; + LPyKey: PPyObject; + LVarKeyParam: TPyDelphiVarParameter; + LPyKeyChar: PPyObject; + LVarKeyCharParam: TPyDelphiVarParameter; + LKeyCharStr: string; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + //var parameters + LPyKey := CreateVarParam(PyDelphiWrapper, Key); + LVarKeyParam := PythonToDelphi(LPyKey) as TPyDelphiVarParameter; + LPyKeyChar := CreateVarParam(PyDelphiWrapper, KeyChar); + LVarKeyCharParam := PythonToDelphi(LPyKeyChar) as TPyDelphiVarParameter; + + LPyTuple := PyTuple_New(4); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyKey); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyKeyChar); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, ShiftToPython(Shift)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + if PyLong_Check(LVarKeyParam.Value) then + Key := PyLong_AsLong(LVarKeyParam.Value); + + if (LVarKeyCharParam.Value = Py_None) then + KeyChar := #0 + else if PyUnicode_Check(LVarKeyCharParam.Value) then + begin + LKeyCharStr := PyUnicodeAsString(LVarKeyCharParam.Value); + if Length(LKeyCharStr) > 0 then + KeyChar := LKeyCharStr[1]; + end; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +initialization + RegisteredUnits.Add(TControlsRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxDataBind.pas b/Source/fmx/WrapFmxDataBind.pas index be4d27cc..3ad2eef4 100644 --- a/Source/fmx/WrapFmxDataBind.pas +++ b/Source/fmx/WrapFmxDataBind.pas @@ -1,423 +1,423 @@ -unit WrapFmxDataBind; - -interface - -uses - FMX.Bind.Navigator, - WrapFmxActnList; - -type - TPyDelphiFMXBindNavigateAction = class(TPyDelphiAction) - private - function GetDelphiObject: TFMXBindNavigateAction; - procedure SetDelphiObject(const Value: TFMXBindNavigateAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateFirst = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateFirst; - procedure SetDelphiObject(const Value: TFMXBindNavigateFirst); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateFirst read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigatePrior = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigatePrior; - procedure SetDelphiObject(const Value: TFMXBindNavigatePrior); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigatePrior read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateNext = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateNext; - procedure SetDelphiObject(const Value: TFMXBindNavigateNext); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateNext read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateLast = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateLast; - procedure SetDelphiObject(const Value: TFMXBindNavigateLast); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateLast read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateInsert = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateInsert; - procedure SetDelphiObject(const Value: TFMXBindNavigateInsert); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateInsert read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateDelete = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateDelete; - procedure SetDelphiObject(const Value: TFMXBindNavigateDelete); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateDelete read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateEdit = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateEdit; - procedure SetDelphiObject(const Value: TFMXBindNavigateEdit); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateEdit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigatePost = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigatePost; - procedure SetDelphiObject(const Value: TFMXBindNavigatePost); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigatePost read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateCancel = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateCancel; - procedure SetDelphiObject(const Value: TFMXBindNavigateCancel); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateCancel read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateRefresh = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateRefresh; - procedure SetDelphiObject(const Value: TFMXBindNavigateRefresh); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateRefresh read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateApplyUpdates = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateApplyUpdates; - procedure SetDelphiObject(const Value: TFMXBindNavigateApplyUpdates); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateApplyUpdates read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFMXBindNavigateCancelUpdates = class(TPyDelphiFMXBindNavigateAction) - private - function GetDelphiObject: TFMXBindNavigateCancelUpdates; - procedure SetDelphiObject(const Value: TFMXBindNavigateCancelUpdates); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TFMXBindNavigateCancelUpdates read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TFmxDataBindRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TFmxDataBindRegistration } - -procedure TFmxDataBindRegistration.DefineVars( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TFmxDataBindRegistration.Name: string; -begin - Result := 'FMX.DataBind'; -end; - -procedure TFmxDataBindRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateFirst); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigatePrior); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateNext); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateLast); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateInsert); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateDelete); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateEdit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigatePost); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateCancel); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateRefresh); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateApplyUpdates); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateCancelUpdates); -end; - -{ TPyDelphiFMXBindNavigateAction } - -class function TPyDelphiFMXBindNavigateAction.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateAction; -end; - -function TPyDelphiFMXBindNavigateAction.GetDelphiObject: TFMXBindNavigateAction; -begin - Result := TFMXBindNavigateAction(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateAction.SetDelphiObject( - const Value: TFMXBindNavigateAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateFirst } - -class function TPyDelphiFMXBindNavigateFirst.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateFirst; -end; - -function TPyDelphiFMXBindNavigateFirst.GetDelphiObject: TFMXBindNavigateFirst; -begin - Result := TFMXBindNavigateFirst(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateFirst.SetDelphiObject( - const Value: TFMXBindNavigateFirst); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigatePrior } - -class function TPyDelphiFMXBindNavigatePrior.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigatePrior; -end; - -function TPyDelphiFMXBindNavigatePrior.GetDelphiObject: TFMXBindNavigatePrior; -begin - Result := TFMXBindNavigatePrior(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigatePrior.SetDelphiObject( - const Value: TFMXBindNavigatePrior); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateNext } - -class function TPyDelphiFMXBindNavigateNext.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateNext; -end; - -function TPyDelphiFMXBindNavigateNext.GetDelphiObject: TFMXBindNavigateNext; -begin - Result := TFMXBindNavigateNext(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateNext.SetDelphiObject( - const Value: TFMXBindNavigateNext); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateLast } - -class function TPyDelphiFMXBindNavigateLast.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateLast; -end; - -function TPyDelphiFMXBindNavigateLast.GetDelphiObject: TFMXBindNavigateLast; -begin - Result := TFMXBindNavigateLast(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateLast.SetDelphiObject( - const Value: TFMXBindNavigateLast); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateInsert } - -class function TPyDelphiFMXBindNavigateInsert.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateInsert; -end; - -function TPyDelphiFMXBindNavigateInsert.GetDelphiObject: TFMXBindNavigateInsert; -begin - Result := TFMXBindNavigateInsert(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateInsert.SetDelphiObject( - const Value: TFMXBindNavigateInsert); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateDelete } - -class function TPyDelphiFMXBindNavigateDelete.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateDelete; -end; - -function TPyDelphiFMXBindNavigateDelete.GetDelphiObject: TFMXBindNavigateDelete; -begin - Result := TFMXBindNavigateDelete(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateDelete.SetDelphiObject( - const Value: TFMXBindNavigateDelete); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateEdit } - -class function TPyDelphiFMXBindNavigateEdit.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateEdit; -end; - -function TPyDelphiFMXBindNavigateEdit.GetDelphiObject: TFMXBindNavigateEdit; -begin - Result := TFMXBindNavigateEdit(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateEdit.SetDelphiObject( - const Value: TFMXBindNavigateEdit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigatePost } - -class function TPyDelphiFMXBindNavigatePost.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigatePost; -end; - -function TPyDelphiFMXBindNavigatePost.GetDelphiObject: TFMXBindNavigatePost; -begin - Result := TFMXBindNavigatePost(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigatePost.SetDelphiObject( - const Value: TFMXBindNavigatePost); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateCancel } - -class function TPyDelphiFMXBindNavigateCancel.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateCancel; -end; - -function TPyDelphiFMXBindNavigateCancel.GetDelphiObject: TFMXBindNavigateCancel; -begin - Result := TFMXBindNavigateCancel(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateCancel.SetDelphiObject( - const Value: TFMXBindNavigateCancel); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateRefresh } - -class function TPyDelphiFMXBindNavigateRefresh.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateRefresh; -end; - -function TPyDelphiFMXBindNavigateRefresh.GetDelphiObject: TFMXBindNavigateRefresh; -begin - Result := TFMXBindNavigateRefresh(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateRefresh.SetDelphiObject( - const Value: TFMXBindNavigateRefresh); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateApplyUpdates } - -class function TPyDelphiFMXBindNavigateApplyUpdates.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateApplyUpdates; -end; - -function TPyDelphiFMXBindNavigateApplyUpdates.GetDelphiObject: TFMXBindNavigateApplyUpdates; -begin - Result := TFMXBindNavigateApplyUpdates(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateApplyUpdates.SetDelphiObject( - const Value: TFMXBindNavigateApplyUpdates); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFMXBindNavigateCancelUpdates } - -class function TPyDelphiFMXBindNavigateCancelUpdates.DelphiObjectClass: TClass; -begin - Result := TFMXBindNavigateCancelUpdates; -end; - -function TPyDelphiFMXBindNavigateCancelUpdates.GetDelphiObject: TFMXBindNavigateCancelUpdates; -begin - Result := TFMXBindNavigateCancelUpdates(inherited DelphiObject); -end; - -procedure TPyDelphiFMXBindNavigateCancelUpdates.SetDelphiObject( - const Value: TFMXBindNavigateCancelUpdates); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TFmxDataBindRegistration.Create); - -end. +unit WrapFmxDataBind; + +interface + +uses + FMX.Bind.Navigator, + WrapFmxActnList; + +type + TPyDelphiFMXBindNavigateAction = class(TPyDelphiAction) + private + function GetDelphiObject: TFMXBindNavigateAction; + procedure SetDelphiObject(const Value: TFMXBindNavigateAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateFirst = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateFirst; + procedure SetDelphiObject(const Value: TFMXBindNavigateFirst); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateFirst read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigatePrior = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigatePrior; + procedure SetDelphiObject(const Value: TFMXBindNavigatePrior); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigatePrior read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateNext = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateNext; + procedure SetDelphiObject(const Value: TFMXBindNavigateNext); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateNext read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateLast = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateLast; + procedure SetDelphiObject(const Value: TFMXBindNavigateLast); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateLast read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateInsert = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateInsert; + procedure SetDelphiObject(const Value: TFMXBindNavigateInsert); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateInsert read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateDelete = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateDelete; + procedure SetDelphiObject(const Value: TFMXBindNavigateDelete); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateDelete read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateEdit = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateEdit; + procedure SetDelphiObject(const Value: TFMXBindNavigateEdit); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateEdit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigatePost = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigatePost; + procedure SetDelphiObject(const Value: TFMXBindNavigatePost); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigatePost read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateCancel = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateCancel; + procedure SetDelphiObject(const Value: TFMXBindNavigateCancel); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateCancel read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateRefresh = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateRefresh; + procedure SetDelphiObject(const Value: TFMXBindNavigateRefresh); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateRefresh read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateApplyUpdates = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateApplyUpdates; + procedure SetDelphiObject(const Value: TFMXBindNavigateApplyUpdates); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateApplyUpdates read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFMXBindNavigateCancelUpdates = class(TPyDelphiFMXBindNavigateAction) + private + function GetDelphiObject: TFMXBindNavigateCancelUpdates; + procedure SetDelphiObject(const Value: TFMXBindNavigateCancelUpdates); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TFMXBindNavigateCancelUpdates read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TFmxDataBindRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TFmxDataBindRegistration } + +procedure TFmxDataBindRegistration.DefineVars( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TFmxDataBindRegistration.Name: string; +begin + Result := 'FMX.DataBind'; +end; + +procedure TFmxDataBindRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateFirst); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigatePrior); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateNext); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateLast); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateInsert); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateDelete); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigatePost); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateCancel); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateRefresh); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateApplyUpdates); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFMXBindNavigateCancelUpdates); +end; + +{ TPyDelphiFMXBindNavigateAction } + +class function TPyDelphiFMXBindNavigateAction.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateAction; +end; + +function TPyDelphiFMXBindNavigateAction.GetDelphiObject: TFMXBindNavigateAction; +begin + Result := TFMXBindNavigateAction(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateAction.SetDelphiObject( + const Value: TFMXBindNavigateAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateFirst } + +class function TPyDelphiFMXBindNavigateFirst.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateFirst; +end; + +function TPyDelphiFMXBindNavigateFirst.GetDelphiObject: TFMXBindNavigateFirst; +begin + Result := TFMXBindNavigateFirst(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateFirst.SetDelphiObject( + const Value: TFMXBindNavigateFirst); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigatePrior } + +class function TPyDelphiFMXBindNavigatePrior.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigatePrior; +end; + +function TPyDelphiFMXBindNavigatePrior.GetDelphiObject: TFMXBindNavigatePrior; +begin + Result := TFMXBindNavigatePrior(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigatePrior.SetDelphiObject( + const Value: TFMXBindNavigatePrior); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateNext } + +class function TPyDelphiFMXBindNavigateNext.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateNext; +end; + +function TPyDelphiFMXBindNavigateNext.GetDelphiObject: TFMXBindNavigateNext; +begin + Result := TFMXBindNavigateNext(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateNext.SetDelphiObject( + const Value: TFMXBindNavigateNext); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateLast } + +class function TPyDelphiFMXBindNavigateLast.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateLast; +end; + +function TPyDelphiFMXBindNavigateLast.GetDelphiObject: TFMXBindNavigateLast; +begin + Result := TFMXBindNavigateLast(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateLast.SetDelphiObject( + const Value: TFMXBindNavigateLast); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateInsert } + +class function TPyDelphiFMXBindNavigateInsert.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateInsert; +end; + +function TPyDelphiFMXBindNavigateInsert.GetDelphiObject: TFMXBindNavigateInsert; +begin + Result := TFMXBindNavigateInsert(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateInsert.SetDelphiObject( + const Value: TFMXBindNavigateInsert); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateDelete } + +class function TPyDelphiFMXBindNavigateDelete.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateDelete; +end; + +function TPyDelphiFMXBindNavigateDelete.GetDelphiObject: TFMXBindNavigateDelete; +begin + Result := TFMXBindNavigateDelete(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateDelete.SetDelphiObject( + const Value: TFMXBindNavigateDelete); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateEdit } + +class function TPyDelphiFMXBindNavigateEdit.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateEdit; +end; + +function TPyDelphiFMXBindNavigateEdit.GetDelphiObject: TFMXBindNavigateEdit; +begin + Result := TFMXBindNavigateEdit(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateEdit.SetDelphiObject( + const Value: TFMXBindNavigateEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigatePost } + +class function TPyDelphiFMXBindNavigatePost.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigatePost; +end; + +function TPyDelphiFMXBindNavigatePost.GetDelphiObject: TFMXBindNavigatePost; +begin + Result := TFMXBindNavigatePost(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigatePost.SetDelphiObject( + const Value: TFMXBindNavigatePost); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateCancel } + +class function TPyDelphiFMXBindNavigateCancel.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateCancel; +end; + +function TPyDelphiFMXBindNavigateCancel.GetDelphiObject: TFMXBindNavigateCancel; +begin + Result := TFMXBindNavigateCancel(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateCancel.SetDelphiObject( + const Value: TFMXBindNavigateCancel); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateRefresh } + +class function TPyDelphiFMXBindNavigateRefresh.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateRefresh; +end; + +function TPyDelphiFMXBindNavigateRefresh.GetDelphiObject: TFMXBindNavigateRefresh; +begin + Result := TFMXBindNavigateRefresh(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateRefresh.SetDelphiObject( + const Value: TFMXBindNavigateRefresh); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateApplyUpdates } + +class function TPyDelphiFMXBindNavigateApplyUpdates.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateApplyUpdates; +end; + +function TPyDelphiFMXBindNavigateApplyUpdates.GetDelphiObject: TFMXBindNavigateApplyUpdates; +begin + Result := TFMXBindNavigateApplyUpdates(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateApplyUpdates.SetDelphiObject( + const Value: TFMXBindNavigateApplyUpdates); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFMXBindNavigateCancelUpdates } + +class function TPyDelphiFMXBindNavigateCancelUpdates.DelphiObjectClass: TClass; +begin + Result := TFMXBindNavigateCancelUpdates; +end; + +function TPyDelphiFMXBindNavigateCancelUpdates.GetDelphiObject: TFMXBindNavigateCancelUpdates; +begin + Result := TFMXBindNavigateCancelUpdates(inherited DelphiObject); +end; + +procedure TPyDelphiFMXBindNavigateCancelUpdates.SetDelphiObject( + const Value: TFMXBindNavigateCancelUpdates); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TFmxDataBindRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxDialogs.pas b/Source/fmx/WrapFmxDialogs.pas index 0e8efab3..8e9ae53c 100644 --- a/Source/fmx/WrapFmxDialogs.pas +++ b/Source/fmx/WrapFmxDialogs.pas @@ -1,114 +1,114 @@ -{$I ..\Definition.Inc} - -unit WrapFmxDialogs; - -interface - -uses - FMX.Dialogs, WrapFmxTypes, PythonEngine; - - -type - TPyDelphiOpenDialog = class(TPyDelphiFmxObject) - private - function GetDelphiObject: TOpenDialog; - procedure SetDelphiObject(const Value: TOpenDialog); - protected - // Exposed Methods - function Execute_Wrapper(args: PPyObject): PPyObject; cdecl; - // Property Getters - function Get_filename(AContext: Pointer): PPyObject; cdecl; - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods( PythonType : TPythonType ); override; - // Properties - property DelphiObject: TOpenDialog read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TDialogRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TDialogRegistration } - -procedure TDialogRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TDialogRegistration.Name: string; -begin - Result := 'Dialog'; -end; - -procedure TDialogRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiOpenDialog); -end; - -{ TPyDelphiOpenDialog } - -class function TPyDelphiOpenDialog.DelphiObjectClass: TClass; -begin - Result := TOpenDialog; -end; - -function TPyDelphiOpenDialog.Execute_Wrapper(args: PPyObject): PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, ':Execute') <> 0 then - Result := VariantAsPyObject(DelphiObject.Execute()) - else - Result := nil; - end; -end; - -function TPyDelphiOpenDialog.GetDelphiObject: TOpenDialog; -begin - Result := TOpenDialog(inherited DelphiObject); -end; - -function TPyDelphiOpenDialog.Get_filename(AContext: Pointer): PPyObject; -begin - Adjust(@self); - Result := GetPythonEngine.VariantAsPyObject(DelphiObject.FileName); -end; - -class procedure TPyDelphiOpenDialog.RegisterGetSets(PythonType: TPythonType); -begin - PythonType.AddGetSet('FileName', @TPyDelphiOpenDialog.Get_filename, - nil, '', nil); -end; - -class procedure TPyDelphiOpenDialog.RegisterMethods(PythonType: TPythonType); -begin - PythonType.AddMethod('Execute', @TPyDelphiOpenDialog.Execute_Wrapper, - 'TOpenDialog.Execute()'#10 + - 'Displays the dialog'); -end; - -procedure TPyDelphiOpenDialog.SetDelphiObject(const Value: TOpenDialog); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TDialogRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxDialogs; + +interface + +uses + FMX.Dialogs, WrapFmxTypes, PythonEngine; + + +type + TPyDelphiOpenDialog = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TOpenDialog; + procedure SetDelphiObject(const Value: TOpenDialog); + protected + // Exposed Methods + function Execute_Wrapper(args: PPyObject): PPyObject; cdecl; + // Property Getters + function Get_filename(AContext: Pointer): PPyObject; cdecl; + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods( PythonType : TPythonType ); override; + // Properties + property DelphiObject: TOpenDialog read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TDialogRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TDialogRegistration } + +procedure TDialogRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TDialogRegistration.Name: string; +begin + Result := 'Dialog'; +end; + +procedure TDialogRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiOpenDialog); +end; + +{ TPyDelphiOpenDialog } + +class function TPyDelphiOpenDialog.DelphiObjectClass: TClass; +begin + Result := TOpenDialog; +end; + +function TPyDelphiOpenDialog.Execute_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':Execute') <> 0 then + Result := VariantAsPyObject(DelphiObject.Execute()) + else + Result := nil; + end; +end; + +function TPyDelphiOpenDialog.GetDelphiObject: TOpenDialog; +begin + Result := TOpenDialog(inherited DelphiObject); +end; + +function TPyDelphiOpenDialog.Get_filename(AContext: Pointer): PPyObject; +begin + Adjust(@self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.FileName); +end; + +class procedure TPyDelphiOpenDialog.RegisterGetSets(PythonType: TPythonType); +begin + PythonType.AddGetSet('FileName', @TPyDelphiOpenDialog.Get_filename, + nil, '', nil); +end; + +class procedure TPyDelphiOpenDialog.RegisterMethods(PythonType: TPythonType); +begin + PythonType.AddMethod('Execute', @TPyDelphiOpenDialog.Execute_Wrapper, + 'TOpenDialog.Execute()'#10 + + 'Displays the dialog'); +end; + +procedure TPyDelphiOpenDialog.SetDelphiObject(const Value: TOpenDialog); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TDialogRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxEdit.pas b/Source/fmx/WrapFmxEdit.pas index fe7a385f..74f60fd9 100644 --- a/Source/fmx/WrapFmxEdit.pas +++ b/Source/fmx/WrapFmxEdit.pas @@ -1,281 +1,281 @@ -{$I ..\Definition.Inc} - -unit WrapFmxEdit; - -interface - -uses - FMX.Edit, FMX.SearchBox, FMX.ComboEdit, FMX.EditBox, FMX.SpinBox, - PythonEngine, WrapFmxTypes, WrapFmxControls; - - -type - TPyDelphiCustomEdit = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TCustomEdit; - procedure SetDelphiObject(const Value: TCustomEdit); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomEdit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiEdit = class(TPyDelphiCustomEdit) - private - function GetDelphiObject: TEdit; - procedure SetDelphiObject(const Value: TEdit); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TEdit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiSearchBox = class(TPyDelphiEdit) - private - function GetDelphiObject: TSearchBox; - procedure SetDelphiObject(const Value: TSearchBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSearchBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiComboEditBase = class(TPyDelphiCustomEdit) - private - function GetDelphiObject: TComboEditBase; - procedure SetDelphiObject(const Value: TComboEditBase); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TComboEditBase read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomComboEdit = class(TPyDelphiComboEditBase) - private - function GetDelphiObject: TCustomComboEdit; - procedure SetDelphiObject(const Value: TCustomComboEdit); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomComboEdit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiComboEdit = class(TPyDelphiCustomComboEdit) - private - function GetDelphiObject: TComboEdit; - procedure SetDelphiObject(const Value: TComboEdit); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TComboEdit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomEditBox = class(TPyDelphiCustomEdit) - private - function GetDelphiObject: TCustomEditBox; - procedure SetDelphiObject(const Value: TCustomEditBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomEditBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiSpinBox = class(TPyDelphiCustomEditBox) - private - function GetDelphiObject: TSpinBox; - procedure SetDelphiObject(const Value: TSpinBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSpinBox read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TEditRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TEditRegistration } - -procedure TEditRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TEditRegistration.Name: string; -begin - Result := 'Edit'; -end; - -procedure TEditRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomEdit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiEdit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSearchBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboEditBase); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomComboEdit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboEdit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomEditBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinBox); -end; - -{ TPyDelphiCustomEdit } - -class function TPyDelphiCustomEdit.DelphiObjectClass: TClass; -begin - Result := TCustomEdit; -end; - -function TPyDelphiCustomEdit.GetDelphiObject: TCustomEdit; -begin - Result := TCustomEdit(inherited DelphiObject); -end; - -procedure TPyDelphiCustomEdit.SetDelphiObject(const Value: TCustomEdit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiEdit } - -class function TPyDelphiEdit.DelphiObjectClass: TClass; -begin - Result := TEdit; -end; - -function TPyDelphiEdit.GetDelphiObject: TEdit; -begin - Result := TEdit(inherited DelphiObject); -end; - -procedure TPyDelphiEdit.SetDelphiObject(const Value: TEdit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSearchBox } - -class function TPyDelphiSearchBox.DelphiObjectClass: TClass; -begin - Result := TSearchBox; -end; - -function TPyDelphiSearchBox.GetDelphiObject: TSearchBox; -begin - Result := TSearchBox(inherited DelphiObject); -end; - -procedure TPyDelphiSearchBox.SetDelphiObject(const Value: TSearchBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiComboEditBase } - -class function TPyDelphiComboEditBase.DelphiObjectClass: TClass; -begin - Result := TComboEditBase; -end; - -function TPyDelphiComboEditBase.GetDelphiObject: TComboEditBase; -begin - Result := TComboEditBase(inherited DelphiObject); -end; - -procedure TPyDelphiComboEditBase.SetDelphiObject(const Value: TComboEditBase); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomComboEdit } - -class function TPyDelphiCustomComboEdit.DelphiObjectClass: TClass; -begin - Result := TCustomComboEdit; -end; - -function TPyDelphiCustomComboEdit.GetDelphiObject: TCustomComboEdit; -begin - Result := TCustomComboEdit(inherited DelphiObject); -end; - -procedure TPyDelphiCustomComboEdit.SetDelphiObject( - const Value: TCustomComboEdit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiComboEdit } - -class function TPyDelphiComboEdit.DelphiObjectClass: TClass; -begin - Result := TComboEdit; -end; - -function TPyDelphiComboEdit.GetDelphiObject: TComboEdit; -begin - Result := TComboEdit(inherited DelphiObject); -end; - -procedure TPyDelphiComboEdit.SetDelphiObject(const Value: TComboEdit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomEditBox } - -class function TPyDelphiCustomEditBox.DelphiObjectClass: TClass; -begin - Result := TCustomEditBox; -end; - -function TPyDelphiCustomEditBox.GetDelphiObject: TCustomEditBox; -begin - Result := TCustomEditBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomEditBox.SetDelphiObject(const Value: TCustomEditBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSpinBox } - -class function TPyDelphiSpinBox.DelphiObjectClass: TClass; -begin - Result := TSpinBox; -end; - -function TPyDelphiSpinBox.GetDelphiObject: TSpinBox; -begin - Result := TSpinBox(inherited DelphiObject); -end; - -procedure TPyDelphiSpinBox.SetDelphiObject(const Value: TSpinBox); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TEditRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxEdit; + +interface + +uses + FMX.Edit, FMX.SearchBox, FMX.ComboEdit, FMX.EditBox, FMX.SpinBox, + PythonEngine, WrapFmxTypes, WrapFmxControls; + + +type + TPyDelphiCustomEdit = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TCustomEdit; + procedure SetDelphiObject(const Value: TCustomEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomEdit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiEdit = class(TPyDelphiCustomEdit) + private + function GetDelphiObject: TEdit; + procedure SetDelphiObject(const Value: TEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TEdit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiSearchBox = class(TPyDelphiEdit) + private + function GetDelphiObject: TSearchBox; + procedure SetDelphiObject(const Value: TSearchBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSearchBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiComboEditBase = class(TPyDelphiCustomEdit) + private + function GetDelphiObject: TComboEditBase; + procedure SetDelphiObject(const Value: TComboEditBase); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TComboEditBase read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomComboEdit = class(TPyDelphiComboEditBase) + private + function GetDelphiObject: TCustomComboEdit; + procedure SetDelphiObject(const Value: TCustomComboEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomComboEdit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiComboEdit = class(TPyDelphiCustomComboEdit) + private + function GetDelphiObject: TComboEdit; + procedure SetDelphiObject(const Value: TComboEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TComboEdit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomEditBox = class(TPyDelphiCustomEdit) + private + function GetDelphiObject: TCustomEditBox; + procedure SetDelphiObject(const Value: TCustomEditBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomEditBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiSpinBox = class(TPyDelphiCustomEditBox) + private + function GetDelphiObject: TSpinBox; + procedure SetDelphiObject(const Value: TSpinBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSpinBox read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TEditRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TEditRegistration } + +procedure TEditRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TEditRegistration.Name: string; +begin + Result := 'Edit'; +end; + +procedure TEditRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSearchBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboEditBase); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomComboEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomEditBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinBox); +end; + +{ TPyDelphiCustomEdit } + +class function TPyDelphiCustomEdit.DelphiObjectClass: TClass; +begin + Result := TCustomEdit; +end; + +function TPyDelphiCustomEdit.GetDelphiObject: TCustomEdit; +begin + Result := TCustomEdit(inherited DelphiObject); +end; + +procedure TPyDelphiCustomEdit.SetDelphiObject(const Value: TCustomEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiEdit } + +class function TPyDelphiEdit.DelphiObjectClass: TClass; +begin + Result := TEdit; +end; + +function TPyDelphiEdit.GetDelphiObject: TEdit; +begin + Result := TEdit(inherited DelphiObject); +end; + +procedure TPyDelphiEdit.SetDelphiObject(const Value: TEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSearchBox } + +class function TPyDelphiSearchBox.DelphiObjectClass: TClass; +begin + Result := TSearchBox; +end; + +function TPyDelphiSearchBox.GetDelphiObject: TSearchBox; +begin + Result := TSearchBox(inherited DelphiObject); +end; + +procedure TPyDelphiSearchBox.SetDelphiObject(const Value: TSearchBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiComboEditBase } + +class function TPyDelphiComboEditBase.DelphiObjectClass: TClass; +begin + Result := TComboEditBase; +end; + +function TPyDelphiComboEditBase.GetDelphiObject: TComboEditBase; +begin + Result := TComboEditBase(inherited DelphiObject); +end; + +procedure TPyDelphiComboEditBase.SetDelphiObject(const Value: TComboEditBase); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomComboEdit } + +class function TPyDelphiCustomComboEdit.DelphiObjectClass: TClass; +begin + Result := TCustomComboEdit; +end; + +function TPyDelphiCustomComboEdit.GetDelphiObject: TCustomComboEdit; +begin + Result := TCustomComboEdit(inherited DelphiObject); +end; + +procedure TPyDelphiCustomComboEdit.SetDelphiObject( + const Value: TCustomComboEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiComboEdit } + +class function TPyDelphiComboEdit.DelphiObjectClass: TClass; +begin + Result := TComboEdit; +end; + +function TPyDelphiComboEdit.GetDelphiObject: TComboEdit; +begin + Result := TComboEdit(inherited DelphiObject); +end; + +procedure TPyDelphiComboEdit.SetDelphiObject(const Value: TComboEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomEditBox } + +class function TPyDelphiCustomEditBox.DelphiObjectClass: TClass; +begin + Result := TCustomEditBox; +end; + +function TPyDelphiCustomEditBox.GetDelphiObject: TCustomEditBox; +begin + Result := TCustomEditBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomEditBox.SetDelphiObject(const Value: TCustomEditBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSpinBox } + +class function TPyDelphiSpinBox.DelphiObjectClass: TClass; +begin + Result := TSpinBox; +end; + +function TPyDelphiSpinBox.GetDelphiObject: TSpinBox; +begin + Result := TSpinBox(inherited DelphiObject); +end; + +procedure TPyDelphiSpinBox.SetDelphiObject(const Value: TSpinBox); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TEditRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index a149222c..1dc5fb31 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -1,580 +1,580 @@ -{$I ..\Definition.Inc} - -unit WrapFmxForms; - -interface - -uses - System.Classes, System.SysUtils, FMX.Forms, - PythonEngine, WrapFmxTypes, WrapDelphiClasses, WrapFmxControls, WrapDelphi, - System.TypInfo, System.UITypes; - -type - TPyDelphiApplication = class(TPyDelphiComponent) - private - function GetDelphiObject: TApplication; - procedure SetDelphiObject(const Value: TApplication); - protected - // Class methods - function Initialize_Wrapper(AArgs: PPyObject): PPyObject; cdecl; - function Run_Wrapper(AArgs: PPyObject): PPyObject; cdecl; - public - constructor Create( APythonType : TPythonType ); override; - // Class methods - class function DelphiObjectClass: TClass; override; - class procedure RegisterMethods(APythonType: TPythonType); override; - // Properties - property DelphiObject: TApplication read GetDelphiObject write SetDelphiObject; - end; - - TCloseQueryEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; var CanClose : Boolean); - public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; - end; - - TCloseEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; var Action: TCloseAction); - public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; - end; - - TPyDelphiCommonCustomForm = class(TPyDelphiFmxObject) - private - function GetDelphiObject: TCommonCustomForm; - procedure SetDelphiObject(const Value: TCommonCustomForm); - function HasFormRes(const AClass: TClass): boolean; - protected - //Load properties from .pydfm file - function LoadProps_Wrapper(args : PPyObject) : PPyObject; cdecl; - public - function CreateComponent(AOwner: TComponent): TComponent; override; - // Class methods - class function DelphiObjectClass: TClass; override; - class procedure RegisterMethods(PythonType: TPythonType); override; - // Properties - property DelphiObject: TCommonCustomForm read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomForm = class(TPyDelphiCommonCustomForm) - private - function GetDelphiObject: TCustomForm; - procedure SetDelphiObject(const Value: TCustomForm); - public - // Class methods - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomForm read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPopupForm = class(TPyDelphiCustomForm) - private - function GetDelphiObject: TCustomPopupForm; - procedure SetDelphiObject(const Value: TCustomPopupForm); - public - // Class methods - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomPopupForm read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiForm = class(TPyDelphiCustomForm) - private - function GetDelphiObject: TForm; - procedure SetDelphiObject(const Value: TForm); - public - // Class methods - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TForm read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiFrame = class(TPyDelphiControl) - private - function GetDelphiObject: TFrame; - procedure SetDelphiObject(const Value: TFrame); - public - // Class methods - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TFrame read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiScreen = class(TPyDelphiComponent) - private - function GetDelphiObject: TScreen; - procedure SetDelphiObject(const Value: TScreen); - public - // Class methods - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TScreen read GetDelphiObject write SetDelphiObject; - end; - - EInvalidFormClass = class(Exception); - -implementation - -uses - {$IFDEF OSX} - Macapi.AppKit, - FMX.Platform.Mac, - {$ENDIF OSX} - System.Types, - System.IOUtils, - System.Rtti, - System.Messaging; - -{$IFDEF OSX} -var - gDelphiMainForm: TCommonCustomForm; - gPythonMainForm: TCommonCustomForm; - gFormsCreatedSubscription: integer; -{$ENDIF OSX} - -{ Register the wrappers, the globals and the constants } -type - TFormsRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineFunctions(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{$IFDEF OSX} - TInternalMainForm = class(TForm) - public - constructor Create(AOwner: TComponent); override; - end; -{$ENDIF} - -{ TFormsRegistration } - -procedure TFormsRegistration.DefineFunctions( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -procedure TFormsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - // Singletons - APyDelphiWrapper.DefineVar('Application', Application); - APyDelphiWrapper.DefineVar('Screen', Screen); -end; - -function TFormsRegistration.Name: string; -begin - Result := 'Forms'; -end; - -procedure TFormsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiApplication); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCommonCustomForm); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomForm); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupForm); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiForm); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFrame); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScreen); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseQueryEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseEventHandler); -end; - -{ TPyDelphiApplication } - -constructor TPyDelphiApplication.Create(APythonType: TPythonType); -begin - inherited; - {$IFDEF OSX} - gFormsCreatedSubscription := TMessageManager.DefaultManager.SubscribeToMessage( - TFormsCreatedMessage, - procedure(const Sender: TObject; const M: TMessage) begin - if (Sender = Application) and Assigned(gDelphiMainForm) then begin - if Assigned(gPythonMainForm) then begin - Application.MainForm := gPythonMainForm; - gPythonMainForm.Hide(); - gPythonMainForm.Show(); - end; - FreeAndNil(gDelphiMainForm); - gPythonMainForm := nil; - TMessageManager.DefaultManager.Unsubscribe(TFormsCreatedMessage, - gFormsCreatedSubscription); - end; - end); - {$ENDIF OSX} -end; - -class function TPyDelphiApplication.DelphiObjectClass: TClass; -begin - Result := TApplication; -end; - -function TPyDelphiApplication.GetDelphiObject: TApplication; -begin - Result := TApplication(inherited DelphiObject); -end; - -procedure TPyDelphiApplication.SetDelphiObject(const Value: TApplication); -begin - inherited DelphiObject := Value; -end; - -function TPyDelphiApplication.Initialize_Wrapper(AArgs: PPyObject): PPyObject; -{$IFDEF OSX} -var - App: NSApplication; -{$ENDIF OSX} -begin - Application.Initialize(); - {$IFDEF OSX} - // #397 - App := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication); - if App.ActivationPolicy > 0 then - App.setActivationPolicy(0); - //the main form standard creation way, - //due to MainMenu creation and others. - Application.CreateForm(TInternalMainForm, gDelphiMainForm); - {$ENDIF OSX} - Result := GetPythonEngine().ReturnNone(); -end; - -function TPyDelphiApplication.Run_Wrapper(AArgs: PPyObject): PPyObject; -begin - {$IFDEF OSX} - gPythonMainForm := Application.MainForm; - Application.MainForm := nil; - {$ENDIF OSX} - Application.Run(); - Result := GetPythonEngine().ReturnNone(); -end; - -class procedure TPyDelphiApplication.RegisterMethods(APythonType: TPythonType); -begin - with APythonType do begin - AddMethod('Initialize', @TPyDelphiApplication.Initialize_Wrapper, - 'TApplication.Initialize()'#10 + - 'Initialize the application'); - AddMethod('Run', @TPyDelphiApplication.Run_Wrapper, - 'TApplication.Run()'#10 + - 'Run the application'); - end; -end; - -{ TCloseQueryEventHandler } - -constructor TCloseQueryEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; - Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); -var - LMethod : TMethod; -begin - inherited; - LMethod.Code := @TCloseQueryEventHandler.DoEvent; - LMethod.Data := Self; - SetMethodProp(Component, PropertyInfo, LMethod); -end; - -procedure TCloseQueryEventHandler.DoEvent(Sender: TObject; - var CanClose: Boolean); -var - LPyObject, LPyTuple, LPyResult, LPyCanClose : PPyObject; - LVarParam : TPyDelphiVarParameter; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - LPyObject := PyDelphiWrapper.Wrap(Sender); - LPyCanClose := CreateVarParam(PyDelphiWrapper, CanClose); - LVarParam := PythonToDelphi(LPyCanClose) as TPyDelphiVarParameter; - LPyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyCanClose); - try - LPyResult := PyObject_CallObject(Callable, LPyTuple); - if Assigned(LPyResult) then - begin - Py_DECREF(LPyResult); - CanClose := PyObject_IsTrue(LVarParam.Value) = 1; - end; - finally - Py_DECREF(LPyTuple); - end; - CheckError; - end; -end; - -class function TCloseQueryEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TCloseQueryEvent); -end; - -{ TCloseEventHandler } - -constructor TCloseEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; - Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); -var - LMethod : TMethod; -begin - inherited; - LMethod.Code := @TCloseEventHandler.DoEvent; - LMethod.Data := Self; - SetMethodProp(Component, PropertyInfo, LMethod); -end; - -procedure TCloseEventHandler.DoEvent(Sender: TObject; var Action: TCloseAction); -var - LPyObject, LPyTuple, LPyResult, LPyAction : PPyObject; - LVarParam : TPyDelphiVarParameter; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - LPyObject := PyDelphiWrapper.Wrap(Sender); - LPyAction := CreateVarParam(PyDelphiWrapper, NativeInt(Action)); - LVarParam := PythonToDelphi(LPyAction) as TPyDelphiVarParameter; - LPyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyAction); - try - LPyResult := PyObject_CallObject(Callable, LPyTuple); - if Assigned(LPyResult) then - begin - Py_DECREF(LPyResult); - if PyLong_Check(LVarParam.Value) and - CheckEnum('TCloseAction', PyLong_AsLong(LVarParam.Value), Ord(Low(TCloseAction)), Ord(High(TCloseAction))) then - Action := TCloseAction(PyLong_AsLong(LVarParam.Value)); - end; - finally - Py_DECREF(LPyTuple); - end; - CheckError; - end; -end; - -class function TCloseEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TCloseEvent); -end; - -{ TPyDelphiCommonCustomForm } - -function TPyDelphiCommonCustomForm.CreateComponent( - AOwner: TComponent): TComponent; -type - TCommonCustomFormClass = class of TCommonCustomForm; -var - LClass: TClass; - LFormClass: TCommonCustomFormClass; - LClassName: string; -begin - LFormClass := nil; - //get de default form class - if DelphiObjectClass.InheritsFrom(TCommonCustomForm) then - LFormClass := TCommonCustomFormClass(DelphiObjectClass); - - //if we have a subclass of our Form wrapper, then check if we can find a - //Delphi class that would have the same name as the Python class. - //This would allow Python to instanciate an existing Delphi form class, - //insted of only using a blank form. - if (ob_type <> PythonType.TheTypePtr) then begin - LClassName := string(ob_type.tp_name); - LClass := GetClass(LClassName); - if not Assigned(LClass) then - LClass := GetClass('T' + LClassName); - if Assigned(LClass) and LClass.InheritsFrom(TCommonCustomForm) then - LFormClass := TCommonCustomFormClass(LClass); - end; - - if not Assigned(LFormClass) then - raise EInvalidFormClass.CreateFmt('Type %s is not a valid form class', [ - DelphiObjectClass.ClassName]); - - //if it's not a design form, so we create it as a non-resourced form, - //using the non-resourced constructor. - //if the Owner is TApplication, then we have to call its CreateForm method, - //otherwise we won't have a mian form defined, as the main form is the first - //created form. Of course, this is a concern only when Python controls all the - //GUI and calls Apllication.Run by itself. - if not HasFormRes(LFormClass) then - Result := LFormClass.CreateNew(AOwner) - else if (AOwner = Application) then - Application.CreateForm(LFormClass, Result) - else - Result := LFormClass.Create(AOwner); -end; - -class function TPyDelphiCommonCustomForm.DelphiObjectClass: TClass; -begin - Result := TCommonCustomForm; -end; - -function TPyDelphiCommonCustomForm.GetDelphiObject: TCommonCustomForm; -begin - Result := TCommonCustomForm(inherited DelphiObject); -end; - -function TPyDelphiCommonCustomForm.HasFormRes(const AClass: TClass): boolean; -begin - Result := FindResource( - FindResourceHInstance(FindClassHInstance(AClass)), - PChar(AClass.ClassName), PChar(RT_RCDATA)) <> 0; -end; - -function TPyDelphiCommonCustomForm.LoadProps_Wrapper( - args: PPyObject): PPyObject; - - function FindResource(): string; - var - LStr: PAnsiChar; - begin - with GetPythonEngine() do begin - if PyArg_ParseTuple(args, 's:LoadProps', @LStr) <> 0 then begin - Result := string(LStr); - end else - Result := String.Empty; - end; - end; - -begin - Adjust(@Self); - try - if InternalReadComponent(FindResource(), DelphiObject) then - Exit(GetPythonEngine().ReturnTrue); - except - on E: Exception do - with GetPythonEngine do - PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); - end; - Result := nil; -end; - -class procedure TPyDelphiCommonCustomForm.RegisterMethods( - PythonType: TPythonType); -begin - PythonType.AddMethod('LoadProps', @TPyDelphiCustomForm.LoadProps_Wrapper, - 'TCommonCustomForm.LoadProps()'#10 + - 'Load properties from a .pydfm file'); -end; - -procedure TPyDelphiCommonCustomForm.SetDelphiObject( - const Value: TCommonCustomForm); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomForm } - -class function TPyDelphiCustomForm.DelphiObjectClass: TClass; -begin - Result := TCustomForm; -end; - -function TPyDelphiCustomForm.GetDelphiObject: TCustomForm; -begin - Result := TCustomForm(inherited DelphiObject); -end; - -procedure TPyDelphiCustomForm.SetDelphiObject(const Value: TCustomForm); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPopupForm } - -class function TPyDelphiCustomPopupForm.DelphiObjectClass: TClass; -begin - Result := TCustomPopupForm; -end; - -function TPyDelphiCustomPopupForm.GetDelphiObject: TCustomPopupForm; -begin - Result := TCustomPopupForm(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPopupForm.SetDelphiObject( - const Value: TCustomPopupForm); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiForm } - -class function TPyDelphiForm.DelphiObjectClass: TClass; -begin - Result := TForm; -end; - -function TPyDelphiForm.GetDelphiObject: TForm; -begin - Result := TForm(inherited DelphiObject); -end; - -procedure TPyDelphiForm.SetDelphiObject(const Value: TForm); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFrame } - -class function TPyDelphiFrame.DelphiObjectClass: TClass; -begin - Result := TFrame; -end; - -function TPyDelphiFrame.GetDelphiObject: TFrame; -begin - Result := TFrame(inherited DelphiObject); -end; - -procedure TPyDelphiFrame.SetDelphiObject(const Value: TFrame); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiScreen } - -class function TPyDelphiScreen.DelphiObjectClass: TClass; -begin - Result := TScreen; -end; - -function TPyDelphiScreen.GetDelphiObject: TScreen; -begin - Result := TScreen(inherited DelphiObject); -end; - -procedure TPyDelphiScreen.SetDelphiObject(const Value: TScreen); -begin - inherited DelphiObject := Value; -end; - -{$IFDEF OSX} - -{ TInternalMainForm } - -constructor TInternalMainForm.Create(AOwner: TComponent); -begin - CreateNew(AOwner); - Name := '_InternalDelphiMainForm'; - Left := -10; - ClientHeight := 1; - ClientWidth := 1; -end; - -{$ENDIF OSX} - -Initialization - RegisteredUnits.Add(TFormsRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxForms; + +interface + +uses + System.Classes, System.SysUtils, FMX.Forms, + PythonEngine, WrapFmxTypes, WrapDelphiClasses, WrapFmxControls, WrapDelphi, + System.TypInfo, System.UITypes; + +type + TPyDelphiApplication = class(TPyDelphiComponent) + private + function GetDelphiObject: TApplication; + procedure SetDelphiObject(const Value: TApplication); + protected + // Class methods + function Initialize_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + function Run_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + public + constructor Create( APythonType : TPythonType ); override; + // Class methods + class function DelphiObjectClass: TClass; override; + class procedure RegisterMethods(APythonType: TPythonType); override; + // Properties + property DelphiObject: TApplication read GetDelphiObject write SetDelphiObject; + end; + + TCloseQueryEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var CanClose : Boolean); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TCloseEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var Action: TCloseAction); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TPyDelphiCommonCustomForm = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TCommonCustomForm; + procedure SetDelphiObject(const Value: TCommonCustomForm); + function HasFormRes(const AClass: TClass): boolean; + protected + //Load properties from .pydfm file + function LoadProps_Wrapper(args : PPyObject) : PPyObject; cdecl; + public + function CreateComponent(AOwner: TComponent): TComponent; override; + // Class methods + class function DelphiObjectClass: TClass; override; + class procedure RegisterMethods(PythonType: TPythonType); override; + // Properties + property DelphiObject: TCommonCustomForm read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomForm = class(TPyDelphiCommonCustomForm) + private + function GetDelphiObject: TCustomForm; + procedure SetDelphiObject(const Value: TCustomForm); + public + // Class methods + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomForm read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPopupForm = class(TPyDelphiCustomForm) + private + function GetDelphiObject: TCustomPopupForm; + procedure SetDelphiObject(const Value: TCustomPopupForm); + public + // Class methods + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomPopupForm read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiForm = class(TPyDelphiCustomForm) + private + function GetDelphiObject: TForm; + procedure SetDelphiObject(const Value: TForm); + public + // Class methods + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TForm read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiFrame = class(TPyDelphiControl) + private + function GetDelphiObject: TFrame; + procedure SetDelphiObject(const Value: TFrame); + public + // Class methods + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TFrame read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiScreen = class(TPyDelphiComponent) + private + function GetDelphiObject: TScreen; + procedure SetDelphiObject(const Value: TScreen); + public + // Class methods + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TScreen read GetDelphiObject write SetDelphiObject; + end; + + EInvalidFormClass = class(Exception); + +implementation + +uses + {$IFDEF OSX} + Macapi.AppKit, + FMX.Platform.Mac, + {$ENDIF OSX} + System.Types, + System.IOUtils, + System.Rtti, + System.Messaging; + +{$IFDEF OSX} +var + gDelphiMainForm: TCommonCustomForm; + gPythonMainForm: TCommonCustomForm; + gFormsCreatedSubscription: integer; +{$ENDIF OSX} + +{ Register the wrappers, the globals and the constants } +type + TFormsRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineFunctions(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{$IFDEF OSX} + TInternalMainForm = class(TForm) + public + constructor Create(AOwner: TComponent); override; + end; +{$ENDIF} + +{ TFormsRegistration } + +procedure TFormsRegistration.DefineFunctions( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TFormsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + // Singletons + APyDelphiWrapper.DefineVar('Application', Application); + APyDelphiWrapper.DefineVar('Screen', Screen); +end; + +function TFormsRegistration.Name: string; +begin + Result := 'Forms'; +end; + +procedure TFormsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiApplication); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCommonCustomForm); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomForm); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupForm); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiForm); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFrame); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScreen); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseQueryEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseEventHandler); +end; + +{ TPyDelphiApplication } + +constructor TPyDelphiApplication.Create(APythonType: TPythonType); +begin + inherited; + {$IFDEF OSX} + gFormsCreatedSubscription := TMessageManager.DefaultManager.SubscribeToMessage( + TFormsCreatedMessage, + procedure(const Sender: TObject; const M: TMessage) begin + if (Sender = Application) and Assigned(gDelphiMainForm) then begin + if Assigned(gPythonMainForm) then begin + Application.MainForm := gPythonMainForm; + gPythonMainForm.Hide(); + gPythonMainForm.Show(); + end; + FreeAndNil(gDelphiMainForm); + gPythonMainForm := nil; + TMessageManager.DefaultManager.Unsubscribe(TFormsCreatedMessage, + gFormsCreatedSubscription); + end; + end); + {$ENDIF OSX} +end; + +class function TPyDelphiApplication.DelphiObjectClass: TClass; +begin + Result := TApplication; +end; + +function TPyDelphiApplication.GetDelphiObject: TApplication; +begin + Result := TApplication(inherited DelphiObject); +end; + +procedure TPyDelphiApplication.SetDelphiObject(const Value: TApplication); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiApplication.Initialize_Wrapper(AArgs: PPyObject): PPyObject; +{$IFDEF OSX} +var + App: NSApplication; +{$ENDIF OSX} +begin + Application.Initialize(); + {$IFDEF OSX} + // #397 + App := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication); + if App.ActivationPolicy > 0 then + App.setActivationPolicy(0); + //the main form standard creation way, + //due to MainMenu creation and others. + Application.CreateForm(TInternalMainForm, gDelphiMainForm); + {$ENDIF OSX} + Result := GetPythonEngine().ReturnNone(); +end; + +function TPyDelphiApplication.Run_Wrapper(AArgs: PPyObject): PPyObject; +begin + {$IFDEF OSX} + gPythonMainForm := Application.MainForm; + Application.MainForm := nil; + {$ENDIF OSX} + Application.Run(); + Result := GetPythonEngine().ReturnNone(); +end; + +class procedure TPyDelphiApplication.RegisterMethods(APythonType: TPythonType); +begin + with APythonType do begin + AddMethod('Initialize', @TPyDelphiApplication.Initialize_Wrapper, + 'TApplication.Initialize()'#10 + + 'Initialize the application'); + AddMethod('Run', @TPyDelphiApplication.Run_Wrapper, + 'TApplication.Run()'#10 + + 'Run the application'); + end; +end; + +{ TCloseQueryEventHandler } + +constructor TCloseQueryEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TCloseQueryEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TCloseQueryEventHandler.DoEvent(Sender: TObject; + var CanClose: Boolean); +var + LPyObject, LPyTuple, LPyResult, LPyCanClose : PPyObject; + LVarParam : TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyCanClose := CreateVarParam(PyDelphiWrapper, CanClose); + LVarParam := PythonToDelphi(LPyCanClose) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyCanClose); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + CanClose := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TCloseQueryEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TCloseQueryEvent); +end; + +{ TCloseEventHandler } + +constructor TCloseEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TCloseEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TCloseEventHandler.DoEvent(Sender: TObject; var Action: TCloseAction); +var + LPyObject, LPyTuple, LPyResult, LPyAction : PPyObject; + LVarParam : TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyAction := CreateVarParam(PyDelphiWrapper, NativeInt(Action)); + LVarParam := PythonToDelphi(LPyAction) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyAction); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + if PyLong_Check(LVarParam.Value) and + CheckEnum('TCloseAction', PyLong_AsLong(LVarParam.Value), Ord(Low(TCloseAction)), Ord(High(TCloseAction))) then + Action := TCloseAction(PyLong_AsLong(LVarParam.Value)); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TCloseEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TCloseEvent); +end; + +{ TPyDelphiCommonCustomForm } + +function TPyDelphiCommonCustomForm.CreateComponent( + AOwner: TComponent): TComponent; +type + TCommonCustomFormClass = class of TCommonCustomForm; +var + LClass: TClass; + LFormClass: TCommonCustomFormClass; + LClassName: string; +begin + LFormClass := nil; + //get de default form class + if DelphiObjectClass.InheritsFrom(TCommonCustomForm) then + LFormClass := TCommonCustomFormClass(DelphiObjectClass); + + //if we have a subclass of our Form wrapper, then check if we can find a + //Delphi class that would have the same name as the Python class. + //This would allow Python to instanciate an existing Delphi form class, + //insted of only using a blank form. + if (ob_type <> PythonType.TheTypePtr) then begin + LClassName := string(ob_type.tp_name); + LClass := GetClass(LClassName); + if not Assigned(LClass) then + LClass := GetClass('T' + LClassName); + if Assigned(LClass) and LClass.InheritsFrom(TCommonCustomForm) then + LFormClass := TCommonCustomFormClass(LClass); + end; + + if not Assigned(LFormClass) then + raise EInvalidFormClass.CreateFmt('Type %s is not a valid form class', [ + DelphiObjectClass.ClassName]); + + //if it's not a design form, so we create it as a non-resourced form, + //using the non-resourced constructor. + //if the Owner is TApplication, then we have to call its CreateForm method, + //otherwise we won't have a mian form defined, as the main form is the first + //created form. Of course, this is a concern only when Python controls all the + //GUI and calls Apllication.Run by itself. + if not HasFormRes(LFormClass) then + Result := LFormClass.CreateNew(AOwner) + else if (AOwner = Application) then + Application.CreateForm(LFormClass, Result) + else + Result := LFormClass.Create(AOwner); +end; + +class function TPyDelphiCommonCustomForm.DelphiObjectClass: TClass; +begin + Result := TCommonCustomForm; +end; + +function TPyDelphiCommonCustomForm.GetDelphiObject: TCommonCustomForm; +begin + Result := TCommonCustomForm(inherited DelphiObject); +end; + +function TPyDelphiCommonCustomForm.HasFormRes(const AClass: TClass): boolean; +begin + Result := FindResource( + FindResourceHInstance(FindClassHInstance(AClass)), + PChar(AClass.ClassName), PChar(RT_RCDATA)) <> 0; +end; + +function TPyDelphiCommonCustomForm.LoadProps_Wrapper( + args: PPyObject): PPyObject; + + function FindResource(): string; + var + LStr: PAnsiChar; + begin + with GetPythonEngine() do begin + if PyArg_ParseTuple(args, 's:LoadProps', @LStr) <> 0 then begin + Result := string(LStr); + end else + Result := String.Empty; + end; + end; + +begin + Adjust(@Self); + try + if InternalReadComponent(FindResource(), DelphiObject) then + Exit(GetPythonEngine().ReturnTrue); + except + on E: Exception do + with GetPythonEngine do + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); + end; + Result := nil; +end; + +class procedure TPyDelphiCommonCustomForm.RegisterMethods( + PythonType: TPythonType); +begin + PythonType.AddMethod('LoadProps', @TPyDelphiCustomForm.LoadProps_Wrapper, + 'TCommonCustomForm.LoadProps()'#10 + + 'Load properties from a .pydfm file'); +end; + +procedure TPyDelphiCommonCustomForm.SetDelphiObject( + const Value: TCommonCustomForm); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomForm } + +class function TPyDelphiCustomForm.DelphiObjectClass: TClass; +begin + Result := TCustomForm; +end; + +function TPyDelphiCustomForm.GetDelphiObject: TCustomForm; +begin + Result := TCustomForm(inherited DelphiObject); +end; + +procedure TPyDelphiCustomForm.SetDelphiObject(const Value: TCustomForm); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPopupForm } + +class function TPyDelphiCustomPopupForm.DelphiObjectClass: TClass; +begin + Result := TCustomPopupForm; +end; + +function TPyDelphiCustomPopupForm.GetDelphiObject: TCustomPopupForm; +begin + Result := TCustomPopupForm(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPopupForm.SetDelphiObject( + const Value: TCustomPopupForm); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiForm } + +class function TPyDelphiForm.DelphiObjectClass: TClass; +begin + Result := TForm; +end; + +function TPyDelphiForm.GetDelphiObject: TForm; +begin + Result := TForm(inherited DelphiObject); +end; + +procedure TPyDelphiForm.SetDelphiObject(const Value: TForm); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFrame } + +class function TPyDelphiFrame.DelphiObjectClass: TClass; +begin + Result := TFrame; +end; + +function TPyDelphiFrame.GetDelphiObject: TFrame; +begin + Result := TFrame(inherited DelphiObject); +end; + +procedure TPyDelphiFrame.SetDelphiObject(const Value: TFrame); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiScreen } + +class function TPyDelphiScreen.DelphiObjectClass: TClass; +begin + Result := TScreen; +end; + +function TPyDelphiScreen.GetDelphiObject: TScreen; +begin + Result := TScreen(inherited DelphiObject); +end; + +procedure TPyDelphiScreen.SetDelphiObject(const Value: TScreen); +begin + inherited DelphiObject := Value; +end; + +{$IFDEF OSX} + +{ TInternalMainForm } + +constructor TInternalMainForm.Create(AOwner: TComponent); +begin + CreateNew(AOwner); + Name := '_InternalDelphiMainForm'; + Left := -10; + ClientHeight := 1; + ClientWidth := 1; +end; + +{$ENDIF OSX} + +Initialization + RegisteredUnits.Add(TFormsRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxGrids.pas b/Source/fmx/WrapFmxGrids.pas index 2cf7d676..841c75b6 100644 --- a/Source/fmx/WrapFmxGrids.pas +++ b/Source/fmx/WrapFmxGrids.pas @@ -1,550 +1,550 @@ -unit WrapFmxGrids; - -interface - -uses - FMX.Grid, FMX.Grid.Style, WrapFmxControls, WrapFmxScrollBox; - -type - TPyDelphiColumn = class(TPyDelphiControl) - private - function GetDelphiObject: TColumn; - procedure SetDelphiObject(const Value: TColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiStringColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TStringColumn; - procedure SetDelphiObject(const Value: TStringColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TStringColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiProgressColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TProgressColumn; - procedure SetDelphiObject(const Value: TProgressColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TProgressColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCheckColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TCheckColumn; - procedure SetDelphiObject(const Value: TCheckColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCheckColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiDateTimeColumnBase = class(TPyDelphiColumn) - private - function GetDelphiObject: TDateTimeColumnBase; - procedure SetDelphiObject(const Value: TDateTimeColumnBase); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TDateTimeColumnBase read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiDateTimeColumn = class(TPyDelphiDateTimeColumnBase) - private - function GetDelphiObject: TDateTimeColumn; - procedure SetDelphiObject(const Value: TDateTimeColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TDateTimeColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiTimeColumn = class(TPyDelphiDateTimeColumnBase) - private - function GetDelphiObject: TTimeColumn; - procedure SetDelphiObject(const Value: TTimeColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TTimeColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiDateColumn = class(TPyDelphiDateTimeColumnBase) - private - function GetDelphiObject: TDateColumn; - procedure SetDelphiObject(const Value: TDateColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TDateColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPopupColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TPopupColumn; - procedure SetDelphiObject(const Value: TPopupColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPopupColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiImageColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TImageColumn; - procedure SetDelphiObject(const Value: TImageColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TImageColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomNumberColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TCustomNumberColumn; - procedure SetDelphiObject(const Value: TCustomNumberColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomNumberColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCurrencyColumn = class(TPyDelphiCustomNumberColumn) - private - function GetDelphiObject: TCurrencyColumn; - procedure SetDelphiObject(const Value: TCurrencyColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCurrencyColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiFloatColumn = class(TPyDelphiCustomNumberColumn) - private - function GetDelphiObject: TFloatColumn; - procedure SetDelphiObject(const Value: TFloatColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TFloatColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiIntegerColumn = class(TPyDelphiCustomNumberColumn) - private - function GetDelphiObject: TIntegerColumn; - procedure SetDelphiObject(const Value: TIntegerColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TIntegerColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiGlyphColumn = class(TPyDelphiColumn) - private - function GetDelphiObject: TGlyphColumn; - procedure SetDelphiObject(const Value: TGlyphColumn); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TGlyphColumn read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomGrid = class(TPyDelphiCustomPresentedScrollBox) - private - function GetDelphiObject: TCustomGrid; - procedure SetDelphiObject(const Value: TCustomGrid); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomGrid read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiGrid = class(TPyDelphiCustomGrid) - private - function GetDelphiObject: TGrid; - procedure SetDelphiObject(const Value: TGrid); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TGrid read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiStringGrid = class(TPyDelphiCustomGrid) - private - function GetDelphiObject: TStringGrid; - procedure SetDelphiObject(const Value: TStringGrid); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TStringGrid read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TGridsRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TGridsRegistration } - -procedure TGridsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TGridsRegistration.Name: string; -begin - Result := 'Grids'; -end; - -procedure TGridsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStringColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiProgressColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCheckColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimeColumnBase); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimeColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimeColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopupColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomNumberColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCurrencyColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFloatColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiIntegerColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGlyphColumn); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomGrid); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGrid); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStringGrid); -end; - -{ TPyDelphiColumn } - -class function TPyDelphiColumn.DelphiObjectClass: TClass; -begin - Result := TColumn; -end; - -function TPyDelphiColumn.GetDelphiObject: TColumn; -begin - Result := TColumn(inherited DelphiObject); -end; - -procedure TPyDelphiColumn.SetDelphiObject(const Value: TColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiStringColumn } - -class function TPyDelphiStringColumn.DelphiObjectClass: TClass; -begin - Result := TStringColumn; -end; - -function TPyDelphiStringColumn.GetDelphiObject: TStringColumn; -begin - Result := TStringColumn(inherited DelphiObject); -end; - -procedure TPyDelphiStringColumn.SetDelphiObject(const Value: TStringColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiProgressColumn } - -class function TPyDelphiProgressColumn.DelphiObjectClass: TClass; -begin - Result := TProgressColumn; -end; - -function TPyDelphiProgressColumn.GetDelphiObject: TProgressColumn; -begin - Result := TProgressColumn(inherited DelphiObject); -end; - -procedure TPyDelphiProgressColumn.SetDelphiObject(const Value: TProgressColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCheckColumn } - -class function TPyDelphiCheckColumn.DelphiObjectClass: TClass; -begin - Result := TCheckColumn; -end; - -function TPyDelphiCheckColumn.GetDelphiObject: TCheckColumn; -begin - Result := TCheckColumn(inherited DelphiObject); -end; - -procedure TPyDelphiCheckColumn.SetDelphiObject(const Value: TCheckColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiDateTimeColumnBase } - -class function TPyDelphiDateTimeColumnBase.DelphiObjectClass: TClass; -begin - Result := TDateTimeColumnBase; -end; - -function TPyDelphiDateTimeColumnBase.GetDelphiObject: TDateTimeColumnBase; -begin - Result := TDateTimeColumnBase(inherited DelphiObject); -end; - -procedure TPyDelphiDateTimeColumnBase.SetDelphiObject( - const Value: TDateTimeColumnBase); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiDateTimeColumn } - -class function TPyDelphiDateTimeColumn.DelphiObjectClass: TClass; -begin - Result := TDateTimeColumn; -end; - -function TPyDelphiDateTimeColumn.GetDelphiObject: TDateTimeColumn; -begin - Result := TDateTimeColumn(inherited DelphiObject); -end; - -procedure TPyDelphiDateTimeColumn.SetDelphiObject(const Value: TDateTimeColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiTimeColumn } - -class function TPyDelphiTimeColumn.DelphiObjectClass: TClass; -begin - Result := TTimeColumn; -end; - -function TPyDelphiTimeColumn.GetDelphiObject: TTimeColumn; -begin - Result := TTimeColumn(inherited DelphiObject); -end; - -procedure TPyDelphiTimeColumn.SetDelphiObject(const Value: TTimeColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiDateColumn } - -class function TPyDelphiDateColumn.DelphiObjectClass: TClass; -begin - Result := TDateColumn; -end; - -function TPyDelphiDateColumn.GetDelphiObject: TDateColumn; -begin - Result := TDateColumn(inherited DelphiObject); -end; - -procedure TPyDelphiDateColumn.SetDelphiObject(const Value: TDateColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPopupColumn } - -class function TPyDelphiPopupColumn.DelphiObjectClass: TClass; -begin - Result := TPopupColumn; -end; - -function TPyDelphiPopupColumn.GetDelphiObject: TPopupColumn; -begin - Result := TPopupColumn(inherited DelphiObject); -end; - -procedure TPyDelphiPopupColumn.SetDelphiObject(const Value: TPopupColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiImageColumn } - -class function TPyDelphiImageColumn.DelphiObjectClass: TClass; -begin - Result := TImageColumn; -end; - -function TPyDelphiImageColumn.GetDelphiObject: TImageColumn; -begin - Result := TImageColumn(inherited DelphiObject); -end; - -procedure TPyDelphiImageColumn.SetDelphiObject(const Value: TImageColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomNumberColumn } - -class function TPyDelphiCustomNumberColumn.DelphiObjectClass: TClass; -begin - Result := TCustomNumberColumn; -end; - -function TPyDelphiCustomNumberColumn.GetDelphiObject: TCustomNumberColumn; -begin - Result := TCustomNumberColumn(inherited DelphiObject); -end; - -procedure TPyDelphiCustomNumberColumn.SetDelphiObject( - const Value: TCustomNumberColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCurrencyColumn } - -class function TPyDelphiCurrencyColumn.DelphiObjectClass: TClass; -begin - Result := TCurrencyColumn; -end; - -function TPyDelphiCurrencyColumn.GetDelphiObject: TCurrencyColumn; -begin - Result := TCurrencyColumn(inherited DelphiObject); -end; - -procedure TPyDelphiCurrencyColumn.SetDelphiObject(const Value: TCurrencyColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFloatColumn } - -class function TPyDelphiFloatColumn.DelphiObjectClass: TClass; -begin - Result := TFloatColumn; -end; - -function TPyDelphiFloatColumn.GetDelphiObject: TFloatColumn; -begin - Result := TFloatColumn(inherited DelphiObject); -end; - -procedure TPyDelphiFloatColumn.SetDelphiObject(const Value: TFloatColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiIntegerColumn } - -class function TPyDelphiIntegerColumn.DelphiObjectClass: TClass; -begin - Result := TIntegerColumn; -end; - -function TPyDelphiIntegerColumn.GetDelphiObject: TIntegerColumn; -begin - Result := TIntegerColumn(inherited DelphiObject); -end; - -procedure TPyDelphiIntegerColumn.SetDelphiObject(const Value: TIntegerColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGlyphColumn } - -class function TPyDelphiGlyphColumn.DelphiObjectClass: TClass; -begin - Result := TGlyphColumn; -end; - -function TPyDelphiGlyphColumn.GetDelphiObject: TGlyphColumn; -begin - Result := TGlyphColumn(inherited DelphiObject); -end; - -procedure TPyDelphiGlyphColumn.SetDelphiObject(const Value: TGlyphColumn); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGlyphCustomGrid } - -class function TPyDelphiCustomGrid.DelphiObjectClass: TClass; -begin - Result := TCustomGrid; -end; - -function TPyDelphiCustomGrid.GetDelphiObject: TCustomGrid; -begin - Result := TCustomGrid(inherited DelphiObject); -end; - -procedure TPyDelphiCustomGrid.SetDelphiObject(const Value: TCustomGrid); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGrid } - -class function TPyDelphiGrid.DelphiObjectClass: TClass; -begin - Result := TGrid; -end; - -function TPyDelphiGrid.GetDelphiObject: TGrid; -begin - Result := TGrid(inherited DelphiObject); -end; - -procedure TPyDelphiGrid.SetDelphiObject(const Value: TGrid); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiStringGrid } - -class function TPyDelphiStringGrid.DelphiObjectClass: TClass; -begin - Result := TStringGrid; -end; - -function TPyDelphiStringGrid.GetDelphiObject: TStringGrid; -begin - Result := TStringGrid(inherited DelphiObject); -end; - -procedure TPyDelphiStringGrid.SetDelphiObject(const Value: TStringGrid); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TGridsRegistration.Create); - -end. +unit WrapFmxGrids; + +interface + +uses + FMX.Grid, FMX.Grid.Style, WrapFmxControls, WrapFmxScrollBox; + +type + TPyDelphiColumn = class(TPyDelphiControl) + private + function GetDelphiObject: TColumn; + procedure SetDelphiObject(const Value: TColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStringColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TStringColumn; + procedure SetDelphiObject(const Value: TStringColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TStringColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiProgressColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TProgressColumn; + procedure SetDelphiObject(const Value: TProgressColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TProgressColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCheckColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TCheckColumn; + procedure SetDelphiObject(const Value: TCheckColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCheckColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiDateTimeColumnBase = class(TPyDelphiColumn) + private + function GetDelphiObject: TDateTimeColumnBase; + procedure SetDelphiObject(const Value: TDateTimeColumnBase); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TDateTimeColumnBase read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiDateTimeColumn = class(TPyDelphiDateTimeColumnBase) + private + function GetDelphiObject: TDateTimeColumn; + procedure SetDelphiObject(const Value: TDateTimeColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TDateTimeColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTimeColumn = class(TPyDelphiDateTimeColumnBase) + private + function GetDelphiObject: TTimeColumn; + procedure SetDelphiObject(const Value: TTimeColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TTimeColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiDateColumn = class(TPyDelphiDateTimeColumnBase) + private + function GetDelphiObject: TDateColumn; + procedure SetDelphiObject(const Value: TDateColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TDateColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPopupColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TPopupColumn; + procedure SetDelphiObject(const Value: TPopupColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPopupColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiImageColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TImageColumn; + procedure SetDelphiObject(const Value: TImageColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TImageColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomNumberColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TCustomNumberColumn; + procedure SetDelphiObject(const Value: TCustomNumberColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomNumberColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCurrencyColumn = class(TPyDelphiCustomNumberColumn) + private + function GetDelphiObject: TCurrencyColumn; + procedure SetDelphiObject(const Value: TCurrencyColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCurrencyColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiFloatColumn = class(TPyDelphiCustomNumberColumn) + private + function GetDelphiObject: TFloatColumn; + procedure SetDelphiObject(const Value: TFloatColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TFloatColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiIntegerColumn = class(TPyDelphiCustomNumberColumn) + private + function GetDelphiObject: TIntegerColumn; + procedure SetDelphiObject(const Value: TIntegerColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TIntegerColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiGlyphColumn = class(TPyDelphiColumn) + private + function GetDelphiObject: TGlyphColumn; + procedure SetDelphiObject(const Value: TGlyphColumn); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TGlyphColumn read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomGrid = class(TPyDelphiCustomPresentedScrollBox) + private + function GetDelphiObject: TCustomGrid; + procedure SetDelphiObject(const Value: TCustomGrid); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomGrid read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiGrid = class(TPyDelphiCustomGrid) + private + function GetDelphiObject: TGrid; + procedure SetDelphiObject(const Value: TGrid); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TGrid read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStringGrid = class(TPyDelphiCustomGrid) + private + function GetDelphiObject: TStringGrid; + procedure SetDelphiObject(const Value: TStringGrid); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TStringGrid read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TGridsRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TGridsRegistration } + +procedure TGridsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TGridsRegistration.Name: string; +begin + Result := 'Grids'; +end; + +procedure TGridsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStringColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiProgressColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCheckColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimeColumnBase); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimeColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimeColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopupColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomNumberColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCurrencyColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFloatColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiIntegerColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGlyphColumn); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomGrid); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGrid); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStringGrid); +end; + +{ TPyDelphiColumn } + +class function TPyDelphiColumn.DelphiObjectClass: TClass; +begin + Result := TColumn; +end; + +function TPyDelphiColumn.GetDelphiObject: TColumn; +begin + Result := TColumn(inherited DelphiObject); +end; + +procedure TPyDelphiColumn.SetDelphiObject(const Value: TColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiStringColumn } + +class function TPyDelphiStringColumn.DelphiObjectClass: TClass; +begin + Result := TStringColumn; +end; + +function TPyDelphiStringColumn.GetDelphiObject: TStringColumn; +begin + Result := TStringColumn(inherited DelphiObject); +end; + +procedure TPyDelphiStringColumn.SetDelphiObject(const Value: TStringColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiProgressColumn } + +class function TPyDelphiProgressColumn.DelphiObjectClass: TClass; +begin + Result := TProgressColumn; +end; + +function TPyDelphiProgressColumn.GetDelphiObject: TProgressColumn; +begin + Result := TProgressColumn(inherited DelphiObject); +end; + +procedure TPyDelphiProgressColumn.SetDelphiObject(const Value: TProgressColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCheckColumn } + +class function TPyDelphiCheckColumn.DelphiObjectClass: TClass; +begin + Result := TCheckColumn; +end; + +function TPyDelphiCheckColumn.GetDelphiObject: TCheckColumn; +begin + Result := TCheckColumn(inherited DelphiObject); +end; + +procedure TPyDelphiCheckColumn.SetDelphiObject(const Value: TCheckColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiDateTimeColumnBase } + +class function TPyDelphiDateTimeColumnBase.DelphiObjectClass: TClass; +begin + Result := TDateTimeColumnBase; +end; + +function TPyDelphiDateTimeColumnBase.GetDelphiObject: TDateTimeColumnBase; +begin + Result := TDateTimeColumnBase(inherited DelphiObject); +end; + +procedure TPyDelphiDateTimeColumnBase.SetDelphiObject( + const Value: TDateTimeColumnBase); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiDateTimeColumn } + +class function TPyDelphiDateTimeColumn.DelphiObjectClass: TClass; +begin + Result := TDateTimeColumn; +end; + +function TPyDelphiDateTimeColumn.GetDelphiObject: TDateTimeColumn; +begin + Result := TDateTimeColumn(inherited DelphiObject); +end; + +procedure TPyDelphiDateTimeColumn.SetDelphiObject(const Value: TDateTimeColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTimeColumn } + +class function TPyDelphiTimeColumn.DelphiObjectClass: TClass; +begin + Result := TTimeColumn; +end; + +function TPyDelphiTimeColumn.GetDelphiObject: TTimeColumn; +begin + Result := TTimeColumn(inherited DelphiObject); +end; + +procedure TPyDelphiTimeColumn.SetDelphiObject(const Value: TTimeColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiDateColumn } + +class function TPyDelphiDateColumn.DelphiObjectClass: TClass; +begin + Result := TDateColumn; +end; + +function TPyDelphiDateColumn.GetDelphiObject: TDateColumn; +begin + Result := TDateColumn(inherited DelphiObject); +end; + +procedure TPyDelphiDateColumn.SetDelphiObject(const Value: TDateColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPopupColumn } + +class function TPyDelphiPopupColumn.DelphiObjectClass: TClass; +begin + Result := TPopupColumn; +end; + +function TPyDelphiPopupColumn.GetDelphiObject: TPopupColumn; +begin + Result := TPopupColumn(inherited DelphiObject); +end; + +procedure TPyDelphiPopupColumn.SetDelphiObject(const Value: TPopupColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiImageColumn } + +class function TPyDelphiImageColumn.DelphiObjectClass: TClass; +begin + Result := TImageColumn; +end; + +function TPyDelphiImageColumn.GetDelphiObject: TImageColumn; +begin + Result := TImageColumn(inherited DelphiObject); +end; + +procedure TPyDelphiImageColumn.SetDelphiObject(const Value: TImageColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomNumberColumn } + +class function TPyDelphiCustomNumberColumn.DelphiObjectClass: TClass; +begin + Result := TCustomNumberColumn; +end; + +function TPyDelphiCustomNumberColumn.GetDelphiObject: TCustomNumberColumn; +begin + Result := TCustomNumberColumn(inherited DelphiObject); +end; + +procedure TPyDelphiCustomNumberColumn.SetDelphiObject( + const Value: TCustomNumberColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCurrencyColumn } + +class function TPyDelphiCurrencyColumn.DelphiObjectClass: TClass; +begin + Result := TCurrencyColumn; +end; + +function TPyDelphiCurrencyColumn.GetDelphiObject: TCurrencyColumn; +begin + Result := TCurrencyColumn(inherited DelphiObject); +end; + +procedure TPyDelphiCurrencyColumn.SetDelphiObject(const Value: TCurrencyColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFloatColumn } + +class function TPyDelphiFloatColumn.DelphiObjectClass: TClass; +begin + Result := TFloatColumn; +end; + +function TPyDelphiFloatColumn.GetDelphiObject: TFloatColumn; +begin + Result := TFloatColumn(inherited DelphiObject); +end; + +procedure TPyDelphiFloatColumn.SetDelphiObject(const Value: TFloatColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiIntegerColumn } + +class function TPyDelphiIntegerColumn.DelphiObjectClass: TClass; +begin + Result := TIntegerColumn; +end; + +function TPyDelphiIntegerColumn.GetDelphiObject: TIntegerColumn; +begin + Result := TIntegerColumn(inherited DelphiObject); +end; + +procedure TPyDelphiIntegerColumn.SetDelphiObject(const Value: TIntegerColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGlyphColumn } + +class function TPyDelphiGlyphColumn.DelphiObjectClass: TClass; +begin + Result := TGlyphColumn; +end; + +function TPyDelphiGlyphColumn.GetDelphiObject: TGlyphColumn; +begin + Result := TGlyphColumn(inherited DelphiObject); +end; + +procedure TPyDelphiGlyphColumn.SetDelphiObject(const Value: TGlyphColumn); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGlyphCustomGrid } + +class function TPyDelphiCustomGrid.DelphiObjectClass: TClass; +begin + Result := TCustomGrid; +end; + +function TPyDelphiCustomGrid.GetDelphiObject: TCustomGrid; +begin + Result := TCustomGrid(inherited DelphiObject); +end; + +procedure TPyDelphiCustomGrid.SetDelphiObject(const Value: TCustomGrid); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGrid } + +class function TPyDelphiGrid.DelphiObjectClass: TClass; +begin + Result := TGrid; +end; + +function TPyDelphiGrid.GetDelphiObject: TGrid; +begin + Result := TGrid(inherited DelphiObject); +end; + +procedure TPyDelphiGrid.SetDelphiObject(const Value: TGrid); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiStringGrid } + +class function TPyDelphiStringGrid.DelphiObjectClass: TClass; +begin + Result := TStringGrid; +end; + +function TPyDelphiStringGrid.GetDelphiObject: TStringGrid; +begin + Result := TStringGrid(inherited DelphiObject); +end; + +procedure TPyDelphiStringGrid.SetDelphiObject(const Value: TStringGrid); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TGridsRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxLayouts.pas b/Source/fmx/WrapFmxLayouts.pas index 4c4b0543..f3433d99 100644 --- a/Source/fmx/WrapFmxLayouts.pas +++ b/Source/fmx/WrapFmxLayouts.pas @@ -1,418 +1,418 @@ -{$I ..\Definition.Inc} - -unit WrapFmxLayouts; - -interface - -uses - FMX.Layouts, {$IFNDEF LINUX}FMX.BufferedLayout,{$ENDIF LINUX} WrapDelphi, WrapFmxControls; - -type - TPyDelphiLayout = class(TPyDelphiControl) - private - function GetDelphiObject: TLayout; - procedure SetDelphiObject(const Value: TLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TLayout read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiScaledLayout = class(TPyDelphiControl) - private - function GetDelphiObject: TScaledLayout; - procedure SetDelphiObject(const Value: TScaledLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TScaledLayout read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomScrollBox = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TCustomScrollBox; - procedure SetDelphiObject(const Value: TCustomScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiScrollBox = class(TPyDelphiCustomScrollBox) - private - function GetDelphiObject: TScrollBox; - procedure SetDelphiObject(const Value: TScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiVertScrollBox = class(TPyDelphiCustomScrollBox) - private - function GetDelphiObject: TVertScrollBox; - procedure SetDelphiObject(const Value: TVertScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TVertScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiHorzScrollBox = class(TPyDelphiCustomScrollBox) - private - function GetDelphiObject: THorzScrollBox; - procedure SetDelphiObject(const Value: THorzScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: THorzScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiFramedScrollBox = class(TPyDelphiCustomScrollBox) - private - function GetDelphiObject: TFramedScrollBox; - procedure SetDelphiObject(const Value: TFramedScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TFramedScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiFramedVertScrollBox = class(TPyDelphiVertScrollBox) - private - function GetDelphiObject: TFramedVertScrollBox; - procedure SetDelphiObject(const Value: TFramedVertScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TFramedVertScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiGridLayout = class(TPyDelphiControl) - private - function GetDelphiObject: TGridLayout; - procedure SetDelphiObject(const Value: TGridLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TGridLayout read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiGridPanelLayout = class(TPyDelphiControl) - private - function GetDelphiObject: TGridPanelLayout; - procedure SetDelphiObject(const Value: TGridPanelLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TGridPanelLayout read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiFlowLayout = class(TPyDelphiControl) - private - function GetDelphiObject: TFlowLayout; - procedure SetDelphiObject(const Value: TFlowLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TFlowLayout read GetDelphiObject write SetDelphiObject; - end; - - {$IFNDEF LINUX} - TPyDelphiCustomBufferedLayout = class(TPyDelphiLayout) - private - function GetDelphiObject: TCustomBufferedLayout; - procedure SetDelphiObject(const Value: TCustomBufferedLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomBufferedLayout read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiBufferedLayout = class(TPyDelphiCustomBufferedLayout) - private - function GetDelphiObject: TBufferedLayout; - procedure SetDelphiObject(const Value: TBufferedLayout); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TBufferedLayout read GetDelphiObject write SetDelphiObject; - end; - {$ENDIF LINUX} - -implementation - -{ Register the wrappers, the globals and the constants } -type - TLayoutsRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TLayoutsRegistration } - -procedure TLayoutsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TLayoutsRegistration.Name: string; -begin - Result := 'Layouts'; -end; - -procedure TLayoutsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLayout); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScaledLayout); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiVertScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiHorzScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFramedScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFramedVertScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGridLayout); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGridPanelLayout); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFlowLayout); - {$IFNDEF LINUX} - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomBufferedLayout); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBufferedLayout); - {$ENDIF LINUX} -end; - -{ TPyDelphiLayout } - -class function TPyDelphiLayout.DelphiObjectClass: TClass; -begin - Result := TLayout; -end; - -function TPyDelphiLayout.GetDelphiObject: TLayout; -begin - Result := TLayout(inherited DelphiObject); -end; - -procedure TPyDelphiLayout.SetDelphiObject(const Value: TLayout); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiScaledLayout } - -class function TPyDelphiScaledLayout.DelphiObjectClass: TClass; -begin - Result := TScaledLayout; -end; - -function TPyDelphiScaledLayout.GetDelphiObject: TScaledLayout; -begin - Result := TScaledLayout(inherited DelphiObject); -end; - -procedure TPyDelphiScaledLayout.SetDelphiObject(const Value: TScaledLayout); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomScrollBox } - -class function TPyDelphiCustomScrollBox.DelphiObjectClass: TClass; -begin - Result := TCustomScrollBox; -end; - -function TPyDelphiCustomScrollBox.GetDelphiObject: TCustomScrollBox; -begin - Result := TCustomScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomScrollBox.SetDelphiObject( - const Value: TCustomScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiScrollBox } - -class function TPyDelphiScrollBox.DelphiObjectClass: TClass; -begin - Result := TScrollBox; -end; - -function TPyDelphiScrollBox.GetDelphiObject: TScrollBox; -begin - Result := TScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiScrollBox.SetDelphiObject(const Value: TScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiVertScrollBox } - -class function TPyDelphiVertScrollBox.DelphiObjectClass: TClass; -begin - Result := TVertScrollBox; -end; - -function TPyDelphiVertScrollBox.GetDelphiObject: TVertScrollBox; -begin - Result := TVertScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiVertScrollBox.SetDelphiObject(const Value: TVertScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiHorzScrollBox } - -class function TPyDelphiHorzScrollBox.DelphiObjectClass: TClass; -begin - Result := THorzScrollBox; -end; - -function TPyDelphiHorzScrollBox.GetDelphiObject: THorzScrollBox; -begin - Result := THorzScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiHorzScrollBox.SetDelphiObject(const Value: THorzScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFramedScrollBox } - -class function TPyDelphiFramedScrollBox.DelphiObjectClass: TClass; -begin - Result := TFramedScrollBox; -end; - -function TPyDelphiFramedScrollBox.GetDelphiObject: TFramedScrollBox; -begin - Result := TFramedScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiFramedScrollBox.SetDelphiObject( - const Value: TFramedScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFramedVertScrollBox } - -class function TPyDelphiFramedVertScrollBox.DelphiObjectClass: TClass; -begin - Result := TFramedVertScrollBox; -end; - -function TPyDelphiFramedVertScrollBox.GetDelphiObject: TFramedVertScrollBox; -begin - Result := TFramedVertScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiFramedVertScrollBox.SetDelphiObject( - const Value: TFramedVertScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGridLayout } - -class function TPyDelphiGridLayout.DelphiObjectClass: TClass; -begin - Result := TGridLayout; -end; - -function TPyDelphiGridLayout.GetDelphiObject: TGridLayout; -begin - Result := TGridLayout(inherited DelphiObject); -end; - -procedure TPyDelphiGridLayout.SetDelphiObject(const Value: TGridLayout); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGridPanelLayout } - -class function TPyDelphiGridPanelLayout.DelphiObjectClass: TClass; -begin - Result := TGridPanelLayout; -end; - -function TPyDelphiGridPanelLayout.GetDelphiObject: TGridPanelLayout; -begin - Result := TGridPanelLayout(inherited DelphiObject); -end; - -procedure TPyDelphiGridPanelLayout.SetDelphiObject( - const Value: TGridPanelLayout); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFlowLayout } - -class function TPyDelphiFlowLayout.DelphiObjectClass: TClass; -begin - Result := TFlowLayout; -end; - -function TPyDelphiFlowLayout.GetDelphiObject: TFlowLayout; -begin - Result := TFlowLayout(inherited DelphiObject); -end; - -procedure TPyDelphiFlowLayout.SetDelphiObject(const Value: TFlowLayout); -begin - inherited DelphiObject := Value; -end; - -{$IFNDEF LINUX} -{ TPyDelphiCustomBufferedLayout } - -class function TPyDelphiCustomBufferedLayout.DelphiObjectClass: TClass; -begin - Result := TCustomBufferedLayout; -end; - -function TPyDelphiCustomBufferedLayout.GetDelphiObject: TCustomBufferedLayout; -begin - Result := TCustomBufferedLayout(inherited DelphiObject); -end; - -procedure TPyDelphiCustomBufferedLayout.SetDelphiObject( - const Value: TCustomBufferedLayout); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBufferedLayout } - -class function TPyDelphiBufferedLayout.DelphiObjectClass: TClass; -begin - Result := TBufferedLayout; -end; - -function TPyDelphiBufferedLayout.GetDelphiObject: TBufferedLayout; -begin - Result := TBufferedLayout(inherited DelphiObject); -end; - -procedure TPyDelphiBufferedLayout.SetDelphiObject(const Value: TBufferedLayout); -begin - inherited DelphiObject := Value; -end; -{$ENDIF LINUX} - -initialization - RegisteredUnits.Add(TLayoutsRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxLayouts; + +interface + +uses + FMX.Layouts, {$IFNDEF LINUX}FMX.BufferedLayout,{$ENDIF LINUX} WrapDelphi, WrapFmxControls; + +type + TPyDelphiLayout = class(TPyDelphiControl) + private + function GetDelphiObject: TLayout; + procedure SetDelphiObject(const Value: TLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TLayout read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiScaledLayout = class(TPyDelphiControl) + private + function GetDelphiObject: TScaledLayout; + procedure SetDelphiObject(const Value: TScaledLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TScaledLayout read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomScrollBox = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TCustomScrollBox; + procedure SetDelphiObject(const Value: TCustomScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiScrollBox = class(TPyDelphiCustomScrollBox) + private + function GetDelphiObject: TScrollBox; + procedure SetDelphiObject(const Value: TScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiVertScrollBox = class(TPyDelphiCustomScrollBox) + private + function GetDelphiObject: TVertScrollBox; + procedure SetDelphiObject(const Value: TVertScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TVertScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiHorzScrollBox = class(TPyDelphiCustomScrollBox) + private + function GetDelphiObject: THorzScrollBox; + procedure SetDelphiObject(const Value: THorzScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: THorzScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiFramedScrollBox = class(TPyDelphiCustomScrollBox) + private + function GetDelphiObject: TFramedScrollBox; + procedure SetDelphiObject(const Value: TFramedScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TFramedScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiFramedVertScrollBox = class(TPyDelphiVertScrollBox) + private + function GetDelphiObject: TFramedVertScrollBox; + procedure SetDelphiObject(const Value: TFramedVertScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TFramedVertScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiGridLayout = class(TPyDelphiControl) + private + function GetDelphiObject: TGridLayout; + procedure SetDelphiObject(const Value: TGridLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TGridLayout read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiGridPanelLayout = class(TPyDelphiControl) + private + function GetDelphiObject: TGridPanelLayout; + procedure SetDelphiObject(const Value: TGridPanelLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TGridPanelLayout read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiFlowLayout = class(TPyDelphiControl) + private + function GetDelphiObject: TFlowLayout; + procedure SetDelphiObject(const Value: TFlowLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TFlowLayout read GetDelphiObject write SetDelphiObject; + end; + + {$IFNDEF LINUX} + TPyDelphiCustomBufferedLayout = class(TPyDelphiLayout) + private + function GetDelphiObject: TCustomBufferedLayout; + procedure SetDelphiObject(const Value: TCustomBufferedLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomBufferedLayout read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiBufferedLayout = class(TPyDelphiCustomBufferedLayout) + private + function GetDelphiObject: TBufferedLayout; + procedure SetDelphiObject(const Value: TBufferedLayout); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TBufferedLayout read GetDelphiObject write SetDelphiObject; + end; + {$ENDIF LINUX} + +implementation + +{ Register the wrappers, the globals and the constants } +type + TLayoutsRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TLayoutsRegistration } + +procedure TLayoutsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TLayoutsRegistration.Name: string; +begin + Result := 'Layouts'; +end; + +procedure TLayoutsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLayout); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScaledLayout); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiVertScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiHorzScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFramedScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFramedVertScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGridLayout); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGridPanelLayout); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFlowLayout); + {$IFNDEF LINUX} + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomBufferedLayout); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBufferedLayout); + {$ENDIF LINUX} +end; + +{ TPyDelphiLayout } + +class function TPyDelphiLayout.DelphiObjectClass: TClass; +begin + Result := TLayout; +end; + +function TPyDelphiLayout.GetDelphiObject: TLayout; +begin + Result := TLayout(inherited DelphiObject); +end; + +procedure TPyDelphiLayout.SetDelphiObject(const Value: TLayout); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiScaledLayout } + +class function TPyDelphiScaledLayout.DelphiObjectClass: TClass; +begin + Result := TScaledLayout; +end; + +function TPyDelphiScaledLayout.GetDelphiObject: TScaledLayout; +begin + Result := TScaledLayout(inherited DelphiObject); +end; + +procedure TPyDelphiScaledLayout.SetDelphiObject(const Value: TScaledLayout); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomScrollBox } + +class function TPyDelphiCustomScrollBox.DelphiObjectClass: TClass; +begin + Result := TCustomScrollBox; +end; + +function TPyDelphiCustomScrollBox.GetDelphiObject: TCustomScrollBox; +begin + Result := TCustomScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomScrollBox.SetDelphiObject( + const Value: TCustomScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiScrollBox } + +class function TPyDelphiScrollBox.DelphiObjectClass: TClass; +begin + Result := TScrollBox; +end; + +function TPyDelphiScrollBox.GetDelphiObject: TScrollBox; +begin + Result := TScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiScrollBox.SetDelphiObject(const Value: TScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiVertScrollBox } + +class function TPyDelphiVertScrollBox.DelphiObjectClass: TClass; +begin + Result := TVertScrollBox; +end; + +function TPyDelphiVertScrollBox.GetDelphiObject: TVertScrollBox; +begin + Result := TVertScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiVertScrollBox.SetDelphiObject(const Value: TVertScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiHorzScrollBox } + +class function TPyDelphiHorzScrollBox.DelphiObjectClass: TClass; +begin + Result := THorzScrollBox; +end; + +function TPyDelphiHorzScrollBox.GetDelphiObject: THorzScrollBox; +begin + Result := THorzScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiHorzScrollBox.SetDelphiObject(const Value: THorzScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFramedScrollBox } + +class function TPyDelphiFramedScrollBox.DelphiObjectClass: TClass; +begin + Result := TFramedScrollBox; +end; + +function TPyDelphiFramedScrollBox.GetDelphiObject: TFramedScrollBox; +begin + Result := TFramedScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiFramedScrollBox.SetDelphiObject( + const Value: TFramedScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFramedVertScrollBox } + +class function TPyDelphiFramedVertScrollBox.DelphiObjectClass: TClass; +begin + Result := TFramedVertScrollBox; +end; + +function TPyDelphiFramedVertScrollBox.GetDelphiObject: TFramedVertScrollBox; +begin + Result := TFramedVertScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiFramedVertScrollBox.SetDelphiObject( + const Value: TFramedVertScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGridLayout } + +class function TPyDelphiGridLayout.DelphiObjectClass: TClass; +begin + Result := TGridLayout; +end; + +function TPyDelphiGridLayout.GetDelphiObject: TGridLayout; +begin + Result := TGridLayout(inherited DelphiObject); +end; + +procedure TPyDelphiGridLayout.SetDelphiObject(const Value: TGridLayout); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGridPanelLayout } + +class function TPyDelphiGridPanelLayout.DelphiObjectClass: TClass; +begin + Result := TGridPanelLayout; +end; + +function TPyDelphiGridPanelLayout.GetDelphiObject: TGridPanelLayout; +begin + Result := TGridPanelLayout(inherited DelphiObject); +end; + +procedure TPyDelphiGridPanelLayout.SetDelphiObject( + const Value: TGridPanelLayout); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFlowLayout } + +class function TPyDelphiFlowLayout.DelphiObjectClass: TClass; +begin + Result := TFlowLayout; +end; + +function TPyDelphiFlowLayout.GetDelphiObject: TFlowLayout; +begin + Result := TFlowLayout(inherited DelphiObject); +end; + +procedure TPyDelphiFlowLayout.SetDelphiObject(const Value: TFlowLayout); +begin + inherited DelphiObject := Value; +end; + +{$IFNDEF LINUX} +{ TPyDelphiCustomBufferedLayout } + +class function TPyDelphiCustomBufferedLayout.DelphiObjectClass: TClass; +begin + Result := TCustomBufferedLayout; +end; + +function TPyDelphiCustomBufferedLayout.GetDelphiObject: TCustomBufferedLayout; +begin + Result := TCustomBufferedLayout(inherited DelphiObject); +end; + +procedure TPyDelphiCustomBufferedLayout.SetDelphiObject( + const Value: TCustomBufferedLayout); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBufferedLayout } + +class function TPyDelphiBufferedLayout.DelphiObjectClass: TClass; +begin + Result := TBufferedLayout; +end; + +function TPyDelphiBufferedLayout.GetDelphiObject: TBufferedLayout; +begin + Result := TBufferedLayout(inherited DelphiObject); +end; + +procedure TPyDelphiBufferedLayout.SetDelphiObject(const Value: TBufferedLayout); +begin + inherited DelphiObject := Value; +end; +{$ENDIF LINUX} + +initialization + RegisteredUnits.Add(TLayoutsRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxListBox.pas b/Source/fmx/WrapFmxListBox.pas index 1f213f6d..c2c390e4 100644 --- a/Source/fmx/WrapFmxListBox.pas +++ b/Source/fmx/WrapFmxListBox.pas @@ -1,191 +1,191 @@ -{$I ..\Definition.Inc} - -unit WrapFmxListBox; - -interface - -uses - FMX.ListBox, WrapFmxTypes, WrapFmxControls, WrapFmxLayouts, PythonEngine; - -type - TPyListBoxItem = class(TPyDelphiTextControl) - private - function GetDelphiObject: TListBoxItem; - procedure SetDelphiObject(const Value: TListBoxItem); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TListBoxItem read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomListBox = class(TPyDelphiScrollBox) - private - function GetDelphiObject: TCustomListBox; - procedure SetDelphiObject(const Value: TCustomListBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomListBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiListBox = class(TPyDelphiCustomListBox) - private - function GetDelphiObject: TListBox; - procedure SetDelphiObject(const Value: TListBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TListBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomComboBox = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TCustomComboBox; - procedure SetDelphiObject(const Value: TCustomComboBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomComboBox read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiComboBox = class(TPyDelphiCustomComboBox) - private - function GetDelphiObject: TComboBox; - procedure SetDelphiObject(const Value: TComboBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TComboBox read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TListBoxRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TListBoxRegistration } - -procedure TListBoxRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TListBoxRegistration.Name: string; -begin - Result := 'ListBox'; -end; - -procedure TListBoxRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyListBoxItem); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomComboBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboBox); -end; - -{ TPyListBoxItem } - -class function TPyListBoxItem.DelphiObjectClass: TClass; -begin - Result := TListBoxItem; -end; - -function TPyListBoxItem.GetDelphiObject: TListBoxItem; -begin - Result := TListBoxItem(inherited DelphiObject); -end; - -procedure TPyListBoxItem.SetDelphiObject(const Value: TListBoxItem); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomListBox } - -class function TPyDelphiCustomListBox.DelphiObjectClass: TClass; -begin - Result := TCustomListBox; -end; - -function TPyDelphiCustomListBox.GetDelphiObject: TCustomListBox; -begin - Result := TCustomListBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomListBox.SetDelphiObject(const Value: TCustomListBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiListBox } - -class function TPyDelphiListBox.DelphiObjectClass: TClass; -begin - Result := TListBox; -end; - -function TPyDelphiListBox.GetDelphiObject: TListBox; -begin - Result := TListBox(inherited DelphiObject); -end; - - -procedure TPyDelphiListBox.SetDelphiObject(const Value: TListBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomComboBox } - -class function TPyDelphiCustomComboBox.DelphiObjectClass: TClass; -begin - Result := TCustomComboBox; -end; - -function TPyDelphiCustomComboBox.GetDelphiObject: TCustomComboBox; -begin - Result := TCustomComboBox(inherited DelphiObject) -end; - -procedure TPyDelphiCustomComboBox.SetDelphiObject(const Value: TCustomComboBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiComboBox } - -class function TPyDelphiComboBox.DelphiObjectClass: TClass; -begin - Result := TComboBox; -end; - -function TPyDelphiComboBox.GetDelphiObject: TComboBox; -begin - Result := TComboBox(inherited DelphiObject) -end; - -procedure TPyDelphiComboBox.SetDelphiObject(const Value: TComboBox); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TListBoxRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxListBox; + +interface + +uses + FMX.ListBox, WrapFmxTypes, WrapFmxControls, WrapFmxLayouts, PythonEngine; + +type + TPyListBoxItem = class(TPyDelphiTextControl) + private + function GetDelphiObject: TListBoxItem; + procedure SetDelphiObject(const Value: TListBoxItem); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TListBoxItem read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomListBox = class(TPyDelphiScrollBox) + private + function GetDelphiObject: TCustomListBox; + procedure SetDelphiObject(const Value: TCustomListBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomListBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiListBox = class(TPyDelphiCustomListBox) + private + function GetDelphiObject: TListBox; + procedure SetDelphiObject(const Value: TListBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TListBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomComboBox = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TCustomComboBox; + procedure SetDelphiObject(const Value: TCustomComboBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomComboBox read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiComboBox = class(TPyDelphiCustomComboBox) + private + function GetDelphiObject: TComboBox; + procedure SetDelphiObject(const Value: TComboBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TComboBox read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TListBoxRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TListBoxRegistration } + +procedure TListBoxRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TListBoxRegistration.Name: string; +begin + Result := 'ListBox'; +end; + +procedure TListBoxRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyListBoxItem); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomComboBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboBox); +end; + +{ TPyListBoxItem } + +class function TPyListBoxItem.DelphiObjectClass: TClass; +begin + Result := TListBoxItem; +end; + +function TPyListBoxItem.GetDelphiObject: TListBoxItem; +begin + Result := TListBoxItem(inherited DelphiObject); +end; + +procedure TPyListBoxItem.SetDelphiObject(const Value: TListBoxItem); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomListBox } + +class function TPyDelphiCustomListBox.DelphiObjectClass: TClass; +begin + Result := TCustomListBox; +end; + +function TPyDelphiCustomListBox.GetDelphiObject: TCustomListBox; +begin + Result := TCustomListBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomListBox.SetDelphiObject(const Value: TCustomListBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiListBox } + +class function TPyDelphiListBox.DelphiObjectClass: TClass; +begin + Result := TListBox; +end; + +function TPyDelphiListBox.GetDelphiObject: TListBox; +begin + Result := TListBox(inherited DelphiObject); +end; + + +procedure TPyDelphiListBox.SetDelphiObject(const Value: TListBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomComboBox } + +class function TPyDelphiCustomComboBox.DelphiObjectClass: TClass; +begin + Result := TCustomComboBox; +end; + +function TPyDelphiCustomComboBox.GetDelphiObject: TCustomComboBox; +begin + Result := TCustomComboBox(inherited DelphiObject) +end; + +procedure TPyDelphiCustomComboBox.SetDelphiObject(const Value: TCustomComboBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiComboBox } + +class function TPyDelphiComboBox.DelphiObjectClass: TClass; +begin + Result := TComboBox; +end; + +function TPyDelphiComboBox.GetDelphiObject: TComboBox; +begin + Result := TComboBox(inherited DelphiObject) +end; + +procedure TPyDelphiComboBox.SetDelphiObject(const Value: TComboBox); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TListBoxRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxListView.pas b/Source/fmx/WrapFmxListView.pas index cad12182..bcd49632 100644 --- a/Source/fmx/WrapFmxListView.pas +++ b/Source/fmx/WrapFmxListView.pas @@ -1,267 +1,267 @@ -unit WrapFmxListView; - -interface - -uses - System.TypInfo, FMX.ListView, FMX.ListView.Types, FMX.ListView.Appearances, - PythonEngine, WrapDelphi, WrapFmxControls; - -type - TPyDelphiAdapterListView = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TAdapterListView; - procedure SetDelphiObject(const Value: TAdapterListView); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TAdapterListView read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiListViewBase = class(TPyDelphiAdapterListView) - private - function GetDelphiObject: TListViewBase; - procedure SetDelphiObject(const Value: TListViewBase); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TListViewBase read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiPresentedListView = class(TPyDelphiListViewBase) - private - function GetDelphiObject: TPresentedListView; - procedure SetDelphiObject(const Value: TPresentedListView); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TPresentedListView read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiAppearanceListView = class(TPyDelphiPresentedListView) - private - function GetDelphiObject: TAppearanceListView; - procedure SetDelphiObject(const Value: TAppearanceListView); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TAppearanceListView read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomListView = class(TPyDelphiAppearanceListView) - private - function GetDelphiObject: TCustomListView; - procedure SetDelphiObject(const Value: TCustomListView); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomListView read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiListView = class(TPyDelphiCustomListView) - private - function GetDelphiObject: TListView; - procedure SetDelphiObject(const Value: TListView); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TListView read GetDelphiObject - write SetDelphiObject; - end; - - //Events - TItemEventHandler = class(TEventHandler) - protected - procedure DoEvent(const Sender: TObject; const AItem: TListViewItem); - public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; - end; - -implementation - -{ Register the wrappers, the globals and the constants } -type - TListViewRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TListViewRegistration } - -procedure TListViewRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TListViewRegistration.Name: string; -begin - Result := 'ListView'; -end; - -procedure TListViewRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAdapterListView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListViewBase); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedListView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAppearanceListView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListView); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TItemEventHandler); -end; - -{ TPyDelphiAdapterListView } - -class function TPyDelphiAdapterListView.DelphiObjectClass: TClass; -begin - Result := TAdapterListView; -end; - -function TPyDelphiAdapterListView.GetDelphiObject: TAdapterListView; -begin - Result := TAdapterListView(inherited DelphiObject); -end; - -procedure TPyDelphiAdapterListView.SetDelphiObject(const Value: TAdapterListView); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiListViewBase } - -class function TPyDelphiListViewBase.DelphiObjectClass: TClass; -begin - Result := TListViewBase; -end; - -function TPyDelphiListViewBase.GetDelphiObject: TListViewBase; -begin - Result := TListViewBase(inherited DelphiObject); -end; - -procedure TPyDelphiListViewBase.SetDelphiObject(const Value: TListViewBase); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedListView } - -class function TPyDelphiPresentedListView.DelphiObjectClass: TClass; -begin - Result := TPresentedListView; -end; - -function TPyDelphiPresentedListView.GetDelphiObject: TPresentedListView; -begin - Result := TPresentedListView(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedListView.SetDelphiObject(const Value: TPresentedListView); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiAppearanceListView } - -class function TPyDelphiAppearanceListView.DelphiObjectClass: TClass; -begin - Result := TAppearanceListView; -end; - -function TPyDelphiAppearanceListView.GetDelphiObject: TAppearanceListView; -begin - Result := TAppearanceListView(inherited DelphiObject); -end; - -procedure TPyDelphiAppearanceListView.SetDelphiObject( - const Value: TAppearanceListView); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomListView } - -class function TPyDelphiCustomListView.DelphiObjectClass: TClass; -begin - Result := TCustomListView; -end; - -function TPyDelphiCustomListView.GetDelphiObject: TCustomListView; -begin - Result := TCustomListView(inherited DelphiObject); -end; - -procedure TPyDelphiCustomListView.SetDelphiObject(const Value: TCustomListView); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiListView } - -class function TPyDelphiListView.DelphiObjectClass: TClass; -begin - Result := TListView; -end; - -function TPyDelphiListView.GetDelphiObject: TListView; -begin - Result := TListView(inherited DelphiObject); -end; - -procedure TPyDelphiListView.SetDelphiObject(const Value: TListView); -begin - inherited DelphiObject := Value; -end; - -{ TItemEventHandler } - -constructor TItemEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; - Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); -var - LMethod : TMethod; -begin - inherited; - LMethod.Code := @TItemEventHandler.DoEvent; - LMethod.Data := Self; - SetMethodProp(Component, PropertyInfo, LMethod); -end; - -class function TItemEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TAppearanceListView.TItemEvent); -end; - -procedure TItemEventHandler.DoEvent(const Sender: TObject; - const AItem: TListViewItem); -var - LPyObject: PPyObject; - LPyItem: PPyObject; - LPyTuple: PPyObject; - LPyResult: PPyObject; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - LPyObject := PyDelphiWrapper.Wrap(Sender); - LPyItem := PyDelphiWrapper.Wrap(AItem); - LPyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyItem); - try - LPyResult := PyObject_CallObject(Callable, LPyTuple); - Py_XDECREF(LPyResult); - finally - Py_DECREF(LPyTuple); - end; - CheckError; - end; -end; - -initialization - RegisteredUnits.Add(TListViewRegistration.Create); - -end. +unit WrapFmxListView; + +interface + +uses + System.TypInfo, FMX.ListView, FMX.ListView.Types, FMX.ListView.Appearances, + PythonEngine, WrapDelphi, WrapFmxControls; + +type + TPyDelphiAdapterListView = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TAdapterListView; + procedure SetDelphiObject(const Value: TAdapterListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TAdapterListView read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiListViewBase = class(TPyDelphiAdapterListView) + private + function GetDelphiObject: TListViewBase; + procedure SetDelphiObject(const Value: TListViewBase); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TListViewBase read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiPresentedListView = class(TPyDelphiListViewBase) + private + function GetDelphiObject: TPresentedListView; + procedure SetDelphiObject(const Value: TPresentedListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TPresentedListView read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiAppearanceListView = class(TPyDelphiPresentedListView) + private + function GetDelphiObject: TAppearanceListView; + procedure SetDelphiObject(const Value: TAppearanceListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TAppearanceListView read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomListView = class(TPyDelphiAppearanceListView) + private + function GetDelphiObject: TCustomListView; + procedure SetDelphiObject(const Value: TCustomListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomListView read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiListView = class(TPyDelphiCustomListView) + private + function GetDelphiObject: TListView; + procedure SetDelphiObject(const Value: TListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TListView read GetDelphiObject + write SetDelphiObject; + end; + + //Events + TItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(const Sender: TObject; const AItem: TListViewItem); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + +implementation + +{ Register the wrappers, the globals and the constants } +type + TListViewRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TListViewRegistration } + +procedure TListViewRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TListViewRegistration.Name: string; +begin + Result := 'ListView'; +end; + +procedure TListViewRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAdapterListView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListViewBase); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedListView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAppearanceListView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListView); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TItemEventHandler); +end; + +{ TPyDelphiAdapterListView } + +class function TPyDelphiAdapterListView.DelphiObjectClass: TClass; +begin + Result := TAdapterListView; +end; + +function TPyDelphiAdapterListView.GetDelphiObject: TAdapterListView; +begin + Result := TAdapterListView(inherited DelphiObject); +end; + +procedure TPyDelphiAdapterListView.SetDelphiObject(const Value: TAdapterListView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiListViewBase } + +class function TPyDelphiListViewBase.DelphiObjectClass: TClass; +begin + Result := TListViewBase; +end; + +function TPyDelphiListViewBase.GetDelphiObject: TListViewBase; +begin + Result := TListViewBase(inherited DelphiObject); +end; + +procedure TPyDelphiListViewBase.SetDelphiObject(const Value: TListViewBase); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedListView } + +class function TPyDelphiPresentedListView.DelphiObjectClass: TClass; +begin + Result := TPresentedListView; +end; + +function TPyDelphiPresentedListView.GetDelphiObject: TPresentedListView; +begin + Result := TPresentedListView(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedListView.SetDelphiObject(const Value: TPresentedListView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiAppearanceListView } + +class function TPyDelphiAppearanceListView.DelphiObjectClass: TClass; +begin + Result := TAppearanceListView; +end; + +function TPyDelphiAppearanceListView.GetDelphiObject: TAppearanceListView; +begin + Result := TAppearanceListView(inherited DelphiObject); +end; + +procedure TPyDelphiAppearanceListView.SetDelphiObject( + const Value: TAppearanceListView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomListView } + +class function TPyDelphiCustomListView.DelphiObjectClass: TClass; +begin + Result := TCustomListView; +end; + +function TPyDelphiCustomListView.GetDelphiObject: TCustomListView; +begin + Result := TCustomListView(inherited DelphiObject); +end; + +procedure TPyDelphiCustomListView.SetDelphiObject(const Value: TCustomListView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiListView } + +class function TPyDelphiListView.DelphiObjectClass: TClass; +begin + Result := TListView; +end; + +function TPyDelphiListView.GetDelphiObject: TListView; +begin + Result := TListView(inherited DelphiObject); +end; + +procedure TPyDelphiListView.SetDelphiObject(const Value: TListView); +begin + inherited DelphiObject := Value; +end; + +{ TItemEventHandler } + +constructor TItemEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TItemEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TAppearanceListView.TItemEvent); +end; + +procedure TItemEventHandler.DoEvent(const Sender: TObject; + const AItem: TListViewItem); +var + LPyObject: PPyObject; + LPyItem: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(AItem); + LPyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyItem); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + Py_XDECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +initialization + RegisteredUnits.Add(TListViewRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxMedia.pas b/Source/fmx/WrapFmxMedia.pas index 732ff279..b884f697 100644 --- a/Source/fmx/WrapFmxMedia.pas +++ b/Source/fmx/WrapFmxMedia.pas @@ -1,468 +1,468 @@ -{$I ..\Definition.Inc} -unit WrapFmxMedia; - -interface - -uses - System.TypInfo, FMX.Media, - PythonEngine, WrapDelphi, - WrapFmxTypes, WrapFmxControls, WrapFmxActnList, WrapFmxStdActns; - -type - TSampleBufferReadyEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; const ATime: TMediaTime); - public - constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; - PropertyInfo: PPropInfo; Callable: PPyObject); override; - class function GetTypeInfo: PTypeInfo; override; - end; - - TPyDelphiCameraComponent = class(TPyDelphiFmxObject) - private - function GetDelphiObject: TCameraComponent; - procedure SetDelphiObject(const Value: TCameraComponent); - public - class function DelphiObjectClass: TClass; override; - class procedure RegisterGetSets(PythonType: TPythonType); override; - class procedure RegisterMethods(PythonType: TPythonType); override; - public - property DelphiObject: TCameraComponent read GetDelphiObject - write SetDelphiObject; - end; - - //Media player wrappers - TPyDelphiCustomMediaCodec = class(TPyDelphiObject) - private - function GetDelphiObject: TCustomMediaCodec; - procedure SetDelphiObject(const Value: TCustomMediaCodec); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TCustomMediaCodec read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMedia = class(TPyDelphiObject) - private - function GetDelphiObject: TMedia; - procedure SetDelphiObject(const Value: TMedia); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMedia read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerControl = class(TPyDelphiControl) - private - function GetDelphiObject: TMediaPlayerControl; - procedure SetDelphiObject(const Value: TMediaPlayerControl); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerControl read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayer = class(TPyDelphiFmxObject) - private - function GetDelphiObject: TMediaPlayer; - procedure SetDelphiObject(const Value: TMediaPlayer); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayer read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomMediaPlayerAction = class(TPyDelphiCustomAction) - private - function GetDelphiObject: TCustomMediaPlayerAction; - procedure SetDelphiObject(const Value: TCustomMediaPlayerAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TCustomMediaPlayerAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerStart = class(TPyDelphiCustomMediaPlayerAction) - private - function GetDelphiObject: TMediaPlayerStart; - procedure SetDelphiObject(const Value: TMediaPlayerStart); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerStart read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerStop = class(TPyDelphiCustomMediaPlayerAction) - private - function GetDelphiObject: TMediaPlayerStop; - procedure SetDelphiObject(const Value: TMediaPlayerStop); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerStop read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerPause = class(TPyDelphiCustomMediaPlayerAction) - private - function GetDelphiObject: TMediaPlayerPlayPause; - procedure SetDelphiObject(const Value: TMediaPlayerPlayPause); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerPlayPause read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerValue = class(TPyDelphiCustomValueRangeAction) - private - function GetDelphiObject: TMediaPlayerValue; - procedure SetDelphiObject(const Value: TMediaPlayerValue); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerValue read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerCurrentTime = class(TPyDelphiMediaPlayerValue) - private - function GetDelphiObject: TMediaPlayerCurrentTime; - procedure SetDelphiObject(const Value: TMediaPlayerCurrentTime); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerCurrentTime read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiMediaPlayerVolume = class(TPyDelphiMediaPlayerValue) - private - function GetDelphiObject: TMediaPlayerVolume; - procedure SetDelphiObject(const Value: TMediaPlayerVolume); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TMediaPlayerVolume read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -type - TFMXMediaRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - - { TFMXMediaRegistration } - -function TFMXMediaRegistration.Name: string; -begin - Result := 'Media'; -end; - -procedure TFMXMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -procedure TFMXMediaRegistration.RegisterWrappers(APyDelphiWrapper - : TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCameraComponent); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaCodec); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMedia); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaPlayerAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerStart); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerStop); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerPause); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerValue); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerCurrentTime); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerVolume); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TSampleBufferReadyEventHandler); -end; - -{ TSampleBufferReadyEventHandler } - -constructor TSampleBufferReadyEventHandler.Create(PyDelphiWrapper - : TPyDelphiWrapper; Component: TObject; PropertyInfo: PPropInfo; - Callable: PPyObject); -var - Method : TMethod; -begin - inherited; - Method.Code := @TSampleBufferReadyEventHandler.DoEvent; - Method.Data := Self; - SetMethodProp(Component, PropertyInfo, Method); -end; - -procedure TSampleBufferReadyEventHandler.DoEvent(Sender: TObject; - const ATime: TMediaTime); -var - PySender, PyTuple, PyResult, PyTime : PPyObject; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - PySender := PyDelphiWrapper.Wrap(Sender); - PyTime := PyLong_FromLong(ATime); - PyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PySender); - GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyTime); - try - PyResult := PyObject_CallObject(Callable, PyTuple); - Py_XDECREF(PyResult); - finally - Py_DECREF(PyTuple); - end; - CheckError; - end; -end; - -class function TSampleBufferReadyEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TSampleBufferReadyEvent); -end; - -{ TPyDelphiCameraComponent } - -class function TPyDelphiCameraComponent.DelphiObjectClass: TClass; -begin - Result := TCameraComponent; -end; - -class procedure TPyDelphiCameraComponent.RegisterGetSets - (PythonType: TPythonType); -begin -end; - -class procedure TPyDelphiCameraComponent.RegisterMethods - (PythonType: TPythonType); -begin -end; - -function TPyDelphiCameraComponent.GetDelphiObject: TCameraComponent; -begin - Result := TCameraComponent(inherited DelphiObject); -end; - -procedure TPyDelphiCameraComponent.SetDelphiObject - (const Value: TCameraComponent); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomMediaCodec } - -class function TPyDelphiCustomMediaCodec.DelphiObjectClass: TClass; -begin - Result := TCustomMediaCodec; -end; - -function TPyDelphiCustomMediaCodec.GetDelphiObject: TCustomMediaCodec; -begin - Result := TCustomMediaCodec(inherited DelphiObject); -end; - -procedure TPyDelphiCustomMediaCodec.SetDelphiObject( - const Value: TCustomMediaCodec); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMedia } - -class function TPyDelphiMedia.DelphiObjectClass: TClass; -begin - Result := TMedia; -end; - -function TPyDelphiMedia.GetDelphiObject: TMedia; -begin - Result := TMedia(inherited DelphiObject); -end; - -procedure TPyDelphiMedia.SetDelphiObject(const Value: TMedia); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerControl } - -class function TPyDelphiMediaPlayerControl.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerControl; -end; - -function TPyDelphiMediaPlayerControl.GetDelphiObject: TMediaPlayerControl; -begin - Result := TMediaPlayerControl(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerControl.SetDelphiObject( - const Value: TMediaPlayerControl); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayer } - -class function TPyDelphiMediaPlayer.DelphiObjectClass: TClass; -begin - Result := TMediaPlayer; -end; - -function TPyDelphiMediaPlayer.GetDelphiObject: TMediaPlayer; -begin - Result := TMediaPlayer(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayer.SetDelphiObject(const Value: TMediaPlayer); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomMediaPlayerAction } - -class function TPyDelphiCustomMediaPlayerAction.DelphiObjectClass: TClass; -begin - Result := TCustomMediaPlayerAction; -end; - -function TPyDelphiCustomMediaPlayerAction.GetDelphiObject: TCustomMediaPlayerAction; -begin - Result := TCustomMediaPlayerAction(inherited DelphiObject); -end; - -procedure TPyDelphiCustomMediaPlayerAction.SetDelphiObject( - const Value: TCustomMediaPlayerAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerStart } - -class function TPyDelphiMediaPlayerStart.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerStart; -end; - -function TPyDelphiMediaPlayerStart.GetDelphiObject: TMediaPlayerStart; -begin - Result := TMediaPlayerStart(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerStart.SetDelphiObject( - const Value: TMediaPlayerStart); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerStop } - -class function TPyDelphiMediaPlayerStop.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerStop; -end; - -function TPyDelphiMediaPlayerStop.GetDelphiObject: TMediaPlayerStop; -begin - Result := TMediaPlayerStop(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerStop.SetDelphiObject( - const Value: TMediaPlayerStop); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerPause } - -class function TPyDelphiMediaPlayerPause.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerPlayPause; -end; - -function TPyDelphiMediaPlayerPause.GetDelphiObject: TMediaPlayerPlayPause; -begin - Result := TMediaPlayerPlayPause(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerPause.SetDelphiObject( - const Value: TMediaPlayerPlayPause); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerValue } - -class function TPyDelphiMediaPlayerValue.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerValue; -end; - -function TPyDelphiMediaPlayerValue.GetDelphiObject: TMediaPlayerValue; -begin - Result := TMediaPlayerValue(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerValue.SetDelphiObject( - const Value: TMediaPlayerValue); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerCurrentTime } - -class function TPyDelphiMediaPlayerCurrentTime.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerCurrentTime; -end; - -function TPyDelphiMediaPlayerCurrentTime.GetDelphiObject: TMediaPlayerCurrentTime; -begin - Result := TMediaPlayerCurrentTime(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerCurrentTime.SetDelphiObject( - const Value: TMediaPlayerCurrentTime); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMediaPlayerVolume } - -class function TPyDelphiMediaPlayerVolume.DelphiObjectClass: TClass; -begin - Result := TMediaPlayerVolume; -end; - -function TPyDelphiMediaPlayerVolume.GetDelphiObject: TMediaPlayerVolume; -begin - Result := TMediaPlayerVolume(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayerVolume.SetDelphiObject( - const Value: TMediaPlayerVolume); -begin - inherited DelphiObject := Value; -end; - -initialization - -RegisteredUnits.Add(TFMXMediaRegistration.Create()); - -end. +{$I ..\Definition.Inc} +unit WrapFmxMedia; + +interface + +uses + System.TypInfo, FMX.Media, + PythonEngine, WrapDelphi, + WrapFmxTypes, WrapFmxControls, WrapFmxActnList, WrapFmxStdActns; + +type + TSampleBufferReadyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; const ATime: TMediaTime); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + class function GetTypeInfo: PTypeInfo; override; + end; + + TPyDelphiCameraComponent = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TCameraComponent; + procedure SetDelphiObject(const Value: TCameraComponent); + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + public + property DelphiObject: TCameraComponent read GetDelphiObject + write SetDelphiObject; + end; + + //Media player wrappers + TPyDelphiCustomMediaCodec = class(TPyDelphiObject) + private + function GetDelphiObject: TCustomMediaCodec; + procedure SetDelphiObject(const Value: TCustomMediaCodec); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomMediaCodec read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMedia = class(TPyDelphiObject) + private + function GetDelphiObject: TMedia; + procedure SetDelphiObject(const Value: TMedia); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMedia read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerControl = class(TPyDelphiControl) + private + function GetDelphiObject: TMediaPlayerControl; + procedure SetDelphiObject(const Value: TMediaPlayerControl); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerControl read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayer = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TMediaPlayer; + procedure SetDelphiObject(const Value: TMediaPlayer); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayer read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomMediaPlayerAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TCustomMediaPlayerAction; + procedure SetDelphiObject(const Value: TCustomMediaPlayerAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomMediaPlayerAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerStart = class(TPyDelphiCustomMediaPlayerAction) + private + function GetDelphiObject: TMediaPlayerStart; + procedure SetDelphiObject(const Value: TMediaPlayerStart); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerStart read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerStop = class(TPyDelphiCustomMediaPlayerAction) + private + function GetDelphiObject: TMediaPlayerStop; + procedure SetDelphiObject(const Value: TMediaPlayerStop); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerStop read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerPause = class(TPyDelphiCustomMediaPlayerAction) + private + function GetDelphiObject: TMediaPlayerPlayPause; + procedure SetDelphiObject(const Value: TMediaPlayerPlayPause); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerPlayPause read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerValue = class(TPyDelphiCustomValueRangeAction) + private + function GetDelphiObject: TMediaPlayerValue; + procedure SetDelphiObject(const Value: TMediaPlayerValue); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerValue read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerCurrentTime = class(TPyDelphiMediaPlayerValue) + private + function GetDelphiObject: TMediaPlayerCurrentTime; + procedure SetDelphiObject(const Value: TMediaPlayerCurrentTime); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerCurrentTime read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiMediaPlayerVolume = class(TPyDelphiMediaPlayerValue) + private + function GetDelphiObject: TMediaPlayerVolume; + procedure SetDelphiObject(const Value: TMediaPlayerVolume); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TMediaPlayerVolume read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +type + TFMXMediaRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + + { TFMXMediaRegistration } + +function TFMXMediaRegistration.Name: string; +begin + Result := 'Media'; +end; + +procedure TFMXMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TFMXMediaRegistration.RegisterWrappers(APyDelphiWrapper + : TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCameraComponent); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaCodec); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMedia); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaPlayerAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerStart); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerStop); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerPause); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerValue); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerCurrentTime); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerVolume); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TSampleBufferReadyEventHandler); +end; + +{ TSampleBufferReadyEventHandler } + +constructor TSampleBufferReadyEventHandler.Create(PyDelphiWrapper + : TPyDelphiWrapper; Component: TObject; PropertyInfo: PPropInfo; + Callable: PPyObject); +var + Method : TMethod; +begin + inherited; + Method.Code := @TSampleBufferReadyEventHandler.DoEvent; + Method.Data := Self; + SetMethodProp(Component, PropertyInfo, Method); +end; + +procedure TSampleBufferReadyEventHandler.DoEvent(Sender: TObject; + const ATime: TMediaTime); +var + PySender, PyTuple, PyResult, PyTime : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + PySender := PyDelphiWrapper.Wrap(Sender); + PyTime := PyLong_FromLong(ATime); + PyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PySender); + GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyTime); + try + PyResult := PyObject_CallObject(Callable, PyTuple); + Py_XDECREF(PyResult); + finally + Py_DECREF(PyTuple); + end; + CheckError; + end; +end; + +class function TSampleBufferReadyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TSampleBufferReadyEvent); +end; + +{ TPyDelphiCameraComponent } + +class function TPyDelphiCameraComponent.DelphiObjectClass: TClass; +begin + Result := TCameraComponent; +end; + +class procedure TPyDelphiCameraComponent.RegisterGetSets + (PythonType: TPythonType); +begin +end; + +class procedure TPyDelphiCameraComponent.RegisterMethods + (PythonType: TPythonType); +begin +end; + +function TPyDelphiCameraComponent.GetDelphiObject: TCameraComponent; +begin + Result := TCameraComponent(inherited DelphiObject); +end; + +procedure TPyDelphiCameraComponent.SetDelphiObject + (const Value: TCameraComponent); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomMediaCodec } + +class function TPyDelphiCustomMediaCodec.DelphiObjectClass: TClass; +begin + Result := TCustomMediaCodec; +end; + +function TPyDelphiCustomMediaCodec.GetDelphiObject: TCustomMediaCodec; +begin + Result := TCustomMediaCodec(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMediaCodec.SetDelphiObject( + const Value: TCustomMediaCodec); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMedia } + +class function TPyDelphiMedia.DelphiObjectClass: TClass; +begin + Result := TMedia; +end; + +function TPyDelphiMedia.GetDelphiObject: TMedia; +begin + Result := TMedia(inherited DelphiObject); +end; + +procedure TPyDelphiMedia.SetDelphiObject(const Value: TMedia); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerControl } + +class function TPyDelphiMediaPlayerControl.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerControl; +end; + +function TPyDelphiMediaPlayerControl.GetDelphiObject: TMediaPlayerControl; +begin + Result := TMediaPlayerControl(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerControl.SetDelphiObject( + const Value: TMediaPlayerControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayer } + +class function TPyDelphiMediaPlayer.DelphiObjectClass: TClass; +begin + Result := TMediaPlayer; +end; + +function TPyDelphiMediaPlayer.GetDelphiObject: TMediaPlayer; +begin + Result := TMediaPlayer(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayer.SetDelphiObject(const Value: TMediaPlayer); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomMediaPlayerAction } + +class function TPyDelphiCustomMediaPlayerAction.DelphiObjectClass: TClass; +begin + Result := TCustomMediaPlayerAction; +end; + +function TPyDelphiCustomMediaPlayerAction.GetDelphiObject: TCustomMediaPlayerAction; +begin + Result := TCustomMediaPlayerAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMediaPlayerAction.SetDelphiObject( + const Value: TCustomMediaPlayerAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerStart } + +class function TPyDelphiMediaPlayerStart.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerStart; +end; + +function TPyDelphiMediaPlayerStart.GetDelphiObject: TMediaPlayerStart; +begin + Result := TMediaPlayerStart(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerStart.SetDelphiObject( + const Value: TMediaPlayerStart); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerStop } + +class function TPyDelphiMediaPlayerStop.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerStop; +end; + +function TPyDelphiMediaPlayerStop.GetDelphiObject: TMediaPlayerStop; +begin + Result := TMediaPlayerStop(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerStop.SetDelphiObject( + const Value: TMediaPlayerStop); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerPause } + +class function TPyDelphiMediaPlayerPause.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerPlayPause; +end; + +function TPyDelphiMediaPlayerPause.GetDelphiObject: TMediaPlayerPlayPause; +begin + Result := TMediaPlayerPlayPause(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerPause.SetDelphiObject( + const Value: TMediaPlayerPlayPause); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerValue } + +class function TPyDelphiMediaPlayerValue.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerValue; +end; + +function TPyDelphiMediaPlayerValue.GetDelphiObject: TMediaPlayerValue; +begin + Result := TMediaPlayerValue(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerValue.SetDelphiObject( + const Value: TMediaPlayerValue); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerCurrentTime } + +class function TPyDelphiMediaPlayerCurrentTime.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerCurrentTime; +end; + +function TPyDelphiMediaPlayerCurrentTime.GetDelphiObject: TMediaPlayerCurrentTime; +begin + Result := TMediaPlayerCurrentTime(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerCurrentTime.SetDelphiObject( + const Value: TMediaPlayerCurrentTime); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMediaPlayerVolume } + +class function TPyDelphiMediaPlayerVolume.DelphiObjectClass: TClass; +begin + Result := TMediaPlayerVolume; +end; + +function TPyDelphiMediaPlayerVolume.GetDelphiObject: TMediaPlayerVolume; +begin + Result := TMediaPlayerVolume(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayerVolume.SetDelphiObject( + const Value: TMediaPlayerVolume); +begin + inherited DelphiObject := Value; +end; + +initialization + +RegisteredUnits.Add(TFMXMediaRegistration.Create()); + +end. diff --git a/Source/fmx/WrapFmxMemo.pas b/Source/fmx/WrapFmxMemo.pas index b758bb23..5dcf7295 100644 --- a/Source/fmx/WrapFmxMemo.pas +++ b/Source/fmx/WrapFmxMemo.pas @@ -1,94 +1,94 @@ -unit WrapFmxMemo; - -interface - -uses - WrapFmxScrollBox, FMX.Memo; - -type - TPyDelphiCustomMemo = class(TPyDelphiCustomPresentedScrollBox) - private - function GetDelphiObject: TCustomMemo; - procedure SetDelphiObject(const Value: TCustomMemo); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomMemo read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiMemo = class(TPyDelphiCustomMemo) - private - function GetDelphiObject: TMemo; - procedure SetDelphiObject(const Value: TMemo); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TMemo read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TMemoRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TPyDelphiCustomMemo } - -class function TPyDelphiCustomMemo.DelphiObjectClass: TClass; -begin - Result := TCustomMemo; -end; - -function TPyDelphiCustomMemo.GetDelphiObject: TCustomMemo; -begin - Result := TCustomMemo(inherited DelphiObject); -end; - -procedure TPyDelphiCustomMemo.SetDelphiObject(const Value: TCustomMemo); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMemo } - -class function TPyDelphiMemo.DelphiObjectClass: TClass; -begin - Result := TMemo; -end; - -function TPyDelphiMemo.GetDelphiObject: TMemo; -begin - Result := TMemo(inherited DelphiObject); -end; - -procedure TPyDelphiMemo.SetDelphiObject(const Value: TMemo); -begin - inherited DelphiObject := Value; -end; - -{ TMemoRegistration } - -function TMemoRegistration.Name: string; -begin - Result := 'Memo'; -end; - -procedure TMemoRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMemo); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMemo); -end; - -initialization - RegisteredUnits.Add(TMemoRegistration.Create()); - -end. +unit WrapFmxMemo; + +interface + +uses + WrapFmxScrollBox, FMX.Memo; + +type + TPyDelphiCustomMemo = class(TPyDelphiCustomPresentedScrollBox) + private + function GetDelphiObject: TCustomMemo; + procedure SetDelphiObject(const Value: TCustomMemo); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomMemo read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiMemo = class(TPyDelphiCustomMemo) + private + function GetDelphiObject: TMemo; + procedure SetDelphiObject(const Value: TMemo); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TMemo read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TMemoRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TPyDelphiCustomMemo } + +class function TPyDelphiCustomMemo.DelphiObjectClass: TClass; +begin + Result := TCustomMemo; +end; + +function TPyDelphiCustomMemo.GetDelphiObject: TCustomMemo; +begin + Result := TCustomMemo(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMemo.SetDelphiObject(const Value: TCustomMemo); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMemo } + +class function TPyDelphiMemo.DelphiObjectClass: TClass; +begin + Result := TMemo; +end; + +function TPyDelphiMemo.GetDelphiObject: TMemo; +begin + Result := TMemo(inherited DelphiObject); +end; + +procedure TPyDelphiMemo.SetDelphiObject(const Value: TMemo); +begin + inherited DelphiObject := Value; +end; + +{ TMemoRegistration } + +function TMemoRegistration.Name: string; +begin + Result := 'Memo'; +end; + +procedure TMemoRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMemo); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMemo); +end; + +initialization + RegisteredUnits.Add(TMemoRegistration.Create()); + +end. diff --git a/Source/fmx/WrapFmxMenus.pas b/Source/fmx/WrapFmxMenus.pas index 9a7c0514..84096ef4 100644 --- a/Source/fmx/WrapFmxMenus.pas +++ b/Source/fmx/WrapFmxMenus.pas @@ -1,154 +1,154 @@ -{$I ..\Definition.Inc} - -unit WrapFmxMenus; - -interface - -uses - WrapFmxControls, FMX.Menus, WrapFmxTypes; - -type - TPyDelphiMenuItem = class(TPyDelphiTextControl) - private - function GetDelphiObject: TMenuItem; - procedure SetDelphiObject(const Value: TMenuItem); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TMenuItem read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPopupMenu = class(TPyDelphiCustomPopupMenu) - private - function GetDelphiObject: TPopupMenu; - procedure SetDelphiObject(const Value: TPopupMenu); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TPopupMenu read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiMenuBar = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TMenuBar; - procedure SetDelphiObject(const Value: TMenuBar); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TMenuBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiMainMenu = class(TPyDelphiFmxObject) - private - function GetDelphiObject: TMainMenu; - procedure SetDelphiObject(const Value: TMainMenu); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TMainMenu read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TMenusRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TMenusRegistration } - -function TMenusRegistration.Name: string; -begin - Result := 'Menus'; -end; - -procedure TMenusRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -procedure TMenusRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMenuItem); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopupMenu); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMenuBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMainMenu); -end; - -{ TPyDelphiMenuItem } - -class function TPyDelphiMenuItem.DelphiObjectClass: TClass; -begin - Result := TMenuItem; -end; - -function TPyDelphiMenuItem.GetDelphiObject: TMenuItem; -begin - Result := TMenuItem(inherited DelphiObject); -end; - -procedure TPyDelphiMenuItem.SetDelphiObject(const Value: TMenuItem); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPopupMenu } - -class function TPyDelphiPopupMenu.DelphiObjectClass: TClass; -begin - Result := TPopupMenu; -end; - -function TPyDelphiPopupMenu.GetDelphiObject: TPopupMenu; -begin - Result := TPopupMenu(inherited DelphiObject); -end; - -procedure TPyDelphiPopupMenu.SetDelphiObject(const Value: TPopupMenu); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMenuBar } - -class function TPyDelphiMenuBar.DelphiObjectClass: TClass; -begin - Result := TMenuBar; -end; - -function TPyDelphiMenuBar.GetDelphiObject: TMenuBar; -begin - Result := TMenuBar(inherited DelphiObject); -end; - -procedure TPyDelphiMenuBar.SetDelphiObject(const Value: TMenuBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiMainMenu } - -class function TPyDelphiMainMenu.DelphiObjectClass: TClass; -begin - Result := TMainMenu; -end; - -function TPyDelphiMainMenu.GetDelphiObject: TMainMenu; -begin - Result := TMainMenu(inherited DelphiObject); -end; - -procedure TPyDelphiMainMenu.SetDelphiObject(const Value: TMainMenu); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TMenusRegistration.Create()); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxMenus; + +interface + +uses + WrapFmxControls, FMX.Menus, WrapFmxTypes; + +type + TPyDelphiMenuItem = class(TPyDelphiTextControl) + private + function GetDelphiObject: TMenuItem; + procedure SetDelphiObject(const Value: TMenuItem); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TMenuItem read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPopupMenu = class(TPyDelphiCustomPopupMenu) + private + function GetDelphiObject: TPopupMenu; + procedure SetDelphiObject(const Value: TPopupMenu); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TPopupMenu read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiMenuBar = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TMenuBar; + procedure SetDelphiObject(const Value: TMenuBar); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TMenuBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiMainMenu = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TMainMenu; + procedure SetDelphiObject(const Value: TMainMenu); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TMainMenu read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TMenusRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TMenusRegistration } + +function TMenusRegistration.Name: string; +begin + Result := 'Menus'; +end; + +procedure TMenusRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TMenusRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMenuItem); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopupMenu); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMenuBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMainMenu); +end; + +{ TPyDelphiMenuItem } + +class function TPyDelphiMenuItem.DelphiObjectClass: TClass; +begin + Result := TMenuItem; +end; + +function TPyDelphiMenuItem.GetDelphiObject: TMenuItem; +begin + Result := TMenuItem(inherited DelphiObject); +end; + +procedure TPyDelphiMenuItem.SetDelphiObject(const Value: TMenuItem); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPopupMenu } + +class function TPyDelphiPopupMenu.DelphiObjectClass: TClass; +begin + Result := TPopupMenu; +end; + +function TPyDelphiPopupMenu.GetDelphiObject: TPopupMenu; +begin + Result := TPopupMenu(inherited DelphiObject); +end; + +procedure TPyDelphiPopupMenu.SetDelphiObject(const Value: TPopupMenu); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMenuBar } + +class function TPyDelphiMenuBar.DelphiObjectClass: TClass; +begin + Result := TMenuBar; +end; + +function TPyDelphiMenuBar.GetDelphiObject: TMenuBar; +begin + Result := TMenuBar(inherited DelphiObject); +end; + +procedure TPyDelphiMenuBar.SetDelphiObject(const Value: TMenuBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMainMenu } + +class function TPyDelphiMainMenu.DelphiObjectClass: TClass; +begin + Result := TMainMenu; +end; + +function TPyDelphiMainMenu.GetDelphiObject: TMainMenu; +begin + Result := TMainMenu(inherited DelphiObject); +end; + +procedure TPyDelphiMainMenu.SetDelphiObject(const Value: TMainMenu); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TMenusRegistration.Create()); + +end. diff --git a/Source/fmx/WrapFmxScrollBox.pas b/Source/fmx/WrapFmxScrollBox.pas index 5caa2b47..8b73b4bf 100644 --- a/Source/fmx/WrapFmxScrollBox.pas +++ b/Source/fmx/WrapFmxScrollBox.pas @@ -1,334 +1,334 @@ -unit WrapFmxScrollBox; - -interface - -uses - FMX.ScrollBox, WrapFmxControls; - -type - TPyDelphiCustomPresentedScrollBox = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TCustomPresentedScrollBox; - procedure SetDelphiObject(const Value: TCustomPresentedScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomPresentedScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPresentedScrollBox = class(TPyDelphiCustomPresentedScrollBox) - private - function GetDelphiObject: TPresentedScrollBox; - procedure SetDelphiObject(const Value: TPresentedScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPresentedScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPresentedVertScrollBox = class(TPyDelphiCustomPresentedScrollBox) - private - function GetDelphiObject: TCustomPresentedVertScrollBox; - procedure SetDelphiObject(const Value: TCustomPresentedVertScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomPresentedVertScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPresentedVertScrollBox = class(TPyDelphiCustomPresentedVertScrollBox) - private - function GetDelphiObject: TPresentedVertScrollBox; - procedure SetDelphiObject(const Value: TPresentedVertScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPresentedVertScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPresentedHorzScrollBox = class(TPyDelphiCustomPresentedScrollBox) - private - function GetDelphiObject: TCustomPresentedHorzScrollBox; - procedure SetDelphiObject(const Value: TCustomPresentedHorzScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomPresentedHorzScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPresentedHorzScrollBox = class(TPyDelphiCustomPresentedHorzScrollBox) - private - function GetDelphiObject: TPresentedHorzScrollBox; - procedure SetDelphiObject(const Value: TPresentedHorzScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPresentedHorzScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPresentedFrameScrollBox = class(TPyDelphiCustomPresentedScrollBox) - private - function GetDelphiObject: TCustomPresentedFramedScrollBox; - procedure SetDelphiObject(const Value: TCustomPresentedFramedScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomPresentedFramedScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPresentedFrameScrollBox = class(TPyDelphiCustomPresentedFrameScrollBox) - private - function GetDelphiObject: TPresentedFramedScrollBox; - procedure SetDelphiObject(const Value: TPresentedFramedScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPresentedFramedScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPresentedFramedVertScrollBox = class(TPyDelphiCustomPresentedVertScrollBox) - private - function GetDelphiObject: TCustomPresentedFramedVertScrollBox; - procedure SetDelphiObject(const Value: TCustomPresentedFramedVertScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomPresentedFramedVertScrollBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPresentedFramedVertScrollBox = class(TPyDelphiCustomPresentedFramedVertScrollBox) - private - function GetDelphiObject: TPresentedFramedVertScrollBox; - procedure SetDelphiObject(const Value: TPresentedFramedVertScrollBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPresentedFramedVertScrollBox read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TScrollBoxRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TScrollBoxRegistration } - -procedure TScrollBoxRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TScrollBoxRegistration.Name: string; -begin - Result := 'ScrollBox'; -end; - -procedure TScrollBoxRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedVertScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedVertScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedHorzScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedHorzScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedFrameScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedFrameScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedFramedVertScrollBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedFramedVertScrollBox); -end; - -{ TPyDelphiCustomPresentedScrollBox } - -class function TPyDelphiCustomPresentedScrollBox.DelphiObjectClass: TClass; -begin - Result := TCustomPresentedScrollBox; -end; - -function TPyDelphiCustomPresentedScrollBox.GetDelphiObject: TCustomPresentedScrollBox; -begin - Result := TCustomPresentedScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPresentedScrollBox.SetDelphiObject( - const Value: TCustomPresentedScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedScrollBox } - -class function TPyDelphiPresentedScrollBox.DelphiObjectClass: TClass; -begin - Result := TPresentedScrollBox; -end; - -function TPyDelphiPresentedScrollBox.GetDelphiObject: TPresentedScrollBox; -begin - Result := TPresentedScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedScrollBox.SetDelphiObject( - const Value: TPresentedScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPresentedVertScrollBox } - -class function TPyDelphiCustomPresentedVertScrollBox.DelphiObjectClass: TClass; -begin - Result := TCustomPresentedVertScrollBox; -end; - -function TPyDelphiCustomPresentedVertScrollBox.GetDelphiObject: TCustomPresentedVertScrollBox; -begin - Result := TCustomPresentedVertScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPresentedVertScrollBox.SetDelphiObject( - const Value: TCustomPresentedVertScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedVertScrollBox } - -class function TPyDelphiPresentedVertScrollBox.DelphiObjectClass: TClass; -begin - Result := TPresentedVertScrollBox; -end; - -function TPyDelphiPresentedVertScrollBox.GetDelphiObject: TPresentedVertScrollBox; -begin - Result := TPresentedVertScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedVertScrollBox.SetDelphiObject( - const Value: TPresentedVertScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPresentedHorzScrollBox } - -class function TPyDelphiCustomPresentedHorzScrollBox.DelphiObjectClass: TClass; -begin - Result := TCustomPresentedHorzScrollBox; -end; - -function TPyDelphiCustomPresentedHorzScrollBox.GetDelphiObject: TCustomPresentedHorzScrollBox; -begin - Result := TCustomPresentedHorzScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPresentedHorzScrollBox.SetDelphiObject( - const Value: TCustomPresentedHorzScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedHorzScrollBox } - -class function TPyDelphiPresentedHorzScrollBox.DelphiObjectClass: TClass; -begin - Result := TPresentedHorzScrollBox; -end; - -function TPyDelphiPresentedHorzScrollBox.GetDelphiObject: TPresentedHorzScrollBox; -begin - Result := TPresentedHorzScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedHorzScrollBox.SetDelphiObject( - const Value: TPresentedHorzScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPresentedFrameScrollBox } - -class function TPyDelphiCustomPresentedFrameScrollBox.DelphiObjectClass: TClass; -begin - Result := TCustomPresentedFramedScrollBox; -end; - -function TPyDelphiCustomPresentedFrameScrollBox.GetDelphiObject: TCustomPresentedFramedScrollBox; -begin - Result := TCustomPresentedFramedScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPresentedFrameScrollBox.SetDelphiObject( - const Value: TCustomPresentedFramedScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedFrameScrollBox } - -class function TPyDelphiPresentedFrameScrollBox.DelphiObjectClass: TClass; -begin - Result := TPresentedFramedScrollBox; -end; - -function TPyDelphiPresentedFrameScrollBox.GetDelphiObject: TPresentedFramedScrollBox; -begin - Result := TPresentedFramedScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedFrameScrollBox.SetDelphiObject( - const Value: TPresentedFramedScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPresentedFramedVertScrollBox } - -class function TPyDelphiCustomPresentedFramedVertScrollBox.DelphiObjectClass: TClass; -begin - Result := TCustomPresentedFramedVertScrollBox; -end; - -function TPyDelphiCustomPresentedFramedVertScrollBox.GetDelphiObject: TCustomPresentedFramedVertScrollBox; -begin - Result := TCustomPresentedFramedVertScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPresentedFramedVertScrollBox.SetDelphiObject( - const Value: TCustomPresentedFramedVertScrollBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPresentedFramedVertScrollBox } - -class function TPyDelphiPresentedFramedVertScrollBox.DelphiObjectClass: TClass; -begin - Result := TPresentedFramedVertScrollBox; -end; - -function TPyDelphiPresentedFramedVertScrollBox.GetDelphiObject: TPresentedFramedVertScrollBox; -begin - Result := TPresentedFramedVertScrollBox(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedFramedVertScrollBox.SetDelphiObject( - const Value: TPresentedFramedVertScrollBox); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TScrollBoxRegistration.Create); - -end. +unit WrapFmxScrollBox; + +interface + +uses + FMX.ScrollBox, WrapFmxControls; + +type + TPyDelphiCustomPresentedScrollBox = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TCustomPresentedScrollBox; + procedure SetDelphiObject(const Value: TCustomPresentedScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomPresentedScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPresentedScrollBox = class(TPyDelphiCustomPresentedScrollBox) + private + function GetDelphiObject: TPresentedScrollBox; + procedure SetDelphiObject(const Value: TPresentedScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPresentedScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPresentedVertScrollBox = class(TPyDelphiCustomPresentedScrollBox) + private + function GetDelphiObject: TCustomPresentedVertScrollBox; + procedure SetDelphiObject(const Value: TCustomPresentedVertScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomPresentedVertScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPresentedVertScrollBox = class(TPyDelphiCustomPresentedVertScrollBox) + private + function GetDelphiObject: TPresentedVertScrollBox; + procedure SetDelphiObject(const Value: TPresentedVertScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPresentedVertScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPresentedHorzScrollBox = class(TPyDelphiCustomPresentedScrollBox) + private + function GetDelphiObject: TCustomPresentedHorzScrollBox; + procedure SetDelphiObject(const Value: TCustomPresentedHorzScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomPresentedHorzScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPresentedHorzScrollBox = class(TPyDelphiCustomPresentedHorzScrollBox) + private + function GetDelphiObject: TPresentedHorzScrollBox; + procedure SetDelphiObject(const Value: TPresentedHorzScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPresentedHorzScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPresentedFrameScrollBox = class(TPyDelphiCustomPresentedScrollBox) + private + function GetDelphiObject: TCustomPresentedFramedScrollBox; + procedure SetDelphiObject(const Value: TCustomPresentedFramedScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomPresentedFramedScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPresentedFrameScrollBox = class(TPyDelphiCustomPresentedFrameScrollBox) + private + function GetDelphiObject: TPresentedFramedScrollBox; + procedure SetDelphiObject(const Value: TPresentedFramedScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPresentedFramedScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPresentedFramedVertScrollBox = class(TPyDelphiCustomPresentedVertScrollBox) + private + function GetDelphiObject: TCustomPresentedFramedVertScrollBox; + procedure SetDelphiObject(const Value: TCustomPresentedFramedVertScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomPresentedFramedVertScrollBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPresentedFramedVertScrollBox = class(TPyDelphiCustomPresentedFramedVertScrollBox) + private + function GetDelphiObject: TPresentedFramedVertScrollBox; + procedure SetDelphiObject(const Value: TPresentedFramedVertScrollBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPresentedFramedVertScrollBox read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TScrollBoxRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TScrollBoxRegistration } + +procedure TScrollBoxRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TScrollBoxRegistration.Name: string; +begin + Result := 'ScrollBox'; +end; + +procedure TScrollBoxRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedVertScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedVertScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedHorzScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedHorzScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedFrameScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedFrameScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPresentedFramedVertScrollBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedFramedVertScrollBox); +end; + +{ TPyDelphiCustomPresentedScrollBox } + +class function TPyDelphiCustomPresentedScrollBox.DelphiObjectClass: TClass; +begin + Result := TCustomPresentedScrollBox; +end; + +function TPyDelphiCustomPresentedScrollBox.GetDelphiObject: TCustomPresentedScrollBox; +begin + Result := TCustomPresentedScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPresentedScrollBox.SetDelphiObject( + const Value: TCustomPresentedScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedScrollBox } + +class function TPyDelphiPresentedScrollBox.DelphiObjectClass: TClass; +begin + Result := TPresentedScrollBox; +end; + +function TPyDelphiPresentedScrollBox.GetDelphiObject: TPresentedScrollBox; +begin + Result := TPresentedScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedScrollBox.SetDelphiObject( + const Value: TPresentedScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPresentedVertScrollBox } + +class function TPyDelphiCustomPresentedVertScrollBox.DelphiObjectClass: TClass; +begin + Result := TCustomPresentedVertScrollBox; +end; + +function TPyDelphiCustomPresentedVertScrollBox.GetDelphiObject: TCustomPresentedVertScrollBox; +begin + Result := TCustomPresentedVertScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPresentedVertScrollBox.SetDelphiObject( + const Value: TCustomPresentedVertScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedVertScrollBox } + +class function TPyDelphiPresentedVertScrollBox.DelphiObjectClass: TClass; +begin + Result := TPresentedVertScrollBox; +end; + +function TPyDelphiPresentedVertScrollBox.GetDelphiObject: TPresentedVertScrollBox; +begin + Result := TPresentedVertScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedVertScrollBox.SetDelphiObject( + const Value: TPresentedVertScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPresentedHorzScrollBox } + +class function TPyDelphiCustomPresentedHorzScrollBox.DelphiObjectClass: TClass; +begin + Result := TCustomPresentedHorzScrollBox; +end; + +function TPyDelphiCustomPresentedHorzScrollBox.GetDelphiObject: TCustomPresentedHorzScrollBox; +begin + Result := TCustomPresentedHorzScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPresentedHorzScrollBox.SetDelphiObject( + const Value: TCustomPresentedHorzScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedHorzScrollBox } + +class function TPyDelphiPresentedHorzScrollBox.DelphiObjectClass: TClass; +begin + Result := TPresentedHorzScrollBox; +end; + +function TPyDelphiPresentedHorzScrollBox.GetDelphiObject: TPresentedHorzScrollBox; +begin + Result := TPresentedHorzScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedHorzScrollBox.SetDelphiObject( + const Value: TPresentedHorzScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPresentedFrameScrollBox } + +class function TPyDelphiCustomPresentedFrameScrollBox.DelphiObjectClass: TClass; +begin + Result := TCustomPresentedFramedScrollBox; +end; + +function TPyDelphiCustomPresentedFrameScrollBox.GetDelphiObject: TCustomPresentedFramedScrollBox; +begin + Result := TCustomPresentedFramedScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPresentedFrameScrollBox.SetDelphiObject( + const Value: TCustomPresentedFramedScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedFrameScrollBox } + +class function TPyDelphiPresentedFrameScrollBox.DelphiObjectClass: TClass; +begin + Result := TPresentedFramedScrollBox; +end; + +function TPyDelphiPresentedFrameScrollBox.GetDelphiObject: TPresentedFramedScrollBox; +begin + Result := TPresentedFramedScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedFrameScrollBox.SetDelphiObject( + const Value: TPresentedFramedScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPresentedFramedVertScrollBox } + +class function TPyDelphiCustomPresentedFramedVertScrollBox.DelphiObjectClass: TClass; +begin + Result := TCustomPresentedFramedVertScrollBox; +end; + +function TPyDelphiCustomPresentedFramedVertScrollBox.GetDelphiObject: TCustomPresentedFramedVertScrollBox; +begin + Result := TCustomPresentedFramedVertScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPresentedFramedVertScrollBox.SetDelphiObject( + const Value: TCustomPresentedFramedVertScrollBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPresentedFramedVertScrollBox } + +class function TPyDelphiPresentedFramedVertScrollBox.DelphiObjectClass: TClass; +begin + Result := TPresentedFramedVertScrollBox; +end; + +function TPyDelphiPresentedFramedVertScrollBox.GetDelphiObject: TPresentedFramedVertScrollBox; +begin + Result := TPresentedFramedVertScrollBox(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedFramedVertScrollBox.SetDelphiObject( + const Value: TPresentedFramedVertScrollBox); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TScrollBoxRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxShapes.pas b/Source/fmx/WrapFmxShapes.pas index 6965c6b3..08607a8f 100644 --- a/Source/fmx/WrapFmxShapes.pas +++ b/Source/fmx/WrapFmxShapes.pas @@ -1,511 +1,511 @@ -{$I ..\Definition.Inc} - -unit WrapFmxShapes; - -interface - -uses - FMX.Objects, WrapFmxControls; - -type - TPyDelphiShape = class(TPyDelphiControl) - private - function GetDelphiObject: TShape; - procedure SetDelphiObject(const Value: TShape); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TShape read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiLine = class(TPyDelphiShape) - private - function GetDelphiObject: TLine; - procedure SetDelphiObject(const Value: TLine); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TLine read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiRectangle = class(TPyDelphiShape) - private - function GetDelphiObject: TRectangle; - procedure SetDelphiObject(const Value: TRectangle); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TRectangle read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCaretRectangle = class(TPyDelphiRectangle) - private - function GetDelphiObject: TCaretRectangle; - procedure SetDelphiObject(const Value: TCaretRectangle); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCaretRectangle read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiRoundRect = class(TPyDelphiShape) - private - function GetDelphiObject: TRoundRect; - procedure SetDelphiObject(const Value: TRoundRect); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TRoundRect read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCalloutRectangle = class(TPyDelphiRectangle) - function GetDelphiObject: TCalloutRectangle; - procedure SetDelphiObject(const Value: TCalloutRectangle); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCalloutRectangle read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiEllipse = class(TPyDelphiShape) - function GetDelphiObject: TEllipse; - procedure SetDelphiObject(const Value: TEllipse); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TEllipse read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCircle = class(TPyDelphiEllipse) - function GetDelphiObject: TCircle; - procedure SetDelphiObject(const Value: TCircle); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCircle read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPie = class(TPyDelphiEllipse) - function GetDelphiObject: TPie; - procedure SetDelphiObject(const Value: TPie); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPie read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiArc = class(TPyDelphiEllipse) - function GetDelphiObject: TArc; - procedure SetDelphiObject(const Value: TArc); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TArc read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomPath = class(TPyDelphiShape) - function GetDelphiObject: TCustomPath; - procedure SetDelphiObject(const Value: TCustomPath); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TCustomPath read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPath = class(TPyDelphiCustomPath) - function GetDelphiObject: TPath; - procedure SetDelphiObject(const Value: TPath); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPath read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiText = class(TPyDelphiControl) - function GetDelphiObject: TText; - procedure SetDelphiObject(const Value: TText); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TText read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiImage = class(TPyDelphiControl) - function GetDelphiObject: TImage; - procedure SetDelphiObject(const Value: TImage); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TImage read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPaintBox = class(TPyDelphiControl) - function GetDelphiObject: TPaintBox; - procedure SetDelphiObject(const Value: TPaintBox); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TPaintBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSelection = class(TPyDelphiControl) - function GetDelphiObject: TSelection; - procedure SetDelphiObject(const Value: TSelection); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TSelection read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSelectionPoint = class(TPyDelphiStyledControl) - function GetDelphiObject: TSelectionPoint; - procedure SetDelphiObject(const Value: TSelectionPoint); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TSelectionPoint read GetDelphiObject write SetDelphiObject; - end; - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TShapesRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TShapesRegistration } - -procedure TShapesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TShapesRegistration.Name: string; -begin - Result := 'Shapes'; -end; - -procedure TShapesRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiShape); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLine); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiRectangle); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCaretRectangle); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiRoundRect); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCalloutRectangle); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiEllipse); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCircle); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPie); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiArc); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPath); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPath); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiText); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImage); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPaintBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSelection); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSelectionPoint); -end; - -{ TPyDelphiShape } - -class function TPyDelphiShape.DelphiObjectClass: TClass; -begin - Result := TShape; -end; - -function TPyDelphiShape.GetDelphiObject: TShape; -begin - Result := TShape(inherited DelphiObject); -end; - -procedure TPyDelphiShape.SetDelphiObject(const Value: TShape); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLine } - -class function TPyDelphiLine.DelphiObjectClass: TClass; -begin - Result := TLine; -end; - -function TPyDelphiLine.GetDelphiObject: TLine; -begin - Result := TLine(inherited DelphiObject); -end; - -procedure TPyDelphiLine.SetDelphiObject(const Value: TLine); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiRectangle } - -class function TPyDelphiRectangle.DelphiObjectClass: TClass; -begin - Result := TRectangle; -end; - -function TPyDelphiRectangle.GetDelphiObject: TRectangle; -begin - Result := TRectangle(inherited DelphiObject); -end; - -procedure TPyDelphiRectangle.SetDelphiObject(const Value: TRectangle); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCaretRectangle } - -class function TPyDelphiCaretRectangle.DelphiObjectClass: TClass; -begin - Result := TCaretRectangle; -end; - -function TPyDelphiCaretRectangle.GetDelphiObject: TCaretRectangle; -begin - Result := TCaretRectangle(inherited DelphiObject); -end; - -procedure TPyDelphiCaretRectangle.SetDelphiObject(const Value: TCaretRectangle); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiRoundRect } - -class function TPyDelphiRoundRect.DelphiObjectClass: TClass; -begin - Result := TRoundRect; -end; - -function TPyDelphiRoundRect.GetDelphiObject: TRoundRect; -begin - Result := TRoundRect(inherited DelphiObject); -end; - -procedure TPyDelphiRoundRect.SetDelphiObject(const Value: TRoundRect); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCalloutRectangle } - -class function TPyDelphiCalloutRectangle.DelphiObjectClass: TClass; -begin - Result := TCalloutRectangle; -end; - -function TPyDelphiCalloutRectangle.GetDelphiObject: TCalloutRectangle; -begin - Result := TCalloutRectangle(inherited DelphiObject); -end; - -procedure TPyDelphiCalloutRectangle.SetDelphiObject( - const Value: TCalloutRectangle); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiEllipse } - -class function TPyDelphiEllipse.DelphiObjectClass: TClass; -begin - Result := TEllipse; -end; - -function TPyDelphiEllipse.GetDelphiObject: TEllipse; -begin - Result := TEllipse(inherited DelphiObject); -end; - -procedure TPyDelphiEllipse.SetDelphiObject(const Value: TEllipse); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCircle } - -class function TPyDelphiCircle.DelphiObjectClass: TClass; -begin - Result := TCircle; -end; - -function TPyDelphiCircle.GetDelphiObject: TCircle; -begin - Result := TCircle(inherited DelphiObject); -end; - -procedure TPyDelphiCircle.SetDelphiObject(const Value: TCircle); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPie } - -class function TPyDelphiPie.DelphiObjectClass: TClass; -begin - Result := TPie; -end; - -function TPyDelphiPie.GetDelphiObject: TPie; -begin - Result := TPie(inherited DelphiObject); -end; - -procedure TPyDelphiPie.SetDelphiObject(const Value: TPie); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiArc } - -class function TPyDelphiArc.DelphiObjectClass: TClass; -begin - Result := TArc; -end; - -function TPyDelphiArc.GetDelphiObject: TArc; -begin - Result := TArc(inherited DelphiObject); -end; - -procedure TPyDelphiArc.SetDelphiObject(const Value: TArc); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomPath } - -class function TPyDelphiCustomPath.DelphiObjectClass: TClass; -begin - Result := TCustomPath; -end; - -function TPyDelphiCustomPath.GetDelphiObject: TCustomPath; -begin - Result := TCustomPath(inherited DelphiObject); -end; - -procedure TPyDelphiCustomPath.SetDelphiObject(const Value: TCustomPath); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPath } - -class function TPyDelphiPath.DelphiObjectClass: TClass; -begin - Result := TPath; -end; - -function TPyDelphiPath.GetDelphiObject: TPath; -begin - Result := TPath(inherited DelphiObject); -end; - -procedure TPyDelphiPath.SetDelphiObject(const Value: TPath); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiText } - -class function TPyDelphiText.DelphiObjectClass: TClass; -begin - Result := TText; -end; - -function TPyDelphiText.GetDelphiObject: TText; -begin - Result := TText(inherited DelphiObject); -end; - -procedure TPyDelphiText.SetDelphiObject(const Value: TText); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiImage } - -class function TPyDelphiImage.DelphiObjectClass: TClass; -begin - Result := TImage; -end; - -function TPyDelphiImage.GetDelphiObject: TImage; -begin - Result := TImage(inherited DelphiObject); -end; - -procedure TPyDelphiImage.SetDelphiObject(const Value: TImage); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPaintBox } - -class function TPyDelphiPaintBox.DelphiObjectClass: TClass; -begin - Result := TPaintBox; -end; - -function TPyDelphiPaintBox.GetDelphiObject: TPaintBox; -begin - Result := TPaintBox(inherited DelphiObject); -end; - -procedure TPyDelphiPaintBox.SetDelphiObject(const Value: TPaintBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSelection } - -class function TPyDelphiSelection.DelphiObjectClass: TClass; -begin - Result := TSelection; -end; - -function TPyDelphiSelection.GetDelphiObject: TSelection; -begin - Result := TSelection(inherited DelphiObject); -end; - -procedure TPyDelphiSelection.SetDelphiObject(const Value: TSelection); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSelectionPoint } - -class function TPyDelphiSelectionPoint.DelphiObjectClass: TClass; -begin - Result := TSelectionPoint; -end; - -function TPyDelphiSelectionPoint.GetDelphiObject: TSelectionPoint; -begin - Result := TSelectionPoint(inherited DelphiObject); -end; - -procedure TPyDelphiSelectionPoint.SetDelphiObject(const Value: TSelectionPoint); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TShapesRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxShapes; + +interface + +uses + FMX.Objects, WrapFmxControls; + +type + TPyDelphiShape = class(TPyDelphiControl) + private + function GetDelphiObject: TShape; + procedure SetDelphiObject(const Value: TShape); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TShape read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiLine = class(TPyDelphiShape) + private + function GetDelphiObject: TLine; + procedure SetDelphiObject(const Value: TLine); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TLine read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiRectangle = class(TPyDelphiShape) + private + function GetDelphiObject: TRectangle; + procedure SetDelphiObject(const Value: TRectangle); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TRectangle read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCaretRectangle = class(TPyDelphiRectangle) + private + function GetDelphiObject: TCaretRectangle; + procedure SetDelphiObject(const Value: TCaretRectangle); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCaretRectangle read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiRoundRect = class(TPyDelphiShape) + private + function GetDelphiObject: TRoundRect; + procedure SetDelphiObject(const Value: TRoundRect); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TRoundRect read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCalloutRectangle = class(TPyDelphiRectangle) + function GetDelphiObject: TCalloutRectangle; + procedure SetDelphiObject(const Value: TCalloutRectangle); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCalloutRectangle read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiEllipse = class(TPyDelphiShape) + function GetDelphiObject: TEllipse; + procedure SetDelphiObject(const Value: TEllipse); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TEllipse read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCircle = class(TPyDelphiEllipse) + function GetDelphiObject: TCircle; + procedure SetDelphiObject(const Value: TCircle); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCircle read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPie = class(TPyDelphiEllipse) + function GetDelphiObject: TPie; + procedure SetDelphiObject(const Value: TPie); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPie read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiArc = class(TPyDelphiEllipse) + function GetDelphiObject: TArc; + procedure SetDelphiObject(const Value: TArc); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TArc read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomPath = class(TPyDelphiShape) + function GetDelphiObject: TCustomPath; + procedure SetDelphiObject(const Value: TCustomPath); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomPath read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPath = class(TPyDelphiCustomPath) + function GetDelphiObject: TPath; + procedure SetDelphiObject(const Value: TPath); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPath read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiText = class(TPyDelphiControl) + function GetDelphiObject: TText; + procedure SetDelphiObject(const Value: TText); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TText read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiImage = class(TPyDelphiControl) + function GetDelphiObject: TImage; + procedure SetDelphiObject(const Value: TImage); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TImage read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPaintBox = class(TPyDelphiControl) + function GetDelphiObject: TPaintBox; + procedure SetDelphiObject(const Value: TPaintBox); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TPaintBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSelection = class(TPyDelphiControl) + function GetDelphiObject: TSelection; + procedure SetDelphiObject(const Value: TSelection); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TSelection read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSelectionPoint = class(TPyDelphiStyledControl) + function GetDelphiObject: TSelectionPoint; + procedure SetDelphiObject(const Value: TSelectionPoint); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TSelectionPoint read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TShapesRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TShapesRegistration } + +procedure TShapesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TShapesRegistration.Name: string; +begin + Result := 'Shapes'; +end; + +procedure TShapesRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiShape); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLine); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiRectangle); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCaretRectangle); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiRoundRect); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCalloutRectangle); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiEllipse); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCircle); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPie); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiArc); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPath); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPath); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiText); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImage); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPaintBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSelection); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSelectionPoint); +end; + +{ TPyDelphiShape } + +class function TPyDelphiShape.DelphiObjectClass: TClass; +begin + Result := TShape; +end; + +function TPyDelphiShape.GetDelphiObject: TShape; +begin + Result := TShape(inherited DelphiObject); +end; + +procedure TPyDelphiShape.SetDelphiObject(const Value: TShape); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLine } + +class function TPyDelphiLine.DelphiObjectClass: TClass; +begin + Result := TLine; +end; + +function TPyDelphiLine.GetDelphiObject: TLine; +begin + Result := TLine(inherited DelphiObject); +end; + +procedure TPyDelphiLine.SetDelphiObject(const Value: TLine); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiRectangle } + +class function TPyDelphiRectangle.DelphiObjectClass: TClass; +begin + Result := TRectangle; +end; + +function TPyDelphiRectangle.GetDelphiObject: TRectangle; +begin + Result := TRectangle(inherited DelphiObject); +end; + +procedure TPyDelphiRectangle.SetDelphiObject(const Value: TRectangle); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCaretRectangle } + +class function TPyDelphiCaretRectangle.DelphiObjectClass: TClass; +begin + Result := TCaretRectangle; +end; + +function TPyDelphiCaretRectangle.GetDelphiObject: TCaretRectangle; +begin + Result := TCaretRectangle(inherited DelphiObject); +end; + +procedure TPyDelphiCaretRectangle.SetDelphiObject(const Value: TCaretRectangle); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiRoundRect } + +class function TPyDelphiRoundRect.DelphiObjectClass: TClass; +begin + Result := TRoundRect; +end; + +function TPyDelphiRoundRect.GetDelphiObject: TRoundRect; +begin + Result := TRoundRect(inherited DelphiObject); +end; + +procedure TPyDelphiRoundRect.SetDelphiObject(const Value: TRoundRect); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCalloutRectangle } + +class function TPyDelphiCalloutRectangle.DelphiObjectClass: TClass; +begin + Result := TCalloutRectangle; +end; + +function TPyDelphiCalloutRectangle.GetDelphiObject: TCalloutRectangle; +begin + Result := TCalloutRectangle(inherited DelphiObject); +end; + +procedure TPyDelphiCalloutRectangle.SetDelphiObject( + const Value: TCalloutRectangle); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiEllipse } + +class function TPyDelphiEllipse.DelphiObjectClass: TClass; +begin + Result := TEllipse; +end; + +function TPyDelphiEllipse.GetDelphiObject: TEllipse; +begin + Result := TEllipse(inherited DelphiObject); +end; + +procedure TPyDelphiEllipse.SetDelphiObject(const Value: TEllipse); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCircle } + +class function TPyDelphiCircle.DelphiObjectClass: TClass; +begin + Result := TCircle; +end; + +function TPyDelphiCircle.GetDelphiObject: TCircle; +begin + Result := TCircle(inherited DelphiObject); +end; + +procedure TPyDelphiCircle.SetDelphiObject(const Value: TCircle); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPie } + +class function TPyDelphiPie.DelphiObjectClass: TClass; +begin + Result := TPie; +end; + +function TPyDelphiPie.GetDelphiObject: TPie; +begin + Result := TPie(inherited DelphiObject); +end; + +procedure TPyDelphiPie.SetDelphiObject(const Value: TPie); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiArc } + +class function TPyDelphiArc.DelphiObjectClass: TClass; +begin + Result := TArc; +end; + +function TPyDelphiArc.GetDelphiObject: TArc; +begin + Result := TArc(inherited DelphiObject); +end; + +procedure TPyDelphiArc.SetDelphiObject(const Value: TArc); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomPath } + +class function TPyDelphiCustomPath.DelphiObjectClass: TClass; +begin + Result := TCustomPath; +end; + +function TPyDelphiCustomPath.GetDelphiObject: TCustomPath; +begin + Result := TCustomPath(inherited DelphiObject); +end; + +procedure TPyDelphiCustomPath.SetDelphiObject(const Value: TCustomPath); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPath } + +class function TPyDelphiPath.DelphiObjectClass: TClass; +begin + Result := TPath; +end; + +function TPyDelphiPath.GetDelphiObject: TPath; +begin + Result := TPath(inherited DelphiObject); +end; + +procedure TPyDelphiPath.SetDelphiObject(const Value: TPath); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiText } + +class function TPyDelphiText.DelphiObjectClass: TClass; +begin + Result := TText; +end; + +function TPyDelphiText.GetDelphiObject: TText; +begin + Result := TText(inherited DelphiObject); +end; + +procedure TPyDelphiText.SetDelphiObject(const Value: TText); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiImage } + +class function TPyDelphiImage.DelphiObjectClass: TClass; +begin + Result := TImage; +end; + +function TPyDelphiImage.GetDelphiObject: TImage; +begin + Result := TImage(inherited DelphiObject); +end; + +procedure TPyDelphiImage.SetDelphiObject(const Value: TImage); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPaintBox } + +class function TPyDelphiPaintBox.DelphiObjectClass: TClass; +begin + Result := TPaintBox; +end; + +function TPyDelphiPaintBox.GetDelphiObject: TPaintBox; +begin + Result := TPaintBox(inherited DelphiObject); +end; + +procedure TPyDelphiPaintBox.SetDelphiObject(const Value: TPaintBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSelection } + +class function TPyDelphiSelection.DelphiObjectClass: TClass; +begin + Result := TSelection; +end; + +function TPyDelphiSelection.GetDelphiObject: TSelection; +begin + Result := TSelection(inherited DelphiObject); +end; + +procedure TPyDelphiSelection.SetDelphiObject(const Value: TSelection); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSelectionPoint } + +class function TPyDelphiSelectionPoint.DelphiObjectClass: TClass; +begin + Result := TSelectionPoint; +end; + +function TPyDelphiSelectionPoint.GetDelphiObject: TSelectionPoint; +begin + Result := TSelectionPoint(inherited DelphiObject); +end; + +procedure TPyDelphiSelectionPoint.SetDelphiObject(const Value: TSelectionPoint); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TShapesRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxStdActns.pas b/Source/fmx/WrapFmxStdActns.pas index 0c96ebe1..7f7eaeed 100644 --- a/Source/fmx/WrapFmxStdActns.pas +++ b/Source/fmx/WrapFmxStdActns.pas @@ -1,454 +1,454 @@ -{$I ..\Definition.Inc} -unit WrapFmxStdActns; - -interface - -uses - FMX.StdActns, - PythonEngine, WrapDelphi, WrapFmxControls, WrapFmxActnList, WrapDelphiClasses; - -type - TPyDelphiHintAction = class(TPyDelphiCustomAction) - private - function GetDelphiObject: THintAction; - procedure SetDelphiObject(const Value: THintAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: THintAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiSysCommonAction = class(TPyDelphiCustomAction) - private - function GetDelphiObject: TSysCommonAction; - procedure SetDelphiObject(const Value: TSysCommonAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TSysCommonAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFileExit = class(TPyDelphiSysCommonAction) - private - function GetDelphiObject: TFileExit; - procedure SetDelphiObject(const Value: TFileExit); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TFileExit read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiWindowClose = class(TPyDelphiSysCommonAction) - private - function GetDelphiObject: TWindowClose; - procedure SetDelphiObject(const Value: TWindowClose); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TWindowClose read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFileHideApp = class(TPyDelphiSysCommonAction) - private - function GetDelphiObject: TFileHideApp; - procedure SetDelphiObject(const Value: TFileHideApp); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TFileHideApp read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiFileHideAppOthers = class(TPyDelphiFileHideApp) - private - function GetDelphiObject: TFileHideAppOthers; - procedure SetDelphiObject(const Value: TFileHideAppOthers); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TFileHideAppOthers read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiObjectViewAction = class(TPyDelphiCustomViewAction) - private - function GetDelphiObject: TObjectViewAction; - procedure SetDelphiObject(const Value: TObjectViewAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TObjectViewAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiVirtualKeyboard = class(TPyDelphiObjectViewAction) - private - function GetDelphiObject: TVirtualKeyboard; - procedure SetDelphiObject(const Value: TVirtualKeyboard); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TVirtualKeyboard read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiViewAction = class(TPyDelphiObjectViewAction) - private - function GetDelphiObject: TViewAction; - procedure SetDelphiObject(const Value: TViewAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TViewAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiBaseValueRange = class(TPyDelphiPersistent) - private - function GetDelphiObject: TBaseValueRange; - procedure SetDelphiObject(const Value: TBaseValueRange); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TBaseValueRange read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomValueRange = class(TPyDelphiBaseValueRange) - private - function GetDelphiObject: TCustomValueRange; - procedure SetDelphiObject(const Value: TCustomValueRange); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TCustomValueRange read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiValueRange = class(TPyDelphiCustomValueRange) - private - function GetDelphiObject: TValueRange; - procedure SetDelphiObject(const Value: TValueRange); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TValueRange read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiCustomValueRangeAction = class(TPyDelphiCustomControlAction) - private - function GetDelphiObject: TCustomValueRangeAction; - procedure SetDelphiObject(const Value: TCustomValueRangeAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TCustomValueRangeAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiValueRangeAction = class(TPyDelphiCustomValueRangeAction) - private - function GetDelphiObject: TValueRangeAction; - procedure SetDelphiObject(const Value: TValueRangeAction); - public - class function DelphiObjectClass: TClass; override; - public - property DelphiObject: TValueRangeAction read GetDelphiObject - write SetDelphiObject; - end; - -implementation - -type - TStdActnsRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TFMXStdActns } - -function TStdActnsRegistration.Name: string; -begin - Result := 'StdActns'; -end; - -procedure TStdActnsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -procedure TStdActnsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiHintAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSysCommonAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileExit); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiWindowClose); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileHideApp); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileHideAppOthers); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiObjectViewAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiVirtualKeyboard); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiViewAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseValueRange); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomValueRange); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiValueRange); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomValueRangeAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiValueRangeAction); -end; - -{ TPyDelphiHintAction } - -class function TPyDelphiHintAction.DelphiObjectClass: TClass; -begin - Result := THintAction; -end; - -function TPyDelphiHintAction.GetDelphiObject: THintAction; -begin - Result := THintAction(inherited DelphiObject); -end; - -procedure TPyDelphiHintAction.SetDelphiObject(const Value: THintAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSysCommonAction } - -class function TPyDelphiSysCommonAction.DelphiObjectClass: TClass; -begin - Result := TSysCommonAction; -end; - -function TPyDelphiSysCommonAction.GetDelphiObject: TSysCommonAction; -begin - Result := TSysCommonAction(inherited DelphiObject); -end; - -procedure TPyDelphiSysCommonAction.SetDelphiObject( - const Value: TSysCommonAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFileExit } - -class function TPyDelphiFileExit.DelphiObjectClass: TClass; -begin - Result := TFileExit; -end; - -function TPyDelphiFileExit.GetDelphiObject: TFileExit; -begin - Result := TFileExit(inherited DelphiObject); -end; - -procedure TPyDelphiFileExit.SetDelphiObject(const Value: TFileExit); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiWindowClose } - -class function TPyDelphiWindowClose.DelphiObjectClass: TClass; -begin - Result := TWindowClose; -end; - -function TPyDelphiWindowClose.GetDelphiObject: TWindowClose; -begin - Result := TWindowClose(inherited DelphiObject); -end; - -procedure TPyDelphiWindowClose.SetDelphiObject(const Value: TWindowClose); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFileHideApp } - -class function TPyDelphiFileHideApp.DelphiObjectClass: TClass; -begin - Result := TFileHideApp; -end; - -function TPyDelphiFileHideApp.GetDelphiObject: TFileHideApp; -begin - Result := TFileHideApp(inherited DelphiObject); -end; - -procedure TPyDelphiFileHideApp.SetDelphiObject(const Value: TFileHideApp); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiFileHideAppOthers } - -class function TPyDelphiFileHideAppOthers.DelphiObjectClass: TClass; -begin - Result := TFileHideAppOthers; -end; - -function TPyDelphiFileHideAppOthers.GetDelphiObject: TFileHideAppOthers; -begin - Result := TFileHideAppOthers(inherited DelphiObject); -end; - -procedure TPyDelphiFileHideAppOthers.SetDelphiObject( - const Value: TFileHideAppOthers); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiObjectViewAction } - -class function TPyDelphiObjectViewAction.DelphiObjectClass: TClass; -begin - Result := TObjectViewAction; -end; - -function TPyDelphiObjectViewAction.GetDelphiObject: TObjectViewAction; -begin - Result := TObjectViewAction(inherited DelphiObject); -end; - -procedure TPyDelphiObjectViewAction.SetDelphiObject( - const Value: TObjectViewAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiVirtualKeyboard } - -class function TPyDelphiVirtualKeyboard.DelphiObjectClass: TClass; -begin - Result := TVirtualKeyboard; -end; - -function TPyDelphiVirtualKeyboard.GetDelphiObject: TVirtualKeyboard; -begin - Result := TVirtualKeyboard(inherited DelphiObject); -end; - -procedure TPyDelphiVirtualKeyboard.SetDelphiObject( - const Value: TVirtualKeyboard); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiViewAction } - -class function TPyDelphiViewAction.DelphiObjectClass: TClass; -begin - Result := TViewAction; -end; - -function TPyDelphiViewAction.GetDelphiObject: TViewAction; -begin - Result := TViewAction(inherited DelphiObject); -end; - -procedure TPyDelphiViewAction.SetDelphiObject(const Value: TViewAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBaseValueRange } - -class function TPyDelphiBaseValueRange.DelphiObjectClass: TClass; -begin - Result := TBaseValueRange; -end; - -function TPyDelphiBaseValueRange.GetDelphiObject: TBaseValueRange; -begin - Result := TBaseValueRange(inherited DelphiObject); -end; - -procedure TPyDelphiBaseValueRange.SetDelphiObject(const Value: TBaseValueRange); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomValueRange } - -class function TPyDelphiCustomValueRange.DelphiObjectClass: TClass; -begin - Result := TCustomValueRange; -end; - -function TPyDelphiCustomValueRange.GetDelphiObject: TCustomValueRange; -begin - Result := TCustomValueRange(inherited DelphiObject); -end; - -procedure TPyDelphiCustomValueRange.SetDelphiObject( - const Value: TCustomValueRange); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiValueRange } - -class function TPyDelphiValueRange.DelphiObjectClass: TClass; -begin - Result := TValueRange; -end; - -function TPyDelphiValueRange.GetDelphiObject: TValueRange; -begin - Result := TValueRange(inherited DelphiObject); -end; - -procedure TPyDelphiValueRange.SetDelphiObject(const Value: TValueRange); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomValueRangeAction } - -class function TPyDelphiCustomValueRangeAction.DelphiObjectClass: TClass; -begin - Result := TCustomValueRangeAction; -end; - -function TPyDelphiCustomValueRangeAction.GetDelphiObject: TCustomValueRangeAction; -begin - Result := TCustomValueRangeAction(inherited DelphiObject); -end; - -procedure TPyDelphiCustomValueRangeAction.SetDelphiObject( - const Value: TCustomValueRangeAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiValueRangeAction } - -class function TPyDelphiValueRangeAction.DelphiObjectClass: TClass; -begin - Result := TValueRangeAction; -end; - -function TPyDelphiValueRangeAction.GetDelphiObject: TValueRangeAction; -begin - Result := TValueRangeAction(inherited DelphiObject); -end; - -procedure TPyDelphiValueRangeAction.SetDelphiObject( - const Value: TValueRangeAction); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TStdActnsRegistration.Create); - -end. +{$I ..\Definition.Inc} +unit WrapFmxStdActns; + +interface + +uses + FMX.StdActns, + PythonEngine, WrapDelphi, WrapFmxControls, WrapFmxActnList, WrapDelphiClasses; + +type + TPyDelphiHintAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: THintAction; + procedure SetDelphiObject(const Value: THintAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: THintAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiSysCommonAction = class(TPyDelphiCustomAction) + private + function GetDelphiObject: TSysCommonAction; + procedure SetDelphiObject(const Value: TSysCommonAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TSysCommonAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFileExit = class(TPyDelphiSysCommonAction) + private + function GetDelphiObject: TFileExit; + procedure SetDelphiObject(const Value: TFileExit); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TFileExit read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiWindowClose = class(TPyDelphiSysCommonAction) + private + function GetDelphiObject: TWindowClose; + procedure SetDelphiObject(const Value: TWindowClose); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TWindowClose read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFileHideApp = class(TPyDelphiSysCommonAction) + private + function GetDelphiObject: TFileHideApp; + procedure SetDelphiObject(const Value: TFileHideApp); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TFileHideApp read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiFileHideAppOthers = class(TPyDelphiFileHideApp) + private + function GetDelphiObject: TFileHideAppOthers; + procedure SetDelphiObject(const Value: TFileHideAppOthers); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TFileHideAppOthers read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiObjectViewAction = class(TPyDelphiCustomViewAction) + private + function GetDelphiObject: TObjectViewAction; + procedure SetDelphiObject(const Value: TObjectViewAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TObjectViewAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiVirtualKeyboard = class(TPyDelphiObjectViewAction) + private + function GetDelphiObject: TVirtualKeyboard; + procedure SetDelphiObject(const Value: TVirtualKeyboard); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TVirtualKeyboard read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiViewAction = class(TPyDelphiObjectViewAction) + private + function GetDelphiObject: TViewAction; + procedure SetDelphiObject(const Value: TViewAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TViewAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiBaseValueRange = class(TPyDelphiPersistent) + private + function GetDelphiObject: TBaseValueRange; + procedure SetDelphiObject(const Value: TBaseValueRange); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TBaseValueRange read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomValueRange = class(TPyDelphiBaseValueRange) + private + function GetDelphiObject: TCustomValueRange; + procedure SetDelphiObject(const Value: TCustomValueRange); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomValueRange read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiValueRange = class(TPyDelphiCustomValueRange) + private + function GetDelphiObject: TValueRange; + procedure SetDelphiObject(const Value: TValueRange); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TValueRange read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiCustomValueRangeAction = class(TPyDelphiCustomControlAction) + private + function GetDelphiObject: TCustomValueRangeAction; + procedure SetDelphiObject(const Value: TCustomValueRangeAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TCustomValueRangeAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiValueRangeAction = class(TPyDelphiCustomValueRangeAction) + private + function GetDelphiObject: TValueRangeAction; + procedure SetDelphiObject(const Value: TValueRangeAction); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TValueRangeAction read GetDelphiObject + write SetDelphiObject; + end; + +implementation + +type + TStdActnsRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TFMXStdActns } + +function TStdActnsRegistration.Name: string; +begin + Result := 'StdActns'; +end; + +procedure TStdActnsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TStdActnsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiHintAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSysCommonAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileExit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiWindowClose); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileHideApp); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFileHideAppOthers); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiObjectViewAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiVirtualKeyboard); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiViewAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseValueRange); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomValueRange); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiValueRange); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomValueRangeAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiValueRangeAction); +end; + +{ TPyDelphiHintAction } + +class function TPyDelphiHintAction.DelphiObjectClass: TClass; +begin + Result := THintAction; +end; + +function TPyDelphiHintAction.GetDelphiObject: THintAction; +begin + Result := THintAction(inherited DelphiObject); +end; + +procedure TPyDelphiHintAction.SetDelphiObject(const Value: THintAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSysCommonAction } + +class function TPyDelphiSysCommonAction.DelphiObjectClass: TClass; +begin + Result := TSysCommonAction; +end; + +function TPyDelphiSysCommonAction.GetDelphiObject: TSysCommonAction; +begin + Result := TSysCommonAction(inherited DelphiObject); +end; + +procedure TPyDelphiSysCommonAction.SetDelphiObject( + const Value: TSysCommonAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileExit } + +class function TPyDelphiFileExit.DelphiObjectClass: TClass; +begin + Result := TFileExit; +end; + +function TPyDelphiFileExit.GetDelphiObject: TFileExit; +begin + Result := TFileExit(inherited DelphiObject); +end; + +procedure TPyDelphiFileExit.SetDelphiObject(const Value: TFileExit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiWindowClose } + +class function TPyDelphiWindowClose.DelphiObjectClass: TClass; +begin + Result := TWindowClose; +end; + +function TPyDelphiWindowClose.GetDelphiObject: TWindowClose; +begin + Result := TWindowClose(inherited DelphiObject); +end; + +procedure TPyDelphiWindowClose.SetDelphiObject(const Value: TWindowClose); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileHideApp } + +class function TPyDelphiFileHideApp.DelphiObjectClass: TClass; +begin + Result := TFileHideApp; +end; + +function TPyDelphiFileHideApp.GetDelphiObject: TFileHideApp; +begin + Result := TFileHideApp(inherited DelphiObject); +end; + +procedure TPyDelphiFileHideApp.SetDelphiObject(const Value: TFileHideApp); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiFileHideAppOthers } + +class function TPyDelphiFileHideAppOthers.DelphiObjectClass: TClass; +begin + Result := TFileHideAppOthers; +end; + +function TPyDelphiFileHideAppOthers.GetDelphiObject: TFileHideAppOthers; +begin + Result := TFileHideAppOthers(inherited DelphiObject); +end; + +procedure TPyDelphiFileHideAppOthers.SetDelphiObject( + const Value: TFileHideAppOthers); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiObjectViewAction } + +class function TPyDelphiObjectViewAction.DelphiObjectClass: TClass; +begin + Result := TObjectViewAction; +end; + +function TPyDelphiObjectViewAction.GetDelphiObject: TObjectViewAction; +begin + Result := TObjectViewAction(inherited DelphiObject); +end; + +procedure TPyDelphiObjectViewAction.SetDelphiObject( + const Value: TObjectViewAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiVirtualKeyboard } + +class function TPyDelphiVirtualKeyboard.DelphiObjectClass: TClass; +begin + Result := TVirtualKeyboard; +end; + +function TPyDelphiVirtualKeyboard.GetDelphiObject: TVirtualKeyboard; +begin + Result := TVirtualKeyboard(inherited DelphiObject); +end; + +procedure TPyDelphiVirtualKeyboard.SetDelphiObject( + const Value: TVirtualKeyboard); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiViewAction } + +class function TPyDelphiViewAction.DelphiObjectClass: TClass; +begin + Result := TViewAction; +end; + +function TPyDelphiViewAction.GetDelphiObject: TViewAction; +begin + Result := TViewAction(inherited DelphiObject); +end; + +procedure TPyDelphiViewAction.SetDelphiObject(const Value: TViewAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBaseValueRange } + +class function TPyDelphiBaseValueRange.DelphiObjectClass: TClass; +begin + Result := TBaseValueRange; +end; + +function TPyDelphiBaseValueRange.GetDelphiObject: TBaseValueRange; +begin + Result := TBaseValueRange(inherited DelphiObject); +end; + +procedure TPyDelphiBaseValueRange.SetDelphiObject(const Value: TBaseValueRange); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomValueRange } + +class function TPyDelphiCustomValueRange.DelphiObjectClass: TClass; +begin + Result := TCustomValueRange; +end; + +function TPyDelphiCustomValueRange.GetDelphiObject: TCustomValueRange; +begin + Result := TCustomValueRange(inherited DelphiObject); +end; + +procedure TPyDelphiCustomValueRange.SetDelphiObject( + const Value: TCustomValueRange); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiValueRange } + +class function TPyDelphiValueRange.DelphiObjectClass: TClass; +begin + Result := TValueRange; +end; + +function TPyDelphiValueRange.GetDelphiObject: TValueRange; +begin + Result := TValueRange(inherited DelphiObject); +end; + +procedure TPyDelphiValueRange.SetDelphiObject(const Value: TValueRange); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomValueRangeAction } + +class function TPyDelphiCustomValueRangeAction.DelphiObjectClass: TClass; +begin + Result := TCustomValueRangeAction; +end; + +function TPyDelphiCustomValueRangeAction.GetDelphiObject: TCustomValueRangeAction; +begin + Result := TCustomValueRangeAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomValueRangeAction.SetDelphiObject( + const Value: TCustomValueRangeAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiValueRangeAction } + +class function TPyDelphiValueRangeAction.DelphiObjectClass: TClass; +begin + Result := TValueRangeAction; +end; + +function TPyDelphiValueRangeAction.GetDelphiObject: TValueRangeAction; +begin + Result := TValueRangeAction(inherited DelphiObject); +end; + +procedure TPyDelphiValueRangeAction.SetDelphiObject( + const Value: TValueRangeAction); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TStdActnsRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxStdCtrls.pas b/Source/fmx/WrapFmxStdCtrls.pas index aba27274..e1af1763 100644 --- a/Source/fmx/WrapFmxStdCtrls.pas +++ b/Source/fmx/WrapFmxStdCtrls.pas @@ -1,942 +1,942 @@ -{$I ..\Definition.Inc} - -unit WrapFmxStdCtrls; - -interface - -uses - Classes, SysUtils, FMX.StdCtrls, - PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxControls, WrapFmxActnList; - -type - TPyDelphiPresentedTextControl = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TPresentedTextControl; - procedure SetDelphiObject(const Value: TPresentedTextControl); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TPresentedTextControl read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPanel = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TPanel; - procedure SetDelphiObject(const Value: TPanel); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TPanel read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCalloutPanel = class(TPyDelphiPanel) - private - function GetDelphiObject: TCalloutPanel; - procedure SetDelphiObject(const Value: TCalloutPanel); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCalloutPanel read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiLabel = class(TPyDelphiPresentedTextControl) - private - function GetDelphiObject: TLabel; - procedure SetDelphiObject(const Value: TLabel); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TLabel read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomButton = class(TPyDelphiPresentedTextControl) - private - function GetDelphiObject: TCustomButton; - procedure SetDelphiObject(const Value: TCustomButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiButton = class(TPyDelphiCustomButton) - private - function GetDelphiObject: TButton; - procedure SetDelphiObject(const Value: TButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSpeedButton = class(TPyDelphiCustomButton) - private - function GetDelphiObject: TSpeedButton; - procedure SetDelphiObject(const Value: TSpeedButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSpeedButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomCornerButton = class(TPyDelphiCustomButton) - private - function GetDelphiObject: TCustomCornerButton; - procedure SetDelphiObject(const Value: TCustomCornerButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomCornerButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCornerButton = class(TPyDelphiCustomCornerButton) - private - function GetDelphiObject: TCornerButton; - procedure SetDelphiObject(const Value: TCornerButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCornerButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCheckBox = class(TPyDelphiPresentedTextControl) - private - function GetDelphiObject: TCheckBox; - procedure SetDelphiObject(const Value: TCheckBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCheckBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiRadioButton = class(TPyDelphiPresentedTextControl) - private - function GetDelphiObject: TRadioButton; - procedure SetDelphiObject(const Value: TRadioButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TRadioButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiGroupBox = class(TPyDelphiPresentedTextControl) - private - function GetDelphiObject: TGroupBox; - procedure SetDelphiObject(const Value: TGroupBox); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TGroupBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiStatusBar = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TStatusBar; - procedure SetDelphiObject(const Value: TStatusBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TStatusBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiToolBar = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TToolBar; - procedure SetDelphiObject(const Value: TToolBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TToolBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSizeGrip = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TSizeGrip; - procedure SetDelphiObject(const Value: TSizeGrip); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSizeGrip read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSplitter = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TSplitter; - procedure SetDelphiObject(const Value: TSplitter); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSplitter read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiProgressBar = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TProgressBar; - procedure SetDelphiObject(const Value: TProgressBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TProgressBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiThumb = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TThumb; - procedure SetDelphiObject(const Value: TThumb); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TThumb read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomTrack = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TCustomTrack; - procedure SetDelphiObject(const Value: TCustomTrack); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomTrack read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiTrack = class(TPyDelphiCustomTrack) - private - function GetDelphiObject: TTrack; - procedure SetDelphiObject(const Value: TTrack); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TTrack read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiTrackBar = class(TPyDelphiCustomTrack) - private - function GetDelphiObject: TTrackBar; - procedure SetDelphiObject(const Value: TTrackBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TTrackBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiBitmapTrackBar = class(TPyDelphiTrackBar) - private - function GetDelphiObject: TBitmapTrackBar; - procedure SetDelphiObject(const Value: TBitmapTrackBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TBitmapTrackBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomSwitch = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TCustomSwitch; - procedure SetDelphiObject(const Value: TCustomSwitch); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TCustomSwitch read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSwitch = class(TPyDelphiCustomSwitch) - private - function GetDelphiObject: TSwitch; - procedure SetDelphiObject(const Value: TSwitch); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSwitch read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiScrollBar = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TScrollBar; - procedure SetDelphiObject(const Value: TScrollBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TScrollBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSmallScrollBar = class(TPyDelphiScrollBar) - private - function GetDelphiObject: TSmallScrollBar; - procedure SetDelphiObject(const Value: TSmallScrollBar); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TSmallScrollBar read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiAniIndicator = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TAniIndicator; - procedure SetDelphiObject(const Value: TAniIndicator); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TAniIndicator read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiArcDial = class(TPyDelphiPresentedControl) - private - function GetDelphiObject: TArcDial; - procedure SetDelphiObject(const Value: TArcDial); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TArcDial read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiExpanderButton = class(TPyDelphiCustomButton) - private - function GetDelphiObject: TExpanderButton; - procedure SetDelphiObject(const Value: TExpanderButton); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TExpanderButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiExpander = class(TPyDelphiTextControl) - private - function GetDelphiObject: TExpander; - procedure SetDelphiObject(const Value: TExpander); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TExpander read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiImageControl = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TImageControl; - procedure SetDelphiObject(const Value: TImageControl); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TImageControl read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiPathLabel = class(TPyDelphiStyledControl) - private - function GetDelphiObject: TPathLabel; - procedure SetDelphiObject(const Value: TPathLabel); - public - class function DelphiObjectClass: TClass; override; - // Properties - property DelphiObject: TPathLabel read GetDelphiObject write SetDelphiObject; - end; - -implementation - -{ Register the wrappers, the globals and the constants } -type - TStdCtrlsRegistration = class(TRegisteredUnit) - public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; - end; - -{ TStdCtrlsRegistration } - -procedure TStdCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TStdCtrlsRegistration.Name: string; -begin - Result := 'StdCtrls'; -end; - -procedure TStdCtrlsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedTextControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPanel); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCalloutPanel); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLabel); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpeedButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCornerButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCornerButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCheckBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiRadioButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGroupBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSizeGrip); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSplitter); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiProgressBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiThumb); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTrack); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrack); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBitmapTrackBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomSwitch); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSwitch); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScrollBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSmallScrollBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAniIndicator); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiArcDial); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiExpanderButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiExpander); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPathLabel); -end; - -{ TPyDelphiPresentedTextControl } - -class function TPyDelphiPresentedTextControl.DelphiObjectClass: TClass; -begin - Result := TPresentedTextControl; -end; - -function TPyDelphiPresentedTextControl.GetDelphiObject: TPresentedTextControl; -begin - Result := TPresentedTextControl(inherited DelphiObject); -end; - -procedure TPyDelphiPresentedTextControl.SetDelphiObject( - const Value: TPresentedTextControl); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPanel } - -class function TPyDelphiPanel.DelphiObjectClass: TClass; -begin - Result := TPanel; -end; - -function TPyDelphiPanel.GetDelphiObject: TPanel; -begin - Result := TPanel(inherited DelphiObject); -end; - -procedure TPyDelphiPanel.SetDelphiObject(const Value: TPanel); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCalloutPanel } - -class function TPyDelphiCalloutPanel.DelphiObjectClass: TClass; -begin - Result := TCalloutPanel; -end; - -function TPyDelphiCalloutPanel.GetDelphiObject: TCalloutPanel; -begin - Result := TCalloutPanel(inherited DelphiObject); -end; - -procedure TPyDelphiCalloutPanel.SetDelphiObject(const Value: TCalloutPanel); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiLabel } - -class function TPyDelphiLabel.DelphiObjectClass: TClass; -begin - Result := TLabel; -end; - -function TPyDelphiLabel.GetDelphiObject: TLabel; -begin - Result := TLabel(inherited DelphiObject); -end; - -procedure TPyDelphiLabel.SetDelphiObject(const Value: TLabel); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomButton } - -class function TPyDelphiCustomButton.DelphiObjectClass: TClass; -begin - Result := TCustomButton; -end; - -function TPyDelphiCustomButton.GetDelphiObject: TCustomButton; -begin - Result := TCustomButton(inherited DelphiObject); -end; - -procedure TPyDelphiCustomButton.SetDelphiObject(const Value: TCustomButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiButton } - -class function TPyDelphiButton.DelphiObjectClass: TClass; -begin - Result := TButton; -end; - -function TPyDelphiButton.GetDelphiObject: TButton; -begin - Result := TButton(inherited DelphiObject); -end; - -procedure TPyDelphiButton.SetDelphiObject(const Value: TButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSpeedButton } - -class function TPyDelphiSpeedButton.DelphiObjectClass: TClass; -begin - Result := TSpeedButton; -end; - -function TPyDelphiSpeedButton.GetDelphiObject: TSpeedButton; -begin - Result := TSpeedButton(inherited DelphiObject); -end; - -procedure TPyDelphiSpeedButton.SetDelphiObject(const Value: TSpeedButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomCornerButton } - -class function TPyDelphiCustomCornerButton.DelphiObjectClass: TClass; -begin - Result := TCustomCornerButton; -end; - -function TPyDelphiCustomCornerButton.GetDelphiObject: TCustomCornerButton; -begin - Result := TCustomCornerButton(inherited DelphiObject); -end; - -procedure TPyDelphiCustomCornerButton.SetDelphiObject( - const Value: TCustomCornerButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCornerButton } - -class function TPyDelphiCornerButton.DelphiObjectClass: TClass; -begin - Result := TCornerButton; -end; - -function TPyDelphiCornerButton.GetDelphiObject: TCornerButton; -begin - Result := TCornerButton(inherited DelphiObject); -end; - -procedure TPyDelphiCornerButton.SetDelphiObject(const Value: TCornerButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCheckBox } - -class function TPyDelphiCheckBox.DelphiObjectClass: TClass; -begin - Result := TCheckBox; -end; - -function TPyDelphiCheckBox.GetDelphiObject: TCheckBox; -begin - Result := TCheckBox(inherited DelphiObject); -end; - -procedure TPyDelphiCheckBox.SetDelphiObject(const Value: TCheckBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiRadioButton } - -class function TPyDelphiRadioButton.DelphiObjectClass: TClass; -begin - Result := TRadioButton; -end; - -function TPyDelphiRadioButton.GetDelphiObject: TRadioButton; -begin - Result := TRadioButton(inherited DelphiObject); -end; - -procedure TPyDelphiRadioButton.SetDelphiObject(const Value: TRadioButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiGroupBox } - -class function TPyDelphiGroupBox.DelphiObjectClass: TClass; -begin - Result := TGroupBox; -end; - -function TPyDelphiGroupBox.GetDelphiObject: TGroupBox; -begin - Result := TGroupBox(inherited DelphiObject); -end; - -procedure TPyDelphiGroupBox.SetDelphiObject(const Value: TGroupBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiStatusBar } - -class function TPyDelphiStatusBar.DelphiObjectClass: TClass; -begin - Result := TStatusBar; -end; - -function TPyDelphiStatusBar.GetDelphiObject: TStatusBar; -begin - Result := TStatusBar(inherited DelphiObject); -end; - -procedure TPyDelphiStatusBar.SetDelphiObject(const Value: TStatusBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiToolBar } - -class function TPyDelphiToolBar.DelphiObjectClass: TClass; -begin - Result := TToolBar; -end; - -function TPyDelphiToolBar.GetDelphiObject: TToolBar; -begin - Result := TToolBar(inherited DelphiObject); -end; - -procedure TPyDelphiToolBar.SetDelphiObject(const Value: TToolBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSizeGrip } - -class function TPyDelphiSizeGrip.DelphiObjectClass: TClass; -begin - Result := TSizeGrip; -end; - -function TPyDelphiSizeGrip.GetDelphiObject: TSizeGrip; -begin - Result := TSizeGrip(inherited DelphiObject); -end; - -procedure TPyDelphiSizeGrip.SetDelphiObject(const Value: TSizeGrip); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSplitter } - -class function TPyDelphiSplitter.DelphiObjectClass: TClass; -begin - Result := TSplitter; -end; - -function TPyDelphiSplitter.GetDelphiObject: TSplitter; -begin - Result := TSplitter(inherited DelphiObject); -end; - -procedure TPyDelphiSplitter.SetDelphiObject(const Value: TSplitter); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiProgressBar } - -class function TPyDelphiProgressBar.DelphiObjectClass: TClass; -begin - Result := TProgressBar; -end; - -function TPyDelphiProgressBar.GetDelphiObject: TProgressBar; -begin - Result := TProgressBar(inherited DelphiObject); -end; - -procedure TPyDelphiProgressBar.SetDelphiObject(const Value: TProgressBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiThumb } - -class function TPyDelphiThumb.DelphiObjectClass: TClass; -begin - Result := TThumb; -end; - -function TPyDelphiThumb.GetDelphiObject: TThumb; -begin - Result := TThumb(inherited DelphiObject); -end; - -procedure TPyDelphiThumb.SetDelphiObject(const Value: TThumb); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomTrack } - -class function TPyDelphiCustomTrack.DelphiObjectClass: TClass; -begin - Result := TCustomTrack; -end; - -function TPyDelphiCustomTrack.GetDelphiObject: TCustomTrack; -begin - Result := TCustomTrack(inherited DelphiObject); -end; - -procedure TPyDelphiCustomTrack.SetDelphiObject(const Value: TCustomTrack); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiTrack } - -class function TPyDelphiTrack.DelphiObjectClass: TClass; -begin - Result := TTrack; -end; - -function TPyDelphiTrack.GetDelphiObject: TTrack; -begin - Result := TTrack(inherited DelphiObject); -end; - -procedure TPyDelphiTrack.SetDelphiObject(const Value: TTrack); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiTrackBar } - -class function TPyDelphiTrackBar.DelphiObjectClass: TClass; -begin - Result := TTrackBar; -end; - -function TPyDelphiTrackBar.GetDelphiObject: TTrackBar; -begin - Result := TTrackBar(inherited DelphiObject); -end; - -procedure TPyDelphiTrackBar.SetDelphiObject(const Value: TTrackBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiBitmapTrackBar } - -class function TPyDelphiBitmapTrackBar.DelphiObjectClass: TClass; -begin - Result := TBitmapTrackBar; -end; - -function TPyDelphiBitmapTrackBar.GetDelphiObject: TBitmapTrackBar; -begin - Result := TBitmapTrackBar(inherited DelphiObject); -end; - -procedure TPyDelphiBitmapTrackBar.SetDelphiObject(const Value: TBitmapTrackBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomSwitch } - -class function TPyDelphiCustomSwitch.DelphiObjectClass: TClass; -begin - Result := TCustomSwitch; -end; - -function TPyDelphiCustomSwitch.GetDelphiObject: TCustomSwitch; -begin - Result := TCustomSwitch(inherited DelphiObject); -end; - -procedure TPyDelphiCustomSwitch.SetDelphiObject(const Value: TCustomSwitch); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSwitch } - -class function TPyDelphiSwitch.DelphiObjectClass: TClass; -begin - Result := TSwitch; -end; - -function TPyDelphiSwitch.GetDelphiObject: TSwitch; -begin - Result := TSwitch(inherited DelphiObject); -end; - -procedure TPyDelphiSwitch.SetDelphiObject(const Value: TSwitch); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiScrollBar } - -class function TPyDelphiScrollBar.DelphiObjectClass: TClass; -begin - Result := TScrollBar; -end; - -function TPyDelphiScrollBar.GetDelphiObject: TScrollBar; -begin - Result := TScrollBar(inherited DelphiObject); -end; - -procedure TPyDelphiScrollBar.SetDelphiObject(const Value: TScrollBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSmallScrollBar } - -class function TPyDelphiSmallScrollBar.DelphiObjectClass: TClass; -begin - Result := TSmallScrollBar; -end; - -function TPyDelphiSmallScrollBar.GetDelphiObject: TSmallScrollBar; -begin - Result := TSmallScrollBar(inherited DelphiObject); -end; - -procedure TPyDelphiSmallScrollBar.SetDelphiObject(const Value: TSmallScrollBar); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiAniIndicator } - -class function TPyDelphiAniIndicator.DelphiObjectClass: TClass; -begin - Result := TAniIndicator; -end; - -function TPyDelphiAniIndicator.GetDelphiObject: TAniIndicator; -begin - Result := TAniIndicator(inherited DelphiObject); -end; - -procedure TPyDelphiAniIndicator.SetDelphiObject(const Value: TAniIndicator); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiArcDial } - -class function TPyDelphiArcDial.DelphiObjectClass: TClass; -begin - Result := TArcDial; -end; - -function TPyDelphiArcDial.GetDelphiObject: TArcDial; -begin - Result := TArcDial(inherited DelphiObject); -end; - -procedure TPyDelphiArcDial.SetDelphiObject(const Value: TArcDial); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiExpanderButton } - -class function TPyDelphiExpanderButton.DelphiObjectClass: TClass; -begin - Result := TExpanderButton; -end; - -function TPyDelphiExpanderButton.GetDelphiObject: TExpanderButton; -begin - Result := TExpanderButton(inherited DelphiObject); -end; - -procedure TPyDelphiExpanderButton.SetDelphiObject(const Value: TExpanderButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiExpander } - -class function TPyDelphiExpander.DelphiObjectClass: TClass; -begin - Result := TExpander; -end; - -function TPyDelphiExpander.GetDelphiObject: TExpander; -begin - Result := TExpander(inherited DelphiObject); -end; - -procedure TPyDelphiExpander.SetDelphiObject(const Value: TExpander); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiImageControl } - -class function TPyDelphiImageControl.DelphiObjectClass: TClass; -begin - Result := TImageControl; -end; - -function TPyDelphiImageControl.GetDelphiObject: TImageControl; -begin - Result := TImageControl(inherited DelphiObject); -end; - -procedure TPyDelphiImageControl.SetDelphiObject(const Value: TImageControl); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiPathLabel } - -class function TPyDelphiPathLabel.DelphiObjectClass: TClass; -begin - Result := TPathLabel; -end; - -function TPyDelphiPathLabel.GetDelphiObject: TPathLabel; -begin - Result := TPathLabel(inherited DelphiObject); -end; - -procedure TPyDelphiPathLabel.SetDelphiObject(const Value: TPathLabel); -begin - inherited DelphiObject := Value; -end; - -initialization - RegisteredUnits.Add(TStdCtrlsRegistration.Create); - -end. +{$I ..\Definition.Inc} + +unit WrapFmxStdCtrls; + +interface + +uses + Classes, SysUtils, FMX.StdCtrls, + PythonEngine, WrapDelphi, WrapDelphiClasses, WrapFmxControls, WrapFmxActnList; + +type + TPyDelphiPresentedTextControl = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TPresentedTextControl; + procedure SetDelphiObject(const Value: TPresentedTextControl); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TPresentedTextControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPanel = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TPanel; + procedure SetDelphiObject(const Value: TPanel); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TPanel read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCalloutPanel = class(TPyDelphiPanel) + private + function GetDelphiObject: TCalloutPanel; + procedure SetDelphiObject(const Value: TCalloutPanel); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCalloutPanel read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiLabel = class(TPyDelphiPresentedTextControl) + private + function GetDelphiObject: TLabel; + procedure SetDelphiObject(const Value: TLabel); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TLabel read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomButton = class(TPyDelphiPresentedTextControl) + private + function GetDelphiObject: TCustomButton; + procedure SetDelphiObject(const Value: TCustomButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiButton = class(TPyDelphiCustomButton) + private + function GetDelphiObject: TButton; + procedure SetDelphiObject(const Value: TButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSpeedButton = class(TPyDelphiCustomButton) + private + function GetDelphiObject: TSpeedButton; + procedure SetDelphiObject(const Value: TSpeedButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSpeedButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomCornerButton = class(TPyDelphiCustomButton) + private + function GetDelphiObject: TCustomCornerButton; + procedure SetDelphiObject(const Value: TCustomCornerButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomCornerButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCornerButton = class(TPyDelphiCustomCornerButton) + private + function GetDelphiObject: TCornerButton; + procedure SetDelphiObject(const Value: TCornerButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCornerButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCheckBox = class(TPyDelphiPresentedTextControl) + private + function GetDelphiObject: TCheckBox; + procedure SetDelphiObject(const Value: TCheckBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCheckBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiRadioButton = class(TPyDelphiPresentedTextControl) + private + function GetDelphiObject: TRadioButton; + procedure SetDelphiObject(const Value: TRadioButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TRadioButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiGroupBox = class(TPyDelphiPresentedTextControl) + private + function GetDelphiObject: TGroupBox; + procedure SetDelphiObject(const Value: TGroupBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TGroupBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiStatusBar = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TStatusBar; + procedure SetDelphiObject(const Value: TStatusBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TStatusBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiToolBar = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TToolBar; + procedure SetDelphiObject(const Value: TToolBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TToolBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSizeGrip = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TSizeGrip; + procedure SetDelphiObject(const Value: TSizeGrip); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSizeGrip read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSplitter = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TSplitter; + procedure SetDelphiObject(const Value: TSplitter); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSplitter read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiProgressBar = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TProgressBar; + procedure SetDelphiObject(const Value: TProgressBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TProgressBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiThumb = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TThumb; + procedure SetDelphiObject(const Value: TThumb); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TThumb read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomTrack = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TCustomTrack; + procedure SetDelphiObject(const Value: TCustomTrack); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomTrack read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTrack = class(TPyDelphiCustomTrack) + private + function GetDelphiObject: TTrack; + procedure SetDelphiObject(const Value: TTrack); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TTrack read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTrackBar = class(TPyDelphiCustomTrack) + private + function GetDelphiObject: TTrackBar; + procedure SetDelphiObject(const Value: TTrackBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TTrackBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiBitmapTrackBar = class(TPyDelphiTrackBar) + private + function GetDelphiObject: TBitmapTrackBar; + procedure SetDelphiObject(const Value: TBitmapTrackBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TBitmapTrackBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomSwitch = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TCustomSwitch; + procedure SetDelphiObject(const Value: TCustomSwitch); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomSwitch read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSwitch = class(TPyDelphiCustomSwitch) + private + function GetDelphiObject: TSwitch; + procedure SetDelphiObject(const Value: TSwitch); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSwitch read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiScrollBar = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TScrollBar; + procedure SetDelphiObject(const Value: TScrollBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TScrollBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSmallScrollBar = class(TPyDelphiScrollBar) + private + function GetDelphiObject: TSmallScrollBar; + procedure SetDelphiObject(const Value: TSmallScrollBar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TSmallScrollBar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiAniIndicator = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TAniIndicator; + procedure SetDelphiObject(const Value: TAniIndicator); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TAniIndicator read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiArcDial = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TArcDial; + procedure SetDelphiObject(const Value: TArcDial); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TArcDial read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiExpanderButton = class(TPyDelphiCustomButton) + private + function GetDelphiObject: TExpanderButton; + procedure SetDelphiObject(const Value: TExpanderButton); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TExpanderButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiExpander = class(TPyDelphiTextControl) + private + function GetDelphiObject: TExpander; + procedure SetDelphiObject(const Value: TExpander); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TExpander read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiImageControl = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TImageControl; + procedure SetDelphiObject(const Value: TImageControl); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TImageControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiPathLabel = class(TPyDelphiStyledControl) + private + function GetDelphiObject: TPathLabel; + procedure SetDelphiObject(const Value: TPathLabel); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TPathLabel read GetDelphiObject write SetDelphiObject; + end; + +implementation + +{ Register the wrappers, the globals and the constants } +type + TStdCtrlsRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TStdCtrlsRegistration } + +procedure TStdCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TStdCtrlsRegistration.Name: string; +begin + Result := 'StdCtrls'; +end; + +procedure TStdCtrlsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedTextControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPanel); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCalloutPanel); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLabel); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpeedButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCornerButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCornerButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCheckBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiRadioButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiGroupBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSizeGrip); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSplitter); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiProgressBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiThumb); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTrack); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrack); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBitmapTrackBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomSwitch); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSwitch); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScrollBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSmallScrollBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAniIndicator); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiArcDial); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiExpanderButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiExpander); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPathLabel); +end; + +{ TPyDelphiPresentedTextControl } + +class function TPyDelphiPresentedTextControl.DelphiObjectClass: TClass; +begin + Result := TPresentedTextControl; +end; + +function TPyDelphiPresentedTextControl.GetDelphiObject: TPresentedTextControl; +begin + Result := TPresentedTextControl(inherited DelphiObject); +end; + +procedure TPyDelphiPresentedTextControl.SetDelphiObject( + const Value: TPresentedTextControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPanel } + +class function TPyDelphiPanel.DelphiObjectClass: TClass; +begin + Result := TPanel; +end; + +function TPyDelphiPanel.GetDelphiObject: TPanel; +begin + Result := TPanel(inherited DelphiObject); +end; + +procedure TPyDelphiPanel.SetDelphiObject(const Value: TPanel); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCalloutPanel } + +class function TPyDelphiCalloutPanel.DelphiObjectClass: TClass; +begin + Result := TCalloutPanel; +end; + +function TPyDelphiCalloutPanel.GetDelphiObject: TCalloutPanel; +begin + Result := TCalloutPanel(inherited DelphiObject); +end; + +procedure TPyDelphiCalloutPanel.SetDelphiObject(const Value: TCalloutPanel); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLabel } + +class function TPyDelphiLabel.DelphiObjectClass: TClass; +begin + Result := TLabel; +end; + +function TPyDelphiLabel.GetDelphiObject: TLabel; +begin + Result := TLabel(inherited DelphiObject); +end; + +procedure TPyDelphiLabel.SetDelphiObject(const Value: TLabel); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomButton } + +class function TPyDelphiCustomButton.DelphiObjectClass: TClass; +begin + Result := TCustomButton; +end; + +function TPyDelphiCustomButton.GetDelphiObject: TCustomButton; +begin + Result := TCustomButton(inherited DelphiObject); +end; + +procedure TPyDelphiCustomButton.SetDelphiObject(const Value: TCustomButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiButton } + +class function TPyDelphiButton.DelphiObjectClass: TClass; +begin + Result := TButton; +end; + +function TPyDelphiButton.GetDelphiObject: TButton; +begin + Result := TButton(inherited DelphiObject); +end; + +procedure TPyDelphiButton.SetDelphiObject(const Value: TButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSpeedButton } + +class function TPyDelphiSpeedButton.DelphiObjectClass: TClass; +begin + Result := TSpeedButton; +end; + +function TPyDelphiSpeedButton.GetDelphiObject: TSpeedButton; +begin + Result := TSpeedButton(inherited DelphiObject); +end; + +procedure TPyDelphiSpeedButton.SetDelphiObject(const Value: TSpeedButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomCornerButton } + +class function TPyDelphiCustomCornerButton.DelphiObjectClass: TClass; +begin + Result := TCustomCornerButton; +end; + +function TPyDelphiCustomCornerButton.GetDelphiObject: TCustomCornerButton; +begin + Result := TCustomCornerButton(inherited DelphiObject); +end; + +procedure TPyDelphiCustomCornerButton.SetDelphiObject( + const Value: TCustomCornerButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCornerButton } + +class function TPyDelphiCornerButton.DelphiObjectClass: TClass; +begin + Result := TCornerButton; +end; + +function TPyDelphiCornerButton.GetDelphiObject: TCornerButton; +begin + Result := TCornerButton(inherited DelphiObject); +end; + +procedure TPyDelphiCornerButton.SetDelphiObject(const Value: TCornerButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCheckBox } + +class function TPyDelphiCheckBox.DelphiObjectClass: TClass; +begin + Result := TCheckBox; +end; + +function TPyDelphiCheckBox.GetDelphiObject: TCheckBox; +begin + Result := TCheckBox(inherited DelphiObject); +end; + +procedure TPyDelphiCheckBox.SetDelphiObject(const Value: TCheckBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiRadioButton } + +class function TPyDelphiRadioButton.DelphiObjectClass: TClass; +begin + Result := TRadioButton; +end; + +function TPyDelphiRadioButton.GetDelphiObject: TRadioButton; +begin + Result := TRadioButton(inherited DelphiObject); +end; + +procedure TPyDelphiRadioButton.SetDelphiObject(const Value: TRadioButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiGroupBox } + +class function TPyDelphiGroupBox.DelphiObjectClass: TClass; +begin + Result := TGroupBox; +end; + +function TPyDelphiGroupBox.GetDelphiObject: TGroupBox; +begin + Result := TGroupBox(inherited DelphiObject); +end; + +procedure TPyDelphiGroupBox.SetDelphiObject(const Value: TGroupBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiStatusBar } + +class function TPyDelphiStatusBar.DelphiObjectClass: TClass; +begin + Result := TStatusBar; +end; + +function TPyDelphiStatusBar.GetDelphiObject: TStatusBar; +begin + Result := TStatusBar(inherited DelphiObject); +end; + +procedure TPyDelphiStatusBar.SetDelphiObject(const Value: TStatusBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiToolBar } + +class function TPyDelphiToolBar.DelphiObjectClass: TClass; +begin + Result := TToolBar; +end; + +function TPyDelphiToolBar.GetDelphiObject: TToolBar; +begin + Result := TToolBar(inherited DelphiObject); +end; + +procedure TPyDelphiToolBar.SetDelphiObject(const Value: TToolBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSizeGrip } + +class function TPyDelphiSizeGrip.DelphiObjectClass: TClass; +begin + Result := TSizeGrip; +end; + +function TPyDelphiSizeGrip.GetDelphiObject: TSizeGrip; +begin + Result := TSizeGrip(inherited DelphiObject); +end; + +procedure TPyDelphiSizeGrip.SetDelphiObject(const Value: TSizeGrip); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSplitter } + +class function TPyDelphiSplitter.DelphiObjectClass: TClass; +begin + Result := TSplitter; +end; + +function TPyDelphiSplitter.GetDelphiObject: TSplitter; +begin + Result := TSplitter(inherited DelphiObject); +end; + +procedure TPyDelphiSplitter.SetDelphiObject(const Value: TSplitter); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiProgressBar } + +class function TPyDelphiProgressBar.DelphiObjectClass: TClass; +begin + Result := TProgressBar; +end; + +function TPyDelphiProgressBar.GetDelphiObject: TProgressBar; +begin + Result := TProgressBar(inherited DelphiObject); +end; + +procedure TPyDelphiProgressBar.SetDelphiObject(const Value: TProgressBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiThumb } + +class function TPyDelphiThumb.DelphiObjectClass: TClass; +begin + Result := TThumb; +end; + +function TPyDelphiThumb.GetDelphiObject: TThumb; +begin + Result := TThumb(inherited DelphiObject); +end; + +procedure TPyDelphiThumb.SetDelphiObject(const Value: TThumb); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomTrack } + +class function TPyDelphiCustomTrack.DelphiObjectClass: TClass; +begin + Result := TCustomTrack; +end; + +function TPyDelphiCustomTrack.GetDelphiObject: TCustomTrack; +begin + Result := TCustomTrack(inherited DelphiObject); +end; + +procedure TPyDelphiCustomTrack.SetDelphiObject(const Value: TCustomTrack); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTrack } + +class function TPyDelphiTrack.DelphiObjectClass: TClass; +begin + Result := TTrack; +end; + +function TPyDelphiTrack.GetDelphiObject: TTrack; +begin + Result := TTrack(inherited DelphiObject); +end; + +procedure TPyDelphiTrack.SetDelphiObject(const Value: TTrack); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTrackBar } + +class function TPyDelphiTrackBar.DelphiObjectClass: TClass; +begin + Result := TTrackBar; +end; + +function TPyDelphiTrackBar.GetDelphiObject: TTrackBar; +begin + Result := TTrackBar(inherited DelphiObject); +end; + +procedure TPyDelphiTrackBar.SetDelphiObject(const Value: TTrackBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiBitmapTrackBar } + +class function TPyDelphiBitmapTrackBar.DelphiObjectClass: TClass; +begin + Result := TBitmapTrackBar; +end; + +function TPyDelphiBitmapTrackBar.GetDelphiObject: TBitmapTrackBar; +begin + Result := TBitmapTrackBar(inherited DelphiObject); +end; + +procedure TPyDelphiBitmapTrackBar.SetDelphiObject(const Value: TBitmapTrackBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomSwitch } + +class function TPyDelphiCustomSwitch.DelphiObjectClass: TClass; +begin + Result := TCustomSwitch; +end; + +function TPyDelphiCustomSwitch.GetDelphiObject: TCustomSwitch; +begin + Result := TCustomSwitch(inherited DelphiObject); +end; + +procedure TPyDelphiCustomSwitch.SetDelphiObject(const Value: TCustomSwitch); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSwitch } + +class function TPyDelphiSwitch.DelphiObjectClass: TClass; +begin + Result := TSwitch; +end; + +function TPyDelphiSwitch.GetDelphiObject: TSwitch; +begin + Result := TSwitch(inherited DelphiObject); +end; + +procedure TPyDelphiSwitch.SetDelphiObject(const Value: TSwitch); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiScrollBar } + +class function TPyDelphiScrollBar.DelphiObjectClass: TClass; +begin + Result := TScrollBar; +end; + +function TPyDelphiScrollBar.GetDelphiObject: TScrollBar; +begin + Result := TScrollBar(inherited DelphiObject); +end; + +procedure TPyDelphiScrollBar.SetDelphiObject(const Value: TScrollBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSmallScrollBar } + +class function TPyDelphiSmallScrollBar.DelphiObjectClass: TClass; +begin + Result := TSmallScrollBar; +end; + +function TPyDelphiSmallScrollBar.GetDelphiObject: TSmallScrollBar; +begin + Result := TSmallScrollBar(inherited DelphiObject); +end; + +procedure TPyDelphiSmallScrollBar.SetDelphiObject(const Value: TSmallScrollBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiAniIndicator } + +class function TPyDelphiAniIndicator.DelphiObjectClass: TClass; +begin + Result := TAniIndicator; +end; + +function TPyDelphiAniIndicator.GetDelphiObject: TAniIndicator; +begin + Result := TAniIndicator(inherited DelphiObject); +end; + +procedure TPyDelphiAniIndicator.SetDelphiObject(const Value: TAniIndicator); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiArcDial } + +class function TPyDelphiArcDial.DelphiObjectClass: TClass; +begin + Result := TArcDial; +end; + +function TPyDelphiArcDial.GetDelphiObject: TArcDial; +begin + Result := TArcDial(inherited DelphiObject); +end; + +procedure TPyDelphiArcDial.SetDelphiObject(const Value: TArcDial); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiExpanderButton } + +class function TPyDelphiExpanderButton.DelphiObjectClass: TClass; +begin + Result := TExpanderButton; +end; + +function TPyDelphiExpanderButton.GetDelphiObject: TExpanderButton; +begin + Result := TExpanderButton(inherited DelphiObject); +end; + +procedure TPyDelphiExpanderButton.SetDelphiObject(const Value: TExpanderButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiExpander } + +class function TPyDelphiExpander.DelphiObjectClass: TClass; +begin + Result := TExpander; +end; + +function TPyDelphiExpander.GetDelphiObject: TExpander; +begin + Result := TExpander(inherited DelphiObject); +end; + +procedure TPyDelphiExpander.SetDelphiObject(const Value: TExpander); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiImageControl } + +class function TPyDelphiImageControl.DelphiObjectClass: TClass; +begin + Result := TImageControl; +end; + +function TPyDelphiImageControl.GetDelphiObject: TImageControl; +begin + Result := TImageControl(inherited DelphiObject); +end; + +procedure TPyDelphiImageControl.SetDelphiObject(const Value: TImageControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiPathLabel } + +class function TPyDelphiPathLabel.DelphiObjectClass: TClass; +begin + Result := TPathLabel; +end; + +function TPyDelphiPathLabel.GetDelphiObject: TPathLabel; +begin + Result := TPathLabel(inherited DelphiObject); +end; + +procedure TPyDelphiPathLabel.SetDelphiObject(const Value: TPathLabel); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TStdCtrlsRegistration.Create); + +end. diff --git a/Source/lcl/Lcl.PythonGUIInputOutput.pas b/Source/lcl/Lcl.PythonGUIInputOutput.pas index 2f7b02f0..d29e9cbb 100644 --- a/Source/lcl/Lcl.PythonGUIInputOutput.pas +++ b/Source/lcl/Lcl.PythonGUIInputOutput.pas @@ -1,249 +1,249 @@ -{$I ..\Definition.Inc} -unit Lcl.PythonGUIInputOutput; - -(**************************************************************************) -(* *) -(* Module: Unit 'PythonGUIInputOutput' Copyright (c) 1997 *) -(* *) -(* Dr. Dietmar Budelsky *) -(* dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4723 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: p4d@mmm-experts.com *) -(* *) -(* look our page at: http://mmm-experts.com/ *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) -(* *) -(**************************************************************************) -(* Contributors: *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Michiel du Toit (micdutoit@hsbfn.com) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) -(**************************************************************************) - -interface - -uses -{$IFDEF MSWINDOWS} - Windows, Messages, -{$ENDIF} - SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PythonEngine; - -{$IFDEF MSWINDOWS} -const - WM_WriteOutput = WM_USER + 1; -{$ENDIF} - -type - {$IF not Defined(FPC) and (CompilerVersion >= 23)} - [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} - TPythonGUIInputOutput = class(TPythonInputOutput) - private - { Private declarations } - FCustomMemo : TCustomMemo; -{$IFDEF MSWINDOWS} - FWinHandle : HWND; -{$ENDIF} - protected - { Protected declarations } -{$IFDEF MSWINDOWS} - procedure pyGUIOutputWndProc (var Message: TMessage); -{$ENDIF} - procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure SendData( const Data : AnsiString ); override; - function ReceiveData : AnsiString; override; - procedure SendUniData( const Data : UnicodeString ); override; - function ReceiveUniData : UnicodeString; override; - procedure AddPendingWrite; override; - procedure WriteOutput; - public - { Public declarations } - constructor Create( AOwner : TComponent ); override; - destructor Destroy; override; - - procedure DisplayString( const str : string ); - - published - { Published declarations } - property Output : TCustomMemo read FCustomMemo write FCustomMemo; - end; - -implementation - -{$IFDEF FPC} -{$IFDEF MSWINDOWS} -Uses - InterfaceBase; -{$ENDIF} -{$ENDIF} - -{PROTECTED METHODS} - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.Notification(AComponent: TComponent; Operation: TOperation); -begin - inherited; - if Operation = opRemove then - if aComponent = fCustomMemo then - fCustomMemo := nil; -end; - -{------------------------------------------------------------------------------} -{$IFDEF MSWINDOWS} -procedure TPythonGUIInputOutput.pyGUIOutputWndProc(var Message: TMessage); -begin - case Message.Msg of - WM_WriteOutput : WriteOutput; - end;{case} -end; -{$ENDIF} -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.SendData( const Data : AnsiString ); -begin - if Assigned(FOnSendData) then - inherited - else - DisplayString( string(Data) ); -end; - -procedure TPythonGUIInputOutput.SendUniData(const Data: UnicodeString); -begin - if Assigned(FOnSendUniData) then - inherited - else - DisplayString( string(Data) ); -end; - -{------------------------------------------------------------------------------} -function TPythonGUIInputOutput.ReceiveData : AnsiString; -Var - S : string; -begin - if Assigned( FOnReceiveData ) then - Result := inherited ReceiveData - else - begin - InputQuery( 'Query from Python', 'Enter text', S); - Result := AnsiString(S); - end; -end; - -function TPythonGUIInputOutput.ReceiveUniData: UnicodeString; -Var - S : string; -begin - if Assigned( FOnReceiveUniData ) then - Result := inherited ReceiveUniData - else - begin - InputQuery( 'Query from Python', 'Enter text', S); - Result := UnicodeString(S); - end; -end; - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.AddPendingWrite; -begin -{$IFDEF MSWINDOWS} - PostMessage( fWinHandle, WM_WriteOutput, 0, 0 ); -{$ENDIF} -end; - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.WriteOutput; -var - S : string; -begin - if FQueue.Count = 0 then - Exit; - - Lock; - try - while FQueue.Count > 0 do - begin - S := FQueue.Strings[ 0 ]; - FQueue.Delete(0); - DisplayString( S ); - end; - finally - Unlock; - end; -end; - -{PUBLIC METHODS} - -{------------------------------------------------------------------------------} -constructor TPythonGUIInputOutput.Create( AOwner : TComponent ); -begin - inherited Create(AOwner); -{$IFDEF MSWINDOWS} - // Create an internal window for use in delayed writes - // This will allow writes from multiple threads to be queue up and - // then written out to the associated TCustomMemo by the main UI thread. - {$IFDEF FPC} - fWinHandle := WidgetSet.AllocateHWnd(pyGUIOutputWndProc); - {$ELSE} - fWinHandle := Classes.AllocateHWnd(pyGUIOutputWndProc); - {$ENDIF} -{$ENDIF} - UnicodeIO := True; -end; - -{------------------------------------------------------------------------------} -destructor TPythonGUIInputOutput.Destroy; -begin -{$IFDEF MSWINDOWS} - // Destroy the internal window used for Delayed write operations - {$IFDEF FPC} - WidgetSet.DeallocateHWnd(fWinHandle); - {$ELSE} - Classes.DeallocateHWnd(fWinHandle); - {$ENDIF} -{$ENDIF} - inherited Destroy; -end; - -{------------------------------------------------------------------------------} -type - TMyCustomMemo = class(TCustomMemo); - -procedure TPythonGUIInputOutput.DisplayString( const str : string ); -begin - if Assigned(Output) then - begin - if TMyCustomMemo(Output).Lines.Count >= MaxLines then - TMyCustomMemo(Output).Lines.Delete(0); - TMyCustomMemo(Output).Lines.Add(str); -{$IFDEF MSWINDOWS} - SendMessage( Output.Handle, em_ScrollCaret, 0, 0); -{$ENDIF} - end; -end; - -{------------------------------------------------------------------------------} - -end. +{$I ..\Definition.Inc} +unit Lcl.PythonGUIInputOutput; + +(**************************************************************************) +(* *) +(* Module: Unit 'PythonGUIInputOutput' Copyright (c) 1997 *) +(* *) +(* Dr. Dietmar Budelsky *) +(* dbudelsky@web.de *) +(* Germany *) +(* *) +(* Morgan Martinet *) +(* 4723 rue Brebeuf *) +(* H2J 3L2 MONTREAL (QC) *) +(* CANADA *) +(* e-mail: p4d@mmm-experts.com *) +(* *) +(* look our page at: http://mmm-experts.com/ *) +(**************************************************************************) +(* Functionality: Delphi Components that provide an interface to the *) +(* Python language (see python.txt for more infos on *) +(* Python itself). *) +(* *) +(**************************************************************************) +(* Contributors: *) +(* Mark Watts(mark_watts@hotmail.com) *) +(* Michiel du Toit (micdutoit@hsbfn.com) *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(* Dr. Dietmar Budelsky, 1997-11-17 *) +(**************************************************************************) + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, +{$ENDIF} + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PythonEngine; + +{$IFDEF MSWINDOWS} +const + WM_WriteOutput = WM_USER + 1; +{$ENDIF} + +type + {$IF not Defined(FPC) and (CompilerVersion >= 23)} + [ComponentPlatformsAttribute(pidWin32 or pidWin64)] + {$IFEND} + TPythonGUIInputOutput = class(TPythonInputOutput) + private + { Private declarations } + FCustomMemo : TCustomMemo; +{$IFDEF MSWINDOWS} + FWinHandle : HWND; +{$ENDIF} + protected + { Protected declarations } +{$IFDEF MSWINDOWS} + procedure pyGUIOutputWndProc (var Message: TMessage); +{$ENDIF} + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SendData( const Data : AnsiString ); override; + function ReceiveData : AnsiString; override; + procedure SendUniData( const Data : UnicodeString ); override; + function ReceiveUniData : UnicodeString; override; + procedure AddPendingWrite; override; + procedure WriteOutput; + public + { Public declarations } + constructor Create( AOwner : TComponent ); override; + destructor Destroy; override; + + procedure DisplayString( const str : string ); + + published + { Published declarations } + property Output : TCustomMemo read FCustomMemo write FCustomMemo; + end; + +implementation + +{$IFDEF FPC} +{$IFDEF MSWINDOWS} +Uses + InterfaceBase; +{$ENDIF} +{$ENDIF} + +{PROTECTED METHODS} + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if aComponent = fCustomMemo then + fCustomMemo := nil; +end; + +{------------------------------------------------------------------------------} +{$IFDEF MSWINDOWS} +procedure TPythonGUIInputOutput.pyGUIOutputWndProc(var Message: TMessage); +begin + case Message.Msg of + WM_WriteOutput : WriteOutput; + end;{case} +end; +{$ENDIF} +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.SendData( const Data : AnsiString ); +begin + if Assigned(FOnSendData) then + inherited + else + DisplayString( string(Data) ); +end; + +procedure TPythonGUIInputOutput.SendUniData(const Data: UnicodeString); +begin + if Assigned(FOnSendUniData) then + inherited + else + DisplayString( string(Data) ); +end; + +{------------------------------------------------------------------------------} +function TPythonGUIInputOutput.ReceiveData : AnsiString; +Var + S : string; +begin + if Assigned( FOnReceiveData ) then + Result := inherited ReceiveData + else + begin + InputQuery( 'Query from Python', 'Enter text', S); + Result := AnsiString(S); + end; +end; + +function TPythonGUIInputOutput.ReceiveUniData: UnicodeString; +Var + S : string; +begin + if Assigned( FOnReceiveUniData ) then + Result := inherited ReceiveUniData + else + begin + InputQuery( 'Query from Python', 'Enter text', S); + Result := UnicodeString(S); + end; +end; + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.AddPendingWrite; +begin +{$IFDEF MSWINDOWS} + PostMessage( fWinHandle, WM_WriteOutput, 0, 0 ); +{$ENDIF} +end; + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.WriteOutput; +var + S : string; +begin + if FQueue.Count = 0 then + Exit; + + Lock; + try + while FQueue.Count > 0 do + begin + S := FQueue.Strings[ 0 ]; + FQueue.Delete(0); + DisplayString( S ); + end; + finally + Unlock; + end; +end; + +{PUBLIC METHODS} + +{------------------------------------------------------------------------------} +constructor TPythonGUIInputOutput.Create( AOwner : TComponent ); +begin + inherited Create(AOwner); +{$IFDEF MSWINDOWS} + // Create an internal window for use in delayed writes + // This will allow writes from multiple threads to be queue up and + // then written out to the associated TCustomMemo by the main UI thread. + {$IFDEF FPC} + fWinHandle := WidgetSet.AllocateHWnd(pyGUIOutputWndProc); + {$ELSE} + fWinHandle := Classes.AllocateHWnd(pyGUIOutputWndProc); + {$ENDIF} +{$ENDIF} + UnicodeIO := True; +end; + +{------------------------------------------------------------------------------} +destructor TPythonGUIInputOutput.Destroy; +begin +{$IFDEF MSWINDOWS} + // Destroy the internal window used for Delayed write operations + {$IFDEF FPC} + WidgetSet.DeallocateHWnd(fWinHandle); + {$ELSE} + Classes.DeallocateHWnd(fWinHandle); + {$ENDIF} +{$ENDIF} + inherited Destroy; +end; + +{------------------------------------------------------------------------------} +type + TMyCustomMemo = class(TCustomMemo); + +procedure TPythonGUIInputOutput.DisplayString( const str : string ); +begin + if Assigned(Output) then + begin + if TMyCustomMemo(Output).Lines.Count >= MaxLines then + TMyCustomMemo(Output).Lines.Delete(0); + TMyCustomMemo(Output).Lines.Add(str); +{$IFDEF MSWINDOWS} + SendMessage( Output.Handle, em_ScrollCaret, 0, 0); +{$ENDIF} + end; +end; + +{------------------------------------------------------------------------------} + +end. diff --git a/Source/vcl/Vcl.PythonGUIInputOutput.pas b/Source/vcl/Vcl.PythonGUIInputOutput.pas index 915c1b68..4eddaee3 100644 --- a/Source/vcl/Vcl.PythonGUIInputOutput.pas +++ b/Source/vcl/Vcl.PythonGUIInputOutput.pas @@ -1,256 +1,256 @@ -{$I ..\Definition.Inc} -unit Vcl.PythonGUIInputOutput; - -(**************************************************************************) -(* *) -(* Module: Unit 'PythonGUIInputOutput' Copyright (c) 1997 *) -(* *) -(* Dr. Dietmar Budelsky *) -(* dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4723 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: p4d@mmm-experts.com *) -(* *) -(* look our page at: http://mmm-experts.com/ *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) -(* *) -(**************************************************************************) -(* Contributors: *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Michiel du Toit (micdutoit@hsbfn.com) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) -(**************************************************************************) - -interface - -uses -{$IFDEF MSWINDOWS} - Windows, Messages, -{$ENDIF} - SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PythonEngine; - -{$IFDEF MSWINDOWS} -const - WM_WriteOutput = WM_USER + 1; -{$ENDIF} - -type - {$IF not Defined(FPC) and (CompilerVersion >= 23)} - [ComponentPlatformsAttribute(pidWin32 or pidWin64)] - {$IFEND} - TPythonGUIInputOutput = class(TPythonInputOutput) - private - { Private declarations } - FCustomMemo : TCustomMemo; -{$IFDEF MSWINDOWS} - FWinHandle : HWND; -{$ENDIF} - protected - { Protected declarations } -{$IFDEF MSWINDOWS} - procedure pyGUIOutputWndProc (var Message: TMessage); -{$ENDIF} - procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure SendData( const Data : AnsiString ); override; - function ReceiveData : AnsiString; override; - procedure SendUniData( const Data : UnicodeString ); override; - function ReceiveUniData : UnicodeString; override; - procedure AddPendingWrite; override; - procedure WriteOutput; - public - { Public declarations } - constructor Create( AOwner : TComponent ); override; - destructor Destroy; override; - - procedure DisplayString( const str : string ); - - published - { Published declarations } - property Output : TCustomMemo read FCustomMemo write FCustomMemo; - end; - - procedure Register; - -implementation - -{$IFDEF FPC} -{$IFDEF MSWINDOWS} -Uses - InterfaceBase; -{$ENDIF} -{$ENDIF} - -{PROTECTED METHODS} - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.Notification(AComponent: TComponent; Operation: TOperation); -begin - inherited; - if Operation = opRemove then - if aComponent = fCustomMemo then - fCustomMemo := nil; -end; - -{------------------------------------------------------------------------------} -{$IFDEF MSWINDOWS} -procedure TPythonGUIInputOutput.pyGUIOutputWndProc(var Message: TMessage); -begin - case Message.Msg of - WM_WriteOutput : WriteOutput; - end;{case} -end; -{$ENDIF} -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.SendData( const Data : AnsiString ); -begin - if Assigned(FOnSendData) then - inherited - else - DisplayString( string(Data) ); -end; - -procedure TPythonGUIInputOutput.SendUniData(const Data: UnicodeString); -begin - if Assigned(FOnSendUniData) then - inherited - else - DisplayString( string(Data) ); -end; - -{------------------------------------------------------------------------------} -function TPythonGUIInputOutput.ReceiveData : AnsiString; -Var - S : string; -begin - if Assigned( FOnReceiveData ) then - Result := inherited ReceiveData - else - begin - InputQuery( 'Query from Python', 'Enter text', S); - Result := AnsiString(S); - end; -end; - -function TPythonGUIInputOutput.ReceiveUniData: UnicodeString; -Var - S : string; -begin - if Assigned( FOnReceiveUniData ) then - Result := inherited ReceiveUniData - else - begin - InputQuery( 'Query from Python', 'Enter text', S); - Result := UnicodeString(S); - end; -end; - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.AddPendingWrite; -begin -{$IFDEF MSWINDOWS} - PostMessage( fWinHandle, WM_WriteOutput, 0, 0 ); -{$ENDIF} -end; - -{------------------------------------------------------------------------------} -procedure TPythonGUIInputOutput.WriteOutput; -var - S : string; -begin - if FQueue.Count = 0 then - Exit; - - Lock; - try - while FQueue.Count > 0 do - begin - S := FQueue.Strings[ 0 ]; - FQueue.Delete(0); - DisplayString( S ); - end; - finally - Unlock; - end; -end; - -{PUBLIC METHODS} - -{------------------------------------------------------------------------------} -constructor TPythonGUIInputOutput.Create( AOwner : TComponent ); -begin - inherited Create(AOwner); -{$IFDEF MSWINDOWS} - // Create an internal window for use in delayed writes - // This will allow writes from multiple threads to be queue up and - // then written out to the associated TCustomMemo by the main UI thread. - {$IFDEF FPC} - fWinHandle := WidgetSet.AllocateHWnd(pyGUIOutputWndProc); - {$ELSE} - fWinHandle := Classes.AllocateHWnd(pyGUIOutputWndProc); - {$ENDIF} -{$ENDIF} - UnicodeIO := True; -end; - -{------------------------------------------------------------------------------} -destructor TPythonGUIInputOutput.Destroy; -begin -{$IFDEF MSWINDOWS} - // Destroy the internal window used for Delayed write operations - {$IFDEF FPC} - WidgetSet.DeallocateHWnd(fWinHandle); - {$ELSE} - Classes.DeallocateHWnd(fWinHandle); - {$ENDIF} -{$ENDIF} - inherited Destroy; -end; - -{------------------------------------------------------------------------------} -type - TMyCustomMemo = class(TCustomMemo); - -procedure TPythonGUIInputOutput.DisplayString( const str : string ); -begin - if Assigned(Output) then - begin - if TMyCustomMemo(Output).Lines.Count >= MaxLines then - TMyCustomMemo(Output).Lines.Delete(0); - TMyCustomMemo(Output).Lines.Add(str); -{$IFDEF MSWINDOWS} - SendMessage( Output.Handle, em_ScrollCaret, 0, 0); -{$ENDIF} - end; -end; - -{------------------------------------------------------------------------------} - -procedure Register; -begin - RegisterComponents('Python', [TPythonGUIInputOutput]); -end; - -end. +{$I ..\Definition.Inc} +unit Vcl.PythonGUIInputOutput; + +(**************************************************************************) +(* *) +(* Module: Unit 'PythonGUIInputOutput' Copyright (c) 1997 *) +(* *) +(* Dr. Dietmar Budelsky *) +(* dbudelsky@web.de *) +(* Germany *) +(* *) +(* Morgan Martinet *) +(* 4723 rue Brebeuf *) +(* H2J 3L2 MONTREAL (QC) *) +(* CANADA *) +(* e-mail: p4d@mmm-experts.com *) +(* *) +(* look our page at: http://mmm-experts.com/ *) +(**************************************************************************) +(* Functionality: Delphi Components that provide an interface to the *) +(* Python language (see python.txt for more infos on *) +(* Python itself). *) +(* *) +(**************************************************************************) +(* Contributors: *) +(* Mark Watts(mark_watts@hotmail.com) *) +(* Michiel du Toit (micdutoit@hsbfn.com) *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(* Dr. Dietmar Budelsky, 1997-11-17 *) +(**************************************************************************) + +interface + +uses +{$IFDEF MSWINDOWS} + Windows, Messages, +{$ENDIF} + SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PythonEngine; + +{$IFDEF MSWINDOWS} +const + WM_WriteOutput = WM_USER + 1; +{$ENDIF} + +type + {$IF not Defined(FPC) and (CompilerVersion >= 23)} + [ComponentPlatformsAttribute(pidWin32 or pidWin64)] + {$IFEND} + TPythonGUIInputOutput = class(TPythonInputOutput) + private + { Private declarations } + FCustomMemo : TCustomMemo; +{$IFDEF MSWINDOWS} + FWinHandle : HWND; +{$ENDIF} + protected + { Protected declarations } +{$IFDEF MSWINDOWS} + procedure pyGUIOutputWndProc (var Message: TMessage); +{$ENDIF} + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SendData( const Data : AnsiString ); override; + function ReceiveData : AnsiString; override; + procedure SendUniData( const Data : UnicodeString ); override; + function ReceiveUniData : UnicodeString; override; + procedure AddPendingWrite; override; + procedure WriteOutput; + public + { Public declarations } + constructor Create( AOwner : TComponent ); override; + destructor Destroy; override; + + procedure DisplayString( const str : string ); + + published + { Published declarations } + property Output : TCustomMemo read FCustomMemo write FCustomMemo; + end; + + procedure Register; + +implementation + +{$IFDEF FPC} +{$IFDEF MSWINDOWS} +Uses + InterfaceBase; +{$ENDIF} +{$ENDIF} + +{PROTECTED METHODS} + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if aComponent = fCustomMemo then + fCustomMemo := nil; +end; + +{------------------------------------------------------------------------------} +{$IFDEF MSWINDOWS} +procedure TPythonGUIInputOutput.pyGUIOutputWndProc(var Message: TMessage); +begin + case Message.Msg of + WM_WriteOutput : WriteOutput; + end;{case} +end; +{$ENDIF} +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.SendData( const Data : AnsiString ); +begin + if Assigned(FOnSendData) then + inherited + else + DisplayString( string(Data) ); +end; + +procedure TPythonGUIInputOutput.SendUniData(const Data: UnicodeString); +begin + if Assigned(FOnSendUniData) then + inherited + else + DisplayString( string(Data) ); +end; + +{------------------------------------------------------------------------------} +function TPythonGUIInputOutput.ReceiveData : AnsiString; +Var + S : string; +begin + if Assigned( FOnReceiveData ) then + Result := inherited ReceiveData + else + begin + InputQuery( 'Query from Python', 'Enter text', S); + Result := AnsiString(S); + end; +end; + +function TPythonGUIInputOutput.ReceiveUniData: UnicodeString; +Var + S : string; +begin + if Assigned( FOnReceiveUniData ) then + Result := inherited ReceiveUniData + else + begin + InputQuery( 'Query from Python', 'Enter text', S); + Result := UnicodeString(S); + end; +end; + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.AddPendingWrite; +begin +{$IFDEF MSWINDOWS} + PostMessage( fWinHandle, WM_WriteOutput, 0, 0 ); +{$ENDIF} +end; + +{------------------------------------------------------------------------------} +procedure TPythonGUIInputOutput.WriteOutput; +var + S : string; +begin + if FQueue.Count = 0 then + Exit; + + Lock; + try + while FQueue.Count > 0 do + begin + S := FQueue.Strings[ 0 ]; + FQueue.Delete(0); + DisplayString( S ); + end; + finally + Unlock; + end; +end; + +{PUBLIC METHODS} + +{------------------------------------------------------------------------------} +constructor TPythonGUIInputOutput.Create( AOwner : TComponent ); +begin + inherited Create(AOwner); +{$IFDEF MSWINDOWS} + // Create an internal window for use in delayed writes + // This will allow writes from multiple threads to be queue up and + // then written out to the associated TCustomMemo by the main UI thread. + {$IFDEF FPC} + fWinHandle := WidgetSet.AllocateHWnd(pyGUIOutputWndProc); + {$ELSE} + fWinHandle := Classes.AllocateHWnd(pyGUIOutputWndProc); + {$ENDIF} +{$ENDIF} + UnicodeIO := True; +end; + +{------------------------------------------------------------------------------} +destructor TPythonGUIInputOutput.Destroy; +begin +{$IFDEF MSWINDOWS} + // Destroy the internal window used for Delayed write operations + {$IFDEF FPC} + WidgetSet.DeallocateHWnd(fWinHandle); + {$ELSE} + Classes.DeallocateHWnd(fWinHandle); + {$ENDIF} +{$ENDIF} + inherited Destroy; +end; + +{------------------------------------------------------------------------------} +type + TMyCustomMemo = class(TCustomMemo); + +procedure TPythonGUIInputOutput.DisplayString( const str : string ); +begin + if Assigned(Output) then + begin + if TMyCustomMemo(Output).Lines.Count >= MaxLines then + TMyCustomMemo(Output).Lines.Delete(0); + TMyCustomMemo(Output).Lines.Add(str); +{$IFDEF MSWINDOWS} + SendMessage( Output.Handle, em_ScrollCaret, 0, 0); +{$ENDIF} + end; +end; + +{------------------------------------------------------------------------------} + +procedure Register; +begin + RegisterComponents('Python', [TPythonGUIInputOutput]); +end; + +end. diff --git a/Source/vcl/Vcl.PythonReg.pas b/Source/vcl/Vcl.PythonReg.pas index d624445d..ed8eecd9 100644 --- a/Source/vcl/Vcl.PythonReg.pas +++ b/Source/vcl/Vcl.PythonReg.pas @@ -1,20 +1,20 @@ -{$I ..\Definition.Inc} -unit Vcl.PythonReg; - -interface - -procedure Register(); - -implementation - -uses - Classes, Controls, Vcl.PythonGUIInputOutput; - -procedure Register(); -begin - {$IFDEF DELPHIXE2_OR_HIGHER} - GroupDescendentsWith(TPythonGUIInputOutput, TControl); - {$ENDIF} - RegisterComponents('Python', [TPythonGUIInputOutput]); -end; -end. +{$I ..\Definition.Inc} +unit Vcl.PythonReg; + +interface + +procedure Register(); + +implementation + +uses + Classes, Controls, Vcl.PythonGUIInputOutput; + +procedure Register(); +begin + {$IFDEF DELPHIXE2_OR_HIGHER} + GroupDescendentsWith(TPythonGUIInputOutput, TControl); + {$ENDIF} + RegisterComponents('Python', [TPythonGUIInputOutput]); +end; +end. diff --git a/Source/vcl/WrapVclMedia.pas b/Source/vcl/WrapVclMedia.pas index 648aa7d5..30f5706d 100644 --- a/Source/vcl/WrapVclMedia.pas +++ b/Source/vcl/WrapVclMedia.pas @@ -1,192 +1,192 @@ -{$I ..\Definition.Inc} -unit WrapVclMedia; - -interface - -uses - System.TypInfo, Vcl.MPlayer, - PythonEngine, WrapDelphi, WrapVclControls; - -type - TEMPNotifyEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; Button: TMPBtnType; - var DoDefault: Boolean); - public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; - end; - - TEMPPostNotifyEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; Button: TMPBtnType); - public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; - end; - - TPyDelphiMediaPlayer = class (TPyDelphiCustomControl) - private - function GetDelphiObject: TMediaPlayer; - procedure SetDelphiObject(const Value: TMediaPlayer); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TMediaPlayer read GetDelphiObject write SetDelphiObject; - end; - -implementation - -type - TMediaRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TVclMediaRegistration } - -function TMediaRegistration.Name: string; -begin - Result := 'Media'; -end; - -procedure TMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -procedure TMediaRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPNotifyEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPPostNotifyEventHandler); -end; - -{ TPyDelphiMediaPlayer } - -class function TPyDelphiMediaPlayer.DelphiObjectClass: TClass; -begin - Result := TMediaPlayer; -end; - -function TPyDelphiMediaPlayer.GetDelphiObject: TMediaPlayer; -begin - Result := TMediaPlayer(inherited DelphiObject); -end; - -procedure TPyDelphiMediaPlayer.SetDelphiObject(const Value: TMediaPlayer); -begin - inherited DelphiObject := Value; -end; - -{ TEMPNotifyEventHandler } - -constructor TEMPNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; - Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); -var - LMethod: TMethod; -begin - inherited; - LMethod.Code := @TEMPNotifyEventHandler.DoEvent; - LMethod.Data := Self; - SetMethodProp(Component, PropertyInfo, LMethod); -end; - -procedure TEMPNotifyEventHandler.DoEvent(Sender: TObject; Button: TMPBtnType; - var DoDefault: Boolean); -var - LPyObject: PPyObject; - LPyTuple: PPyObject; - LPyResult: PPyObject; - LPyButton: PPyObject; - LDoDefault: PPyObject; - LVarParam: TPyDelphiVarParameter; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK() then - with GetPythonEngine do begin - LPyObject := PyDelphiWrapper.Wrap(Sender); - LPyButton := PyLong_FromLong(Integer(Button)); - LDoDefault := CreateVarParam(PyDelphiWrapper, DoDefault); - LVarParam := PythonToDelphi(LDoDefault) as TPyDelphiVarParameter; - - LPyTuple := PyTuple_New(3); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LDoDefault); - try - LPyResult := PyObject_CallObject(Callable, LPyTuple); - if Assigned(LPyResult) then begin - Py_DECREF(LPyResult); - DoDefault := PyObject_IsTrue(LVarParam.Value) = 1; - end; - finally - Py_DECREF(LPyTuple); - end; - CheckError(); - end; -end; - -class function TEMPNotifyEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(EMPNotify); -end; - -{ TEMPPostNotifyEventHandler } - -constructor TEMPPostNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; - Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); -var - LMethod: TMethod; -begin - inherited; - LMethod.Code := @TEMPPostNotifyEventHandler.DoEvent; - LMethod.Data := Self; - SetMethodProp(Component, PropertyInfo, LMethod); -end; - -procedure TEMPPostNotifyEventHandler.DoEvent(Sender: TObject; - Button: TMPBtnType); -var - LPyObject: PPyObject; - LPyTuple: PPyObject; - LPyResult: PPyObject; - LPyButton: PPyObject; -begin - Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK() then - with GetPythonEngine do begin - LPyObject := PyDelphiWrapper.Wrap(Sender); - LPyButton := PyLong_FromLong(Integer(Button)); - - LPyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); - GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); - try - LPyResult := PyObject_CallObject(Callable, LPyTuple); - if Assigned(LPyResult) then begin - Py_DECREF(LPyResult); - end; - finally - Py_DECREF(LPyTuple); - end; - CheckError(); - end; -end; - -class function TEMPPostNotifyEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(EMPPostNotify); -end; - -initialization - RegisteredUnits.Add(TMediaRegistration.Create); - -end. +{$I ..\Definition.Inc} +unit WrapVclMedia; + +interface + +uses + System.TypInfo, Vcl.MPlayer, + PythonEngine, WrapDelphi, WrapVclControls; + +type + TEMPNotifyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Button: TMPBtnType; + var DoDefault: Boolean); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TEMPPostNotifyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Button: TMPBtnType); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TPyDelphiMediaPlayer = class (TPyDelphiCustomControl) + private + function GetDelphiObject: TMediaPlayer; + procedure SetDelphiObject(const Value: TMediaPlayer); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TMediaPlayer read GetDelphiObject write SetDelphiObject; + end; + +implementation + +type + TMediaRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TVclMediaRegistration } + +function TMediaRegistration.Name: string; +begin + Result := 'Media'; +end; + +procedure TMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +procedure TMediaRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPNotifyEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPPostNotifyEventHandler); +end; + +{ TPyDelphiMediaPlayer } + +class function TPyDelphiMediaPlayer.DelphiObjectClass: TClass; +begin + Result := TMediaPlayer; +end; + +function TPyDelphiMediaPlayer.GetDelphiObject: TMediaPlayer; +begin + Result := TMediaPlayer(inherited DelphiObject); +end; + +procedure TPyDelphiMediaPlayer.SetDelphiObject(const Value: TMediaPlayer); +begin + inherited DelphiObject := Value; +end; + +{ TEMPNotifyEventHandler } + +constructor TEMPNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TEMPNotifyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TEMPNotifyEventHandler.DoEvent(Sender: TObject; Button: TMPBtnType; + var DoDefault: Boolean); +var + LPyObject: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; + LPyButton: PPyObject; + LDoDefault: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyButton := PyLong_FromLong(Integer(Button)); + LDoDefault := CreateVarParam(PyDelphiWrapper, DoDefault); + LVarParam := PythonToDelphi(LDoDefault) as TPyDelphiVarParameter; + + LPyTuple := PyTuple_New(3); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LDoDefault); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DoDefault := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +class function TEMPNotifyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(EMPNotify); +end; + +{ TEMPPostNotifyEventHandler } + +constructor TEMPPostNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TEMPPostNotifyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TEMPPostNotifyEventHandler.DoEvent(Sender: TObject; + Button: TMPBtnType); +var + LPyObject: PPyObject; + LPyTuple: PPyObject; + LPyResult: PPyObject; + LPyButton: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyButton := PyLong_FromLong(Integer(Button)); + + LPyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +class function TEMPPostNotifyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(EMPPostNotify); +end; + +initialization + RegisteredUnits.Add(TMediaRegistration.Create); + +end. diff --git a/Source/vcl/WrapVclSamplesSpin.pas b/Source/vcl/WrapVclSamplesSpin.pas index dea16146..98d9b0e7 100644 --- a/Source/vcl/WrapVclSamplesSpin.pas +++ b/Source/vcl/WrapVclSamplesSpin.pas @@ -1,100 +1,100 @@ -{$I ..\Definition.Inc} - -unit WrapVclSamplesSpin; - -interface - -uses - Classes, Vcl.Samples.Spin, WrapDelphi, WrapVclControls, WrapVclStdCtrls; - -type - TPyDelphiSpinButton = class (TPyDelphiWinControl) - private - function GetDelphiObject: TSpinButton; - procedure SetDelphiObject(const Value: TSpinButton); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TSpinButton read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiSpinEdit = class (TPyDelphiCustomEdit) - private - function GetDelphiObject: TSpinEdit; - procedure SetDelphiObject(const Value: TSpinEdit); - public - class function DelphiObjectClass : TClass; override; - // Properties - property DelphiObject: TSpinEdit read GetDelphiObject write SetDelphiObject; - end; - -implementation - -{ Register the wrappers, the globals and the constants } -type - TSamplesSpinRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TStdCtrlsRegistration } - -procedure TSamplesSpinRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TSamplesSpinRegistration.Name: string; -begin - Result := 'Samples.Spin'; -end; - -procedure TSamplesSpinRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinEdit); -end; - -{ TPyDelphiSpinButton } - -class function TPyDelphiSpinButton.DelphiObjectClass: TClass; -begin - Result := TSpinButton; -end; - -function TPyDelphiSpinButton.GetDelphiObject: TSpinButton; -begin - Result := TSpinButton(inherited DelphiObject); -end; - -procedure TPyDelphiSpinButton.SetDelphiObject(const Value: TSpinButton); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiSpinEdit } - -class function TPyDelphiSpinEdit.DelphiObjectClass: TClass; -begin - Result := TSpinEdit; -end; - -function TPyDelphiSpinEdit.GetDelphiObject: TSpinEdit; -begin - Result := TSpinEdit(inherited DelphiObject); -end; - -procedure TPyDelphiSpinEdit.SetDelphiObject(const Value: TSpinEdit); -begin - inherited DelphiObject := Value; -end; - - - -initialization - RegisteredUnits.Add( TSamplesSpinRegistration.Create ); - Classes.RegisterClasses([TSpinButton, TSpinEdit]); -end. +{$I ..\Definition.Inc} + +unit WrapVclSamplesSpin; + +interface + +uses + Classes, Vcl.Samples.Spin, WrapDelphi, WrapVclControls, WrapVclStdCtrls; + +type + TPyDelphiSpinButton = class (TPyDelphiWinControl) + private + function GetDelphiObject: TSpinButton; + procedure SetDelphiObject(const Value: TSpinButton); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TSpinButton read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiSpinEdit = class (TPyDelphiCustomEdit) + private + function GetDelphiObject: TSpinEdit; + procedure SetDelphiObject(const Value: TSpinEdit); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TSpinEdit read GetDelphiObject write SetDelphiObject; + end; + +implementation + +{ Register the wrappers, the globals and the constants } +type + TSamplesSpinRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TStdCtrlsRegistration } + +procedure TSamplesSpinRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TSamplesSpinRegistration.Name: string; +begin + Result := 'Samples.Spin'; +end; + +procedure TSamplesSpinRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinEdit); +end; + +{ TPyDelphiSpinButton } + +class function TPyDelphiSpinButton.DelphiObjectClass: TClass; +begin + Result := TSpinButton; +end; + +function TPyDelphiSpinButton.GetDelphiObject: TSpinButton; +begin + Result := TSpinButton(inherited DelphiObject); +end; + +procedure TPyDelphiSpinButton.SetDelphiObject(const Value: TSpinButton); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiSpinEdit } + +class function TPyDelphiSpinEdit.DelphiObjectClass: TClass; +begin + Result := TSpinEdit; +end; + +function TPyDelphiSpinEdit.GetDelphiObject: TSpinEdit; +begin + Result := TSpinEdit(inherited DelphiObject); +end; + +procedure TPyDelphiSpinEdit.SetDelphiObject(const Value: TSpinEdit); +begin + inherited DelphiObject := Value; +end; + + + +initialization + RegisteredUnits.Add( TSamplesSpinRegistration.Create ); + Classes.RegisterClasses([TSpinButton, TSpinEdit]); +end. diff --git a/Source/vcl/WrapVclWinXCtrls.pas b/Source/vcl/WrapVclWinXCtrls.pas index 0d420ebb..fd027c70 100644 --- a/Source/vcl/WrapVclWinXCtrls.pas +++ b/Source/vcl/WrapVclWinXCtrls.pas @@ -1,223 +1,223 @@ -{$I ..\Definition.Inc} -unit WrapVclWinXCtrls; - -interface - -uses - Vcl.WinXCtrls, - {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - Vcl.NumberBox, - {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - WrapVclControls, WrapVclStdCtrls; - -type - TPyDelphiCustomActivityIndicator = class (TPyDelphiCustomControl) - private - function GetDelphiObject: TCustomActivityIndicator; - procedure SetDelphiObject(const Value: TCustomActivityIndicator); - public - class function DelphiObjectClass : TClass; override; - property DelphiObject: TCustomActivityIndicator read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiActivityIndicator = class (TPyDelphiCustomActivityIndicator) - private - function GetDelphiObject: TActivityIndicator; - procedure SetDelphiObject(const Value: TActivityIndicator); - public - class function DelphiObjectClass : TClass; override; - property DelphiObject: TActivityIndicator read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiCustomCustomToggleSwitch = class (TPyDelphiCustomControl) - private - function GetDelphiObject: TCustomToggleSwitch; - procedure SetDelphiObject(const Value: TCustomToggleSwitch); - public - class function DelphiObjectClass : TClass; override; - property DelphiObject: TCustomToggleSwitch read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiToggleSwitch = class (TPyDelphiCustomCustomToggleSwitch) - private - function GetDelphiObject: TToggleSwitch; - procedure SetDelphiObject(const Value: TToggleSwitch); - public - class function DelphiObjectClass : TClass; override; - property DelphiObject: TToggleSwitch read GetDelphiObject write SetDelphiObject; - end; - - {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - TPyDelphiCustomNumberBox = class(TPyDelphiCustomEdit) - private - function GetDelphiObject: TCustomNumberBox; - procedure SetDelphiObject(const Value: TCustomNumberBox); - public - class function DelphiObjectClass : TClass; override; - property DelphiObject: TCustomNumberBox read GetDelphiObject write SetDelphiObject; - end; - - TPyDelphiNumberBox = class(TPyDelphiCustomNumberBox) - private - function GetDelphiObject: TNumberBox; - procedure SetDelphiObject(const Value: TNumberBox); - public - class function DelphiObjectClass : TClass; override; - property DelphiObject: TNumberBox read GetDelphiObject write SetDelphiObject; - end; - {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - -implementation - -uses - WrapDelphi; - -{ Register the wrappers, the globals and the constants } -type - TWinXCtrlsRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - -{ TComCtrlsRegistration } - -procedure TWinXCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TWinXCtrlsRegistration.Name: string; -begin - Result := 'WinXCtrls'; -end; - -procedure TWinXCtrlsRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomActivityIndicator); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActivityIndicator); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomToggleSwitch); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToggleSwitch); - {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomNumberBox); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiNumberBox); - {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} -end; - -{ TPyDelphiCustomActivityIndicator } - -class function TPyDelphiCustomActivityIndicator.DelphiObjectClass: TClass; -begin - Result := TCustomActivityIndicator; -end; - -function TPyDelphiCustomActivityIndicator.GetDelphiObject: TCustomActivityIndicator; -begin - Result := TCustomActivityIndicator(inherited DelphiObject); -end; - -procedure TPyDelphiCustomActivityIndicator.SetDelphiObject( - const Value: TCustomActivityIndicator); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiActivityIndicator } - -class function TPyDelphiActivityIndicator.DelphiObjectClass: TClass; -begin - Result := TActivityIndicator; -end; - -function TPyDelphiActivityIndicator.GetDelphiObject: TActivityIndicator; -begin - Result := TActivityIndicator(inherited DelphiObject); -end; - -procedure TPyDelphiActivityIndicator.SetDelphiObject( - const Value: TActivityIndicator); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiCustomCustomToggleSwitch } - -class function TPyDelphiCustomCustomToggleSwitch.DelphiObjectClass: TClass; -begin - Result := TCustomToggleSwitch; -end; - -function TPyDelphiCustomCustomToggleSwitch.GetDelphiObject: TCustomToggleSwitch; -begin - Result := TCustomToggleSwitch(inherited DelphiObject); -end; - -procedure TPyDelphiCustomCustomToggleSwitch.SetDelphiObject( - const Value: TCustomToggleSwitch); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiToggleSwitch } - -class function TPyDelphiToggleSwitch.DelphiObjectClass: TClass; -begin - Result := TToggleSwitch; -end; - -function TPyDelphiToggleSwitch.GetDelphiObject: TToggleSwitch; -begin - Result := TToggleSwitch(inherited DelphiObject); -end; - -procedure TPyDelphiToggleSwitch.SetDelphiObject(const Value: TToggleSwitch); -begin - inherited DelphiObject := Value; -end; - -{$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - -{ TPyDelphiCustomNumberBox } - -class function TPyDelphiCustomNumberBox.DelphiObjectClass: TClass; -begin - Result := TCustomNumberBox; -end; - -function TPyDelphiCustomNumberBox.GetDelphiObject: TCustomNumberBox; -begin - Result := TCustomNumberBox(inherited DelphiObject); -end; - -procedure TPyDelphiCustomNumberBox.SetDelphiObject( - const Value: TCustomNumberBox); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiNumberBox } - -class function TPyDelphiNumberBox.DelphiObjectClass: TClass; -begin - Result := TNumberBox; -end; - -function TPyDelphiNumberBox.GetDelphiObject: TNumberBox; -begin - Result := TNumberBox(inherited DelphiObject); -end; - -procedure TPyDelphiNumberBox.SetDelphiObject(const Value: TNumberBox); -begin - inherited DelphiObject := Value; -end; - -{$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} - -initialization - RegisteredUnits.Add(TWinXCtrlsRegistration.Create()); - -end. +{$I ..\Definition.Inc} +unit WrapVclWinXCtrls; + +interface + +uses + Vcl.WinXCtrls, + {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + Vcl.NumberBox, + {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + WrapVclControls, WrapVclStdCtrls; + +type + TPyDelphiCustomActivityIndicator = class (TPyDelphiCustomControl) + private + function GetDelphiObject: TCustomActivityIndicator; + procedure SetDelphiObject(const Value: TCustomActivityIndicator); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TCustomActivityIndicator read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiActivityIndicator = class (TPyDelphiCustomActivityIndicator) + private + function GetDelphiObject: TActivityIndicator; + procedure SetDelphiObject(const Value: TActivityIndicator); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TActivityIndicator read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomCustomToggleSwitch = class (TPyDelphiCustomControl) + private + function GetDelphiObject: TCustomToggleSwitch; + procedure SetDelphiObject(const Value: TCustomToggleSwitch); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TCustomToggleSwitch read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiToggleSwitch = class (TPyDelphiCustomCustomToggleSwitch) + private + function GetDelphiObject: TToggleSwitch; + procedure SetDelphiObject(const Value: TToggleSwitch); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TToggleSwitch read GetDelphiObject write SetDelphiObject; + end; + + {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + TPyDelphiCustomNumberBox = class(TPyDelphiCustomEdit) + private + function GetDelphiObject: TCustomNumberBox; + procedure SetDelphiObject(const Value: TCustomNumberBox); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TCustomNumberBox read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiNumberBox = class(TPyDelphiCustomNumberBox) + private + function GetDelphiObject: TNumberBox; + procedure SetDelphiObject(const Value: TNumberBox); + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TNumberBox read GetDelphiObject write SetDelphiObject; + end; + {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + +implementation + +uses + WrapDelphi; + +{ Register the wrappers, the globals and the constants } +type + TWinXCtrlsRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +{ TComCtrlsRegistration } + +procedure TWinXCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TWinXCtrlsRegistration.Name: string; +begin + Result := 'WinXCtrls'; +end; + +procedure TWinXCtrlsRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomActivityIndicator); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActivityIndicator); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomToggleSwitch); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToggleSwitch); + {$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomNumberBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiNumberBox); + {$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} +end; + +{ TPyDelphiCustomActivityIndicator } + +class function TPyDelphiCustomActivityIndicator.DelphiObjectClass: TClass; +begin + Result := TCustomActivityIndicator; +end; + +function TPyDelphiCustomActivityIndicator.GetDelphiObject: TCustomActivityIndicator; +begin + Result := TCustomActivityIndicator(inherited DelphiObject); +end; + +procedure TPyDelphiCustomActivityIndicator.SetDelphiObject( + const Value: TCustomActivityIndicator); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiActivityIndicator } + +class function TPyDelphiActivityIndicator.DelphiObjectClass: TClass; +begin + Result := TActivityIndicator; +end; + +function TPyDelphiActivityIndicator.GetDelphiObject: TActivityIndicator; +begin + Result := TActivityIndicator(inherited DelphiObject); +end; + +procedure TPyDelphiActivityIndicator.SetDelphiObject( + const Value: TActivityIndicator); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomCustomToggleSwitch } + +class function TPyDelphiCustomCustomToggleSwitch.DelphiObjectClass: TClass; +begin + Result := TCustomToggleSwitch; +end; + +function TPyDelphiCustomCustomToggleSwitch.GetDelphiObject: TCustomToggleSwitch; +begin + Result := TCustomToggleSwitch(inherited DelphiObject); +end; + +procedure TPyDelphiCustomCustomToggleSwitch.SetDelphiObject( + const Value: TCustomToggleSwitch); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiToggleSwitch } + +class function TPyDelphiToggleSwitch.DelphiObjectClass: TClass; +begin + Result := TToggleSwitch; +end; + +function TPyDelphiToggleSwitch.GetDelphiObject: TToggleSwitch; +begin + Result := TToggleSwitch(inherited DelphiObject); +end; + +procedure TPyDelphiToggleSwitch.SetDelphiObject(const Value: TToggleSwitch); +begin + inherited DelphiObject := Value; +end; + +{$IF DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + +{ TPyDelphiCustomNumberBox } + +class function TPyDelphiCustomNumberBox.DelphiObjectClass: TClass; +begin + Result := TCustomNumberBox; +end; + +function TPyDelphiCustomNumberBox.GetDelphiObject: TCustomNumberBox; +begin + Result := TCustomNumberBox(inherited DelphiObject); +end; + +procedure TPyDelphiCustomNumberBox.SetDelphiObject( + const Value: TCustomNumberBox); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiNumberBox } + +class function TPyDelphiNumberBox.DelphiObjectClass: TClass; +begin + Result := TNumberBox; +end; + +function TPyDelphiNumberBox.GetDelphiObject: TNumberBox; +begin + Result := TNumberBox(inherited DelphiObject); +end; + +procedure TPyDelphiNumberBox.SetDelphiObject(const Value: TNumberBox); +begin + inherited DelphiObject := Value; +end; + +{$IFEND DEFINED(DELPHI11_OR_HIGHER) or DEFINED(DELPHI10_4_2)} + +initialization + RegisteredUnits.Add(TWinXCtrlsRegistration.Create()); + +end. From 4c0db58e0f67cd3583f904c63d4a618f353abc65 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 21 Jan 2023 02:39:04 +0200 Subject: [PATCH 040/174] WrapClass added. Deal with functions returning classes. --- Source/WrapDelphi.pas | 411 ++++++++++++++++++++--------------- Source/WrapDelphiWindows.pas | 14 +- 2 files changed, 239 insertions(+), 186 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 5d2394a9..f1c65f63 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -842,6 +842,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) function GetHelperType(const TypeName : string) : TPythonType; // Function that provides a Python object wrapping an object function Wrap(AObj : TObject; AOwnership: TObjectOwnership = soReference) : PPyObject; + function WrapClass(AClass: TClass): PPyObject; {$IFDEF EXTENDED_RTTI} // Function that provides a Python object wrapping a record function WrapRecord(Address: Pointer; Typ: TRttiStructuredType): PPyObject; @@ -941,6 +942,13 @@ implementation var gRegisteredUnits : TRegisteredUnits; +{$IFDEF EXTENDED_RTTI} + function RttiCall(ParentAddress: pointer; PythonType: TPythonType; + DelphiWrapper: TPyDelphiWrapper; MethName: string; + ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; + AParentAddrIsClass: boolean = false): PPyObject; forward; +{$ENDIF EXTENDED_RTTI} + function RegisteredUnits : TRegisteredUnits; begin if not Assigned(gRegisteredUnits) then @@ -1876,6 +1884,195 @@ procedure Rtti_Dir(SL: TStringList; RttiType: TRttiType); SL.Add(RttiField.Name); end; +function RttiCall(ParentAddress: pointer; PythonType: TPythonType; + DelphiWrapper: TPyDelphiWrapper; MethName: string; + ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; + AParentAddrIsClass: boolean): PPyObject; + + function ParamAsDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue): Boolean; + var + Arr: array of TValue; + I: Integer; + elType: PPTypeInfo; + V: Variant; + Num: Int64; + begin + Result := False; + if (RttiParam.ParamType = nil) or (RttiParam.ParamType.Handle = nil) or (GetTypeData(RttiParam.ParamType.Handle) = nil) then + Exit; + elType := GetTypeData(RttiParam.ParamType.Handle).elType; + if elType = nil then + elType := GetTypeData(RttiParam.ParamType.Handle).elType2; + if elType = nil then + Exit; + + SetLength(Arr, PythonType.Engine.PyList_Size(PyValue)); + for I := 0 to PythonType.Engine.PyList_Size(PyValue) - 1 do + begin + V := PythonType.Engine.PyObjectAsVariant(PythonType.Engine.PyList_GetItem(PyValue, i)); + if elType^.Kind = tkEnumeration then + begin + Num := TValue.FromVariant(V).Cast(TypeInfo(Int64)).AsInt64; + Arr[i] := TValue.FromOrdinal(elType^, Num); + end + else + Arr[i] := TValue.FromVariant(V).Cast(elType^); + end; + ParamValue := TValue.FromArray(RttiParam.ParamType.Handle, Arr); + Result := True; + end; + + function FindMethod(const MethName:string; RttiType : TRttiType; + PyArgs: PPyObject; var Args: array of TValue):TRttiMethod; + // Deals with overloaded methods + // Constructs the Arg Array + // PyArgs is a Python tuple + Var + Method: TRttiMethod; + Index: Integer; + ErrMsg: string; + Obj: TObject; + ClassRef: TClass; + PyValue : PPyObject; + Param: TRttiParameter; + Params : TArray; + SearchContinue: Boolean; + begin + Result := nil; + for Method in RttiType.GetMethods do + if SameText(Method.Name, MethName) then + begin + Params := Method.GetParameters; + if Length(Args) = Length(Params) then + begin + Result := Method; + SearchContinue := False; + for Index := 0 to Length(Params) - 1 do + begin + Param := Params[Index]; + if (Param.ParamType = nil) or + (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) then + begin + Result := nil; + SearchContinue := True; + Break; + end; + + PyValue := PythonType.Engine.PyTuple_GetItem(PyArgs, Index); + if Param.ParamType = nil then + begin + Result := nil; + Break + end + else if Param.ParamType.TypeKind = tkClass then + begin + if ValidateClassProperty(PyValue, Param.ParamType.Handle, Obj, ErrMsg) + then + Args[Index] := Obj + else begin + Result := nil; + Break + end + end + else if (Param.ParamType.TypeKind = tkClassRef) then + begin + if ValidateClassRef(PyValue, Param.ParamType.Handle, ClassRef, ErrMsg) then + Args[Index] := ClassRef + else begin + Result := nil; + Break + end + end + else if (Param.ParamType.TypeKind = tkDynArray) and PythonType.Engine.PyList_Check(PyValue) then + begin + if ParamAsDynArray(PyValue, Param, Args[Index]) then + Continue; //to avoid last check + end + else begin + if not SimplePythonToValue(PyValue, Param.ParamType.Handle, + Args[Index], ErrMsg) then + begin + Result := nil; + Break + end; + end; + + if (Param.ParamType <> nil) and not Args[Index].IsType(Param.ParamType.Handle) then + begin + Result :=nil; + Break; + end; + end; // for params + + if not SearchContinue then + Break; + end; + end; + end; + + procedure InvalidArguments(const MethName, ErrMsg : string); + begin + with GetPythonEngine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_ErrInvalidArgs, + [MethName, ErrMsg]))); + end; + +Var + Args: array of TValue; + ArgCount: Integer; + meth: TRttiMethod; + ret: TValue; + ErrMsg : string; + Addr: TValue; + +begin + Result := nil; + // Ignore keyword arguments ob2 + // ob1 is a tuple with zero or more elements + + ArgCount := PythonType.Engine.PyTuple_Size(ob1); + SetLength(Args, ArgCount); + + meth := FindMethod(MethName, ParentRtti, ob1, Args); + + if not Assigned(meth) then begin + InvalidArguments(MethName, rs_IncompatibleArguments); + Exit; + end; + + try + if ParentRtti is TRttiInstanceType then + if meth.IsClassMethod then + Addr := TValue.From(TObject(ParentAddress).ClassType) + else + Addr := TValue.From(TObject(ParentAddress)) + else if ParentRtti is TRttiInterfaceType then + TValue.Make(@ParentAddress, ParentRtti.Handle, Addr) + else + Addr := TValue.From(ParentAddress); + ret := meth.Invoke(Addr, Args); + if ret.IsEmpty then + Result := GetPythonEngine.ReturnNone + else if ret.Kind = tkClass then + Result := DelphiWrapper.Wrap(ret.AsObject) + else if ret.Kind = tkClassRef then + Result := DelphiWrapper.WrapClass(ret.AsClass) + else begin + Result := SimpleValueToPython(ret, ErrMsg); + if Result = nil then + with PythonType.Engine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); + end; + except + on E: Exception do begin + Result := nil; + InvalidArguments(MethName, E.Message); + end; + end; +end; + function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; @@ -2896,187 +3093,8 @@ function TPyDelphiObject.Wrap(AObject: TObject; {$IFDEF EXTENDED_RTTI} function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; - - function ParamAsDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue): Boolean; - var - Arr: array of TValue; - I: Integer; - elType: PPTypeInfo; - V: Variant; - Num: Int64; - begin - Result := False; - if (RttiParam.ParamType = nil) or (RttiParam.ParamType.Handle = nil) or (GetTypeData(RttiParam.ParamType.Handle) = nil) then - Exit; - elType := GetTypeData(RttiParam.ParamType.Handle).elType; - if elType = nil then - elType := GetTypeData(RttiParam.ParamType.Handle).elType2; - if elType = nil then - Exit; - - SetLength(Arr, PythonType.Engine.PyList_Size(PyValue)); - for I := 0 to PythonType.Engine.PyList_Size(PyValue) - 1 do - begin - V := PythonType.Engine.PyObjectAsVariant(PythonType.Engine.PyList_GetItem(PyValue, i)); - if elType^.Kind = tkEnumeration then - begin - Num := TValue.FromVariant(V).Cast(TypeInfo(Int64)).AsInt64; - Arr[i] := TValue.FromOrdinal(elType^, Num); - end - else - Arr[i] := TValue.FromVariant(V).Cast(elType^); - end; - ParamValue := TValue.FromArray(RttiParam.ParamType.Handle, Arr); - Result := True; - end; - - function FindMethod(const MethName:string; RttiType : TRttiType; - PyArgs: PPyObject; var Args: array of TValue):TRttiMethod; - // Deals with overloaded methods - // Constructs the Arg Array - // PyArgs is a Python tuple - Var - Method: TRttiMethod; - Index: Integer; - ErrMsg: string; - Obj: TObject; - ClassRef: TClass; - PyValue : PPyObject; - Param: TRttiParameter; - Params : TArray; - SearchContinue: Boolean; - begin - Result := nil; - for Method in RttiType.GetMethods do - if SameText(Method.Name, MethName) then - begin - Params := Method.GetParameters; - if Length(Args) = Length(Params) then - begin - Result := Method; - SearchContinue := False; - for Index := 0 to Length(Params) - 1 do - begin - Param := Params[Index]; - if (Param.ParamType = nil) or - (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) then - begin - Result := nil; - SearchContinue := True; - Break; - end; - - PyValue := PythonType.Engine.PyTuple_GetItem(PyArgs, Index); - if Param.ParamType = nil then - begin - Result := nil; - Break - end - else if Param.ParamType.TypeKind = tkClass then - begin - if ValidateClassProperty(PyValue, Param.ParamType.Handle, Obj, ErrMsg) - then - Args[Index] := Obj - else begin - Result := nil; - Break - end - end - else if (Param.ParamType.TypeKind = tkClassRef) then - begin - if ValidateClassRef(PyValue, Param.ParamType.Handle, ClassRef, ErrMsg) then - Args[Index] := ClassRef - else begin - Result := nil; - Break - end - end - else if (Param.ParamType.TypeKind = tkDynArray) and PythonType.Engine.PyList_Check(PyValue) then - begin - if ParamAsDynArray(PyValue, Param, Args[Index]) then - Continue; //to avoid last check - end - else begin - if not SimplePythonToValue(PyValue, Param.ParamType.Handle, - Args[Index], ErrMsg) then - begin - Result := nil; - Break - end; - end; - - if (Param.ParamType <> nil) and not Args[Index].IsType(Param.ParamType.Handle) then - begin - Result :=nil; - Break; - end; - end; // for params - - if not SearchContinue then - Break; - end; - end; - end; - - procedure InvalidArguments(const MethName, ErrMsg : string); - begin - with GetPythonEngine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidArgs, - [MethName, ErrMsg]))); - end; - -Var - Args: array of TValue; - ArgCount: Integer; - meth: TRttiMethod; - ret: TValue; - ErrMsg : string; - Addr: TValue; - begin - Result := nil; - // Ignore keyword arguments ob2 - // ob1 is a tuple with zero or more elements - - ArgCount := PythonType.Engine.PyTuple_Size(ob1); - SetLength(Args, ArgCount); - - meth := FindMethod(MethName, ParentRtti, ob1, Args); - - if not Assigned(meth) then begin - InvalidArguments(MethName, rs_IncompatibleArguments); - Exit; - end; - - try - if ParentRtti is TRttiInstanceType then - if meth.IsClassMethod then - Addr := TValue.From(TObject(ParentAddress).ClassType) - else - Addr := TValue.From(TObject(ParentAddress)) - else if ParentRtti is TRttiInterfaceType then - TValue.Make(@ParentAddress, ParentRtti.Handle, Addr) - else - Addr := TValue.From(ParentAddress); - ret := meth.Invoke(Addr, Args); - if ret.IsEmpty then - Result := GetPythonEngine.ReturnNone - else if ret.Kind = tkClass then - Result := fDelphiWrapper.Wrap(ret.AsObject) - else begin - Result := SimpleValueToPython(ret, ErrMsg); - if Result = nil then - with PythonType.Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); - end; - except - on E: Exception do begin - Result := nil; - InvalidArguments(MethName, E.Message); - end; - end; + Result := RttiCall(ParentAddress, PythonType, fDelphiWrapper, MethName, ParentRtti, ob1, ob2); end; {$ELSE)} @@ -3595,6 +3613,7 @@ procedure TPyDelphiWrapper.CreateModuleFunctions; RegisterFunction(PAnsiChar('Abort'), Abort_Wrapper, PAnsiChar('Abort()'#10 + 'Raises a silent exception.')); + for i := 0 to RegisteredUnits.Count-1 do RegisteredUnits[i].DefineFunctions(Self); end; @@ -3872,7 +3891,7 @@ procedure TPyDelphiWrapper.UnsubscribeFreeNotifications; function TPyDelphiWrapper.Wrap(AObj: TObject; AOwnership: TObjectOwnership): PPyObject; -Var +var i : integer; DelphiClass : TClass; Index : integer; @@ -3905,6 +3924,36 @@ function TPyDelphiWrapper.Wrap(AObj: TObject; end; end; +function TPyDelphiWrapper.WrapClass(AClass: TClass): PPyObject; +var + I : integer; + DelphiClass : TClass; + Index : integer; +begin + CheckEngine; + // We cast the python object to the right delphi type + if not Assigned(AClass) then + Result := Engine.ReturnNone + else begin + // find nearest registered ancestor + Index := -1; + DelphiClass := AClass; + while Assigned(DelphiClass) do begin + for I := 0 to fClassRegister.Count - 1 do + if TRegisteredClass(fClassRegister[I]).DelphiClass = DelphiClass then begin + Index := I; + break; + end; + if Index >= 0 then break; + DelphiClass := DelphiClass.ClassParent; + end; + Assert(Index >= 0, 'Internal Error in PyDelphiWrapper.Wrap'); // shouldn't happen + + Result := PPyObject(TRegisteredClass(fClassRegister[Index]).PythonType.TheTypePtr); + Engine.Py_XINCREF(Result); + end; +end; + {$IFDEF EXTENDED_RTTI} function TPyDelphiWrapper.WrapRecord(Address: Pointer; Typ: TRttiStructuredType) : PPyObject; var diff --git a/Source/WrapDelphiWindows.pas b/Source/WrapDelphiWindows.pas index d0bc0aa9..34c02eaf 100644 --- a/Source/WrapDelphiWindows.pas +++ b/Source/WrapDelphiWindows.pas @@ -4,11 +4,15 @@ interface +{$IFDEF MSWINDOWS} uses Windows, Classes, SysUtils, PythonEngine, WrapDelphi, WrapDelphiClasses; +{$ENDIF MSWINDOWS} implementation +{$IFDEF MSWINDOWS} + {$IFDEF DELPHI11_OR_HIGHER} uses System.Win.HighDpi, Winapi.ShellScaling; @@ -187,11 +191,11 @@ class function TWindowsRegistration.SetProcessDpiAwareness_Wrapper(PySelf, initialization RegisteredUnits.Add(TWindowsRegistration.Create); - {$IFDEF MSWINDOWS} - {$IFDEF DELPHI11_OR_HIGHER} - SetHighDpiAware(); - {$ENDIF DELPHI11_OR_HIGHER} - {$ENDIF MSWINDOWS} + {$IFDEF DELPHI11_OR_HIGHER} + SetHighDpiAware(); + {$ENDIF DELPHI11_OR_HIGHER} + +{$ENDIF MSWINDOWS} end. From 1cd66211f586468d9fe3a1352344073759e64d8a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 21 Jan 2023 02:52:53 +0200 Subject: [PATCH 041/174] Minor changes in WrapClass --- Source/WrapDelphi.pas | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index f1c65f63..a6fdbf05 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3931,7 +3931,6 @@ function TPyDelphiWrapper.WrapClass(AClass: TClass): PPyObject; Index : integer; begin CheckEngine; - // We cast the python object to the right delphi type if not Assigned(AClass) then Result := Engine.ReturnNone else begin @@ -3947,7 +3946,7 @@ function TPyDelphiWrapper.WrapClass(AClass: TClass): PPyObject; if Index >= 0 then break; DelphiClass := DelphiClass.ClassParent; end; - Assert(Index >= 0, 'Internal Error in PyDelphiWrapper.Wrap'); // shouldn't happen + Assert(Index >= 0, 'Internal Error in PyDelphiWrapper.WrapClass'); // shouldn't happen Result := PPyObject(TRegisteredClass(fClassRegister[Index]).PythonType.TheTypePtr); Engine.Py_XINCREF(Result); From 8a726f56c4dcdf6f8b9ca2a33b6544b36d3dca69 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Mon, 13 Mar 2023 05:28:09 +0400 Subject: [PATCH 042/174] changes to fix Lazarus and FreePascal compilation issues. --- Source/PythonEngine.pas | 6 +++++- Source/WrapDelphi.pas | 3 +++ Source/WrapDelphiClasses.pas | 19 +++++++++++++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 4ce8aba2..c065676a 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -6066,7 +6066,11 @@ function TPythonEngine.PyUnicodeAsString(obj : PPyObject): UnicodeString; Exit; // The second argument is the size of the destination (Result) including #0 - NewSize := Utf8ToUnicode(PChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); + {$IFDEF FPC} + NewSize := Utf8ToUnicode(PUnicodeChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); + {$ELSE} + NewSize := Utf8ToUnicode(PChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); + {$ENDIF} // NewSize includes #0 SetLength(Result, NewSize - 1); end diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index a6fdbf05..a4f732d7 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2571,6 +2571,9 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; var PyType: PPyTypeObject; + {$IFDEF FPC} + i: longint; + {$ENDIF} {$IFDEF EXTENDED_RTTI} Context: TRttiContext; RttiType: TRTTIType; diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 23ca2d56..44ee1d17 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -5,7 +5,8 @@ interface uses - Classes, SysUtils, PythonEngine, WrapDelphi; + Classes, SysUtils, PythonEngine, WrapDelphi + {$IFDEF FPC}, bufstream{$ENDIF}; type { @@ -367,6 +368,7 @@ implementation uses TypInfo {$IFNDEF FPC}, System.Rtti{$ENDIF}; + {$IFNDEF FPC} type TPyReader = class(TReader) @@ -2223,7 +2225,12 @@ TBufferedFileStreamClass = class of TBufferedFileStream; DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LBufferSize); end else if (LArgCount = 3) then begin if (APythonType.Engine.PyArg_ParseTupleAndKeywords(args, kwds, 'sHI|i:Create', @LKwArgs2[0], @LFileName, @LMode, @LRights, @LBufferSize) <> 0) then - DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights, LBufferSize); + {$IFDEF FPC} + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights); + DelphiObject.Size:= LBufferSize; + {$ELSE} + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights, LBufferSize); + {$ENDIF} end; //Maybe it was created on the next attempt... @@ -2385,14 +2392,22 @@ TResourceStreamClass = class of TResourceStream; {$ELSE} if APythonType.Engine.PyArg_ParseTuple(args, 'Iss:Create', @LHandle, @LResName, @LResType) <> 0 then {$ENDIF} + {$IFDEF FPC} + DelphiObject := TResourceStreamClass(DelphiObjectClass).Create(LHandle, String(LResName), PChar(String(LResType))) + {$ELSE} DelphiObject := TResourceStreamClass(DelphiObjectClass).Create(LHandle, String(LResName), PWideChar(String(LResType))) + {$ENDIF} else {$IFDEF CPUX64} if APythonType.Engine.PyArg_ParseTuple(args, 'Kis:Create', @LHandle, @LResId, @LResType) <> 0 then {$ELSE} if APythonType.Engine.PyArg_ParseTuple(args, 'Iis:Create', @LHandle, @LResId, @LResType) <> 0 then {$ENDIF} + {$IFDEF FPC} + DelphiObject := TResourceStreamClass(DelphiObjectClass).CreateFromID(LHandle, LResId, PChar(String(LResType))); + {$ELSE} DelphiObject := TResourceStreamClass(DelphiObjectClass).CreateFromID(LHandle, LResId, PWideChar(String(LResType))); + {$ENDIF} except on E: Exception do with GetPythonEngine do From 62eab068cff182010034fde2de2b09bdc7597911 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Tue, 21 Mar 2023 05:10:33 +0400 Subject: [PATCH 043/174] addressed code review comments by pyscripter. --- Source/PythonEngine.pas | 7 ++----- Source/WrapDelphi.pas | 2 ++ Source/WrapDelphiClasses.pas | 12 ++---------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index c065676a..64813974 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -6066,11 +6066,8 @@ function TPythonEngine.PyUnicodeAsString(obj : PPyObject): UnicodeString; Exit; // The second argument is the size of the destination (Result) including #0 - {$IFDEF FPC} - NewSize := Utf8ToUnicode(PUnicodeChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); - {$ELSE} - NewSize := Utf8ToUnicode(PChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); - {$ENDIF} + NewSize := Utf8ToUnicode(PWideChar(Result), Cardinal(Size + 1), Buffer, Cardinal(Size)); + // NewSize includes #0 SetLength(Result, NewSize - 1); end diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index a4f732d7..56daf4b0 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2573,6 +2573,8 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; PyType: PPyTypeObject; {$IFDEF FPC} i: longint; + {$ELSE} + i: integer; {$ENDIF} {$IFDEF EXTENDED_RTTI} Context: TRttiContext; diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 44ee1d17..7c1d8867 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -2392,22 +2392,14 @@ TResourceStreamClass = class of TResourceStream; {$ELSE} if APythonType.Engine.PyArg_ParseTuple(args, 'Iss:Create', @LHandle, @LResName, @LResType) <> 0 then {$ENDIF} - {$IFDEF FPC} - DelphiObject := TResourceStreamClass(DelphiObjectClass).Create(LHandle, String(LResName), PChar(String(LResType))) - {$ELSE} - DelphiObject := TResourceStreamClass(DelphiObjectClass).Create(LHandle, String(LResName), PWideChar(String(LResType))) - {$ENDIF} + DelphiObject := TResourceStreamClass(DelphiObjectClass).Create(LHandle, String(LResName), PChar(String(LResType))) else {$IFDEF CPUX64} if APythonType.Engine.PyArg_ParseTuple(args, 'Kis:Create', @LHandle, @LResId, @LResType) <> 0 then {$ELSE} if APythonType.Engine.PyArg_ParseTuple(args, 'Iis:Create', @LHandle, @LResId, @LResType) <> 0 then {$ENDIF} - {$IFDEF FPC} - DelphiObject := TResourceStreamClass(DelphiObjectClass).CreateFromID(LHandle, LResId, PChar(String(LResType))); - {$ELSE} - DelphiObject := TResourceStreamClass(DelphiObjectClass).CreateFromID(LHandle, LResId, PWideChar(String(LResType))); - {$ENDIF} + DelphiObject := TResourceStreamClass(DelphiObjectClass).CreateFromID(LHandle, LResId, PChar(String(LResType))); except on E: Exception do with GetPythonEngine do From 6b248612180b3fabeda0dcfa87e3741e171e8506 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Tue, 21 Mar 2023 14:52:25 +0400 Subject: [PATCH 044/174] These changes are in response to PR comments --- Source/WrapDelphi.pas | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 56daf4b0..523f8c8d 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2571,17 +2571,14 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; var PyType: PPyTypeObject; - {$IFDEF FPC} - i: longint; - {$ELSE} - i: integer; - {$ENDIF} + {$IFDEF EXTENDED_RTTI} Context: TRttiContext; RttiType: TRTTIType; {$ELSE} _PropList: PPropList; _propCount : Integer; + i: Integer; {$ENDIF} begin Adjust(@Self); From 3b1cf11757624a5c0c496f7a13b3fc64cd57b8fe Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 16 Jun 2023 15:58:55 +0300 Subject: [PATCH 045/174] Fix PR #413 --- Source/WrapDelphiClasses.pas | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 7c1d8867..3f7e3ac7 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -368,7 +368,6 @@ implementation uses TypInfo {$IFNDEF FPC}, System.Rtti{$ENDIF}; - {$IFNDEF FPC} type TPyReader = class(TReader) @@ -2222,14 +2221,23 @@ TBufferedFileStreamClass = class of TBufferedFileStream; LArgCount := APythonType.Engine.PyTuple_Size(args); if (LArgCount = 2) then begin if (APythonType.Engine.PyArg_ParseTupleAndKeywords(args, kwds, 'sH|i:Create', @LKwArgs1[0], @LFileName, @LMode, @LBufferSize) <> 0) then + {$IFDEF FPC} + begin + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode); + DelphiObject.Size:= LBufferSize; + end; + {$ELSE} DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LBufferSize); + {$ENDIF} end else if (LArgCount = 3) then begin if (APythonType.Engine.PyArg_ParseTupleAndKeywords(args, kwds, 'sHI|i:Create', @LKwArgs2[0], @LFileName, @LMode, @LRights, @LBufferSize) <> 0) then {$IFDEF FPC} - DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights); - DelphiObject.Size:= LBufferSize; + begin + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights); + DelphiObject.Size:= LBufferSize; + end; {$ELSE} - DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights, LBufferSize); + DelphiObject := TBufferedFileStreamClass(DelphiObjectClass).Create(String(LFileName), LMode, LRights, LBufferSize); {$ENDIF} end; From 445de4ea48d67f5d95cb5f9fcc7d355c35f1314e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 29 Jun 2023 19:06:08 +0300 Subject: [PATCH 046/174] Fix #426 --- Source/PythonEngine.pas | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 64813974..0bf657dc 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -6371,6 +6371,10 @@ constructor TEngineClient.Create( AOwner : TComponent ); destructor TEngineClient.Destroy; begin + // if the client is destroyed before the Python Engine then + // we need to finalize it. Otherwise it will already be finalized + if FInitialized then + Finalize; Engine := nil; // This detaches the client from the Engine. if Assigned( FOnDestroy ) then FOnDestroy( Self ); @@ -8647,7 +8651,8 @@ procedure TPythonType.Initialize; procedure TPythonType.Finalize; begin - Engine.Py_CLEAR(FCreateFunc); + if Assigned(Engine) then + Engine.Py_CLEAR(FCreateFunc); FCreateFunc := nil; inherited; end; From 0b97a5a481417508266ec3e083a061c4dcbd295e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 2 Jul 2023 15:20:04 +0300 Subject: [PATCH 047/174] Promoted GetSequenceItem to public --- Source/PythonEngine.pas | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 0bf657dc..b6d7d1b5 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1956,8 +1956,9 @@ TPythonEngine = class(TPythonInterface) function ArrayToPyDict( const items : array of const) : PPyObject; function StringsToPyList( strings : TStrings ) : PPyObject; function StringsToPyTuple( strings : TStrings ) : PPyObject; - procedure PyListToStrings(list: PPyObject; Strings: TStrings; ClearStrings: Boolean = True); + procedure PyListToStrings(list: PPyObject; Strings: TStrings; ClearStrings: Boolean = True); procedure PyTupleToStrings( tuple: PPyObject; strings : TStrings ); + function GetSequenceItem( sequence : PPyObject; idx : Integer ) : Variant; function ReturnNone : PPyObject; function ReturnTrue : PPyObject; function ReturnFalse : PPyObject; @@ -4785,6 +4786,19 @@ function TPythonEngine.GetPythonPath: UnicodeString; {$ENDIF} end; +function TPythonEngine.GetSequenceItem(sequence: PPyObject; + idx: Integer): Variant; + var + val : PPyObject; + begin + val := PySequence_GetItem( sequence, idx ); + try + Result := PyObjectAsVariant( val ); + finally + Py_XDecRef( val ); + end; +end; + function TPythonEngine.GetProgramName: UnicodeString; begin {$IFDEF POSIX} @@ -5742,18 +5756,6 @@ function TPythonEngine.PyObjectAsVariant( obj : PPyObject ) : Variant; end; end; - function GetSequenceItem( sequence : PPyObject; idx : Integer ) : Variant; - var - val : PPyObject; - begin - val := PySequence_GetItem( sequence, idx ); - try - Result := PyObjectAsVariant( val ); - finally - Py_XDecRef( val ); - end; - end; - var i, seq_length : Integer; begin From 98aa85dd8bef82512da4032c91da6411f81013ea Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 14 Jul 2023 04:53:47 +0300 Subject: [PATCH 048/174] Fix #428 --- Source/vcl/WrapVclGrids.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/vcl/WrapVclGrids.pas b/Source/vcl/WrapVclGrids.pas index 46410f66..3f52bbe7 100644 --- a/Source/vcl/WrapVclGrids.pas +++ b/Source/vcl/WrapVclGrids.pas @@ -717,7 +717,7 @@ function TPyDelphiStringGrid.SetCell(args: PPyObject): PPyObject; with GetPythonEngine do begin // adjust the transmitted self argument Adjust(@Self); - if PyArg_ParseTuple( args, 'iiO:GetCell',@col, @row, @value ) <> 0 then + if PyArg_ParseTuple( args, 'iiO:SetCell',@col, @row, @value ) <> 0 then begin DelphiObject.Cells[col, row]:= PyObjectAsString(value); result:=ReturnNone; From 76ef1594c3eb31555ad9aebe3319b79d04f1d9d1 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 1 Aug 2023 00:21:05 +0300 Subject: [PATCH 049/174] Partial sync with the Embarcadero fork. --- Modules/DelphiVCL/DelphiVCL.dpr | 47 +- Packages/Delphi/Delphi 10.4+/PythonFmx.dpk | 3 +- Packages/Delphi/Delphi 10.4+/PythonFmx.dproj | 1 + .../Delphi/Delphi 10.4+/PythonFmxLinux.dpk | 125 +- .../Delphi/Delphi 10.4+/PythonFmxLinux.dproj | 1935 +++++++++-------- Source/Definition.Inc | 2 +- Source/PythonEngine.pas | 46 +- Source/WrapDelphi.pas | 10 +- Source/WrapDelphiClasses.pas | 16 +- Source/WrapDelphiTypes.pas | 48 +- Source/fmx/WrapDelphiFmx.pas | 3 +- Source/fmx/WrapFmxDateTime.pas | 238 ++ Source/fmx/WrapFmxDialogs.pas | 102 +- Source/fmx/WrapFmxEdit.pas | 31 +- Source/fmx/WrapFmxTypes.pas | 724 +++++- Source/vcl/WrapVclExtCtrls.pas | 120 +- Tests/FMX/Android/NumberServicesTest.pas | 12 +- Tests/FMX/Android/WrapDelphiTest.pas | 1068 ++++----- 18 files changed, 2871 insertions(+), 1660 deletions(-) create mode 100644 Source/fmx/WrapFmxDateTime.pas diff --git a/Modules/DelphiVCL/DelphiVCL.dpr b/Modules/DelphiVCL/DelphiVCL.dpr index 0275789e..ffbaabae 100644 --- a/Modules/DelphiVCL/DelphiVCL.dpr +++ b/Modules/DelphiVCL/DelphiVCL.dpr @@ -1,25 +1,22 @@ -library DelphiVCL; - -uses - SysUtils, - Classes, - uMain in 'uMain.pas'; - -{$I ..\..\Source\Definition.Inc} - -exports - // This must match the pattern "PyInit_[ProjectName]" - // So if the project is named DelphiVCL then - // the export must be PyInit_DelphiVCL - PyInit_DelphiVCL; -{$IFDEF MSWINDOWS} -{$E pyd} -{$ENDIF} -{$IFDEF LINUX} -{$SONAME 'DelphiVCL'} - -{$ENDIF} - -begin -end. - +library DelphiVCL; + +uses + SysUtils, + Classes, + uMain in 'uMain.pas'; + +{$I ..\..\Source\Definition.Inc} + +exports + // This must match the pattern "PyInit_[ProjectName]" + // So if the project is named DelphiVCL then + // the export must be PyInit_DelphiVCL + PyInit_DelphiVCL; + +{$IFDEF MSWINDOWS} +{$E pyd} +{$ENDIF} + +begin +end. + diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk index ddc2ec03..8167888e 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk @@ -58,6 +58,7 @@ contains WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas', WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas', WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas', - WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas'; + WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas', + WrapFmxDateTime in '..\..\..\Source\fmx\WrapFmxDateTime.pas'; end. diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj index ecfd8d6b..f3da3849 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj @@ -158,6 +158,7 @@ + Base diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk index 8e416898..9525324e 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk @@ -1,62 +1,63 @@ -package PythonFmxLinux; - -{$R *.res} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO OFF} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS OFF} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO OFF} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$DEFINE RELEASE} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'Python4Delphi - Run-time Engine Package for FMXLinux'} -{$LIBSUFFIX AUTO} -{$RUNONLY} -{$IMPLICITBUILD ON} - -requires - rtl, - python, - fmx; - -contains - FMX.PythonGUIInputOutput in '..\..\..\Source\fmx\FMX.PythonGUIInputOutput.pas', - WrapDelphiFmx in '..\..\..\Source\fmx\WrapDelphiFmx.pas', - WrapFmxActnList in '..\..\..\Source\fmx\WrapFmxActnList.pas', - WrapFmxColors in '..\..\..\Source\fmx\WrapFmxColors.pas', - WrapFmxComCtrls in '..\..\..\Source\fmx\WrapFmxComCtrls.pas', - WrapFmxControls in '..\..\..\Source\fmx\WrapFmxControls.pas', - WrapFmxDialogs in '..\..\..\Source\fmx\WrapFmxDialogs.pas', - WrapFmxEdit in '..\..\..\Source\fmx\WrapFmxEdit.pas', - WrapFmxForms in '..\..\..\Source\fmx\WrapFmxForms.pas', - WrapFmxGrids in '..\..\..\Source\fmx\WrapFmxGrids.pas', - WrapFmxLayouts in '..\..\..\Source\fmx\WrapFmxLayouts.pas', - WrapFmxListBox in '..\..\..\Source\fmx\WrapFmxListBox.pas', - WrapFmxListView in '..\..\..\Source\fmx\WrapFmxListView.pas', - WrapFmxMedia in '..\..\..\Source\fmx\WrapFmxMedia.pas', - WrapFmxMemo in '..\..\..\Source\fmx\WrapFmxMemo.pas', - WrapFmxMenus in '..\..\..\Source\fmx\WrapFmxMenus.pas', - WrapFmxScrollBox in '..\..\..\Source\fmx\WrapFmxScrollBox.pas', - WrapFmxShapes in '..\..\..\Source\fmx\WrapFmxShapes.pas', - WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas', - WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas', - WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas', - WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas'; - -end. - +package PythonFmxLinux; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$DEFINE RELEASE} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'Python4Delphi - Run-time Engine Package for FMXLinux'} +{$LIBSUFFIX AUTO} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + python, + fmx; + +contains + FMX.PythonGUIInputOutput in '..\..\..\Source\fmx\FMX.PythonGUIInputOutput.pas', + WrapDelphiFmx in '..\..\..\Source\fmx\WrapDelphiFmx.pas', + WrapFmxActnList in '..\..\..\Source\fmx\WrapFmxActnList.pas', + WrapFmxColors in '..\..\..\Source\fmx\WrapFmxColors.pas', + WrapFmxComCtrls in '..\..\..\Source\fmx\WrapFmxComCtrls.pas', + WrapFmxControls in '..\..\..\Source\fmx\WrapFmxControls.pas', + WrapFmxDialogs in '..\..\..\Source\fmx\WrapFmxDialogs.pas', + WrapFmxEdit in '..\..\..\Source\fmx\WrapFmxEdit.pas', + WrapFmxForms in '..\..\..\Source\fmx\WrapFmxForms.pas', + WrapFmxGrids in '..\..\..\Source\fmx\WrapFmxGrids.pas', + WrapFmxLayouts in '..\..\..\Source\fmx\WrapFmxLayouts.pas', + WrapFmxListBox in '..\..\..\Source\fmx\WrapFmxListBox.pas', + WrapFmxListView in '..\..\..\Source\fmx\WrapFmxListView.pas', + WrapFmxMedia in '..\..\..\Source\fmx\WrapFmxMedia.pas', + WrapFmxMemo in '..\..\..\Source\fmx\WrapFmxMemo.pas', + WrapFmxMenus in '..\..\..\Source\fmx\WrapFmxMenus.pas', + WrapFmxScrollBox in '..\..\..\Source\fmx\WrapFmxScrollBox.pas', + WrapFmxShapes in '..\..\..\Source\fmx\WrapFmxShapes.pas', + WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas', + WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas', + WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas', + WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas', + WrapFmxDateTime in '..\..\..\Source\fmx\WrapFmxDateTime.pas'; + +end. + diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj index 85456f05..445f21ac 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj @@ -1,967 +1,968 @@ - - - {B0F48139-24FB-42F3-93E8-05DA2E142904} - PythonFmxLinux.dpk - True - Release - 128 - Package - None - 19.5 - Linux64 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - false - false - false - false - false - 00400000 - true - true - PythonFmxLinux - Python4Delphi - Run-time Engine Package for FMXLinux - $(Auto) - true - 1046 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - System;Xml;Data;Datasnap;Web;Soap;REST.Authenticator.OAuth.WebForm;$(DCC_Namespace) - $(BDSCatalogRepositoryAllUsers)\FmxLinux-1.71\redist;$(DCC_UnitSearchPath) - - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - - - RELEASE;$(DCC_Define) - 0 - false - 0 - - - /usr/bin/gnome-terminal -- "%debuggee%" - - - DEBUG;$(DCC_Define) - false - true - true - true - - - Debug - - - Debug - - - Debug - - - Debug - - - - MainSource - - - - - - - - - - - - - - - - - - - - - - - - - - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Package - - - - PythonFmxLinux.dpk - - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - False - False - False - True - False - False - False - False - - - - - true - - - - - true - - - - - true - - - - - bplPythonFmxLinux.so - true - - - - - PythonFmxLinux.bpl - true - - - - - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - - - 12 - - - - - + + + {B0F48139-24FB-42F3-93E8-05DA2E142904} + PythonFmxLinux.dpk + True + Release + 128 + Package + FMX + 19.5 + Linux64 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + false + false + false + false + false + 00400000 + true + true + PythonFmxLinux + Python4Delphi - Run-time Engine Package for FMXLinux + $(Auto) + true + 1046 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + System;Xml;Data;Datasnap;Web;Soap;REST.Authenticator.OAuth.WebForm;$(DCC_Namespace) + $(BDSCatalogRepositoryAllUsers)\FmxLinux-1.71\redist;$(DCC_UnitSearchPath) + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + /usr/bin/gnome-terminal -- "%debuggee%" + + + DEBUG;$(DCC_Define) + false + true + true + true + + + Debug + + + Debug + + + Debug + + + Debug + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Package + + + + PythonFmxLinux.dpk + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + False + False + False + False + True + False + False + False + False + + + + + true + + + + + true + + + + + true + + + + + bplPythonFmxLinux.so + true + + + + + PythonFmxLinux.bpl + true + + + + + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + + 12 + + + + + diff --git a/Source/Definition.Inc b/Source/Definition.Inc index 5c2723b7..826b61a9 100644 --- a/Source/Definition.Inc +++ b/Source/Definition.Inc @@ -108,7 +108,7 @@ {$DEFINE DELPHIXE6_OR_HIGHER} {$DEFINE DELPHIXE7_OR_HIGHER} {$DEFINE DELPHIXE8_OR_HIGHER} - {$DEFINE DELPHIX10_OR_HIGHER} + {$DEFINE DELPHI10_OR_HIGHER} {$ENDIF} {$IFDEF VER310} // Delphi 10.1 {$DEFINE DELPHI10_1} diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index b6d7d1b5..dbc139e2 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1237,7 +1237,8 @@ TDynamicDll = class(TComponent) procedure LoadPythonInfoFromModule; function GetPythonModuleFromProcess(): NativeUInt; - function HasHostSymbols(): boolean; + // Check for Python symbols in the current loaded library (FDLLHandle) + function HasPythonSymbolsInLibrary(): boolean; procedure LoadFromHostSymbols(); //Loading strategies function TryLoadFromHostSymbols(): boolean; @@ -1612,6 +1613,7 @@ TPythonInterface=class(TDynamicDll) PyBytes_Size:function (ob:PPyObject):NativeInt; cdecl; PyBytes_DecodeEscape:function(s:PAnsiChar; len:NativeInt; errors:PAnsiChar; unicode:NativeInt; recode_encoding:PAnsiChar):PPyObject; cdecl; PyBytes_Repr:function(ob:PPyObject; smartquotes:integer):PPyObject; cdecl; + PyBytes_FromObject: function(ob:PPyObject): PPyObject; cdecl; PyByteArray_Concat: procedure(var ob1: PPyObject; ob2: PPyObject); cdecl; PyByteArray_Resize: procedure(var ob1: PPyObject; len: Py_ssize_t); cdecl; PyByteArray_FromObject: function(ob:PPyObject): PPyObject; cdecl; @@ -1987,6 +1989,7 @@ TPythonEngine = class(TPythonInterface) function PyUnicodeAsString( obj : PPyObject ) : UnicodeString; function PyUnicodeAsUTF8String( obj : PPyObject ) : RawByteString; function PyBytesAsAnsiString( obj : PPyObject ) : AnsiString; + function PyByteArrayAsAnsiString( obj : PPyObject ) : AnsiString; // Public Properties property ClientCount : Integer read GetClientCount; @@ -3093,16 +3096,10 @@ function TDynamicDll.GetPythonModuleFromProcess(): NativeUInt; {$IFNDEF FPC} function HasSymbols(const AModule: NativeUInt): boolean; - var - LPy_GetBuildInfo: function : PAnsiChar; cdecl; - LPy_IsInitialized: function: integer; cdecl; begin FDLLHandle := AModule; try - LPy_GetBuildInfo := Import('Py_GetBuildInfo', false); - LPy_IsInitialized := Import('Py_IsInitialized', false); - Result := Assigned(LPy_GetBuildInfo) and Assigned(LPy_GetBuildInfo()) - and Assigned(LPy_IsInitialized) and (LPy_IsInitialized() <> 0); + Result := HasPythonSymbolsInLibrary(); finally FDLLHandle := 0; end; @@ -3308,10 +3305,16 @@ function TDynamicDll.TryLoadFromCurrentProcess: boolean; function TDynamicDll.TryLoadFromHostSymbols: boolean; begin //We want to look in for host symbols at first + {$IFNDEF FPC} + FDLLHandle := LoadLibrary(''); + {$ELSE} FDLLHandle := 0; - Result := HasHostSymbols(); + {$ENDIF} + Result := HasPythonSymbolsInLibrary(); if Result then - LoadFromHostSymbols(); + LoadFromHostSymbols() + else + FDLLHandle := 0; end; procedure TDynamicDll.LoadFromHostSymbols; @@ -3412,12 +3415,15 @@ function TDynamicDll.GetQuitMessage : string; Result := Format( 'Dll %s could not be loaded. We must quit.', [DllName]); end; -function TDynamicDll.HasHostSymbols: boolean; +function TDynamicDll.HasPythonSymbolsInLibrary: boolean; var + LPy_GetBuildInfo: function: PAnsiChar; cdecl; LPy_IsInitialized: function: integer; cdecl; begin + LPy_GetBuildInfo := Import('Py_GetBuildInfo', false); LPy_IsInitialized := Import('Py_IsInitialized', false); - Result := Assigned(LPy_IsInitialized) and (LPy_IsInitialized() <> 0); + Result := Assigned(LPy_GetBuildInfo) and Assigned(LPy_GetBuildInfo()) + and Assigned(LPy_IsInitialized) and (LPy_IsInitialized() <> 0); end; procedure TDynamicDll.Quit; @@ -3808,6 +3814,7 @@ procedure TPythonInterface.MapDll; PyBytes_DecodeEscape := Import('PyBytes_DecodeEscape'); PyBytes_Repr := Import('PyBytes_Repr'); _PyBytes_Resize := Import('_PyBytes_Resize'); + PyBytes_FromObject := Import('PyBytes_FromObject'); PyByteArray_AsString := Import('PyByteArray_AsString'); PyByteArray_Concat := Import('PyByteArray_Concat'); PyByteArray_Resize := Import('PyByteArray_Resize'); @@ -6039,6 +6046,21 @@ procedure TPythonEngine.PyTupleToStrings( tuple: PPyObject; strings : TStrings ) strings.Add( PyObjectAsString( PyTuple_GetItem( tuple, i ) ) ); end; +function TPythonEngine.PyByteArrayAsAnsiString(obj: PPyObject): AnsiString; +var + LBuffer: PAnsiChar; + LSize: Py_ssize_t; +begin + if PyByteArray_Check(obj) then + begin + LSize := PyByteArray_Size(obj); + LBuffer := PyByteArray_AsString(obj); + SetString(Result, LBuffer, LSize); + end + else + raise EPythonError.CreateFmt(SPyConvertionError, ['PyByteArrayAsAnsiString', 'ByteArray']); +end; + function TPythonEngine.PyBytesAsAnsiString(obj: PPyObject): AnsiString; var buffer: PAnsiChar; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 523f8c8d..3eb9aba0 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2043,8 +2043,11 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; try if ParentRtti is TRttiInstanceType then - if meth.IsClassMethod then - Addr := TValue.From(TObject(ParentAddress).ClassType) + if meth.IsClassMethod or meth.IsStatic then + if AParentAddrIsClass then + Addr := TValue.From(TClass(ParentAddress)) + else + Addr := TValue.From(TObject(ParentAddress).ClassType) else Addr := TValue.From(TObject(ParentAddress)) else if ParentRtti is TRttiInterfaceType then @@ -2571,7 +2574,6 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; var PyType: PPyTypeObject; - {$IFDEF EXTENDED_RTTI} Context: TRttiContext; RttiType: TRTTIType; @@ -2688,7 +2690,6 @@ procedure TPyDelphiObject.Notify(ADeletedObject: TObject); class procedure TPyDelphiObject.RegisterGetSets(PythonType: TPythonType); begin inherited; - // then register TObject + custom getters/setters. with PythonType do begin @@ -4022,4 +4023,3 @@ finalization {$ENDIF} FreeAndNil(gRegisteredUnits); end. - diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 3f7e3ac7..2e2ae482 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -1927,7 +1927,7 @@ class procedure TPyDelphiStream.RegisterMethods(PythonType: TPythonType); begin inherited; PythonType.AddMethod('ReadBytes', @TPyDelphiStream.ReadBytes_Wrapper, - 'TPyDelphiStream.ReadBytes()' + #10 + 'Read content as bytearray.'); + 'TPyDelphiStream.ReadBytes()' + #10 + 'Read content as bytes.'); PythonType.AddMethod('ReadInt', @TPyDelphiStream.ReadInt_Wrapper, 'TPyDelphiStream.ReadInt()' + #10 + 'Read content as integer.'); PythonType.AddMethod('ReadString', @TPyDelphiStream.ReadString_Wrapper, @@ -1936,7 +1936,7 @@ class procedure TPyDelphiStream.RegisterMethods(PythonType: TPythonType); 'TPyDelphiStream.ReadFloat()' + #10 + 'Read content as float.'); PythonType.AddMethod('WriteBytes', @TPyDelphiStream.WriteBytes_Wrapper, - 'TPyDelphiStream.WriteBytes()' + #10 + 'Write content as bytearray.'); + 'TPyDelphiStream.WriteBytes()' + #10 + 'Write content as bytes.'); PythonType.AddMethod('WriteInt', @TPyDelphiStream.WriteInt_Wrapper, 'TPyDelphiStream.WriteInt()' + #10 + 'Write content as integer.'); PythonType.AddMethod('WriteString', @TPyDelphiStream.WriteString_Wrapper, @@ -1978,7 +1978,7 @@ function TPyDelphiStream.ReadBytes_Wrapper(const AArgs: PPyObject): PPyObject; Py_XDecRef(LItem); end; //The content - LItem := PyByteArray_FromObject(LBytes); + LItem := PyBytes_FromObject(LBytes); Py_XDecRef(LBytes); PyList_Append(Result, LItem); Py_XDecRef(LItem); @@ -2060,9 +2060,9 @@ function TPyDelphiStream.WriteBytes_Wrapper(const AArgs: PPyObject): PPyObject; Adjust(@Self); Result := nil; with GetPythonEngine() do begin - if PyArg_ParseTuple(AArgs, 'Yi:Create', @LValue, @LCount) <> 0 then - if PyByteArray_Check(LValue) then begin - LBuffer := TEncoding.Default.GetBytes(String(PyByteArray_AsString(LValue))); + if PyArg_ParseTuple(AArgs, 'Si:Create', @LValue, @LCount) <> 0 then + if PyBytes_Check(LValue) then begin + LBuffer := TEncoding.Default.GetBytes(String(PyBytesAsAnsiString(LValue))); Result := PyLong_FromLong(DelphiObject.Write(LBuffer, LCount)); end; end; @@ -2315,13 +2315,13 @@ TBytesStreamClass = class of TBytesStream; if APythonType.Engine.PyByteArray_Check(LBytes) then begin DelphiObject := TBytesStreamClass(DelphiObjectClass).Create( TEncoding.Default.GetBytes( - String(APythonType.Engine.PyByteArray_AsString(LBytes)))); + String(APythonType.Engine.PyByteArrayAsAnsiString(LBytes)))); end; end else if APythonType.Engine.PyArg_ParseTuple(args, 'S:Create', @LBytes) <> 0 then begin if APythonType.Engine.PyBytes_Check(LBytes) then begin DelphiObject := TBytesStreamClass(DelphiObjectClass).Create( TEncoding.Default.GetBytes( - String(APythonType.Engine.PyBytes_AsString(LBytes)))); + String(APythonType.Engine.PyBytesAsAnsiString(LBytes)))); end; end; diff --git a/Source/WrapDelphiTypes.pas b/Source/WrapDelphiTypes.pas index 55ef30aa..12f7718c 100644 --- a/Source/WrapDelphiTypes.pas +++ b/Source/WrapDelphiTypes.pas @@ -9,7 +9,11 @@ interface SysUtils, PythonEngine, Types, - WrapDelphi; + WrapDelphi + {$IFNDEF FPC} + , System.UITypes + {$ENDIF FPC} + ; type TPyDelphiPoint = class(TPyObject) @@ -95,10 +99,14 @@ TPyDelphiSize = class(TPyObject) function CheckRectAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TRect) : Boolean; function CheckSizeAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TSize) : Boolean; + {$IFNDEF FPC} + function MouseButtonToPython(const AMouseButton: TMouseButton): PPyObject; + {$ENDIF FPC} + implementation uses - Math; + Math, Rtti; { Register the wrappers, the globals and the constants } type @@ -114,6 +122,31 @@ TTypesRegistration = class(TRegisteredUnit) procedure TTypesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); begin inherited; + {$IFNDEF FPC} + APyDelphiWrapper.DefineVar('crDefault', crDefault); + APyDelphiWrapper.DefineVar('crNone', crNone); + APyDelphiWrapper.DefineVar('crArrow', crArrow); + APyDelphiWrapper.DefineVar('crCross', crCross); + APyDelphiWrapper.DefineVar('crIBeam', crIBeam); + APyDelphiWrapper.DefineVar('crSize', crSize); + APyDelphiWrapper.DefineVar('crSizeNESW', crSizeNESW); + APyDelphiWrapper.DefineVar('crSizeNS', crSizeNS); + APyDelphiWrapper.DefineVar('crSizeNWSE', crSizeNWSE); + APyDelphiWrapper.DefineVar('crSizeWE', crSizeWE); + APyDelphiWrapper.DefineVar('crUpArrow', crUpArrow); + APyDelphiWrapper.DefineVar('crHourGlass', crHourGlass); + APyDelphiWrapper.DefineVar('crDrag', crDrag); + APyDelphiWrapper.DefineVar('crNoDrop', crNoDrop); + APyDelphiWrapper.DefineVar('crHSplit', crHSplit); + APyDelphiWrapper.DefineVar('crVSplit', crVSplit); + APyDelphiWrapper.DefineVar('crMultiDrag', crMultiDrag); + APyDelphiWrapper.DefineVar('crSQLWait', crSQLWait); + APyDelphiWrapper.DefineVar('crNo', crNo); + APyDelphiWrapper.DefineVar('crAppStart', crAppStart); + APyDelphiWrapper.DefineVar('crHelp', crHelp); + APyDelphiWrapper.DefineVar('crHandPoint', crHandPoint); + APyDelphiWrapper.DefineVar('crSizeAll', crSizeAll); + {$ENDIF FPC} end; function TTypesRegistration.Name: string; @@ -129,7 +162,16 @@ procedure TTypesRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper APyDelphiWrapper.RegisterHelperType(TPyDelphiSize); end; +{$IFNDEF FPC} +function MouseButtonToPython(const AMouseButton: TMouseButton): PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString( + TRttiEnumerationType.GetName(AMouseButton)); +end; +{$ENDIF FPC} + { Helper functions } + function WrapPoint(APyDelphiWrapper : TPyDelphiWrapper; const APoint : TPoint) : PPyObject; var _type : TPythonType; @@ -509,7 +551,6 @@ class procedure TPyDelphiRect.SetupType(PythonType: TPythonType); PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; end; - { TPyDelphiSize } function TPyDelphiSize.Compare(obj: PPyObject): Integer; @@ -612,4 +653,5 @@ function TPyDelphiSize.Set_CY(AValue: PPyObject; initialization RegisteredUnits.Add(TTypesRegistration.Create); + end. diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index 558ea03d..4e1505e1 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -33,6 +33,7 @@ implementation WrapFmxMenus, WrapFmxStyles, WrapFmxMemo, - WrapFmxColors; + WrapFmxColors, + WrapFmxDateTime; end. diff --git a/Source/fmx/WrapFmxDateTime.pas b/Source/fmx/WrapFmxDateTime.pas new file mode 100644 index 00000000..1fc12e31 --- /dev/null +++ b/Source/fmx/WrapFmxDateTime.pas @@ -0,0 +1,238 @@ +unit WrapFmxDateTime; + +interface + +uses + Classes, + FMX.DateTimeCtrls, FMX.Calendar, + PythonEngine, WrapDelphi, WrapFmxControls; + +type + {|||| FMX.DateTimeCtrls ||||} + + TPyDelphiCustomDateTimeEdit = class(TPyDelphiTextControl) + private + function GetDelphiObject: TCustomDateTimeEdit; + procedure SetDelphiObject(const Value: TCustomDateTimeEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomDateTimeEdit read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomTimeEdit = class(TPyDelphiCustomDateTimeEdit) + private + function GetDelphiObject: TCustomTimeEdit; + procedure SetDelphiObject(const Value: TCustomTimeEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomTimeEdit read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTimeEdit = class(TPyDelphiCustomTimeEdit) + private + function GetDelphiObject: TTimeEdit; + procedure SetDelphiObject(const Value: TTimeEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TTimeEdit read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomDateEdit = class(TPyDelphiCustomDateTimeEdit) + private + function GetDelphiObject: TCustomDateEdit; + procedure SetDelphiObject(const Value: TCustomDateEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomDateEdit read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiDateEdit = class(TPyDelphiCustomDateEdit) + private + function GetDelphiObject: TDateEdit; + procedure SetDelphiObject(const Value: TDateEdit); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TDateEdit read GetDelphiObject write SetDelphiObject; + end; + + {|||| FMX.Calendar ||||} + + TPyDelphiCustomCalendar = class(TPyDelphiPresentedControl) + private + function GetDelphiObject: TCustomCalendar; + procedure SetDelphiObject(const Value: TCustomCalendar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCustomCalendar read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCalendar = class(TPyDelphiCustomCalendar) + private + function GetDelphiObject: TCalendar; + procedure SetDelphiObject(const Value: TCalendar); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TCalendar read GetDelphiObject write SetDelphiObject; + end; + +implementation + +type +{ Register the wrappers, the globals and the constants } + TDateTimeRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TDateTimeRegistration } + +function TDateTimeRegistration.Name: string; +begin + Result := 'DateTimeCtrls'; +end; + +procedure TDateTimeRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomDateTimeEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTimeEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimeEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomDateEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateEdit); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCalendar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCalendar); +end; + +{ TPyDelphiCustomDateTimeEdit } + +class function TPyDelphiCustomDateTimeEdit.DelphiObjectClass: TClass; +begin + Result := TCustomDateTimeEdit; +end; + +function TPyDelphiCustomDateTimeEdit.GetDelphiObject: TCustomDateTimeEdit; +begin + Result := TCustomDateTimeEdit(inherited DelphiObject); +end; + +procedure TPyDelphiCustomDateTimeEdit.SetDelphiObject( + const Value: TCustomDateTimeEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomTimeEdit } + +class function TPyDelphiCustomTimeEdit.DelphiObjectClass: TClass; +begin + Result := TCustomTimeEdit; +end; + +function TPyDelphiCustomTimeEdit.GetDelphiObject: TCustomTimeEdit; +begin + Result := TCustomTimeEdit(inherited DelphiObject); +end; + +procedure TPyDelphiCustomTimeEdit.SetDelphiObject(const Value: TCustomTimeEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTimeEdit } + +class function TPyDelphiTimeEdit.DelphiObjectClass: TClass; +begin + Result := TTimeEdit; +end; + +function TPyDelphiTimeEdit.GetDelphiObject: TTimeEdit; +begin + Result := TTimeEdit(inherited DelphiObject); +end; + +procedure TPyDelphiTimeEdit.SetDelphiObject(const Value: TTimeEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomDateEdit } + +class function TPyDelphiCustomDateEdit.DelphiObjectClass: TClass; +begin + Result := TCustomDateEdit; +end; + +function TPyDelphiCustomDateEdit.GetDelphiObject: TCustomDateEdit; +begin + Result := TCustomDateEdit(inherited DelphiObject); +end; + +procedure TPyDelphiCustomDateEdit.SetDelphiObject(const Value: TCustomDateEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiDateEdit } + +class function TPyDelphiDateEdit.DelphiObjectClass: TClass; +begin + Result := TDateEdit; +end; + +function TPyDelphiDateEdit.GetDelphiObject: TDateEdit; +begin + Result := TDateEdit(inherited DelphiObject); +end; + +procedure TPyDelphiDateEdit.SetDelphiObject(const Value: TDateEdit); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomCalendar } + +class function TPyDelphiCustomCalendar.DelphiObjectClass: TClass; +begin + Result := TCustomCalendar; +end; + +function TPyDelphiCustomCalendar.GetDelphiObject: TCustomCalendar; +begin + Result := TCustomCalendar(inherited DelphiObject); +end; + +procedure TPyDelphiCustomCalendar.SetDelphiObject(const Value: TCustomCalendar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCalendar } + +class function TPyDelphiCalendar.DelphiObjectClass: TClass; +begin + Result := TCalendar; +end; + +function TPyDelphiCalendar.GetDelphiObject: TCalendar; +begin + Result := TCalendar(inherited DelphiObject); +end; + +procedure TPyDelphiCalendar.SetDelphiObject(const Value: TCalendar); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TDateTimeRegistration.Create); + +end. diff --git a/Source/fmx/WrapFmxDialogs.pas b/Source/fmx/WrapFmxDialogs.pas index 8e9ae53c..059dcd66 100644 --- a/Source/fmx/WrapFmxDialogs.pas +++ b/Source/fmx/WrapFmxDialogs.pas @@ -5,7 +5,8 @@ interface uses - FMX.Dialogs, WrapFmxTypes, PythonEngine; + FMX.Dialogs, FMX.DialogService, + WrapDelphi, WrapFmxTypes, PythonEngine; type @@ -27,10 +28,36 @@ TPyDelphiOpenDialog = class(TPyDelphiFmxObject) write SetDelphiObject; end; -implementation + TPyDelphiSaveDialog = class(TPyDelphiFmxObject) + private + function GetDelphiObject: TSaveDialog; + procedure SetDelphiObject(const Value: TSaveDialog); + protected + // Exposed Methods + function Execute_Wrapper(args: PPyObject): PPyObject; cdecl; + // Property Getters + function Get_filename(AContext: Pointer): PPyObject; cdecl; + public + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure RegisterMethods(PythonType: TPythonType); override; + // Properties + property DelphiObject: TSaveDialog read GetDelphiObject + write SetDelphiObject; + end; -uses - WrapDelphi; + TPyDelphiDialogService = class(TPyDelphiObject) + private + function GetDelphiObject: TDialogService; + procedure SetDelphiObject(const Value: TDialogService); + public + class function DelphiObjectClass: TClass; override; + public + property DelphiObject: TDialogService read GetDelphiObject + write SetDelphiObject; + end; + +implementation { Register the wrappers, the globals and the constants } type @@ -58,6 +85,8 @@ procedure TDialogRegistration.RegisterWrappers( begin inherited; APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiOpenDialog); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSaveDialog); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDialogService); end; { TPyDelphiOpenDialog } @@ -108,6 +137,71 @@ procedure TPyDelphiOpenDialog.SetDelphiObject(const Value: TOpenDialog); inherited DelphiObject := Value; end; +{ TPyDelphiSaveDialog } + +class function TPyDelphiSaveDialog.DelphiObjectClass: TClass; +begin + Result := TSaveDialog; +end; + +function TPyDelphiSaveDialog.Execute_Wrapper(args: PPyObject): PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, ':Execute') <> 0 then + Result := VariantAsPyObject(DelphiObject.Execute()) + else + Result := nil; + end; +end; + +function TPyDelphiSaveDialog.GetDelphiObject: TSaveDialog; +begin + Result := TSaveDialog(inherited DelphiObject); +end; + +function TPyDelphiSaveDialog.Get_filename(AContext: Pointer): PPyObject; +begin + Adjust(@self); + Result := GetPythonEngine.VariantAsPyObject(DelphiObject.FileName); +end; + +class procedure TPyDelphiSaveDialog.RegisterGetSets(PythonType: TPythonType); +begin + PythonType.AddGetSet('FileName', @TPyDelphiOpenDialog.Get_filename, + nil, '', nil); +end; + +class procedure TPyDelphiSaveDialog.RegisterMethods(PythonType: TPythonType); +begin + PythonType.AddMethod('Execute', @TPyDelphiOpenDialog.Execute_Wrapper, + 'TOpenDialog.Execute()'#10 + + 'Displays the dialog'); +end; + +procedure TPyDelphiSaveDialog.SetDelphiObject(const Value: TSaveDialog); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiDialogService } + +class function TPyDelphiDialogService.DelphiObjectClass: TClass; +begin + Result := TDialogService; +end; + +function TPyDelphiDialogService.GetDelphiObject: TDialogService; +begin + Result := TDialogService(inherited DelphiObject); +end; + +procedure TPyDelphiDialogService.SetDelphiObject(const Value: TDialogService); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TDialogRegistration.Create); diff --git a/Source/fmx/WrapFmxEdit.pas b/Source/fmx/WrapFmxEdit.pas index 74f60fd9..05a0cee5 100644 --- a/Source/fmx/WrapFmxEdit.pas +++ b/Source/fmx/WrapFmxEdit.pas @@ -5,7 +5,7 @@ interface uses - FMX.Edit, FMX.SearchBox, FMX.ComboEdit, FMX.EditBox, FMX.SpinBox, + FMX.Edit, FMX.SearchBox, FMX.ComboEdit, FMX.EditBox, FMX.SpinBox, FMX.NumberBox, PythonEngine, WrapFmxTypes, WrapFmxControls; @@ -98,6 +98,17 @@ TPyDelphiSpinBox = class(TPyDelphiCustomEditBox) write SetDelphiObject; end; + TPyDelphiNumberBox = class(TPyDelphiCustomEditBox) + private + function GetDelphiObject: TNumberBox; + procedure SetDelphiObject(const Value: TNumberBox); + public + class function DelphiObjectClass: TClass; override; + // Properties + property DelphiObject: TNumberBox read GetDelphiObject + write SetDelphiObject; + end; + implementation uses @@ -136,6 +147,7 @@ procedure TEditRegistration.RegisterWrappers( APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiComboEdit); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomEditBox); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiSpinBox); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiNumberBox); end; { TPyDelphiCustomEdit } @@ -275,6 +287,23 @@ procedure TPyDelphiSpinBox.SetDelphiObject(const Value: TSpinBox); inherited DelphiObject := Value; end; +{ TPyDelphiNumberBox } + +class function TPyDelphiNumberBox.DelphiObjectClass: TClass; +begin + Result := TNumberBox; +end; + +function TPyDelphiNumberBox.GetDelphiObject: TNumberBox; +begin + Result := TNumberBox(inherited DelphiObject); +end; + +procedure TPyDelphiNumberBox.SetDelphiObject(const Value: TNumberBox); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TEditRegistration.Create); diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 5ab014a4..efc3c7f4 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -4,7 +4,8 @@ interface uses - System.Types, FMX.Types, PythonEngine, WrapDelphi, WrapDelphiClasses; + System.Types, FMX.Types, PythonEngine, WrapDelphi, WrapDelphiClasses, + System.TypInfo, System.UITypes, System.Classes; type { @@ -72,6 +73,25 @@ TPyDelphiRectF = class(TPyObject) property Value: TRectF read FValue write FValue; end; + TPyDelphiTouch = class(TPyObject) + private + FValue: TTouch; + FPyDelphiWrapper: TPyDelphiWrapper; + protected + // Exposed Getters + function Get_Location(AContext: Pointer): PPyObject; cdecl; + // Exposed Setters + function Set_Location(AValue: PPyObject; AContext: Pointer): integer; cdecl; + public + constructor Create(APythonType: TPythonType); override; + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + function Compare(obj: PPyObject): Integer; override; + function Repr: PPyObject; override; + class procedure RegisterGetSets(PythonType: TPythonType); override; + class procedure SetupType(PythonType: TPythonType); override; + property Value : TTouch read FValue write FValue; + end; + TPyDelphiFmxObject = class(TPyDelphiComponent) private function GetDelphiObject: TFmxObject; @@ -158,18 +178,100 @@ TPyDelphiTimer = class (TPyDelphiComponent) property DelphiObject: TTimer read GetDelphiObject write SetDelphiObject; end; + TMouseEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TMouseMoveEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Shift: TShiftState; X, Y: Single); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TMouseWheelEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TKeyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TProcessTickEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; time, deltaTime: Single); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TVirtualKeyboardEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; KeyboardVisible: Boolean; const Bounds : TRect); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TTapEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; const Point: TPointF); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TTouchEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; const Touches: TTouches; const Action: TTouchAction); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + {Helper functions} + function WrapPointF(APyDelphiWrapper: TPyDelphiWrapper; const APoint : TPointF) : PPyObject; function WrapSizeF(APyDelphiWrapper: TPyDelphiWrapper; const ASize : TSizeF) : PPyObject; function WrapRectF(APyDelphiWrapper: TPyDelphiWrapper; const ARect : TRectF) : PPyObject; + function WrapTouch(APyDelphiWrapper: TPyDelphiWrapper; const ATouch: TTouch): PPyObject; + function WrapTouches(APyDelphiWrapper: TPyDelphiWrapper; const ATouches: TTouches): PPyObject; function CheckPointFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TPointF): Boolean; function CheckSizeFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TSizeF): Boolean; function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TRectF): Boolean; + function CheckTouchAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TTouch): Boolean; + + function TouchActionToPython(ATouchAction: TTouchAction): PPyObject; + implementation + uses - System.Math, System.SysUtils; + System.Math, System.SysUtils, System.Rtti, + WrapDelphiTypes; { Register the wrappers, the globals and the constants } + type TTypesRegistration = class(TRegisteredUnit) public @@ -178,7 +280,47 @@ TTypesRegistration = class(TRegisteredUnit) procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; end; +{ TTypesRegistration } + +procedure TTypesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TTypesRegistration.Name: string; +begin + Result := 'FMX Types'; +end; + +procedure TTypesRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterHelperType(TPyDelphiPointF); + APyDelphiWrapper.RegisterHelperType(TPyDelphiSizeF); + APyDelphiWrapper.RegisterHelperType(TPyDelphiRectF); + APyDelphiWrapper.RegisterHelperType(TPyDelphiTouch); + + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFmxObject); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPosition); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupMenu); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBounds); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControlSize); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimer); + + //Event handlers + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseWheelEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TProcessTickEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TVirtualKeyboardEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTapEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTouchEventHandler); +end; + { TPyDelphiPointF } + function TPyDelphiPointF.Compare(obj: PPyObject): Integer; var _other : TPyDelphiPointF; @@ -276,33 +418,8 @@ function TPyDelphiPointF.Set_Y(AValue: PPyObject; AContext: Pointer): integer; Result := -1; end; -{ TTypesRegistration } -procedure TTypesRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; - -function TTypesRegistration.Name: string; -begin - Result := 'FMX Types'; -end; - -procedure TTypesRegistration.RegisterWrappers( - APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.RegisterHelperType(TPyDelphiPointF); - APyDelphiWrapper.RegisterHelperType(TPyDelphiSizeF); - APyDelphiWrapper.RegisterHelperType(TPyDelphiRectF); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFmxObject); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPosition); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupMenu); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBounds); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControlSize); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimer); -end; - { Helper functions } + function WrapPointF(APyDelphiWrapper : TPyDelphiWrapper; const APoint : TPointF) : PPyObject; var _type : TPythonType; @@ -330,6 +447,37 @@ function WrapRectF(APyDelphiWrapper: TPyDelphiWrapper; const ARect : TRectF) : P (PythonToDelphi(Result) as TPyDelphiRectF).Value := ARect; end; +function WrapTouch(APyDelphiWrapper: TPyDelphiWrapper; const ATouch: TTouch): PPyObject; +var + LType : TPythonType; +begin + LType := APyDelphiWrapper.GetHelperType('TouchType'); + Result := LType.CreateInstance; + (PythonToDelphi(Result) as TPyDelphiTouch).Value := ATouch; +end; + +function WrapTouches(APyDelphiWrapper: TPyDelphiWrapper; const ATouches: TTouches): PPyObject; + + procedure Append(AList : PPyObject; const ATouch : TTouch); + var + LPyItem : PPyObject; + begin + with GetPythonEngine do + begin + LPyItem := WrapTouch(APyDelphiWrapper, ATouch); + PyList_Append(AList, LPyItem); + Py_XDecRef(LPyItem); + end; + end; + +var + LTouch: TTouch; +begin + Result := GetPythonEngine.PyList_New(0); + for LTouch in ATouches do + Append(Result, LTouch); +end; + function CheckPointFAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : TPointF) : Boolean; begin with GetPythonEngine do @@ -387,7 +535,33 @@ function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string end; end; +function CheckTouchAttribute(AAttribute: PPyObject; const AAttributeName: string; out AValue: TTouch): Boolean; +begin + with GetPythonEngine do + begin + if IsDelphiObject(AAttribute) and (PythonToDelphi(AAttribute) is TPyDelphiTouch) then + begin + AValue := TPyDelphiTouch(PythonToDelphi(AAttribute)).Value; + Result := True; + end + else + begin + Result := False; + with GetPythonEngine do + PyErr_SetString (PyExc_AttributeError^, + PAnsiChar(AnsiString(Format('%s receives only Touch objects', [AAttributeName])))); + end; + end; +end; + +function TouchActionToPython(ATouchAction: TTouchAction): PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString( + TRttiEnumerationType.GetName(ATouchAction)); +end; + { TPyDelphiFmxObject } + class function TPyDelphiFmxObject.DelphiObjectClass: TClass; begin Result := TFmxObject; @@ -407,7 +581,7 @@ function TPyDelphiFmxObject.Get_Parent(AContext: Pointer): PPyObject; class procedure TPyDelphiFmxObject.RegisterGetSets(PythonType: TPythonType); begin PythonType.AddGetSet('Parent', @TPyDelphiFmxObject.Get_Parent, @TPyDelphiFmxObject.Set_Parent, - 'Returns/Sets the Control Visibility', nil); + 'Returns/Sets the Control Visibility', nil); end; class procedure TPyDelphiFmxObject.RegisterMethods(PythonType: TPythonType); @@ -540,6 +714,7 @@ function TPyDelphiPosition.Set_Y(AValue: PPyObject; AContext: Pointer): integer; end; { TPyDelphiSizeF } + function TPyDelphiSizeF.Compare(obj: PPyObject): Integer; var LOther : TPyDelphiSizeF; @@ -640,6 +815,7 @@ function TPyDelphiSizeF.Set_Width(AValue: PPyObject; end; { TPyDelphiCustomPopupMenu } + class function TPyDelphiCustomPopupMenu.DelphiObjectClass: TClass; begin Result := TCustomPopupMenu; @@ -657,6 +833,7 @@ procedure TPyDelphiCustomPopupMenu.SetDelphiObject( end; { TPyDelphiBounds } + constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args: PPyObject); var @@ -714,6 +891,7 @@ function TPyDelphiBounds.Set_Rect(AValue: PPyObject; end; { TPyDelphiControlSize } + constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args: PPyObject); var @@ -770,6 +948,7 @@ function TPyDelphiControlSize.Set_SizeF(AValue: PPyObject; end; { TPyDelphiRectF } + function TPyDelphiRectF.Compare(obj: PPyObject): Integer; var LOther : TPyDelphiRectF; @@ -916,6 +1095,92 @@ function TPyDelphiRectF.Set_Top(AValue: PPyObject; AContext: Pointer): integer; Result := -1; end; +{ TPyDelphiTouch } + +function TPyDelphiTouch.Compare(obj: PPyObject): Integer; +var + LOther : TPyDelphiTouch; +begin + if IsDelphiObject(obj) and (PythonToDelphi(obj) is TPyDelphiPointF) then + begin + LOther := TPyDelphiTouch(PythonToDelphi(obj)); + Result := CompareValue(Value.Location.X, LOther.Value.Location.X); + if Result = 0 then + Result := CompareValue(Value.Location.Y, LOther.Value.Location.Y); + end + else + Result := 1; +end; + +constructor TPyDelphiTouch.Create(APythonType: TPythonType); +begin + inherited; + if Assigned(PythonType) and (PythonType.Owner is TPyDelphiWrapper) then + FPyDelphiWrapper := TPyDelphiWrapper(PythonType.Owner); +end; + +constructor TPyDelphiTouch.CreateWith(APythonType: TPythonType; + args: PPyObject); +var + LPointF : TPointF; + LPyPointF : PPyObject; +begin + inherited; + with GetPythonEngine do + if PyArg_ParseTuple(args, 'O:Create', @LPyPointF) <> 0 then + if CheckPointFAttribute(LPyPointF, 'pointf', LPointF) then begin + FValue.Location := LPointF + end; +end; + +function TPyDelphiTouch.Get_Location(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := WrapPointF(FPyDelphiWrapper, Value.Location); +end; + +class procedure TPyDelphiTouch.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + with PythonType do + begin + AddGetSet('Location', @TPyDelphiTouch.Get_Location, @TPyDelphiTouch.Set_Location, + 'Provides access to the location of a touch', nil); + end; +end; + +function TPyDelphiTouch.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString(Format('', + [Value.Location.X, Value.Location.Y])); +end; + +class procedure TPyDelphiTouch.SetupType(PythonType: TPythonType); +begin + inherited; + PythonType.TypeName := 'Touch'; + PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; + PythonType.TypeFlags := PythonType.TypeFlags + [tpfBaseType]; + PythonType.GenerateCreateFunction := False; + PythonType.DocString.Text := 'wrapper for Delphi FMX TTouch type'; + PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; +end; + +function TPyDelphiTouch.Set_Location(AValue: PPyObject; + AContext: Pointer): integer; +var + LValue: TPointF; +begin + if CheckPointFAttribute(AValue, 'Location', LValue) then + with GetPythonEngine do begin + Adjust(@Self); + FValue.Location := LValue; + Result := 0; + end + else + Result := -1; +end; + { TPyDelphiTimer } class function TPyDelphiTimer.DelphiObjectClass: TClass; @@ -933,6 +1198,407 @@ procedure TPyDelphiTimer.SetDelphiObject(const Value: TTimer); inherited DelphiObject := Value; end; +{ TMouseEventHandler } + +constructor TMouseEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TMouseEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TMouseEventHandler.DoEvent(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Single); +var + LPyObject, LPyTuple, LPyButton, LPyX, LPyY, LPyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyButton := MouseButtonToPython(Button); + LPyX := PyFloat_FromDouble(X); + LPyY := PyFloat_FromDouble(Y); + LPyTuple := PyTuple_New(5); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyButton); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, ShiftToPython(Shift)); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, LPyX); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 4, LPyY); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TMouseEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TMouseEvent); +end; + +{ TMouseMoveEventHandler } + +constructor TMouseMoveEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TMouseMoveEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TMouseMoveEventHandler.DoEvent(Sender: TObject; Shift: TShiftState; X, + Y: Single); +var + LPyObject, LPyTuple, LPyX, LPyY, LPyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyX := PyFloat_FromDouble(X); + LPyY := PyFloat_FromDouble(Y); + LPyTuple := PyTuple_New(4); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, ShiftToPython(Shift)); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyX); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, LPyY); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TMouseMoveEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TMouseMoveEvent); +end; + +{ TMouseWheelEventHandler } + +constructor TMouseWheelEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TMouseWheelEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TMouseWheelEventHandler.DoEvent(Sender: TObject; Shift: TShiftState; + WheelDelta: Integer; var Handled: Boolean); +var + LPyObject, LPyTuple, LPyShift, LPyWheelDelta, LPyHandled, LPyResult: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyShift := ShiftToPython(Shift); + LPyWheelDelta := PyLong_FromLong(WheelDelta); + LPyHandled := CreateVarParam(PyDelphiWrapper, Handled); + LVarParam := PythonToDelphi(LPyHandled) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyShift); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyWheelDelta); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, LPyHandled); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + if LVarParam.Value = Py_None then + Handled := false + else if PyBool_Check(LVarParam.Value) then + Handled := Boolean(PyLong_AsLong(LVarParam.Value)); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TMouseWheelEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TMouseWheelEvent); +end; + +{ TKeyEventHandler } + +constructor TKeyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TKeyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TKeyEventHandler.DoEvent(Sender: TObject; var Key: Word; + var KeyChar: WideChar; Shift: TShiftState); +var + LPyObject, LPyTuple, LPyKey, LPyKeyChar, LPyShift, LPyResult: PPyObject; + LKeyVarParam: TPyDelphiVarParameter; + LKeyCharVarParam: TPyDelphiVarParameter; + LKeyChar: string; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyKey := CreateVarParam(PyDelphiWrapper, Key); + LPyKeyChar := CreateVarParam(PyDelphiWrapper, KeyChar); + LPyShift := ShiftToPython(Shift); + LKeyVarParam := PythonToDelphi(LPyKey) as TPyDelphiVarParameter; + LKeyCharVarParam := PythonToDelphi(LPyKeyChar) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyKey); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyKeyChar); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 3, LPyShift); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + //Key var arg + if LKeyVarParam.Value = Py_None then + Key := 0 + else if PyLong_Check(LKeyVarParam.Value) then + Key := Word(PyLong_AsLong(LKeyVarParam.Value)); + + //KeyChar var arg + if LKeyCharVarParam.Value = Py_None then + LKeyChar := #0 + else if PyUnicode_Check(LKeyCharVarParam.Value) then + begin + LKeyChar := PyUnicodeAsString(LKeyCharVarParam.Value); + if Length(LKeyChar) > 0 then + KeyChar := LKeyChar[1]; + end; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TKeyEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TKeyEvent); +end; + +{ TProcessTickEventHandler } + +constructor TProcessTickEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TProcessTickEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TProcessTickEventHandler.DoEvent(Sender: TObject; time, + deltaTime: Single); +var + LPyObject, LPyTuple, LPyTime, LPyDeltaTime, LPyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyTime := PyFloat_FromDouble(time); + LPyDeltaTime := PyFloat_FromDouble(deltaTime); + LPyTuple := PyTuple_New(3); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyTime); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyDeltaTime); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TProcessTickEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TProcessTickEvent); +end; + +{ TVirtualKeyboardEventHandler } + +constructor TVirtualKeyboardEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TVirtualKeyboardEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TVirtualKeyboardEventHandler.DoEvent(Sender: TObject; + KeyboardVisible: Boolean; const Bounds: TRect); +var + LPyObject, LPyTuple, LPyKeyboardVisible, LPyBounds, LPyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyKeyboardVisible := PyBool_FromLong(Ord(KeyboardVisible)); + LPyBounds := WrapRect(PyDelphiWrapper, Bounds); + LPyTuple := PyTuple_New(3); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyKeyboardVisible); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyBounds); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TVirtualKeyboardEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TVirtualKeyboardEvent); +end; + +{ TTapEventHandler } + +constructor TTapEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TTapEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TTapEventHandler.DoEvent(Sender: TObject; const Point: TPointF); +var + LPyObject, LPyTuple, LPyPoint, LPyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyPoint := WrapPointF(PyDelphiWrapper, Point); + LPyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyPoint); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TTapEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTapEvent); +end; + +{ TTouchEventHandler } + +constructor TTouchEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TTouchEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TTouchEventHandler.DoEvent(Sender: TObject; const Touches: TTouches; + const Action: TTouchAction); +var + LPyObject, LPyTuple, LPyTouches, LPyTouchAction, LPyResult : PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyTouches := WrapTouches(PyDelphiWrapper, Touches); + LPyTouchAction := TouchActionToPython(Action); + LPyTuple := PyTuple_New(3); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPyObject); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyTouches); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyTouchAction); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + begin + Py_DECREF(LPyResult); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TTouchEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTouchEvent); +end; + initialization RegisteredUnits.Add(TTypesRegistration.Create); + end. diff --git a/Source/vcl/WrapVclExtCtrls.pas b/Source/vcl/WrapVclExtCtrls.pas index 887e1ae3..8fcbae88 100644 --- a/Source/vcl/WrapVclExtCtrls.pas +++ b/Source/vcl/WrapVclExtCtrls.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, PythonEngine, WrapDelphi, WrapDelphiClasses, WrapVclControls, - Windows, ExtCtrls; + Windows, ExtCtrls, TypInfo, Rtti; type TPyDelphiShape = class (TPyDelphiGraphicControl) @@ -169,6 +169,37 @@ TPyDelphiColorBox = class (TPyDelphiWinControl) end; {$ENDIF FPC} + TSysLinkEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; const Link: string; LinkType: TSysLinkType); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + + TPyDelphiCustomLinkLabel = class (TPyDelphiWinControl) + private + function GetDelphiObject: TCustomLinkLabel; + procedure SetDelphiObject(const Value: TCustomLinkLabel); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomLinkLabel read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiLinkLabel = class (TPyDelphiCustomLinkLabel) + private + function GetDelphiObject: TLinkLabel; + procedure SetDelphiObject(const Value: TLinkLabel); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TLinkLabel read GetDelphiObject write SetDelphiObject; + end; + + function SysLinkTypeToPython(const ASysLinkType: TSysLinkType): PPyObject; + implementation { Register the wrappers, the globals and the constants } @@ -216,8 +247,18 @@ procedure TExtCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap {$IFNDEF FPC} APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiColorBox); {$ENDIF FPC} + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomLinkLabel); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiLinkLabel); + + // Event handlers + APyDelphiWrapper.EventHandlers.RegisterHandler(TSysLinkEventHandler); end; +function SysLinkTypeToPython(const ASysLinkType: TSysLinkType): PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString( + TRttiEnumerationType.GetName(ASysLinkType)); +end; { TPyDelphiShape } @@ -493,6 +534,83 @@ procedure TPyDelphiColorBox.SetDelphiObject(const Value: TColorBox); end; {$ENDIF FPC} +{ TSysLinkEventHandler } + +constructor TSysLinkEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TSysLinkEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TSysLinkEventHandler.DoEvent(Sender: TObject; const Link: string; + LinkType: TSysLinkType); +var + LPyTuple, LPySender, LPyLink, LPyLinkType, PyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + LPySender := PyDelphiWrapper.Wrap(Sender); + LPyLink := PyUnicodeFromString(Link); + LPyLinkType := SysLinkTypeToPython(LinkType); + LPyTuple := PyTuple_New(3); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 0, LPySender); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 1, LPyLink); + GetPythonEngine.PyTuple_SetItem(LPyTuple, 2, LPyLinkType); + try + PyResult := PyObject_CallObject(Callable, LPyTuple); + Py_XDECREF(PyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError; + end; +end; + +class function TSysLinkEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TSysLinkEvent); +end; + +{ TPyDelphiCustomLinkLabel } + +class function TPyDelphiCustomLinkLabel.DelphiObjectClass: TClass; +begin + Result := TCustomLinkLabel; +end; + +function TPyDelphiCustomLinkLabel.GetDelphiObject: TCustomLinkLabel; +begin + Result := TCustomLinkLabel(inherited DelphiObject); +end; + +procedure TPyDelphiCustomLinkLabel.SetDelphiObject( + const Value: TCustomLinkLabel); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiLinkLabel } + +class function TPyDelphiLinkLabel.DelphiObjectClass: TClass; +begin + Result := TLinkLabel; +end; + +function TPyDelphiLinkLabel.GetDelphiObject: TLinkLabel; +begin + Result := TLinkLabel(inherited DelphiObject); +end; + +procedure TPyDelphiLinkLabel.SetDelphiObject(const Value: TLinkLabel); +begin + inherited DelphiObject := Value; +end; initialization RegisteredUnits.Add( TExtCtrlsRegistration.Create ); diff --git a/Tests/FMX/Android/NumberServicesTest.pas b/Tests/FMX/Android/NumberServicesTest.pas index 1fb9cbc8..9494a5a0 100644 --- a/Tests/FMX/Android/NumberServicesTest.pas +++ b/Tests/FMX/Android/NumberServicesTest.pas @@ -85,7 +85,7 @@ TTestNumberServices = class(TObject) private PythonType_TRndInt: TPythonType; FPythonModule : TPythonModule; - PythonEngine : TPythonEngine; + FPythonEngine : TPythonEngine; pdvainteger: integer; pdvbinteger: integer; pdvc : TPythonDelphiVar; @@ -186,10 +186,10 @@ procedure TTestNumberServices.SetupFixture; valpy: TPyObject; val: PyTRandomInteger; begin - PythonEngine := TPythonEngine.Create(nil); - PythonEngine.Name := 'PythonEngine'; - TPythonLoad.Configure(PythonEngine); - PythonEngine.LoadDll; + FPythonEngine := TPythonEngine.Create(nil); + FPythonEngine.Name := 'PythonEngine'; + TPythonLoad.Configure(FPythonEngine); + FPythonEngine.LoadDll; // python module FPythonModule := TPythonModule.Create(GetPythonEngine); FPythonModule.Engine := GetPythonEngine; @@ -486,7 +486,7 @@ procedure TRandomInteger.SetValue(const Value: Integer); end; procedure TTestNumberServices.TearDownFixture; begin - PythonEngine.Free; + FPythonEngine.Free; pdvc.Free; end; // nsAdd diff --git a/Tests/FMX/Android/WrapDelphiTest.pas b/Tests/FMX/Android/WrapDelphiTest.pas index 453b6dda..6e73312e 100644 --- a/Tests/FMX/Android/WrapDelphiTest.pas +++ b/Tests/FMX/Android/WrapDelphiTest.pas @@ -1,534 +1,534 @@ -(**************************************************************************) -(* *) -(* Module: Unit 'WrapDelphiTest' Copyright (c) 2021 *) -(* *) -(* Lucas Moura Belo - lmbelo *) -(* lucas.belo@live.com *) -(* BH, Brazil *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project pages: https://github.com/Embarcadero/python4delphi *) -(* https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Test unit for WrapDelphi module *) -(* *) -(* *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) - -unit WrapDelphiTest; - -interface - -uses - Types, - DUnitX.TestFramework, - PythonEngine, - WrapDelphi; - -type - TFruit = (Apple, Banana, Orange); - TFruits = set of TFruit; - - {$M+} - ITestInterface = interface(IInterface) - ['{AD50ADF2-2691-47CA-80AB-07AF1EDA8C89}'] - procedure SetString(const S: string); - function GetString: string; - end; - {$M-} - - TSubRecord = record - DoubleField: double; - end; - - TTestRecord = record - StringField: string; - SubRecord: TSubRecord; - procedure SetStringField(S: string); - end; - - TFruitDynArray = TArray; - TStaticArray = array[0..999] of Int64; - TTestRttiAccess = class - private - FFruit: TFruit; - FFruits: TFruits; - public - FruitField :TFruit; - FruitsField: TFruits; - StringField: string; - DoubleField: double; - ObjectField: TObject; - RecordField: TTestRecord; - InterfaceField: ITestInterface; - function GetData: TObject; - procedure BuyFruits(AFruits: TFruits); - procedure SellFruits(const AFruits: TFruitDynArray); - procedure SellFruitsInt(const AFruits:TIntegerDynArray); - function GetDynArray: TInt64DynArray; - function GetStaticArray: TStaticArray; - property Fruit: TFruit read FFruit write FFruit; - property Fruits: TFruits read FFruits write FFruits; - function SetStringField(var Value: Integer): string; overload; - function SetStringField(const Value: string): string; overload; - procedure PassVariantArray(const Value: Variant); - end; - - TTestInterfaceImpl = class(TInterfacedObject, ITestInterface) - private - FString: string; - procedure SetString(const S: string); - function GetString: string; - end; - - [TestFixture] - TTestWrapDelphi = class(TObject) - private - PythonEngine: TPythonEngine; - DelphiModule: TPythonModule; - PyDelphiWrapper: TPyDelphiWrapper; - Rtti_Var: Variant; - TestRttiAccess: TTestRttiAccess; - Rec: TTestRecord; - Rtti_Rec: Variant; - FTestInterface: ITestInterface; - Rtti_Interface: Variant; - public - [SetupFixture] - procedure SetupFixture; - [TearDownFixture] - procedure TearDownFixture; - [Test] - procedure TestEnumProperty; - [Test] - procedure TestSetProperty; - [Test] - procedure TestDoubleField; - [Test] - procedure TestEnumField; - [Test] - procedure TestSetField; - [Test] - procedure TestStringField; - [Test] - procedure TestSetProps; - [Test] - procedure TestObjectField; - [Test] - procedure TestMethodCall; - [Test] - procedure TestRecord; - [Test] - procedure TestRecordField; - [Test] - procedure TestInterface; - [Test] - procedure TestInterfaceField; - [Test] - procedure TestDynArrayParameters; - [Test] - procedure TestGetDynArray; - [Test] - procedure TestGetStaticArray; - [Test] - procedure TestMethodWithVarAndOverload; - [Test] - procedure TestFreeReturnedObject; - [Test] - procedure TestPassVariantArray; - end; - -implementation - -Uses - System.SysUtils, - System.Variants, - System.Classes, - System.Rtti, - VarPyth, - WrapDelphiClasses, - PythonLoad; - - -{ TTestRTTIAccess } - -procedure TTestRttiAccess.BuyFruits(AFruits: TFruits); -begin - Fruits := AFruits; -end; - -{ TTestWrapDelphi } - -procedure TTestWrapDelphi.TestFreeReturnedObject; -begin - PythonEngine.ExecString( - 'from delphi import rtti_var' + sLineBreak + - 'obj = rtti_var.GetData()' + sLineBreak + - 'obj.Free()' - ); - Assert.Pass; -end; - -procedure TTestWrapDelphi.SetupFixture; -var - Py : PPyObject; -begin - PythonEngine := TPythonEngine.Create(nil); - PythonEngine.Name := 'PythonEngine'; - TPythonLoad.Configure(PythonEngine); - - DelphiModule := TPythonModule.Create(nil); - - DelphiModule.Name := 'DelphiModule'; - DelphiModule.Engine := PythonEngine; - DelphiModule.ModuleName := 'delphi'; - - PyDelphiWrapper := TPyDelphiWrapper.Create(nil); - - PyDelphiWrapper.Name := 'PyDelphiWrapper'; - PyDelphiWrapper.Engine := PythonEngine; - PyDelphiWrapper.Module := DelphiModule; - - PythonEngine.LoadDll; - // Then wrap the an instance our TTestRTTIAccess - // It will allow us to to test access to public fields and methods as well - // public (as well as published) properties. - // This time we would like the object to be destroyed when the PyObject - // is destroyed, so we need to set its Owned property to True; - TestRttiAccess := TTestRTTIAccess.Create; - TestRttiAccess.InterfaceField := TTestInterfaceImpl.Create; - Py := PyDelphiWrapper.Wrap(TestRttiAccess, TObjectOwnership.soReference); - DelphiModule.SetVar('rtti_var', Py); - PythonEngine.Py_DecRef(Py); - Py := PyDelphiWrapper.WrapRecord(@Rec, TRttiContext.Create.GetType(TypeInfo(TTestRecord)) as TRttiStructuredType); - DelphiModule.SetVar('rtti_rec', Py); - PythonEngine.Py_DecRef(Py); - FTestInterface := TTestInterfaceImpl.Create; - Py := PyDelphiWrapper.WrapInterface(TValue.From(FTestInterface)); - DelphiModule.SetVar('rtti_interface', Py); - PythonEngine.Py_DecRef(Py); - PythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface'); - Rtti_Var := MainModule.rtti_var; - Rtti_Rec := MainModule.rtti_rec; - Rtti_Interface := MainModule.rtti_interface; -end; - -procedure TTestWrapDelphi.TearDownFixture; -begin - VarClear(Rtti_Var); - VarClear(Rtti_Rec); - VarClear(Rtti_Interface); - PythonEngine.Free; - PyDelphiWrapper.Free; - DelphiModule.Free; - TestRttiAccess.Free; -end; - -procedure TTestWrapDelphi.TestDoubleField; -begin - TestRttiAccess.DoubleField := 3.14; - Assert.AreEqual(double(TestRttiAccess.DoubleField), double(3.14)); - Rtti_Var.DoubleField := variant(double(1.23)); //implicitly cast to a variant to avoid a bug present in 10.4.2 - Assert.AreEqual(double(Rtti_Var.DoubleField), double(1.23)); -end; - -procedure TTestWrapDelphi.TestEnumField; -begin - TestRttiAccess.FruitField := Apple; - Assert.IsTrue(RTTI_var.FruitField = 'Apple'); - Rtti_Var.FruitField := 'Banana'; - Assert.IsTrue(TestRttiAccess.FruitField = Banana); -end; - -procedure TTestWrapDelphi.TestEnumProperty; -// Enumeration values are converted to/from strings -begin - TestRttiAccess.Fruit := Apple; - Assert.IsTrue(RTTI_var.Fruit = 'Apple'); - Rtti_Var.Fruit := 'Banana'; - Assert.IsTrue(TestRttiAccess.Fruit = Banana); -end; - -procedure TTestWrapDelphi.TestGetDynArray; -var - List: Variant; -begin - List := Rtti_Var.GetDynArray(); - Assert.IsTrue(VarIsPythonList(List)); - Assert.AreEqual(1000000, Integer(len(List))); - Assert.AreEqual(Int64(999999), Int64(PythonEngine.PyObjectAsVariant(PythonEngine.PyList_GetItem(ExtractPythonObjectFrom(List), 999999)))); -end; - -procedure TTestWrapDelphi.TestGetStaticArray; -var - List: Variant; -begin - List := Rtti_Var.GetStaticArray(); - Assert.IsTrue(VarIsPythonList(List)); - Assert.AreEqual(1000, Integer(len(List))); - Assert.AreEqual(Int64(999), Int64(PythonEngine.PyObjectAsVariant(PythonEngine.PyList_GetItem(ExtractPythonObjectFrom(List), 999)))); -end; - -procedure TTestWrapDelphi.TestInterface; -begin - Rtti_Interface.SetString('Test'); - Assert.IsTrue(Rtti_Interface.GetString() = 'Test'); -end; - -procedure TTestWrapDelphi.TestInterfaceField; -begin - Rtti_Interface.SetString('New Value'); - Assert.IsTrue(Rtti_Interface.GetString() = 'New Value'); - Rtti_Var.InterfaceField.SetString('Old Value'); - Assert.IsTrue(Rtti_Var.InterfaceField.GetString() = 'Old Value'); - // Assign interface - Rtti_Var.InterfaceField := Rtti_Interface; - Assert.IsTrue(Rtti_Var.InterfaceField.GetString() = 'New Value'); - Rtti_Var.InterfaceField := None; - Assert.IsTrue(VarIsNone(Rtti_Var.InterfaceField)); -end; - -procedure TTestWrapDelphi.TestMethodCall; -begin - TestRttiAccess.Fruits := []; - Assert.AreEqual(string(Rtti_Var.Fruits), '[]'); - Rtti_Var.BuyFruits(VarPythonCreate(['Apple', 'Banana'], stList)); - Assert.AreEqual(string(Rtti_Var.Fruits), '[''Apple'', ''Banana'']'); -end; - -procedure TTestWrapDelphi.TestObjectField; -{ - Demonstrating and testing: - Subclassing Delphi components in Python - Creating Delphi objects in Python - Assigning objects to object fields -} -Var - Script: AnsiString; - myComp: Variant; -begin - Script := - 'from delphi import Component' + sLineBreak + - 'class MyComponent(Component):' + SLineBreak + - ' def __init__(self, Owner):' + SLineBreak + - ' self._x = None' + SLineBreak + - '' + SLineBreak + - ' @property' + SLineBreak + - ' def x(self):' + SLineBreak + - ' return self._x' + SLineBreak + - '' + SLineBreak + - ' @x.setter' + SLineBreak + - ' def x(self, value):' + SLineBreak + - ' self._x = value' + SLineBreak + - '' + SLineBreak + - 'myComp = MyComponent(None)'; - ; - - PythonEngine.ExecString(Script); - myComp := MainModule.myComp; - // accessing inherited property - Assert.IsTrue(myComp.Name = ''); - myComp.Name := 'NoName'; - Assert.IsTrue(myComp.Name = 'NoName'); - // accessing subclass property - myComp.x := variant(double(3.14)); //implicitly cast to a variant to avoid a bug present in 10.4.2 - Assert.IsTrue(myComp.x = 3.14); - - // Setting an object field - rtti_var.ObjectField := myComp; - Assert.IsTrue(rtti_var.ObjectField.Name = 'NoName'); - Assert.AreEqual(TComponent(TestRttiAccess.ObjectField).Name, 'NoName'); - rtti_var.ObjectField := None; - Assert.IsTrue(rtti_var.ObjectField = None); -end; - -procedure TTestWrapDelphi.TestPassVariantArray; -begin - PythonEngine.ExecString( - 'from delphi import rtti_var' + sLineBreak + - 'rtti_var.PassVariantArray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])' - ); - Assert.Pass; -end; - -procedure TTestWrapDelphi.TestRecord; -begin - Rtti_rec.StringField := 'abcd'; - Assert.IsTrue(rtti_rec.StringField = 'abcd'); - Rtti_rec.SetStringField('1234'); - Assert.IsTrue(rtti_rec.StringField = '1234'); - Assert.AreEqual(Rec.StringField, '1234'); - Rtti_rec.SubRecord.DoubleField := variant(double(3.14)); //implicitly cast to a variant to avoid a bug present in 10.4.2 - Assert.IsTrue(rtti_rec.SubRecord.DoubleField = 3.14); - Assert.AreEqual(Rec.SubRecord.DoubleField, 3.14); -end; - -procedure TTestWrapDelphi.TestRecordField; -Var - RecValue: Variant; -begin - RecValue := rtti_var.RecordField; - RecValue.StringField := 'abc'; - rtti_var.RecordField := RecValue; - Assert.IsTrue(rtti_var.RecordField.StringField = 'abc'); -end; - -procedure TTestWrapDelphi.TestSetField; -// Sets are converted to/from list of strings -begin - TestRttiAccess.FruitsField := []; - Assert.AreEqual(string(Rtti_Var.FruitsField), '[]'); - Rtti_Var.FruitsField := VarPythonCreate(['Apple', 'Banana'], stList); - Assert.AreEqual(string(Rtti_Var.FruitsField), '[''Apple'', ''Banana'']'); - Assert.IsTrue(TestRttiAccess.FruitsField = [Apple, Banana]); -end; - -procedure TTestWrapDelphi.TestSetProperty; -begin - TestRttiAccess.Fruits := []; - Assert.AreEqual(string(Rtti_Var.Fruits), '[]'); - Rtti_Var.Fruits := VarPythonCreate(['Apple', 'Banana'], stList); - Assert.AreEqual(string(Rtti_Var.Fruits), '[''Apple'', ''Banana'']'); - Assert.IsTrue(TestRttiAccess.Fruits = [Apple, Banana]); -end; - -procedure TTestWrapDelphi.TestSetProps; -begin - rtti_var.SetProps(StringField := 'abc', DoubleField := 1.234); - Assert.AreEqual(TestRttiAccess.StringField, 'abc'); - Assert.AreEqual(TestRttiAccess.DoubleField, 1.234); -end; - -procedure TTestWrapDelphi.TestStringField; -begin - TestRttiAccess.StringField := 'Hi'; - Assert.AreEqual(string(Rtti_Var.StringField), 'Hi'); - Rtti_Var.StringField := 'P4D'; - Assert.AreEqual(TestRttiAccess.StringField, 'P4D'); -end; - -procedure TTestWrapDelphi.TestDynArrayParameters; -{var - rc: TRttiContext; - rt: TRttiType; - rm: TRttiMethod; - rp: TArray; - ra: TArray;} -begin -{ rc := TRttiContext.Create; - rt := rc.GetType(TypeInfo(TTestRttiAccess)); - rm := rt.GetMethod('SellFruitsInt'); - rp := rm.GetParameters; - SetLength(ra, 1); - ra[0] := TValue.FromArray(TypeInfo(TIntegerDynArray), [TValue.From(0)]); - rm.Invoke(TestRttiAccess, ra);} - TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; - Rtti_Var.SellFruitsInt(VarPythonCreate([0, 1], stList)); - Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); - TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; - Rtti_Var.SellFruits(VarPythonCreate([Ord(TFruit.Apple), Ord(TFruit.Banana)], stList)); - Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); -end; - -procedure TTestWrapDelphi.TestMethodWithVarAndOverload; -begin - Rtti_Var.SetStringField('test'); - Assert.AreEqual('test', TestRttiAccess.StringField); -end; - -function TTestRttiAccess.SetStringField(const Value: string): string; -begin - StringField := Value; - Result := StringField; -end; - -function TTestRttiAccess.SetStringField(var Value: Integer): string; -begin - StringField := IntToStr(Value); - Result := StringField; -end; - -function TTestRttiAccess.GetData: TObject; -begin - Result := TStringList.Create; -end; - -function TTestRttiAccess.GetDynArray: TInt64DynArray; -var - I: Integer; -begin - SetLength(Result, 1000000); - for I := 0 to Length(Result) - 1 do - Result[I] := I; -end; - -function TTestRttiAccess.GetStaticArray: TStaticArray; -var - I: Integer; -begin - for I := 0 to Length(Result) - 1 do - Result[I] := I; -end; - -procedure TTestRttiAccess.PassVariantArray(const Value: Variant); -begin - Assert.IsTrue(VarIsArray(Value) and (VarArrayHighBound(Value, 1) = 9)); -end; - -procedure TTestRttiAccess.SellFruits(const AFruits: TFruitDynArray); -var - Fruit: TFruit; -begin - for Fruit in AFruits do - Exclude(FFruits, Fruit); -end; - -procedure TTestRttiAccess.SellFruitsInt(const AFruits:TIntegerDynArray); -var - Fruit: Integer; -begin - for Fruit in AFruits do - Exclude(FFruits, TFruit(Fruit)); -end; - -{ TTestRecord } - -procedure TTestRecord.SetStringField(S: string); -begin - Self.StringField := S; -end; - -{ TTestInterfaceImpl } - -function TTestInterfaceImpl.GetString: string; -begin - Result := FString; -end; - -procedure TTestInterfaceImpl.SetString(const S: string); -begin - FString := S; -end; - -initialization - TDUnitX.RegisterTestFixture(TTestWrapDelphi); - ReportMemoryLeaksOnShutdown := True; - -end. +(**************************************************************************) +(* *) +(* Module: Unit 'WrapDelphiTest' Copyright (c) 2021 *) +(* *) +(* Lucas Moura Belo - lmbelo *) +(* lucas.belo@live.com *) +(* BH, Brazil *) +(* *) +(* PyScripter *) +(* e-mail: pyscripter@gmail.com *) +(* *) +(* Project pages: https://github.com/Embarcadero/python4delphi *) +(* https://github.com/pyscripter/python4delphi *) +(**************************************************************************) +(* Functionality: Test unit for WrapDelphi module *) +(* *) +(* *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(**************************************************************************) + +unit WrapDelphiTest; + +interface + +uses + Types, + DUnitX.TestFramework, + PythonEngine, + WrapDelphi; + +type + TFruit = (Apple, Banana, Orange); + TFruits = set of TFruit; + + {$M+} + ITestInterface = interface(IInterface) + ['{AD50ADF2-2691-47CA-80AB-07AF1EDA8C89}'] + procedure SetString(const S: string); + function GetString: string; + end; + {$M-} + + TSubRecord = record + DoubleField: double; + end; + + TTestRecord = record + StringField: string; + SubRecord: TSubRecord; + procedure SetStringField(S: string); + end; + + TFruitDynArray = TArray; + TStaticArray = array[0..999] of Int64; + TTestRttiAccess = class + private + FFruit: TFruit; + FFruits: TFruits; + public + FruitField :TFruit; + FruitsField: TFruits; + StringField: string; + DoubleField: double; + ObjectField: TObject; + RecordField: TTestRecord; + InterfaceField: ITestInterface; + function GetData: TObject; + procedure BuyFruits(AFruits: TFruits); + procedure SellFruits(const AFruits: TFruitDynArray); + procedure SellFruitsInt(const AFruits:TIntegerDynArray); + function GetDynArray: TInt64DynArray; + function GetStaticArray: TStaticArray; + property Fruit: TFruit read FFruit write FFruit; + property Fruits: TFruits read FFruits write FFruits; + function SetStringField(var Value: Integer): string; overload; + function SetStringField(const Value: string): string; overload; + procedure PassVariantArray(const Value: Variant); + end; + + TTestInterfaceImpl = class(TInterfacedObject, ITestInterface) + private + FString: string; + procedure SetString(const S: string); + function GetString: string; + end; + + [TestFixture] + TTestWrapDelphi = class(TObject) + private + FPythonEngine: TPythonEngine; + DelphiModule: TPythonModule; + PyDelphiWrapper: TPyDelphiWrapper; + Rtti_Var: Variant; + TestRttiAccess: TTestRttiAccess; + Rec: TTestRecord; + Rtti_Rec: Variant; + FTestInterface: ITestInterface; + Rtti_Interface: Variant; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure TearDownFixture; + [Test] + procedure TestEnumProperty; + [Test] + procedure TestSetProperty; + [Test] + procedure TestDoubleField; + [Test] + procedure TestEnumField; + [Test] + procedure TestSetField; + [Test] + procedure TestStringField; + [Test] + procedure TestSetProps; + [Test] + procedure TestObjectField; + [Test] + procedure TestMethodCall; + [Test] + procedure TestRecord; + [Test] + procedure TestRecordField; + [Test] + procedure TestInterface; + [Test] + procedure TestInterfaceField; + [Test] + procedure TestDynArrayParameters; + [Test] + procedure TestGetDynArray; + [Test] + procedure TestGetStaticArray; + [Test] + procedure TestMethodWithVarAndOverload; + [Test] + procedure TestFreeReturnedObject; + [Test] + procedure TestPassVariantArray; + end; + +implementation + +Uses + System.SysUtils, + System.Variants, + System.Classes, + System.Rtti, + VarPyth, + WrapDelphiClasses, + PythonLoad; + + +{ TTestRTTIAccess } + +procedure TTestRttiAccess.BuyFruits(AFruits: TFruits); +begin + Fruits := AFruits; +end; + +{ TTestWrapDelphi } + +procedure TTestWrapDelphi.TestFreeReturnedObject; +begin + FPythonEngine.ExecString( + 'from delphi import rtti_var' + sLineBreak + + 'obj = rtti_var.GetData()' + sLineBreak + + 'obj.Free()' + ); + Assert.Pass; +end; + +procedure TTestWrapDelphi.SetupFixture; +var + Py : PPyObject; +begin + FPythonEngine := TPythonEngine.Create(nil); + FPythonEngine.Name := 'PythonEngine'; + TPythonLoad.Configure(FPythonEngine); + + DelphiModule := TPythonModule.Create(nil); + + DelphiModule.Name := 'DelphiModule'; + DelphiModule.Engine := FPythonEngine; + DelphiModule.ModuleName := 'delphi'; + + PyDelphiWrapper := TPyDelphiWrapper.Create(nil); + + PyDelphiWrapper.Name := 'PyDelphiWrapper'; + PyDelphiWrapper.Engine := FPythonEngine; + PyDelphiWrapper.Module := DelphiModule; + + FPythonEngine.LoadDll; + // Then wrap the an instance our TTestRTTIAccess + // It will allow us to to test access to public fields and methods as well + // public (as well as published) properties. + // This time we would like the object to be destroyed when the PyObject + // is destroyed, so we need to set its Owned property to True; + TestRttiAccess := TTestRTTIAccess.Create; + TestRttiAccess.InterfaceField := TTestInterfaceImpl.Create; + Py := PyDelphiWrapper.Wrap(TestRttiAccess, TObjectOwnership.soReference); + DelphiModule.SetVar('rtti_var', Py); + FPythonEngine.Py_DecRef(Py); + Py := PyDelphiWrapper.WrapRecord(@Rec, TRttiContext.Create.GetType(TypeInfo(TTestRecord)) as TRttiStructuredType); + DelphiModule.SetVar('rtti_rec', Py); + FPythonEngine.Py_DecRef(Py); + FTestInterface := TTestInterfaceImpl.Create; + Py := PyDelphiWrapper.WrapInterface(TValue.From(FTestInterface)); + DelphiModule.SetVar('rtti_interface', Py); + FPythonEngine.Py_DecRef(Py); + FPythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface'); + Rtti_Var := MainModule.rtti_var; + Rtti_Rec := MainModule.rtti_rec; + Rtti_Interface := MainModule.rtti_interface; +end; + +procedure TTestWrapDelphi.TearDownFixture; +begin + VarClear(Rtti_Var); + VarClear(Rtti_Rec); + VarClear(Rtti_Interface); + FPythonEngine.Free; + PyDelphiWrapper.Free; + DelphiModule.Free; + TestRttiAccess.Free; +end; + +procedure TTestWrapDelphi.TestDoubleField; +begin + TestRttiAccess.DoubleField := 3.14; + Assert.AreEqual(double(TestRttiAccess.DoubleField), double(3.14)); + Rtti_Var.DoubleField := variant(double(1.23)); //implicitly cast to a variant to avoid a bug present in 10.4.2 + Assert.AreEqual(double(Rtti_Var.DoubleField), double(1.23)); +end; + +procedure TTestWrapDelphi.TestEnumField; +begin + TestRttiAccess.FruitField := Apple; + Assert.IsTrue(RTTI_var.FruitField = 'Apple'); + Rtti_Var.FruitField := 'Banana'; + Assert.IsTrue(TestRttiAccess.FruitField = Banana); +end; + +procedure TTestWrapDelphi.TestEnumProperty; +// Enumeration values are converted to/from strings +begin + TestRttiAccess.Fruit := Apple; + Assert.IsTrue(RTTI_var.Fruit = 'Apple'); + Rtti_Var.Fruit := 'Banana'; + Assert.IsTrue(TestRttiAccess.Fruit = Banana); +end; + +procedure TTestWrapDelphi.TestGetDynArray; +var + List: Variant; +begin + List := Rtti_Var.GetDynArray(); + Assert.IsTrue(VarIsPythonList(List)); + Assert.AreEqual(1000000, Integer(len(List))); + Assert.AreEqual(Int64(999999), Int64(FPythonEngine.PyObjectAsVariant(FPythonEngine.PyList_GetItem(ExtractPythonObjectFrom(List), 999999)))); +end; + +procedure TTestWrapDelphi.TestGetStaticArray; +var + List: Variant; +begin + List := Rtti_Var.GetStaticArray(); + Assert.IsTrue(VarIsPythonList(List)); + Assert.AreEqual(1000, Integer(len(List))); + Assert.AreEqual(Int64(999), Int64(FPythonEngine.PyObjectAsVariant(FPythonEngine.PyList_GetItem(ExtractPythonObjectFrom(List), 999)))); +end; + +procedure TTestWrapDelphi.TestInterface; +begin + Rtti_Interface.SetString('Test'); + Assert.IsTrue(Rtti_Interface.GetString() = 'Test'); +end; + +procedure TTestWrapDelphi.TestInterfaceField; +begin + Rtti_Interface.SetString('New Value'); + Assert.IsTrue(Rtti_Interface.GetString() = 'New Value'); + Rtti_Var.InterfaceField.SetString('Old Value'); + Assert.IsTrue(Rtti_Var.InterfaceField.GetString() = 'Old Value'); + // Assign interface + Rtti_Var.InterfaceField := Rtti_Interface; + Assert.IsTrue(Rtti_Var.InterfaceField.GetString() = 'New Value'); + Rtti_Var.InterfaceField := None; + Assert.IsTrue(VarIsNone(Rtti_Var.InterfaceField)); +end; + +procedure TTestWrapDelphi.TestMethodCall; +begin + TestRttiAccess.Fruits := []; + Assert.AreEqual(string(Rtti_Var.Fruits), '[]'); + Rtti_Var.BuyFruits(VarPythonCreate(['Apple', 'Banana'], stList)); + Assert.AreEqual(string(Rtti_Var.Fruits), '[''Apple'', ''Banana'']'); +end; + +procedure TTestWrapDelphi.TestObjectField; +{ + Demonstrating and testing: + Subclassing Delphi components in Python + Creating Delphi objects in Python + Assigning objects to object fields +} +Var + Script: AnsiString; + myComp: Variant; +begin + Script := + 'from delphi import Component' + sLineBreak + + 'class MyComponent(Component):' + SLineBreak + + ' def __init__(self, Owner):' + SLineBreak + + ' self._x = None' + SLineBreak + + '' + SLineBreak + + ' @property' + SLineBreak + + ' def x(self):' + SLineBreak + + ' return self._x' + SLineBreak + + '' + SLineBreak + + ' @x.setter' + SLineBreak + + ' def x(self, value):' + SLineBreak + + ' self._x = value' + SLineBreak + + '' + SLineBreak + + 'myComp = MyComponent(None)'; + ; + + FPythonEngine.ExecString(Script); + myComp := MainModule.myComp; + // accessing inherited property + Assert.IsTrue(myComp.Name = ''); + myComp.Name := 'NoName'; + Assert.IsTrue(myComp.Name = 'NoName'); + // accessing subclass property + myComp.x := variant(double(3.14)); //implicitly cast to a variant to avoid a bug present in 10.4.2 + Assert.IsTrue(myComp.x = 3.14); + + // Setting an object field + rtti_var.ObjectField := myComp; + Assert.IsTrue(rtti_var.ObjectField.Name = 'NoName'); + Assert.AreEqual(TComponent(TestRttiAccess.ObjectField).Name, 'NoName'); + rtti_var.ObjectField := None; + Assert.IsTrue(rtti_var.ObjectField = None); +end; + +procedure TTestWrapDelphi.TestPassVariantArray; +begin + FPythonEngine.ExecString( + 'from delphi import rtti_var' + sLineBreak + + 'rtti_var.PassVariantArray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])' + ); + Assert.Pass; +end; + +procedure TTestWrapDelphi.TestRecord; +begin + Rtti_rec.StringField := 'abcd'; + Assert.IsTrue(rtti_rec.StringField = 'abcd'); + Rtti_rec.SetStringField('1234'); + Assert.IsTrue(rtti_rec.StringField = '1234'); + Assert.AreEqual(Rec.StringField, '1234'); + Rtti_rec.SubRecord.DoubleField := variant(double(3.14)); //implicitly cast to a variant to avoid a bug present in 10.4.2 + Assert.IsTrue(rtti_rec.SubRecord.DoubleField = 3.14); + Assert.AreEqual(Rec.SubRecord.DoubleField, 3.14); +end; + +procedure TTestWrapDelphi.TestRecordField; +Var + RecValue: Variant; +begin + RecValue := rtti_var.RecordField; + RecValue.StringField := 'abc'; + rtti_var.RecordField := RecValue; + Assert.IsTrue(rtti_var.RecordField.StringField = 'abc'); +end; + +procedure TTestWrapDelphi.TestSetField; +// Sets are converted to/from list of strings +begin + TestRttiAccess.FruitsField := []; + Assert.AreEqual(string(Rtti_Var.FruitsField), '[]'); + Rtti_Var.FruitsField := VarPythonCreate(['Apple', 'Banana'], stList); + Assert.AreEqual(string(Rtti_Var.FruitsField), '[''Apple'', ''Banana'']'); + Assert.IsTrue(TestRttiAccess.FruitsField = [Apple, Banana]); +end; + +procedure TTestWrapDelphi.TestSetProperty; +begin + TestRttiAccess.Fruits := []; + Assert.AreEqual(string(Rtti_Var.Fruits), '[]'); + Rtti_Var.Fruits := VarPythonCreate(['Apple', 'Banana'], stList); + Assert.AreEqual(string(Rtti_Var.Fruits), '[''Apple'', ''Banana'']'); + Assert.IsTrue(TestRttiAccess.Fruits = [Apple, Banana]); +end; + +procedure TTestWrapDelphi.TestSetProps; +begin + rtti_var.SetProps(StringField := 'abc', DoubleField := 1.234); + Assert.AreEqual(TestRttiAccess.StringField, 'abc'); + Assert.AreEqual(TestRttiAccess.DoubleField, 1.234); +end; + +procedure TTestWrapDelphi.TestStringField; +begin + TestRttiAccess.StringField := 'Hi'; + Assert.AreEqual(string(Rtti_Var.StringField), 'Hi'); + Rtti_Var.StringField := 'P4D'; + Assert.AreEqual(TestRttiAccess.StringField, 'P4D'); +end; + +procedure TTestWrapDelphi.TestDynArrayParameters; +{var + rc: TRttiContext; + rt: TRttiType; + rm: TRttiMethod; + rp: TArray; + ra: TArray;} +begin +{ rc := TRttiContext.Create; + rt := rc.GetType(TypeInfo(TTestRttiAccess)); + rm := rt.GetMethod('SellFruitsInt'); + rp := rm.GetParameters; + SetLength(ra, 1); + ra[0] := TValue.FromArray(TypeInfo(TIntegerDynArray), [TValue.From(0)]); + rm.Invoke(TestRttiAccess, ra);} + TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; + Rtti_Var.SellFruitsInt(VarPythonCreate([0, 1], stList)); + Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); + TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; + Rtti_Var.SellFruits(VarPythonCreate([Ord(TFruit.Apple), Ord(TFruit.Banana)], stList)); + Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); +end; + +procedure TTestWrapDelphi.TestMethodWithVarAndOverload; +begin + Rtti_Var.SetStringField('test'); + Assert.AreEqual('test', TestRttiAccess.StringField); +end; + +function TTestRttiAccess.SetStringField(const Value: string): string; +begin + StringField := Value; + Result := StringField; +end; + +function TTestRttiAccess.SetStringField(var Value: Integer): string; +begin + StringField := IntToStr(Value); + Result := StringField; +end; + +function TTestRttiAccess.GetData: TObject; +begin + Result := TStringList.Create; +end; + +function TTestRttiAccess.GetDynArray: TInt64DynArray; +var + I: Integer; +begin + SetLength(Result, 1000000); + for I := 0 to Length(Result) - 1 do + Result[I] := I; +end; + +function TTestRttiAccess.GetStaticArray: TStaticArray; +var + I: Integer; +begin + for I := 0 to Length(Result) - 1 do + Result[I] := I; +end; + +procedure TTestRttiAccess.PassVariantArray(const Value: Variant); +begin + Assert.IsTrue(VarIsArray(Value) and (VarArrayHighBound(Value, 1) = 9)); +end; + +procedure TTestRttiAccess.SellFruits(const AFruits: TFruitDynArray); +var + Fruit: TFruit; +begin + for Fruit in AFruits do + Exclude(FFruits, Fruit); +end; + +procedure TTestRttiAccess.SellFruitsInt(const AFruits:TIntegerDynArray); +var + Fruit: Integer; +begin + for Fruit in AFruits do + Exclude(FFruits, TFruit(Fruit)); +end; + +{ TTestRecord } + +procedure TTestRecord.SetStringField(S: string); +begin + Self.StringField := S; +end; + +{ TTestInterfaceImpl } + +function TTestInterfaceImpl.GetString: string; +begin + Result := FString; +end; + +procedure TTestInterfaceImpl.SetString(const S: string); +begin + FString := S; +end; + +initialization + TDUnitX.RegisterTestFixture(TTestWrapDelphi); + ReportMemoryLeaksOnShutdown := True; + +end. From 824cf1e0c1857734fd3ae971d93f318ee8f2a1d6 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 1 Aug 2023 14:19:53 +0300 Subject: [PATCH 050/174] Fix crash in Demo31. Accessing DelphiObject properties without calling Adjust(@Self) in WrapVclComCtrls.pas. --- Source/vcl/WrapVclComCtrls.pas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index aec2033b..dfedeb0b 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -351,6 +351,7 @@ function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( function TPyDelphiPageControl.Get_ActivePage(AContext: Pointer): PPyObject; begin + Adjust(@Self); Result := Wrap(DelphiObject.ActivePage); end; @@ -364,6 +365,7 @@ function TPyDelphiPageControl.Get_ActivePageIndex( {$IFNDEF FPC} function TPyDelphiPageControl.Get_Canvas(AContext: Pointer): PPyObject; begin + Adjust(@Self); Result := Wrap(DelphiObject.Canvas); end; {$ENDIF FPC} From ef4172079bb7a3bfda40c267ddf9182a29cdb98e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 2 Aug 2023 16:20:05 +0300 Subject: [PATCH 051/174] Fix #337 Uniform unit headers. --- Contributors.md | 20 +++ Source/MethodCallBack.pas | 26 ++-- Source/PythonAction.pas | 13 ++ Source/PythonEngine.pas | 58 ++------- Source/PythonVersions.pas | 22 ++-- Source/VarPyth.pas | 40 ++---- Source/WrapActions.pas | 13 ++ Source/WrapDelphi.pas | 21 ++- Source/WrapDelphiClasses.pas | 13 ++ Source/WrapDelphiDataBind.pas | 13 ++ Source/WrapDelphiTypes.pas | 13 ++ Source/WrapDelphiWindows.pas | 13 ++ Source/WrapFireDAC.pas | 22 +++- Source/fmx/FMX.PythonGUIInputOutput.pas | 13 ++ Source/fmx/WrapDelphiFmx.pas | 13 ++ Source/fmx/WrapFmxActnList.pas | 13 ++ Source/fmx/WrapFmxColors.pas | 13 ++ Source/fmx/WrapFmxComCtrls.pas | 13 ++ Source/fmx/WrapFmxControls.pas | 13 ++ Source/fmx/WrapFmxDataBind.pas | 13 ++ Source/fmx/WrapFmxDateTime.pas | 13 ++ Source/fmx/WrapFmxDialogs.pas | 13 ++ Source/fmx/WrapFmxEdit.pas | 13 ++ Source/fmx/WrapFmxForms.pas | 13 ++ Source/fmx/WrapFmxGrids.pas | 13 ++ Source/fmx/WrapFmxLayouts.pas | 13 ++ Source/fmx/WrapFmxListBox.pas | 13 ++ Source/fmx/WrapFmxListView.pas | 13 ++ Source/fmx/WrapFmxMedia.pas | 13 ++ Source/fmx/WrapFmxMemo.pas | 13 ++ Source/fmx/WrapFmxMenus.pas | 13 ++ Source/fmx/WrapFmxScrollBox.pas | 13 ++ Source/fmx/WrapFmxShapes.pas | 13 ++ Source/fmx/WrapFmxStdActns.pas | 13 ++ Source/fmx/WrapFmxStdCtrls.pas | 13 ++ Source/fmx/WrapFmxStyles.pas | 13 ++ Source/fmx/WrapFmxTypes.pas | 13 ++ Source/lcl/Lcl.PythonGUIInputOutput.pas | 51 ++------ Source/vcl/Vcl.PythonGUIInputOutput.pas | 51 ++------ Source/vcl/WrapDelphiVCL.pas | 13 ++ Source/vcl/WrapVclActnList.pas | 165 +++++++++++++----------- Source/vcl/WrapVclButtons.pas | 13 ++ Source/vcl/WrapVclComCtrls.pas | 15 ++- Source/vcl/WrapVclControls.pas | 13 ++ Source/vcl/WrapVclDialogs.pas | 13 ++ Source/vcl/WrapVclExtCtrls.pas | 13 ++ Source/vcl/WrapVclForms.pas | 15 ++- Source/vcl/WrapVclGraphics.pas | 13 ++ Source/vcl/WrapVclGrids.pas | 13 ++ Source/vcl/WrapVclMedia.pas | 13 ++ Source/vcl/WrapVclMenus.pas | 13 ++ Source/vcl/WrapVclSamplesSpin.pas | 13 ++ Source/vcl/WrapVclStdCtrls.pas | 13 ++ Source/vcl/WrapVclThemes.pas | 13 ++ Source/vcl/WrapVclWinXCtrls.pas | 13 ++ 55 files changed, 790 insertions(+), 275 deletions(-) create mode 100644 Contributors.md diff --git a/Contributors.md b/Contributors.md new file mode 100644 index 00000000..f6cce9d7 --- /dev/null +++ b/Contributors.md @@ -0,0 +1,20 @@ +## Contributors + +### Fpc and Lazarus support: +- Alexey-T (https://github.com/Alexey-T) +### Early Contributors: +- Grzegorz Makarewicz (mak@mikroplan.com.pl) +- Samuel Iseli (iseli@vertec.ch) +- Andrew Robinson (andy@hps1.demon.co.uk) +- Mark Watts(mark_watts@hotmail.com) +- Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr) +- Sigve Tjora (public@tjora.no) +- Mark Derricutt (mark@talios.com) +- Igor E. Poteryaev (jah@mail.ru) +- Yuri Filimonov (fil65@mail.ru) +- Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) +- Michiel du Toit (micdutoit@hsbfn.com) - Lazarus Port +- Chris Nicolai (nicolaitanes@gmail.com) +- Andrey Gruzdev (andrey.gruzdev@gmail.com) + +More recent contributors can be seen at the [project contributors graph](https://github.com/pyscripter/python4delphi/graphs/contributors). diff --git a/Source/MethodCallBack.pas b/Source/MethodCallBack.pas index f5eaec11..82b25a8e 100644 --- a/Source/MethodCallBack.pas +++ b/Source/MethodCallBack.pas @@ -1,28 +1,18 @@ (**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) (* *) -(* Module: Unit 'MethodCallback' Copyright (c) 1998 *) -(* *) -(* Version: 0.0 Dr. Dietmar Budelsky *) -(* Sub-Version: 0.3 dbudelsky@web.de *) -(* Germany *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) (* *) +(* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) (* Functionality: Generates synthetic callback functions which calls *) (* DELPHI Class Methods. A callback mechanism (DDE, PYTHON, TCL) can now *) (* use DELPHI objects. *) -(* *) -(**************************************************************************) -(* Contributors: *) -(* Grzegorz Makarewicz (mak@mikroplan.com.pl) *) -(* Morgan Martinet (p4d@mmm-experts.com) *) -(* Samuel Iseli (iseli@vertec.ch) *) -(* Andrey Gruzdev (andrey.gruzdev@gmail.com) *) -(* Lucas Belo (lucas.belo@live.com) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free, as long as this *) -(* header and its copyright text is intact. *) -(* Dr. Dietmar Budelsky, 1998-01-07 *) (**************************************************************************) {$I Definition.Inc} diff --git a/Source/PythonAction.pas b/Source/PythonAction.pas index c1532fab..60af65e5 100644 --- a/Source/PythonAction.pas +++ b/Source/PythonAction.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit PythonAction; interface diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index dbc139e2..3ceeaa91 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1,56 +1,14 @@ (**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) (* *) -(* Module: Unit 'PythonEngine' Copyright (c) 1997 *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) (* *) -(* Dr. Dietmar Budelsky *) -(* dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4723 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: p4d@mmm-experts.com *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project page: https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) -(* *) -(**************************************************************************) -(* Contributors: *) -(* Grzegorz Makarewicz (mak@mikroplan.com.pl) *) -(* Andrew Robinson (andy@hps1.demon.co.uk) *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr) *) -(* Sigve Tjora (public@tjora.no) *) -(* Mark Derricutt (mark@talios.com) *) -(* Igor E. Poteryaev (jah@mail.ru) *) -(* Yuri Filimonov (fil65@mail.ru) *) -(* Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) *) -(* Michiel du Toit (micdutoit@hsbfn.com) - Lazarus Port *) -(* Chris Nicolai (nicolaitanes@gmail.com) *) -(* Andrey Gruzdev (andrey.gruzdev@gmail.com) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) +(* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) {$I Definition.Inc} diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 2a596d5d..569ba52f 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -1,11 +1,17 @@ -{----------------------------------------------------------------------------- - Unit Name: PythonVersions - Author: PyScripter - Purpose: Discover and get info about Python versions - Part of the Python for Delphi library - - History: ------------------------------------------------------------------------------} +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) +(* Purpose: Discover and get info about Python versions *) +(**************************************************************************) unit PythonVersions; diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index ab9f170a..ae953b48 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -1,17 +1,14 @@ -{$I Definition.Inc} - -unit VarPyth; - (**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) (* *) -(* Module: Unit 'VarPyth' Copyright (c) 2001 *) -(* *) -(* Version: 1.0 Morgan Martinet *) -(* Sub-Version: 0.7 4723 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: p4d@mmm-experts.com *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) (* *) +(* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) (* Functionality: This allows you to use Python objects like COM *) (* automation objects, inside your Delphi source code. *) @@ -19,23 +16,10 @@ (* that uses the new custom variant types introduced *) (* in Delphi6. *) (**************************************************************************) -(* Contributors: *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) + +{$I Definition.Inc} + +unit VarPyth; interface diff --git a/Source/WrapActions.pas b/Source/WrapActions.pas index ff7ac700..3e527f52 100644 --- a/Source/WrapActions.pas +++ b/Source/WrapActions.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapActions; interface diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 3eb9aba0..27448707 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1,12 +1,19 @@ -(*----------------------------------------------------------------------------- - Unit Name: WrapDelphi - Author: Kiriakos Vlahos - Date: 24-Feb-2005 +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + +(*----------------------------------------------------------------------------- Purpose: Provide automatic wrapping of Delphi variables utilising RTTI - Contributors: - Morgan Martinet (mmm@free.fr) - Features: Published properties and methods compiled with {$METHODINFO ON} are handled automatically (Note that METHODINFO can be used only with Delphi7 diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 2e2ae482..5a00f9aa 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I Definition.Inc} unit WrapDelphiClasses; diff --git a/Source/WrapDelphiDataBind.pas b/Source/WrapDelphiDataBind.pas index 01dd5fb3..2d2938cb 100644 --- a/Source/WrapDelphiDataBind.pas +++ b/Source/WrapDelphiDataBind.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapDelphiDataBind; interface diff --git a/Source/WrapDelphiTypes.pas b/Source/WrapDelphiTypes.pas index 12f7718c..76c22c85 100644 --- a/Source/WrapDelphiTypes.pas +++ b/Source/WrapDelphiTypes.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I Definition.Inc} unit WrapDelphiTypes; diff --git a/Source/WrapDelphiWindows.pas b/Source/WrapDelphiWindows.pas index 34c02eaf..86845816 100644 --- a/Source/WrapDelphiWindows.pas +++ b/Source/WrapDelphiWindows.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I Definition.Inc} unit WrapDelphiWindows; diff --git a/Source/WrapFireDAC.pas b/Source/WrapFireDAC.pas index 195a1e45..eefa7af9 100644 --- a/Source/WrapFireDAC.pas +++ b/Source/WrapFireDAC.pas @@ -1,9 +1,19 @@ -{$REGION 'Licence'} -{ - Wrapper classes for FireDAC TFDTable and TFDQuery - Original Code by https://github.com/hartmutdavid -==============================================================================} -{$ENDREGION} +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) +(* Wrapper classes for FireDAC TFDTable and TFDQuery *) +(* Original Code by https://github.com/hartmutdavid *) +(**************************************************************************) + unit WrapFireDAC; interface diff --git a/Source/fmx/FMX.PythonGUIInputOutput.pas b/Source/fmx/FMX.PythonGUIInputOutput.pas index 36aa61c1..2d90884f 100644 --- a/Source/fmx/FMX.PythonGUIInputOutput.pas +++ b/Source/fmx/FMX.PythonGUIInputOutput.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit FMX.PythonGUIInputOutput; diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index 4e1505e1..1fd2cd29 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapDelphiFmx; interface diff --git a/Source/fmx/WrapFmxActnList.pas b/Source/fmx/WrapFmxActnList.pas index 0083be93..bc7278b0 100644 --- a/Source/fmx/WrapFmxActnList.pas +++ b/Source/fmx/WrapFmxActnList.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxActnList; diff --git a/Source/fmx/WrapFmxColors.pas b/Source/fmx/WrapFmxColors.pas index bef6dad8..6a2f90e7 100644 --- a/Source/fmx/WrapFmxColors.pas +++ b/Source/fmx/WrapFmxColors.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxColors; interface diff --git a/Source/fmx/WrapFmxComCtrls.pas b/Source/fmx/WrapFmxComCtrls.pas index 0093e614..84b92dfa 100644 --- a/Source/fmx/WrapFmxComCtrls.pas +++ b/Source/fmx/WrapFmxComCtrls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxComCtrls; diff --git a/Source/fmx/WrapFmxControls.pas b/Source/fmx/WrapFmxControls.pas index 3ae4a506..ac177c02 100644 --- a/Source/fmx/WrapFmxControls.pas +++ b/Source/fmx/WrapFmxControls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxControls; diff --git a/Source/fmx/WrapFmxDataBind.pas b/Source/fmx/WrapFmxDataBind.pas index 3ad2eef4..6bc3b8b7 100644 --- a/Source/fmx/WrapFmxDataBind.pas +++ b/Source/fmx/WrapFmxDataBind.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxDataBind; interface diff --git a/Source/fmx/WrapFmxDateTime.pas b/Source/fmx/WrapFmxDateTime.pas index 1fc12e31..7da8b56a 100644 --- a/Source/fmx/WrapFmxDateTime.pas +++ b/Source/fmx/WrapFmxDateTime.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxDateTime; interface diff --git a/Source/fmx/WrapFmxDialogs.pas b/Source/fmx/WrapFmxDialogs.pas index 059dcd66..6a9b06be 100644 --- a/Source/fmx/WrapFmxDialogs.pas +++ b/Source/fmx/WrapFmxDialogs.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxDialogs; diff --git a/Source/fmx/WrapFmxEdit.pas b/Source/fmx/WrapFmxEdit.pas index 05a0cee5..ac9a11b0 100644 --- a/Source/fmx/WrapFmxEdit.pas +++ b/Source/fmx/WrapFmxEdit.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxEdit; diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index 1dc5fb31..0c63147e 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxForms; diff --git a/Source/fmx/WrapFmxGrids.pas b/Source/fmx/WrapFmxGrids.pas index 841c75b6..85b680a8 100644 --- a/Source/fmx/WrapFmxGrids.pas +++ b/Source/fmx/WrapFmxGrids.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxGrids; interface diff --git a/Source/fmx/WrapFmxLayouts.pas b/Source/fmx/WrapFmxLayouts.pas index f3433d99..ea7c5178 100644 --- a/Source/fmx/WrapFmxLayouts.pas +++ b/Source/fmx/WrapFmxLayouts.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxLayouts; diff --git a/Source/fmx/WrapFmxListBox.pas b/Source/fmx/WrapFmxListBox.pas index c2c390e4..9bce17f6 100644 --- a/Source/fmx/WrapFmxListBox.pas +++ b/Source/fmx/WrapFmxListBox.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxListBox; diff --git a/Source/fmx/WrapFmxListView.pas b/Source/fmx/WrapFmxListView.pas index bcd49632..10270d4c 100644 --- a/Source/fmx/WrapFmxListView.pas +++ b/Source/fmx/WrapFmxListView.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxListView; interface diff --git a/Source/fmx/WrapFmxMedia.pas b/Source/fmx/WrapFmxMedia.pas index b884f697..7b1d3fd2 100644 --- a/Source/fmx/WrapFmxMedia.pas +++ b/Source/fmx/WrapFmxMedia.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxMedia; diff --git a/Source/fmx/WrapFmxMemo.pas b/Source/fmx/WrapFmxMemo.pas index 5dcf7295..462f383e 100644 --- a/Source/fmx/WrapFmxMemo.pas +++ b/Source/fmx/WrapFmxMemo.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxMemo; interface diff --git a/Source/fmx/WrapFmxMenus.pas b/Source/fmx/WrapFmxMenus.pas index 84096ef4..e34bfb62 100644 --- a/Source/fmx/WrapFmxMenus.pas +++ b/Source/fmx/WrapFmxMenus.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxMenus; diff --git a/Source/fmx/WrapFmxScrollBox.pas b/Source/fmx/WrapFmxScrollBox.pas index 8b73b4bf..bb46808e 100644 --- a/Source/fmx/WrapFmxScrollBox.pas +++ b/Source/fmx/WrapFmxScrollBox.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapFmxScrollBox; interface diff --git a/Source/fmx/WrapFmxShapes.pas b/Source/fmx/WrapFmxShapes.pas index 08607a8f..b098b750 100644 --- a/Source/fmx/WrapFmxShapes.pas +++ b/Source/fmx/WrapFmxShapes.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxShapes; diff --git a/Source/fmx/WrapFmxStdActns.pas b/Source/fmx/WrapFmxStdActns.pas index 7f7eaeed..e28cea86 100644 --- a/Source/fmx/WrapFmxStdActns.pas +++ b/Source/fmx/WrapFmxStdActns.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxStdActns; diff --git a/Source/fmx/WrapFmxStdCtrls.pas b/Source/fmx/WrapFmxStdCtrls.pas index e1af1763..5711db8b 100644 --- a/Source/fmx/WrapFmxStdCtrls.pas +++ b/Source/fmx/WrapFmxStdCtrls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxStdCtrls; diff --git a/Source/fmx/WrapFmxStyles.pas b/Source/fmx/WrapFmxStyles.pas index 36965919..8bd2a761 100644 --- a/Source/fmx/WrapFmxStyles.pas +++ b/Source/fmx/WrapFmxStyles.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxStyles; diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index efc3c7f4..68023bf3 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapFmxTypes; diff --git a/Source/lcl/Lcl.PythonGUIInputOutput.pas b/Source/lcl/Lcl.PythonGUIInputOutput.pas index d29e9cbb..f6390ec8 100644 --- a/Source/lcl/Lcl.PythonGUIInputOutput.pas +++ b/Source/lcl/Lcl.PythonGUIInputOutput.pas @@ -1,47 +1,18 @@ -{$I ..\Definition.Inc} -unit Lcl.PythonGUIInputOutput; - (**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) (* *) -(* Module: Unit 'PythonGUIInputOutput' Copyright (c) 1997 *) -(* *) -(* Dr. Dietmar Budelsky *) -(* dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4723 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: p4d@mmm-experts.com *) -(* *) -(* look our page at: http://mmm-experts.com/ *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) (* *) +(* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) -(* Contributors: *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Michiel du Toit (micdutoit@hsbfn.com) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) -(**************************************************************************) + +{$I ..\Definition.Inc} +unit Lcl.PythonGUIInputOutput; interface diff --git a/Source/vcl/Vcl.PythonGUIInputOutput.pas b/Source/vcl/Vcl.PythonGUIInputOutput.pas index 4eddaee3..5f800346 100644 --- a/Source/vcl/Vcl.PythonGUIInputOutput.pas +++ b/Source/vcl/Vcl.PythonGUIInputOutput.pas @@ -1,47 +1,18 @@ -{$I ..\Definition.Inc} -unit Vcl.PythonGUIInputOutput; - (**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) (* *) -(* Module: Unit 'PythonGUIInputOutput' Copyright (c) 1997 *) -(* *) -(* Dr. Dietmar Budelsky *) -(* dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4723 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: p4d@mmm-experts.com *) -(* *) -(* look our page at: http://mmm-experts.com/ *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) (* *) +(* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) -(* Contributors: *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Michiel du Toit (micdutoit@hsbfn.com) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) -(**************************************************************************) + +{$I ..\Definition.Inc} +unit Vcl.PythonGUIInputOutput; interface diff --git a/Source/vcl/WrapDelphiVCL.pas b/Source/vcl/WrapDelphiVCL.pas index ea9f5392..1178ebb9 100644 --- a/Source/vcl/WrapDelphiVCL.pas +++ b/Source/vcl/WrapDelphiVCL.pas @@ -1,3 +1,16 @@ + +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + unit WrapDelphiVCL; { diff --git a/Source/vcl/WrapVclActnList.pas b/Source/vcl/WrapVclActnList.pas index f15e2a88..fde9ac6b 100644 --- a/Source/vcl/WrapVclActnList.pas +++ b/Source/vcl/WrapVclActnList.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclActnList; @@ -17,15 +30,15 @@ interface the types and allows the use of the constructors e.g. ActionList() } TPyDelphiCustomActionList = class(TPyDelphiContainedActionList) - private - function GetDelphiObject: TCustomActionList; - procedure SetDelphiObject(const Value: TCustomActionList); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomActionList read GetDelphiObject - write SetDelphiObject; - end; - + private + function GetDelphiObject: TCustomActionList; + procedure SetDelphiObject(const Value: TCustomActionList); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomActionList read GetDelphiObject + write SetDelphiObject; + end; + TPyDelphiActionList = class (TPyDelphiCustomActionList) private function GetDelphiObject: TActionList; @@ -38,23 +51,23 @@ TPyDelphiActionList = class (TPyDelphiCustomActionList) end; TPyDelphiCustomAction = class(TPyDelphiContainedAction) - private - function GetDelphiObject: TCustomAction; - procedure SetDelphiObject(const Value: TCustomAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TCustomAction read GetDelphiObject - write SetDelphiObject; - end; - - TPyDelphiAction = class(TPyDelphiContainedAction) - private - function GetDelphiObject: TAction; - procedure SetDelphiObject(const Value: TAction); - public - class function DelphiObjectClass: TClass; override; - property DelphiObject: TAction read GetDelphiObject write SetDelphiObject; - end; + private + function GetDelphiObject: TCustomAction; + procedure SetDelphiObject(const Value: TCustomAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomAction read GetDelphiObject + write SetDelphiObject; + end; + + TPyDelphiAction = class(TPyDelphiContainedAction) + private + function GetDelphiObject: TAction; + procedure SetDelphiObject(const Value: TAction); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TAction read GetDelphiObject write SetDelphiObject; + end; implementation @@ -79,26 +92,26 @@ procedure TActnListRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomActionList); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiActionList); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomAction); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAction); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAction); end; { TPyDelphiCustomActionList } -class function TPyDelphiCustomActionList.DelphiObjectClass: TClass; -begin - Result := TCustomActionList; -end; - -function TPyDelphiCustomActionList.GetDelphiObject: TCustomActionList; -begin - Result := TCustomActionList(inherited DelphiObject); -end; - -procedure TPyDelphiCustomActionList.SetDelphiObject - (const Value: TCustomActionList); -begin - inherited DelphiObject := Value; -end; - +class function TPyDelphiCustomActionList.DelphiObjectClass: TClass; +begin + Result := TCustomActionList; +end; + +function TPyDelphiCustomActionList.GetDelphiObject: TCustomActionList; +begin + Result := TCustomActionList(inherited DelphiObject); +end; + +procedure TPyDelphiCustomActionList.SetDelphiObject + (const Value: TCustomActionList); +begin + inherited DelphiObject := Value; +end; + { TPyDelphiActionList } class function TPyDelphiActionList.DelphiObjectClass: TClass; @@ -118,39 +131,39 @@ procedure TPyDelphiActionList.SetDelphiObject( end; { TPyDelphiCustomAction } - -class function TPyDelphiCustomAction.DelphiObjectClass: TClass; -begin - Result := TCustomAction; -end; - -function TPyDelphiCustomAction.GetDelphiObject: TCustomAction; -begin - Result := TCustomAction(inherited DelphiObject); -end; - -procedure TPyDelphiCustomAction.SetDelphiObject(const Value: TCustomAction); -begin - inherited DelphiObject := Value; -end; - -{ TPyDelphiAction } - -class function TPyDelphiAction.DelphiObjectClass: TClass; -begin - Result := TAction; -end; - -function TPyDelphiAction.GetDelphiObject: TAction; -begin - Result := TAction(inherited DelphiObject); -end; - -procedure TPyDelphiAction.SetDelphiObject(const Value: TAction); -begin - inherited DelphiObject := Value; -end; - + +class function TPyDelphiCustomAction.DelphiObjectClass: TClass; +begin + Result := TCustomAction; +end; + +function TPyDelphiCustomAction.GetDelphiObject: TCustomAction; +begin + Result := TCustomAction(inherited DelphiObject); +end; + +procedure TPyDelphiCustomAction.SetDelphiObject(const Value: TCustomAction); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiAction } + +class function TPyDelphiAction.DelphiObjectClass: TClass; +begin + Result := TAction; +end; + +function TPyDelphiAction.GetDelphiObject: TAction; +begin + Result := TAction(inherited DelphiObject); +end; + +procedure TPyDelphiAction.SetDelphiObject(const Value: TAction); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TActnListRegistration.Create); end. diff --git a/Source/vcl/WrapVclButtons.pas b/Source/vcl/WrapVclButtons.pas index cf4e7801..26ebf124 100644 --- a/Source/vcl/WrapVclButtons.pas +++ b/Source/vcl/WrapVclButtons.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclButtons; diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index dfedeb0b..a38d3505 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -1,4 +1,17 @@ -{$I ..\Definition.Inc} +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + +{$I ..\Definition.Inc} unit WrapVclComCtrls; diff --git a/Source/vcl/WrapVclControls.pas b/Source/vcl/WrapVclControls.pas index 07494a3d..c8171dc0 100644 --- a/Source/vcl/WrapVclControls.pas +++ b/Source/vcl/WrapVclControls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclControls; diff --git a/Source/vcl/WrapVclDialogs.pas b/Source/vcl/WrapVclDialogs.pas index 1e37942b..ed205e7c 100644 --- a/Source/vcl/WrapVclDialogs.pas +++ b/Source/vcl/WrapVclDialogs.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclDialogs; diff --git a/Source/vcl/WrapVclExtCtrls.pas b/Source/vcl/WrapVclExtCtrls.pas index 8fcbae88..85c5b4d3 100644 --- a/Source/vcl/WrapVclExtCtrls.pas +++ b/Source/vcl/WrapVclExtCtrls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclExtCtrls; diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index cd9bd33a..ad62a6cf 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -1,4 +1,17 @@ -{$I ..\Definition.Inc} +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + +{$I ..\Definition.Inc} unit WrapVclForms; diff --git a/Source/vcl/WrapVclGraphics.pas b/Source/vcl/WrapVclGraphics.pas index 55f7b2d7..cde54ed6 100644 --- a/Source/vcl/WrapVclGraphics.pas +++ b/Source/vcl/WrapVclGraphics.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclGraphics; diff --git a/Source/vcl/WrapVclGrids.pas b/Source/vcl/WrapVclGrids.pas index 3f52bbe7..0d74cf7e 100644 --- a/Source/vcl/WrapVclGrids.pas +++ b/Source/vcl/WrapVclGrids.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclGrids; diff --git a/Source/vcl/WrapVclMedia.pas b/Source/vcl/WrapVclMedia.pas index 30f5706d..f8ee1d55 100644 --- a/Source/vcl/WrapVclMedia.pas +++ b/Source/vcl/WrapVclMedia.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclMedia; diff --git a/Source/vcl/WrapVclMenus.pas b/Source/vcl/WrapVclMenus.pas index 8a755c75..30e49f1b 100644 --- a/Source/vcl/WrapVclMenus.pas +++ b/Source/vcl/WrapVclMenus.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclMenus; diff --git a/Source/vcl/WrapVclSamplesSpin.pas b/Source/vcl/WrapVclSamplesSpin.pas index 98d9b0e7..859ad414 100644 --- a/Source/vcl/WrapVclSamplesSpin.pas +++ b/Source/vcl/WrapVclSamplesSpin.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclSamplesSpin; diff --git a/Source/vcl/WrapVclStdCtrls.pas b/Source/vcl/WrapVclStdCtrls.pas index 07e11f57..c0e9e234 100644 --- a/Source/vcl/WrapVclStdCtrls.pas +++ b/Source/vcl/WrapVclStdCtrls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclStdCtrls; diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index f77b49ee..a5c3a850 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclThemes; diff --git a/Source/vcl/WrapVclWinXCtrls.pas b/Source/vcl/WrapVclWinXCtrls.pas index fd027c70..5d7c4bc6 100644 --- a/Source/vcl/WrapVclWinXCtrls.pas +++ b/Source/vcl/WrapVclWinXCtrls.pas @@ -1,3 +1,16 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + {$I ..\Definition.Inc} unit WrapVclWinXCtrls; From 02dd57b91dc276fc59d3011e5ddc3b37b926426f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 22 Sep 2023 23:15:17 +0300 Subject: [PATCH 052/174] Fix unreleased python object in Run_CommandAsObjectWithDict See https://en.delphipraxis.net/topic/10209-possible-memory-leak/ --- Source/PythonEngine.pas | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 3ceeaa91..e29bed72 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4941,10 +4941,14 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command: AnsiString; Code := Py_CompileString(PAnsiChar(CleanString(command)), PAnsiChar(EncodeString(FileName)), mode); if Code = nil then - CheckError(False); - Result := PyEval_EvalCode(Code, _globals, _locals ); - if Result = nil then - CheckError(False); + CheckError(False) + else + begin + Result := PyEval_EvalCode(Code, _globals, _locals ); + Py_DECREF(Code); + if Result = nil then + CheckError(False); + end; except if PyErr_Occurred <> nil then CheckError(False) From afbe277a113cc1bdc644d067c80084e64e5428e8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 24 Sep 2023 15:09:31 +0300 Subject: [PATCH 053/174] Introduced TPyClassWrapper a generic wrapper for pascal classes --- Source/WrapDelphi.pas | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 27448707..c4abe532 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -587,6 +587,21 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) end; TPyDelphiObjectClass = class of TPyDelphiObject; + + { Generic wrapper for pascal classes + Can be used from unit wrappers as follows: + APyDelphiWrapper.RegisterDelphiWrapper(TPyClassWrapper); + or at runtime (e.g. inside the FormCreate handler: + PyDelphiWrapper1.RegisterDelphiWrapper(TPyClassWrapper).Initialize;} + TPyClassWrapper = class(TPyDelphiObject) + function GetDelphiObject: T; + procedure SetDelphiObject(const Value: T); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: T read GetDelphiObject write SetDelphiObject; + end; + { This class will simply hold a Python object in its Value property. This is required for Delphi var parameters because Python won't let you replace a parameter value with another one, so, we will provide a container @@ -842,7 +857,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) procedure Finalize; override; procedure DefineVar(const AName : string; const AValue : Variant); overload; procedure DefineVar(const AName : string; AValue : TObject); overload; - procedure RegisterDelphiWrapper(AWrapperClass : TPyDelphiObjectClass); + function RegisterDelphiWrapper(AWrapperClass : TPyDelphiObjectClass): TPythonType; function RegisterHelperType(APyObjectClass : TPyObjectClass) : TPythonType; function RegisterFunction(AFuncName : PAnsiChar; AFunc : PyCFunction; ADocString : PAnsiChar ): PPyMethodDef; overload; function RegisterFunction(AFuncName : PAnsiChar; AFunc : TDelphiMethod; ADocString : PAnsiChar ): PPyMethodDef; overload; @@ -3144,6 +3159,25 @@ function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; end; {$ENDIF} +{ TPyClassWrapper } + +class function TPyClassWrapper.DelphiObjectClass: TClass; +begin + Result := T; +end; + +function TPyClassWrapper.GetDelphiObject: T; +begin + Result := T(inherited DelphiObject) +end; + +procedure TPyClassWrapper.SetDelphiObject(const Value: T); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiMethodObject } + function TPyDelphiMethodObject.Repr: PPyObject; begin with GetPythonEngine do @@ -3790,8 +3824,8 @@ procedure TPyDelphiWrapper.Notify(ADeletedObject: TObject); fEventHandlerList.Delete(i); end; -procedure TPyDelphiWrapper.RegisterDelphiWrapper( - AWrapperClass: TPyDelphiObjectClass); +function TPyDelphiWrapper.RegisterDelphiWrapper( + AWrapperClass: TPyDelphiObjectClass): TPythonType; var RegisteredClass : TRegisteredClass; Index: Integer; @@ -3814,6 +3848,8 @@ procedure TPyDelphiWrapper.RegisterDelphiWrapper( end; fClassRegister.Add(RegisteredClass); + Result := RegisteredClass.PythonType; + if AWrapperClass.DelphiObjectClass.InheritsFrom(TPersistent) then Classes.RegisterClass(TPersistentClass(AWrapperClass.DelphiObjectClass)); end; From e4ab3a83484482528259a56c06685bc8f96a7865 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 1 Oct 2023 14:22:00 +0300 Subject: [PATCH 054/174] Call PyType_Ready in TPythonType.Initialize --- Source/PythonEngine.pas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index e29bed72..9a776947 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -8632,6 +8632,8 @@ procedure TPythonType.Initialize; Module.AddClient( Self ); end; InitServices; + if Engine.PyType_Ready(TheTypePtr) <> 0 then + Engine.CheckError; inherited; end; From f5fb7512d2ba1c5db1f39d853cfc03eb5a8b9cda Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 3 Oct 2023 19:11:42 +0300 Subject: [PATCH 055/174] WrapDelphi: - Generic class wrapper - Use Rtti to expose methods, fields and properties to the created python type. Here is the first stage with methods exposed. - IDocServer interface to provide docstrings to the exposed members - New WrapDelphi tests added PythonEngine: - FindPythonType overload - Minor changes and comments --- Source/PythonEngine.pas | 50 +++-- Source/WrapDelphi.pas | 473 ++++++++++++++++++++++++++++++++++----- Tests/WrapDelphiTest.pas | 46 +++- 3 files changed, 495 insertions(+), 74 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 9a776947..fed4a0e8 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1902,7 +1902,8 @@ TPythonEngine = class(TPythonInterface) procedure AddClient( client : TEngineClient ); procedure RemoveClient( client : TEngineClient ); function FindClient( const aName : string ) : TEngineClient; - function FindPythonType( const TypeName : AnsiString ) : TPythonType; + function FindPythonType(const TypeName : AnsiString): TPythonType; overload; + function FindPythonType(PyType: PPyTypeObject): TPythonType; overload; function TypeByName( const aTypeName : AnsiString ) : PPyTypeObject; function ModuleByName( const aModuleName : AnsiString ) : PPyObject; function MethodsByName( const aMethodsContainer: string ) : PPyMethodDef; @@ -2362,6 +2363,20 @@ TPythonModule = class(TMethodsContainer) - When turning a Delphi instance into a Python object pointer, GetSelf will offset Self from B to A. - Properties ob_refcnt and ob_type will call GetSelf to access their data. + + Further Notes: + - PyObject instances are not created directly, but via their python type + See TPythonType.CreateInstance and TPythonType.NewSubtypeInst (tp_new + slot). In the second case TPy_Object.NewInstance is not called and + the size of the memory is determined by the tp_basicsize slot. + - Their memory can be allocated either by pascal or python. PythonAlloc + keeps track of how the PyObject memory was allocated. + - PyObject instances are not destroyed directly, but by PyObjectDestructor + when their reference count goes down to zero (tp_dealloc slot) + - The value of PythonAlloc determines how the memory is freed + using either PyObject_Free (tp_free slot) or in the overwritten + FreeInstance. + - This class is heart of the P4D library. Pure magic!! } // The base class of all new Python types TPyObject = class @@ -2767,7 +2782,6 @@ function PythonOK : Boolean; function PythonToDelphi( obj : PPyObject ) : TPyObject; function IsDelphiObject( obj : PPyObject ) : Boolean; procedure PyObjectDestructor( pSelf : PPyObject); cdecl; -procedure FreeSubtypeInst(ob:PPyObject); cdecl; procedure Register; function PyType_HasFeature(AType : PPyTypeObject; AFlag : Integer) : Boolean; function SysVersionFromDLLName(const DLLFileName : string): string; @@ -6139,6 +6153,19 @@ function TPythonEngine.FindPythonType(const TypeName: AnsiString): TPythonType; end; end; +function TPythonEngine.FindPythonType(PyType: PPyTypeObject): TPythonType; +var + I : Integer; +begin + Result := nil; + for I := 0 to ClientCount - 1 do + if (Clients[I] is TPythonType) and (TPythonType(Clients[I]).TheTypePtr = PyType) then + begin + Result := TPythonType(Clients[I]); + Break; + end; +end; + function TPythonEngine.FindFunction(const ModuleName,FuncName: AnsiString): PPyObject; var module,func: PPyObject; @@ -8178,6 +8205,9 @@ function TPythonType.NewSubtypeInst( aType: PPyTypeObject; args, kwds : PPyObje var obj : TPyObject; begin + // Allocate memory in the python heap for both the pascal and the python + // PyObject (see tp_basicsize in SetPyObjectClass) + // nitems = 0 because PyType_GenericAlloc adds +1 Result := aType^.tp_alloc(aType, 0); if Assigned(Result) then begin @@ -8191,21 +8221,11 @@ function TPythonType.NewSubtypeInst( aType: PPyTypeObject; args, kwds : PPyObje begin Engine.Py_DECREF(Result); Result := nil; + obj.Free; end; end; end; -function TPythonType_AllocSubtypeInst( pSelf: PPyTypeObject; nitems : NativeInt) : PPyObject; cdecl; -begin - Result := GetPythonEngine.PyType_GenericAlloc(pSelf, nitems); -end; - -procedure FreeSubtypeInst(ob:PPyObject); -begin - GetPythonEngine.PyObject_Free(ob); -end; - - // Number services function TPythonType_NbAdd( pSelf, obj : PPyObject) : PPyObject; cdecl; @@ -8484,9 +8504,9 @@ procedure TPythonType.InitServices; if tpfBaseType in TypeFlags then begin tp_init := TPythonType_InitSubtype; - tp_alloc := TPythonType_AllocSubtypeInst; + tp_alloc := FEngine.PyType_GenericAlloc; tp_new := GetCallBack( Self, @TPythonType.NewSubtypeInst, 3, DEFAULT_CALLBACK_TYPE); - tp_free := FreeSubtypeInst; + tp_free := FEngine.PyObject_Free; tp_methods := MethodsData; tp_members := MembersData; tp_getset := GetSetData; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index c4abe532..fa2337b3 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -569,10 +569,17 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) function SqContains( obj: PPyObject): integer; override; function SqAssItem( idx : NativeInt; obj : PPyObject) : Integer; override; + // CreateWith should be overwritten when a constuctor with + // parameters is needed. It should raise a python exception class function DelphiObjectClass : TClass; virtual; class procedure RegisterMethods( PythonType : TPythonType ); override; class procedure RegisterGetSets( PythonType : TPythonType ); override; class procedure SetupType( PythonType : TPythonType ); override; + {$IFDEF EXTENDED_RTTI} + class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedMethodNames: TArray = []); + {$ENDIF EXTENDED_RTTI} // if the class is a container (TStrings, TComponent, TCollection...), // then return the class implementing the access to the contained items. class function GetContainerAccessClass : TContainerAccessClass; virtual; @@ -588,16 +595,34 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) TPyDelphiObjectClass = class of TPyDelphiObject; - { Generic wrapper for pascal classes + { + Generic wrapper for pascal classes + Can be used from unit wrappers as follows: APyDelphiWrapper.RegisterDelphiWrapper(TPyClassWrapper); or at runtime (e.g. inside the FormCreate handler: - PyDelphiWrapper1.RegisterDelphiWrapper(TPyClassWrapper).Initialize;} - TPyClassWrapper = class(TPyDelphiObject) + PyDelphiWrapper1.RegisterDelphiWrapper(TPyClassWrapper).Initialize; + + if you want your class to capable of being instantiated from python then do: + + TTestWrapper = class(TPyClassWrapper) + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); overload; override; + end; + + constuctor TTestWrapper.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); + begin + Create(APythonType); + DelphiObject := TTest.Create; + end; + + PyDelphiWrapper1.RegisterDelphiWrapper(TTestWrapper).Initialize; + } + TPyClassWrapper = class(TPyDelphiObject) function GetDelphiObject: T; procedure SetDelphiObject(const Value: T); public class function DelphiObjectClass : TClass; override; + class procedure RegisterMethods( PythonType : TPythonType ); override; // Properties property DelphiObject: T read GetDelphiObject write SetDelphiObject; end; @@ -823,6 +848,8 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) fHelperClassRegister : TStringList; // Stores Created Event Handlers fEventHandlerList : TEventHandlers; + // Stores created exposed class members + fExposedMembers: TObjectList; fVarParamType: TPythonType; {$IFNDEF FPC} fDelphiMethodType: TPythonType; @@ -886,6 +913,55 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) property Module : TPythonModule read FModule write SetModule; end; +{$IFDEF EXTENDED_RTTI} + TAbstractExposedMember = class abstract + protected + FName: AnsiString; + FDocString: AnsiString; + FPyDelphiWrapper: TPyDelphiWrapper; + FPythonType: TPythonType; + FParentRtti: TRttiStructuredType; + function GetDocString(): string; virtual; abstract; + public + constructor Create(const AName: string; + APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; + AParentRtti: TRttiStructuredType); + property DocString: AnsiString read FDocString write FDocString; + property Name: AnsiString read FName; + end; + + TExposedMethod = class(TAbstractExposedMember) + private + FRttiMethod: TRttiMethod; + FCallback: Pointer; + protected + function GetDocString(): string; override; + public + constructor Create(APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; + AParentRtti: TRttiStructuredType; ARttiMethod: TRttiMethod); + destructor Destroy; override; + function MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; cdecl; + property Callback: Pointer read FCallback; + class function MethodDocStr(ARttiMethod: TRttiMethod): string; + end; + + // Documentation hook inerface + // Implement to customize the creation of docstrings for exposed class members + IDocServer = interface + ['{4AF0D319-47E9-4F0A-9C71-97B8CBB559FF}'] + function ReadTypeDocStr(const ATypeInfo: PTypeInfo; + out ADocStr: string): boolean; + function ReadMemberDocStr(const AParent: PTypeInfo; + const AMember: TRttiMember; out ADocStr: string): boolean; + procedure Initialize; + procedure Finalize; + function Initialized: Boolean; + end; + + var + PyDocServer: IDocServer = nil; +{$ENDIF} + { Singletons } function RegisteredUnits : TRegisteredUnits; function GlobalDelphiWrapper: TPyDelphiWrapper; @@ -918,7 +994,9 @@ implementation Uses Math, - RTLConsts; + StrUtils, + RTLConsts, + MethodCallback; resourcestring rs_ErrCheckIndex = '%s "%d" out of range'; @@ -947,6 +1025,7 @@ implementation rs_ExpectedObject = 'Expected a Pascal object'; rs_ExpectedRecord = 'Expected a Pascal record'; rs_ExpectedClass = 'Expected a Pascal class'; + rs_ExpectedNil = 'In static methods Self should be nil'; rs_ExpectedInterface = 'Expected a Pascal interface'; rs_InvalidClass = 'Invalid class'; rs_ErrEventNotReg = 'No Registered EventHandler for events of type "%s'; @@ -965,10 +1044,150 @@ implementation gRegisteredUnits : TRegisteredUnits; {$IFDEF EXTENDED_RTTI} - function RttiCall(ParentAddress: pointer; PythonType: TPythonType; - DelphiWrapper: TPyDelphiWrapper; MethName: string; - ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; - AParentAddrIsClass: boolean = false): PPyObject; forward; +function RttiCall(ParentAddress: pointer; PythonType: TPythonType; + DelphiWrapper: TPyDelphiWrapper; MethName: string; + ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; + AParentAddrIsClass: boolean = false): PPyObject; forward; + +function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; + out ClassRef: TClass; out ErrMsg: string): Boolean; forward; + +procedure InvalidArguments(const MethName, ErrMsg : string); +begin + with GetPythonEngine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_ErrInvalidArgs, + [MethName, ErrMsg]))); +end; + +{ TAbstractExposedMember } + +constructor TAbstractExposedMember.Create(const AName: string; + APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; + AParentRtti: TRttiStructuredType); +begin + inherited Create; + FName := AnsiString(AName); + FPyDelphiWrapper := APyDelphiWrapper; + FPythonType := APythonType; + FParentRtti := AParentRtti; + FDocString := UTF8Encode(GetDocString); +end; + + +{ TExposedMethod } + +constructor TExposedMethod. Create(APyDelphiWrapper: TPyDelphiWrapper; + APythonType: TPythonType; AParentRtti: TRttiStructuredType; + ARttiMethod: TRttiMethod); +var + Method: TDelphiMethodWithKW; +begin + FRttiMethod := ARttiMethod; + inherited Create(ARttiMethod.Name, APyDelphiWrapper, APythonType, AParentRtti); + Method := MethodWrapper; + FCallBack := GetOfObjectCallBack(TCallBack(Method), 3, DEFAULT_CALLBACK_TYPE); +end; + +destructor TExposedMethod.Destroy; +begin + DeleteCallback(FCallback); + inherited; +end; + +function TExposedMethod.GetDocString: string; +begin + Result := Format('', [ + FRttiMethod.Name, FParentRtti.Name, NativeInt(FRttiMethod.CodeAddress)]); +end; + +function TExposedMethod.MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; +var + ParentAddress: Pointer; + RefClass, ClassRef: TClass; + ErrMsg: string; +begin + if FRttiMethod.IsStatic then + begin + if ASelf <> nil then + begin + InvalidArguments(string(FName), rs_ExpectedNil); + Exit(nil); + end + else + ParentAddress := nil; + end + else if FRttiMethod.IsClassMethod then + begin + // Class methods can be called from both instances and class references + if IsDelphiObject(ASelf) then + ParentAddress := TPyDelphiObject(PythonToDelphi(ASelf)).DelphiObject.ClassType + else + begin + RefClass := (FRttiMethod.Parent as TRttiInstanceType).MetaclassType; + if ValidateClassRef(ASelf, RefClass, ClassRef, ErrMsg) then + ParentAddress := ClassRef + else + begin + InvalidArguments(string(FName), rs_ExpectedClass); + Exit(nil); + end; + end; + end + else + begin + if IsDelphiObject(ASelf) then + ParentAddress := TPyDelphiObject(PythonToDelphi(ASelf)).DelphiObject + else + begin + InvalidArguments(string(FName), rs_ExpectedObject); + Exit(nil); + end; + end; + + // TODO: Optimize out the method search in RttiCall, by passing the + // RttiMethod directly to an overload of Rtti, when the method + // is not overloaded + + Result := RttiCall( + ParentAddress, + FPythonType, + FPyDelphiWrapper, + string(FName), + FParentRtti, + Args, + Kwds, + FRttiMethod.IsStatic or FRttiMethod.IsClassMethod); +end; + +class function TExposedMethod.MethodDocStr(ARttiMethod: TRttiMethod): string; +const + METHOD_DOC_STR_PATTERN = '%s.%s(%s)'; +var + LArgsStr: string; + LRttiParameter: TRttiParameter; +begin + LArgsStr := ''; + for LRttiParameter in ARttiMethod.GetParameters do begin + if LArgsStr <> '' then + LArgsStr := LArgsStr + ', '; + + LArgsStr := LArgsStr + LRttiParameter.Name; + if Assigned(LRttiParameter.ParamType) then + LArgsStr := LArgsStr + ': ' + + LRttiParameter.ParamType.Name.Replace('T', '', []); + end; + + Result := Format(METHOD_DOC_STR_PATTERN, + [ARttiMethod.Parent.Name, ARttiMethod.Name, LArgsStr]); + + if Assigned(ARttiMethod.ReturnType) then + Result := Result + + ' -> ' + + ARttiMethod.ReturnType.Name.Replace('T', '', []); + + Result := Result + #10; +end; {$ENDIF EXTENDED_RTTI} function RegisteredUnits : TRegisteredUnits; @@ -1178,7 +1397,7 @@ function ValidateInterfaceProperty(PyValue: PPyObject; RttiType: TRttiInterfaceT ErrMsg := rs_ExpectedInterface; end; -function ValidateClassRef(PyValue: PPyObject; TypeInfo: PTypeInfo; +function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; out ClassRef: TClass; out ErrMsg: string): Boolean; var LTypeName: AnsiString; @@ -1200,14 +1419,18 @@ function ValidateClassRef(PyValue: PPyObject; TypeInfo: PTypeInfo; Exit; end; - LPythonType := GetPythonEngine.FindPythonType(LTypeName); + LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue)); + if not Assigned(LPythonType) then + // Try once more with the base type to catter for pascal classes + // subclassed in Python + LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue).tp_base); + if Assigned(LPythonType) then begin if Assigned(LPythonType) and LPythonType.PyObjectClass.InheritsFrom(TPyDelphiObject) then begin ClassRef := TPyDelphiObjectClass(LPythonType.PyObjectClass).DelphiObjectClass; - TypeInfo := GetTypeData(TypeInfo)^.InstanceType^; - if Assigned(TypeInfo) and (ClassRef.InheritsFrom(GetTypeData(TypeInfo)^.ClassType)) then + if ClassRef.InheritsFrom(RefClass) then Result := True else ErrMsg := rs_IncompatibleClasses; @@ -1911,6 +2134,17 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; AParentAddrIsClass: boolean): PPyObject; + { TODO: Handle methods with var parameters + procedures/functions with var parameters should return a tuple + e.g. + procedure Test(var Param: Integer) + use in python: + param = objref.Test(param) + + function Test(var Param: Integer): Integer + use in python: + res, param = objref.Test(param) } + function ParamAsDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue): Boolean; var Arr: array of TValue; @@ -1998,7 +2232,10 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; end else if (Param.ParamType.TypeKind = tkClassRef) then begin - if ValidateClassRef(PyValue, Param.ParamType.Handle, ClassRef, ErrMsg) then + if ValidateClassRef(PyValue, + (Param.ParamType as TRttiClassRefType).MetaclassType, + ClassRef, ErrMsg) + then Args[Index] := ClassRef else begin Result := nil; @@ -2032,14 +2269,6 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; end; end; - procedure InvalidArguments(const MethName, ErrMsg : string); - begin - with GetPythonEngine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidArgs, - [MethName, ErrMsg]))); - end; - Var Args: array of TValue; ArgCount: Integer; @@ -2622,7 +2851,7 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; {$IFDEF EXTENDED_RTTI} Context := TRttiContext.Create(); try - RttiType := Context.GetType(DelphiObject.ClassType); + RttiType := Context.GetType(DelphiObject.ClassType()); Rtti_Dir(SL, RttiType); finally Context.Free(); @@ -2713,15 +2942,12 @@ class procedure TPyDelphiObject.RegisterGetSets(PythonType: TPythonType); begin inherited; // then register TObject + custom getters/setters. - with PythonType do - begin - AddGetSet('ClassName', @TPyDelphiObject.Get_ClassName, nil, - 'Returns the TObject.ClassName', nil); - AddGetSet('__bound__', @TPyDelphiObject.Get_Bound, nil, - 'Returns True if the wrapper is still bound to the Delphi instance.', nil); - AddGetSet('__owned__', @TPyDelphiObject.Get_Owned, @TPyDelphiObject.Set_Owned, - 'Returns True if the wrapper owns the Delphi instance.', nil); - end; + PythonType.AddGetSet('ClassName', @TPyDelphiObject.Get_ClassName, nil, + 'Returns the TObject.ClassName', nil); + PythonType.AddGetSet('__bound__', @TPyDelphiObject.Get_Bound, nil, + 'Returns True if the wrapper is still bound to the Delphi instance.', nil); + PythonType.AddGetSet('__owned__', @TPyDelphiObject.Get_Owned, @TPyDelphiObject.Set_Owned, + 'Returns True if the wrapper owns the Delphi instance.', nil); end; class procedure TPyDelphiObject.RegisterMethods(PythonType: TPythonType); @@ -2733,9 +2959,11 @@ class procedure TPyDelphiObject.RegisterMethods(PythonType: TPythonType); PythonType.AddMethod('Free', @TPyDelphiObject.Free_Wrapper, 'TObject.Free()'#10 + 'Frees the Wrapped Delphi Object'); + {$IFNDEF EXTENDED_RTTI} PythonType.AddMethod('InheritsFrom', @TPyDelphiObject.InheritsFrom_Wrapper, 'TObject.InheritsFrom(ClassName)'#10 + 'Returns True if Delphi Object is or inherits from ClassName'); + {$ENDIF EXTENDED_RTTI} PythonType.AddMethod('ToTuple', @TPyDelphiObject.ToTuple_Wrapper, 'TStrings.ToTuple()'#10 + 'If the object is a container (TStrings, TComponent...), it returns the content of the sequence as a Python tuple object.'); @@ -2947,6 +3175,13 @@ function TPyDelphiObject.SetProps(args, keywords: PPyObject): PPyObject; class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); var _ContainerAccessClass : TContainerAccessClass; + PyWrapper: TPyDelphiWrapper; + NearestAncestorClass: TClass; + RegisteredClass: TRegisteredClass; + Index: Integer; + {$IFDEF EXTENDED_RTTI} + LDocStr: string; + {$ENDIF EXTENDED_RTTI} begin inherited; PythonType.TypeName := AnsiString(GetTypeName); @@ -2964,8 +3199,124 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); if _ContainerAccessClass.SupportsIndexOf then PythonType.Services.Sequence := PythonType.Services.Sequence + [ssContains]; end; + + // Find nearest registered ancestor class and set it as base + PyWrapper := PythonType.Owner as TPyDelphiWrapper; + NearestAncestorClass := nil; + for Index := PyWrapper.fClassRegister.Count - 1 downto 0 do + begin + RegisteredClass := PyWrapper.fClassRegister[Index] as TRegisteredClass; + if DelphiObjectClass.InheritsFrom(RegisteredClass.DelphiClass) then + begin + PythonType.BaseType := RegisteredClass.PythonType; + NearestAncestorClass := RegisteredClass.DelphiClass; + Break; + end; + end; + {$IFDEF EXTENDED_RTTI} + //Try to load the class doc string from doc server + if Assigned(PyDocServer) and PyDocServer.Initialized and + PyDocServer.ReadTypeDocStr(DelphiObjectClass.ClassInfo, LDocStr) + then + PythonType.DocString.Text := LDocStr; + + ExposeMethods(DelphiObjectClass, NearestAncestorClass, PythonType, + PyWrapper, ['Free', 'CPP_ABI_1', 'CPP_ABI_2', 'CPP_ABI_3']); + {$ENDIF EXTENDED_RTTI} end; +{$IFDEF EXTENDED_RTTI} +class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; + NearestAncestorClass: TClass; APythonType: TPythonType; + APyDelphiWrapper: TPyDelphiWrapper; + AExcludedMethodNames: TArray = []); +var + LRttiCtx: TRttiContext; + LRttiType: TRttiStructuredType; + LRttiMethod: TRttiMethod; + AddedMethods: TArray; + LExposedMethod: TExposedMethod; + LClass: TClass; + LDocStr: string; +begin + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; + + AddedMethods := []; + for LRttiMethod in LRttiType.GetMethods do begin + // Ignore methods with visibility lower than protected + if (Ord(LRttiMethod.Visibility) < Ord(TMemberVisibility.mvProtected)) then + Continue; + + // Ingnore destructors and operator overloads + if LRttiMethod.MethodKind in [mkDestructor, mkClassDestructor, mkOperatorOverload] then + Continue; + + // Ignore excluded methods + if MatchStr(LRttiMethod.Name, AExcludedMethodNames) then + Continue; + + // Ignore duplicate methods + if MatchStr(LRttiMethod.Name, AddedMethods) then + Continue; + + // Skip methods decleared in NearestAncestorClass and its ancestors + if (NearestAncestorClass <> nil) and ((AClass = NearestAncestorClass) or + not (AClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + + AddedMethods := AddedMethods + [LRttiMethod.Name]; + + // Create the exposed method + LExposedMethod := TExposedMethod.Create(APyDelphiWrapper, APythonType, + LRttiType, LRttiMethod); + + //Try to load the method doc string from doc server + if Assigned(PyDocServer) and PyDocServer.Initialized then + begin + LClass := DelphiObjectClass; + LDocStr := String.Empty; + while Assigned(LClass) and (LDocStr = '') do begin + if PyDocServer.ReadMemberDocStr( + LClass.ClassInfo, LRttiMethod, LDocStr) then + LExposedMethod.DocString := AnsiString(LDocStr); + LClass := LClass.ClassParent; + end; + end; + + //Build the DocStr including method args + LExposedMethod.DocString := + Utf8Encode(TExposedMethod.MethodDocStr(LRttiMethod)) + + LExposedMethod.DocString; + + // Keep it alive until the Wrapper is Finalized + APyDelphiWrapper.fExposedMembers.Add(LExposedMethod); + + //Adds the Python method + if LRttiMethod.IsStatic then + APythonType.AddStaticMethodWithKeywords( + PAnsiChar(LExposedMethod.Name), + LExposedMethod.Callback, + PAnsiChar(LExposedMethod.DocString)) + else if LRttiMethod.IsClassMethod then + APythonType.AddClassMethodWithKeywords( + PAnsiChar(LExposedMethod.Name), + LExposedMethod.Callback, + PAnsiChar(LExposedMethod.DocString)) + else + APythonType.AddMethodWithKeywords( + PAnsiChar(LExposedMethod.Name), + LExposedMethod.Callback, + PAnsiChar(LExposedMethod.DocString)); + end; + finally + LRttiCtx.Free; + end; +end; +{$ENDIF EXTENDED_RTTI} + function TPyDelphiObject.Set_Owned(AValue: PPyObject; AContext: Pointer): Integer; var @@ -3159,23 +3510,6 @@ function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; end; {$ENDIF} -{ TPyClassWrapper } - -class function TPyClassWrapper.DelphiObjectClass: TClass; -begin - Result := T; -end; - -function TPyClassWrapper.GetDelphiObject: T; -begin - Result := T(inherited DelphiObject) -end; - -procedure TPyClassWrapper.SetDelphiObject(const Value: T); -begin - inherited DelphiObject := Value; -end; - { TPyDelphiMethodObject } function TPyDelphiMethodObject.Repr: PPyObject; @@ -3204,6 +3538,29 @@ class procedure TPyDelphiMethodObject.SetupType( PythonType : TPythonType ); {$ENDIF} + +{ TPyClassWrapper } + +class function TPyClassWrapper.DelphiObjectClass: TClass; +begin + Result := T; +end; + +function TPyClassWrapper.GetDelphiObject: T; +begin + Result := T(inherited DelphiObject) +end; + +class procedure TPyClassWrapper.RegisterMethods(PythonType: TPythonType); +begin + // Do not call inherited; +end; + +procedure TPyClassWrapper.SetDelphiObject(const Value: T); +begin + inherited DelphiObject := Value; +end; + { TPyDelphiVarParameter } destructor TPyDelphiVarParameter.Destroy; @@ -3592,6 +3949,7 @@ constructor TPyDelphiWrapper.Create(AOwner: TComponent); fClassRegister := TObjectList.Create(True); fHelperClassRegister := TStringList.Create; fEventHandlerList := TEventHandlers.Create(Self); + fExposedMembers := TObjectList.Create(True); if not (csDesigning in ComponentState) then CreateWrappers; @@ -3697,6 +4055,8 @@ procedure TPyDelphiWrapper.CreateWrappers; fDefaultContainerType := RegisterHelperType(TPyDelphiContainer); fVarParamType := RegisterHelperType(TPyDelphiVarParameter); {$IFDEF EXTENDED_RTTI} + if Assigned(PyDocServer) then + PyDocServer.Initialize; fRecordType := RegisterHelperType(TPyPascalRecord); fInterfaceType := RegisterHelperType(TPyPascalInterface); {$ENDIF} @@ -3710,6 +4070,10 @@ procedure TPyDelphiWrapper.CreateWrappers; // Register wrappers for each Delphi unit for i := 0 to RegisteredUnits.Count-1 do RegisteredUnits[i].RegisterWrappers(Self); +{$IFDEF EXTENDED_RTTI} + if Assigned(PyDocServer) then + PyDocServer.Finalize; +{$ENDIF} end; procedure TPyDelphiWrapper.DefineVar(const AName: string; const AValue: Variant); @@ -3735,6 +4099,7 @@ procedure TPyDelphiWrapper.DefineVar(const AName: string; AValue: TObject); destructor TPyDelphiWrapper.Destroy; begin + if Initialized then Finalize; UnsubscribeFreeNotifications; // note that those pointers MUST be set to nil, otherwise it will crash // when calling inherited, as we have overridden SetEngine that tries to @@ -3742,6 +4107,7 @@ destructor TPyDelphiWrapper.Destroy; FreeAndNil(fClassRegister); FreeAndNil(fHelperClassRegister); FreeAndNil(fEventHandlerList); + FreeAndNil(fExposedMembers); Module := nil; //No need to free PythonType objects since they are owned; @@ -3754,6 +4120,7 @@ procedure TPyDelphiWrapper.Finalize; UnsubscribeFreeNotifications; if Assigned(fEventHandlerList) then fEventHandlerList.Clear; + fExposedMembers.Clear; end; function TPyDelphiWrapper.GetHelperType(const TypeName: string): TPythonType; @@ -3828,7 +4195,6 @@ function TPyDelphiWrapper.RegisterDelphiWrapper( AWrapperClass: TPyDelphiObjectClass): TPythonType; var RegisteredClass : TRegisteredClass; - Index: Integer; begin Assert(Assigned(AWrapperClass)); @@ -3838,15 +4204,6 @@ function TPyDelphiWrapper.RegisterDelphiWrapper( RegisteredClass.PythonType.Engine := Engine; RegisteredClass.PythonType.Module := fModule; RegisteredClass.PythonType.PyObjectClass := AWrapperClass; - // Find nearest registered parent class and set it as base - for Index := fClassRegister.Count - 1 downto 0 do - with TRegisteredClass(fClassRegister[Index]) do - if RegisteredClass.DelphiClass.InheritsFrom(DelphiClass) then - begin - RegisteredClass.PythonType.BaseType := PythonType; - Break; - end; - fClassRegister.Add(RegisteredClass); Result := RegisteredClass.PythonType; diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 62148a58..ee6dffa7 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -61,6 +61,11 @@ TTestRttiAccess = class function SetStringField(const Value: string): string; overload; procedure PassVariantArray(const Value: Variant); function ClassRefParam(ClassRef: TPersistentClass): string; + class function DoubleString(S: string): string; + class function Square(I: Integer): Integer; static; + end; + + TTestSubclass = class(TTestRttiAccess) end; TTestInterfaceImpl = class(TInterfacedObject, ITestInterface) @@ -129,6 +134,10 @@ TTestWrapDelphi = class(TObject) procedure TestClassRefParam; [Test] procedure TestInheritance; + [Test] + procedure TestClassMethods; + [Test] + procedure TestStaticMethods; end; implementation @@ -190,6 +199,11 @@ procedure TTestWrapDelphi.SetupFixture; PyDelphiWrapper.Module := DelphiModule; PythonEngine.LoadDll; + + // Register TTestRTTIAccess and TTestSubclass and initialize + PyDelphiWrapper.RegisterDelphiWrapper(TPyClassWrapper).Initialize; + PyDelphiWrapper.RegisterDelphiWrapper(TPyClassWrapper).Initialize; + // Then wrap the an instance our TTestRTTIAccess // It will allow us to to test access to public fields and methods as well // public (as well as published) properties. @@ -207,7 +221,7 @@ procedure TTestWrapDelphi.SetupFixture; Py := PyDelphiWrapper.WrapInterface(TValue.From(FTestInterface)); DelphiModule.SetVar('rtti_interface', Py); PythonEngine.Py_DecRef(Py); - PythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface, Object, Persistent, Collection, Strings'); + PythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface, Object, Persistent, Collection, Strings, TestRttiAccess, TestSubclass'); Rtti_Var := MainModule.rtti_var; Rtti_Rec := MainModule.rtti_rec; Rtti_Interface := MainModule.rtti_interface; @@ -224,6 +238,16 @@ procedure TTestWrapDelphi.TearDownFixture; TestRttiAccess.Free; end; +procedure TTestWrapDelphi.TestClassMethods; +begin + // calling from a class + Assert.AreEqual(MainModule.TestRttiAccess.DoubleString('A'), 'AA'); + // calling from an instance + Assert.AreEqual(Rtti_Var.DoubleString('A'), 'AA'); + // calling from a subclass + Assert.AreEqual(MainModule.TestSubclass.DoubleString('B'), 'BB'); +end; + procedure TTestWrapDelphi.TestClassRefParam; begin Assert.AreEqual(Rtti_Var.ClassRefParam(MainModule.Collection), 'TCollection'); @@ -420,6 +444,16 @@ procedure TTestWrapDelphi.TestSetProps; Assert.AreEqual(TestRttiAccess.DoubleField, 1.234); end; +procedure TTestWrapDelphi.TestStaticMethods; +begin + // calling from a class + Assert.AreEqual(MainModule.TestRttiAccess.Square(2), 4); + // calling from an instance + Assert.AreEqual(Rtti_Var.Square(4), 16); + // calling from a subclass + Assert.AreEqual(MainModule.TestSubclass.Square(5), 25); +end; + procedure TTestWrapDelphi.TestStringField; begin TestRttiAccess.StringField := 'Hi'; @@ -463,6 +497,11 @@ function TTestRttiAccess.SetStringField(const Value: string): string; Result := StringField; end; +class function TTestRttiAccess.Square(I: Integer): Integer; +begin + Result := I * I; +end; + function TTestRttiAccess.SetStringField(var Value: Integer): string; begin StringField := IntToStr(Value); @@ -474,6 +513,11 @@ function TTestRttiAccess.ClassRefParam(ClassRef: TPersistentClass): string; Result := ClassRef.ClassName; end; +class function TTestRttiAccess.DoubleString(S: string): string; +begin + Result := S + S; +end; + function TTestRttiAccess.GetData: TObject; begin Result := TStringList.Create; From e22e60d9559064bc30dcfd58651ead234ca55c20 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 3 Oct 2023 20:05:30 +0300 Subject: [PATCH 056/174] Do not expose constructors. Class instantiation should be handled by CreateWith (pythonic way). CreateWith should take account of multiple constructors. --- Source/WrapDelphi.pas | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index fa2337b3..1916b232 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3249,8 +3249,10 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; if (Ord(LRttiMethod.Visibility) < Ord(TMemberVisibility.mvProtected)) then Continue; - // Ingnore destructors and operator overloads - if LRttiMethod.MethodKind in [mkDestructor, mkClassDestructor, mkOperatorOverload] then + // Ingnore constructors, destructors and operator overloads + if LRttiMethod.MethodKind in [mkConstructor, mkDestructor, + mkClassConstructor, mkClassDestructor, mkOperatorOverload] + then Continue; // Ignore excluded methods From fa65e383dcba8091419a745b02e4b37aa636fdbd Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 3 Oct 2023 20:21:39 +0300 Subject: [PATCH 057/174] Fix NearestAncestorClass handling in ExposeMethods. --- Source/WrapDelphi.pas | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 1916b232..965a70aa 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3264,8 +3264,9 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; Continue; // Skip methods decleared in NearestAncestorClass and its ancestors - if (NearestAncestorClass <> nil) and ((AClass = NearestAncestorClass) or - not (AClass.InheritsFrom(NearestAncestorClass))) + LClass := (LRttiMethod.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) then Continue; From a1ae2f4e82bf589d98fe28871ebff4460dee7a44 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 4 Oct 2023 04:29:50 +0300 Subject: [PATCH 058/174] Partial backport from the Embarcadero fork. --- Packages/Delphi/Delphi 10.4+/Python.dpk | 4 +- Packages/Delphi/Delphi 10.4+/Python.dproj | 1 + Packages/Delphi/Delphi 10.4+/PythonFmx.dpk | 3 +- Packages/Delphi/Delphi 10.4+/PythonVcl.dpk | 3 +- Packages/Delphi/Delphi 10.4+/PythonVcl.dproj | 1 + Source/WrapDelphi.pas | 215 +- Source/WrapDelphiImageList.pas | 78 + Source/fmx/WrapDelphiFmx.pas | 1 + Source/fmx/WrapFmxActnList.pas | 1 + Source/fmx/WrapFmxColors.pas | 2 + Source/fmx/WrapFmxDataBind.pas | 2 + Source/fmx/WrapFmxDateTime.pas | 2 + Source/fmx/WrapFmxDialogs.pas | 1 - Source/fmx/WrapFmxEdit.pas | 1 - Source/fmx/WrapFmxGrids.pas | 2 + Source/fmx/WrapFmxImgList.pas | 276 ++ Source/fmx/WrapFmxListView.pas | 2 + Source/fmx/WrapFmxMedia.pas | 1 + Source/fmx/WrapFmxMemo.pas | 2 + Source/fmx/WrapFmxScrollBox.pas | 2 + Source/fmx/WrapFmxStdActns.pas | 1 + Source/fmx/WrapFmxStyles.pas | 1 + Source/fmx/WrapFmxTypes.pas | 1 + Source/vcl/WrapDelphiVCL.pas | 1 + Source/vcl/WrapVclComCtrls.pas | 3808 +++++++++++++++--- Source/vcl/WrapVclControls.pas | 176 +- Source/vcl/WrapVclDialogs.pas | 6 +- Source/vcl/WrapVclForms.pas | 2 +- Source/vcl/WrapVclGraphics.pas | 21 + Source/vcl/WrapVclImgList.pas | 78 + Source/vcl/WrapVclMedia.pas | 1 + Source/vcl/WrapVclThemes.pas | 1 + Source/vcl/WrapVclWinXCtrls.pas | 1 + 33 files changed, 4123 insertions(+), 575 deletions(-) create mode 100644 Source/WrapDelphiImageList.pas create mode 100644 Source/fmx/WrapFmxImgList.pas create mode 100644 Source/vcl/WrapVclImgList.pas diff --git a/Packages/Delphi/Delphi 10.4+/Python.dpk b/Packages/Delphi/Delphi 10.4+/Python.dpk index b27c7bb2..8d6d2b03 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dpk +++ b/Packages/Delphi/Delphi 10.4+/Python.dpk @@ -1,4 +1,5 @@ package Python; + {$R *.res} {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} @@ -48,6 +49,7 @@ contains WrapDelphiWindows in '..\..\..\Source\WrapDelphiWindows.pas', WrapFireDAC in '..\..\..\Source\WrapFireDAC.pas', WrapActions in '..\..\..\Source\WrapActions.pas', - WrapDelphiDataBind in '..\..\..\Source\WrapDelphiDataBind.pas'; + WrapDelphiDataBind in '..\..\..\Source\WrapDelphiDataBind.pas', + WrapDelphiImageList in '..\..\..\Source\WrapDelphiImageList.pas'; end. diff --git a/Packages/Delphi/Delphi 10.4+/Python.dproj b/Packages/Delphi/Delphi 10.4+/Python.dproj index 689ea6e5..3760d219 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dproj +++ b/Packages/Delphi/Delphi 10.4+/Python.dproj @@ -177,6 +177,7 @@ + Base diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk index 8167888e..6b302342 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dpk @@ -59,6 +59,7 @@ contains WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas', WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas', WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas', - WrapFmxDateTime in '..\..\..\Source\fmx\WrapFmxDateTime.pas'; + WrapFmxDateTime in '..\..\..\Source\fmx\WrapFmxDateTime.pas', + WrapFmxImgList in '..\..\..\Source\fmx\WrapFmxImgList.pas'; end. diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk b/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk index bc68ac72..a3bbc930 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dpk @@ -55,6 +55,7 @@ contains WrapVclStdCtrls in '..\..\..\Source\vcl\WrapVclStdCtrls.pas', WrapVclWinXCtrls in '..\..\..\Source\vcl\WrapVclWinXCtrls.pas', WrapVclThemes in '..\..\..\Source\vcl\WrapVclThemes.pas', - WrapVclMedia in '..\..\..\Source\vcl\WrapVclMedia.pas'; + WrapVclMedia in '..\..\..\Source\vcl\WrapVclMedia.pas', + WrapVclImgList in '..\..\..\Source\vcl\WrapVclImgList.pas'; end. diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj index 5e059dc0..3f40f175 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj @@ -118,6 +118,7 @@ + Base diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 965a70aa..c085e037 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -656,9 +656,10 @@ TPyDelphiVarParameter = class(TPyObject) { Base class for exposing Records and Interfaces when Extended RTTI is available } TPyRttiObject = class (TPyObject) private - fAddr: Pointer; - fRttiType: TRttiStructuredType; - function GetValue: TValue; virtual; abstract; + fCopy: TValue; + fAddr: Pointer; + fRttiType: TRttiStructuredType; + function GetValue: TValue; virtual; abstract; protected // Exposed Methods function SetProps(args, keywords : PPyObject) : PPyObject; cdecl; @@ -667,10 +668,11 @@ TPyRttiObject = class (TPyObject) PyDelphiWrapper : TPyDelphiWrapper; constructor Create( APythonType : TPythonType ); override; procedure SetAddrAndType(Address: Pointer; Typ: TRttiStructuredType); + procedure SetValueAndType(const AValue: TValue; + const ACopy: Boolean = false); function GetAttrO( key: PPyObject) : PPyObject; override; function SetAttrO( key, value: PPyObject) : Integer; override; - function Repr : PPyObject; override; property Addr: Pointer read fAddr; property RttiType: TRttiStructuredType read fRttiType; property Value: TValue read GetValue; @@ -683,6 +685,7 @@ TPyPascalRecord = class(TPyRttiObject) private function GetValue: TValue; override; public + function Repr : PPyObject; override; class procedure SetupType( PythonType : TPythonType ); override; end; @@ -690,6 +693,7 @@ TPyPascalInterface = class(TPyRttiObject) private function GetValue: TValue; override; public + function Repr : PPyObject; override; class procedure SetupType( PythonType : TPythonType ); override; end; {$ENDIF} @@ -884,6 +888,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) procedure Finalize; override; procedure DefineVar(const AName : string; const AValue : Variant); overload; procedure DefineVar(const AName : string; AValue : TObject); overload; + procedure DefineVar(const AName : string; AValue : TClass); overload; function RegisterDelphiWrapper(AWrapperClass : TPyDelphiObjectClass): TPythonType; function RegisterHelperType(APyObjectClass : TPyObjectClass) : TPythonType; function RegisterFunction(AFuncName : PAnsiChar; AFunc : PyCFunction; ADocString : PAnsiChar ): PPyMethodDef; overload; @@ -894,11 +899,16 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) function WrapClass(AClass: TClass): PPyObject; {$IFDEF EXTENDED_RTTI} // Function that provides a Python object wrapping a record - function WrapRecord(Address: Pointer; Typ: TRttiStructuredType): PPyObject; + function WrapRecord(Address: Pointer; Typ: TRttiStructuredType): PPyObject; overload; + function WrapRecord(const AValue: TValue; const ACopy: Boolean = false): PPyObject; overload; // Function that provides a Python object wrapping an interface // Note the the interface must be compiled in {$M+} mode and have a guid // Usage: WrapInterface(TValue.From(YourInterfaceReference)) - function WrapInterface(const IValue: TValue): PPyObject; + // Warning: WrapInterface represents a weak (uncounted) reference! + // Use ACopy = True to retrieve a normal counted reference + // that will keep the interface alive as long as python has a + // reference to it. + function WrapInterface(const IValue: TValue; const ACopy: Boolean = False): PPyObject; {$ENDIF} // properties property EventHandlers : TEventHandlers read fEventHandlerList; @@ -980,6 +990,7 @@ TExposedMethod = class(TAbstractExposedMember) function CheckEnum(const AEnumName : string; AValue, AMinValue, AMaxValue : Integer) : Boolean; function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; const AValue : Variant) : PPyObject; overload; function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; AObject: TObject) : PPyObject; overload; + function CreateVarParam(PyDelphiWrapper: TPyDelphiWrapper; AClass: TClass): PPyObject; overload; function SetToPython(ATypeInfo: PTypeInfo; AValue : Integer) : PPyObject; overload; function SetToPython(APropInfo: PPropInfo; AValue : Integer) : PPyObject; overload; function SetToPython(AInstance: TObject; APropInfo: PPropInfo) : PPyObject; overload; @@ -1264,7 +1275,7 @@ function SimpleValueToPython(const Value: TValue; out ErrMsg: string): PPyObject tkArray, tkDynArray: Result := DynArrayToPython(Value); tkClass, tkMethod, - tkRecord, tkInterface, + tkRecord, tkInterface, {$IFDEF MANAGED_RECORD} tkMRecord,{$ENDIF} tkClassRef, tkPointer, tkProcedure: ErrMsg := rs_ErrValueToPython; else @@ -1330,7 +1341,7 @@ function SimplePythonToValue(PyValue: PPyObject; TypeInfo: PTypeInfo; Result := True; end; tkClass, tkMethod, tkArray, - tkRecord, tkInterface, + tkRecord, tkInterface,{$IFDEF MANAGED_RECORD} tkMRecord,{$ENDIF} tkClassRef, tkPointer, tkProcedure: ErrMsg := rs_ErrPythonToValue; else @@ -1625,6 +1636,16 @@ function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; AObject: TObject) : GetPythonEngine.Py_DECREF(tmp); end; +function CreateVarParam(PyDelphiWrapper: TPyDelphiWrapper; AClass: TClass): PPyObject; overload; +var + LTmp: PPyObject; +begin + Result := PyDelphiWrapper.VarParamType.CreateInstance; + LTmp := PyDelphiWrapper.WrapClass(AClass); + (PythonToDelphi(Result) as TPyDelphiVarParameter).Value := LTmp; + GetPythonEngine.Py_DECREF(LTmp); +end; + function SupportsFreeNotification(AObject : TObject) : Boolean; var _FreeNotification : IFreeNotification; @@ -2242,6 +2263,22 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; Break end end + else if Param.ParamType.TypeKind = tkInterface then + begin + if not ValidateInterfaceProperty(PyValue, Param.ParamType as TRttiInterfaceType, Args[Index], ErrMsg) then + begin + Result := nil; + Break + end + end + else if Param.ParamType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then + begin + if not ValidateRecordProperty(PyValue, Param.ParamType.Handle, Args[Index], ErrMsg) then + begin + Result := nil; + Break + end + end else if (Param.ParamType.TypeKind = tkDynArray) and PythonType.Engine.PyList_Check(PyValue) then begin if ParamAsDynArray(PyValue, Param, Args[Index]) then @@ -2312,6 +2349,10 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; Result := DelphiWrapper.Wrap(ret.AsObject) else if ret.Kind = tkClassRef then Result := DelphiWrapper.WrapClass(ret.AsClass) + else if ret.Kind = tkInterface then + Result := DelphiWrapper.WrapInterface(ret, True) + else if ret.Kind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then + Result := DelphiWrapper.WrapRecord(ret, True) else begin Result := SimpleValueToPython(ret, ErrMsg); if Result = nil then @@ -2365,8 +2406,15 @@ function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; case Prop.PropertyType.TypeKind of tkClass: Result := PyDelphiWrapper.Wrap(Prop.GetValue(ParentAddr).AsObject); + tkClassRef: + Result := PyDelphiWrapper.WrapClass(Prop.GetValue(ParentAddr).AsClass); tkInterface: - Result := PyDelphiWrapper.WrapInterface(Prop.GetValue(ParentAddr)); + // Must be a copy, otherwise reference counting fails and the returned + // interface might be freed while python is holding a reference to it + Result := PyDelphiWrapper.WrapInterface(Prop.GetValue(ParentAddr), True); + tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: + // Must be a copy, property getters are not allowed to leak access to underlying storage + Result := PyDelphiWrapper.WrapRecord(Prop.GetValue(ParentAddr), True); tkMethod: if (ParentType is TRttiInstanceType) and (Prop is TRttiInstanceProperty) then Result := PyDelphiWrapper.fEventHandlerList.GetCallable(TObject(ParentAddr), @@ -2388,12 +2436,18 @@ function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; case Field.FieldType.TypeKind of tkClass: Result := PyDelphiWrapper.Wrap(Field.GetValue(ParentAddr).AsObject); // Returns None if Field is nil + tkClassRef: + Result := PyDelphiWrapper.WrapClass(Field.GetValue(ParentAddr).AsClass); // Returns None if Field is nil tkInterface: - Result := PyDelphiWrapper.WrapInterface(Field.GetValue(ParentAddr)); + Result := PyDelphiWrapper.WrapInterface(Field.GetValue(ParentAddr), True); tkRecord: if Field.FieldType is TRttiStructuredType then - //Result := PyDelphiWrapper.WrapRecord(Pointer(PPByte(ParentAddr)^ + Field.Offset), TRttiStructuredType(Field.FieldType)); - Result := PyDelphiWrapper.WrapRecord(PByte(ParentAddr) + Field.Offset, TRttiStructuredType(Field.FieldType)); + //Potentially dangerous as the returned value, which is a pointer into the object, + //could be stored on the python side, then the object freed, and the stored pointer later + //used to access no longer allocated memory + //But I can't see any good alternative if Python should be able to write directly into + //fields of a record that's part of an object. + Result := PyDelphiWrapper.WrapRecord(PByte(ParentAddr) + Field.Offset, TRttiStructuredType(Field.FieldType)); else Result := SimpleValueToPython(Field.GetValue(ParentAddr), ErrMsg) end; @@ -2418,6 +2472,7 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType Field: TRttiField; V: TValue; Obj: TObject; + Cls: TClass; ValueOut: TValue; begin Result := False; @@ -2438,12 +2493,20 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType Prop.SetValue(ParentAddr, Obj); Result := True; end; + tkClassRef: + if ValidateClassRef(Value, + (Prop.PropertyType as TRttiClassRefType).MetaclassType, + Cls, ErrMsg) then + begin + Prop.SetValue(ParentAddr, Cls); + Result := True; + end; tkInterface: if ValidateInterfaceProperty(Value, Prop.PropertyType as TRttiInterfaceType, ValueOut, ErrMsg) then begin Prop.SetValue(ParentAddr, ValueOut); Result := True; end; - tkRecord: + tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: if ValidateRecordProperty(Value, Prop.PropertyType.Handle, ValueOut, ErrMsg) then begin Prop.SetValue(ParentAddr, ValueOut); Result := True; @@ -2483,12 +2546,20 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType Field.SetValue(ParentAddr, Obj); Result := True; end; + tkClassRef: + if ValidateClassRef(Value, + (Field.FieldType as TRttiClassRefType).MetaclassType, + Cls, ErrMsg) then + begin + Field.SetValue(ParentAddr, Cls); + Result := True; + end; tkInterface: if ValidateInterfaceProperty(Value, Field.FieldType as TRttiInterfaceType, ValueOut, ErrMsg) then begin Field.SetValue(ParentAddr, ValueOut); Result := True; end; - tkRecord: + tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: if ValidateRecordProperty(Value, Field.FieldType.Handle, ValueOut, ErrMsg) then begin Field.SetValue(ParentAddr, ValueOut); Result := True; @@ -2569,13 +2640,6 @@ class procedure TPyRttiObject.RegisterMethods(PythonType: TPythonType); 'Returns the list of all methods, fields and properties of this instance.'); end; -function TPyRttiObject.Repr: PPyObject; -begin - Result := GetPythonEngine.PyUnicodeFromString( - Format('', - [RttiType.Name, NativeInt(Self)]) ) -end; - function TPyRttiObject.SetAttrO(key, value: PPyObject): Integer; var KeyName: string; @@ -2621,11 +2685,51 @@ procedure TPyRttiObject.SetAddrAndType(Address: Pointer; Typ: TRttiStructuredTyp fRttiType := Typ; end; +procedure TPyRttiObject.SetValueAndType(const AValue: TValue; + const ACopy: Boolean); +var + LRttiCtx: TRttiContext; + LRttiType: TRttiStructuredType; +begin + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(AValue.TypeInfo) as TRttiStructuredType; + finally + LRttiCtx.Free(); + end; + + if ACopy then + begin + FCopy := AValue; + if LRttiType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}] then + SetAddrAndType(FCopy.GetReferenceToRawData(), LRttiType) + else if LRttiType.TypeKind = tkInterface then + SetAddrAndType(Pointer(FCopy.GetReferenceToRawData()^), LRttiType) + end + else + begin + if LRttiType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}] then + SetAddrAndType(AValue.GetReferenceToRawData(), LRttiType) + else if LRttiType.TypeKind = tkInterface then + SetAddrAndType(Pointer(AValue.GetReferenceToRawData()^), LRttiType) + end; +end; + { TPyPascalRecord } function TPyPascalRecord.GetValue: TValue; begin - TValue.Make(fAddr, RttiType.Handle, Result); + if FCopy.IsEmpty then + TValue.Make(fAddr, RttiType.Handle, Result) + else + Result := FCopy; +end; + +function TPyPascalRecord.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString( + Format('', + [RttiType.Name, NativeInt(fAddr)]) ) end; class procedure TPyPascalRecord.SetupType(PythonType: TPythonType); @@ -2639,7 +2743,17 @@ class procedure TPyPascalRecord.SetupType(PythonType: TPythonType); function TPyPascalInterface.GetValue: TValue; begin - TValue.Make(@fAddr, RttiType.Handle, Result); + if FCopy.IsEmpty then + TValue.Make(@fAddr, RttiType.Handle, Result) + else + Result := FCopy; +end; + +function TPyPascalInterface.Repr: PPyObject; +begin + Result := GetPythonEngine.PyUnicodeFromString( + Format('', + [RttiType.Name, NativeInt(fAddr)]) ) end; class procedure TPyPascalInterface.SetupType(PythonType: TPythonType); @@ -4100,6 +4214,16 @@ procedure TPyDelphiWrapper.DefineVar(const AName: string; AValue: TObject); Engine.Py_DECREF(_obj); end; +procedure TPyDelphiWrapper.DefineVar(const AName: string; AValue: TClass); +var + LObj: PPyObject; +begin + Assert(Assigned(Module)); + LObj := WrapClass(AValue); + Module.SetVar(AnsiString(AName), LObj); + Engine.Py_DECREF(LObj); +end; + destructor TPyDelphiWrapper.Destroy; begin if Initialized then Finalize; @@ -4378,28 +4502,53 @@ function TPyDelphiWrapper.WrapRecord(Address: Pointer; Typ: TRttiStructuredType) end; end; -function TPyDelphiWrapper.WrapInterface(const IValue: TValue): PPyObject; +function TPyDelphiWrapper.WrapRecord(const AValue: TValue; const ACopy: Boolean): PPyObject; var - PythonType: TPythonType; - Address: Pointer; - Typ: TRttiStructuredType; + LPythonType: TPythonType; +begin + CheckEngine(); + + if AValue.IsEmpty then begin + Result := Engine.ReturnNone; + Exit; + end; + + LPythonType := GetHelperType('PascalRecordType'); + if not Assigned(LPythonType) or not (AValue.Kind in [tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}]) then + begin + Result := Engine.ReturnNone; + Exit; + end; + + Result := LPythonType.CreateInstance(); + with PythonToDelphi(Result) as TPyPascalRecord do begin + SetValueAndType(AValue, ACopy); + PyDelphiWrapper := Self; + end; +end; + +function TPyDelphiWrapper.WrapInterface(const IValue: TValue; + const ACopy: Boolean = False): PPyObject; +var + LPythonType: TPythonType; begin CheckEngine; + if IValue.IsEmpty then begin Result := Engine.ReturnNone; Exit; end; - PythonType := GetHelperType('PascalInterfaceType'); - if not Assigned(PythonType) or (IValue.Kind <> tkInterface) then + + LPythonType := GetHelperType('PascalInterfaceType'); + if not Assigned(LPythonType) or (IValue.Kind <> tkInterface) then begin Result := Engine.ReturnNone; Exit; end; - Result := PythonType.CreateInstance; - Typ := TRttiContext.Create.GetType(IValue.TypeInfo) as TRttiStructuredType; - Address := Pointer(IValue.GetReferenceToRawData^); + + Result := LPythonType.CreateInstance; with PythonToDelphi(Result) as TPyPascalInterface do begin - SetAddrAndType(Address, Typ); + SetValueAndType(IValue, ACopy); PyDelphiWrapper := Self; end; end; diff --git a/Source/WrapDelphiImageList.pas b/Source/WrapDelphiImageList.pas new file mode 100644 index 00000000..0017847c --- /dev/null +++ b/Source/WrapDelphiImageList.pas @@ -0,0 +1,78 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) +{$I Definition.Inc} + +unit WrapDelphiImageList; + +interface + +uses + System.Classes, System.SysUtils, System.ImageList, + PythonEngine, WrapDelphi, WrapDelphiClasses; + +type + TPyDelphiBaseImageList = class (TPyDelphiComponent) + private + function GetDelphiObject: TBaseImageList; + procedure SetDelphiObject(const Value: TBaseImageList); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TBaseImageList read GetDelphiObject write SetDelphiObject; + end; + +implementation + +{ Register the wrappers, the globals and the constants } +type + TImageListRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TImageListRegistration } + +function TImageListRegistration.Name: string; +begin + Result := 'ImageList'; +end; + +procedure TImageListRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBaseImageList); +end; + +{ TPyDelphiBaseImageList } + +class function TPyDelphiBaseImageList.DelphiObjectClass: TClass; +begin + Result := TBaseImageList; +end; + +function TPyDelphiBaseImageList.GetDelphiObject: TBaseImageList; +begin + Result := TBaseImageList(inherited DelphiObject); +end; + +procedure TPyDelphiBaseImageList.SetDelphiObject(const Value: TBaseImageList); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TImageListRegistration.Create()); + +end. diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index 1fd2cd29..0bcc5f45 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -28,6 +28,7 @@ implementation WrapFmxDataBind, {$ENDIF LINUX} WrapFmxTypes, + WrapFmxImgList, WrapFmxControls, WrapFmxStdCtrls, WrapFmxEdit, diff --git a/Source/fmx/WrapFmxActnList.pas b/Source/fmx/WrapFmxActnList.pas index bc7278b0..9ddc1f79 100644 --- a/Source/fmx/WrapFmxActnList.pas +++ b/Source/fmx/WrapFmxActnList.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapFmxActnList; interface diff --git a/Source/fmx/WrapFmxColors.pas b/Source/fmx/WrapFmxColors.pas index 6a2f90e7..8cc0144a 100644 --- a/Source/fmx/WrapFmxColors.pas +++ b/Source/fmx/WrapFmxColors.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxColors; interface diff --git a/Source/fmx/WrapFmxDataBind.pas b/Source/fmx/WrapFmxDataBind.pas index 6bc3b8b7..df4b9269 100644 --- a/Source/fmx/WrapFmxDataBind.pas +++ b/Source/fmx/WrapFmxDataBind.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxDataBind; interface diff --git a/Source/fmx/WrapFmxDateTime.pas b/Source/fmx/WrapFmxDateTime.pas index 7da8b56a..608ed834 100644 --- a/Source/fmx/WrapFmxDateTime.pas +++ b/Source/fmx/WrapFmxDateTime.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxDateTime; interface diff --git a/Source/fmx/WrapFmxDialogs.pas b/Source/fmx/WrapFmxDialogs.pas index 6a9b06be..382fa913 100644 --- a/Source/fmx/WrapFmxDialogs.pas +++ b/Source/fmx/WrapFmxDialogs.pas @@ -21,7 +21,6 @@ interface FMX.Dialogs, FMX.DialogService, WrapDelphi, WrapFmxTypes, PythonEngine; - type TPyDelphiOpenDialog = class(TPyDelphiFmxObject) private diff --git a/Source/fmx/WrapFmxEdit.pas b/Source/fmx/WrapFmxEdit.pas index ac9a11b0..4a7a027a 100644 --- a/Source/fmx/WrapFmxEdit.pas +++ b/Source/fmx/WrapFmxEdit.pas @@ -21,7 +21,6 @@ interface FMX.Edit, FMX.SearchBox, FMX.ComboEdit, FMX.EditBox, FMX.SpinBox, FMX.NumberBox, PythonEngine, WrapFmxTypes, WrapFmxControls; - type TPyDelphiCustomEdit = class(TPyDelphiPresentedControl) private diff --git a/Source/fmx/WrapFmxGrids.pas b/Source/fmx/WrapFmxGrids.pas index 85b680a8..d98775fa 100644 --- a/Source/fmx/WrapFmxGrids.pas +++ b/Source/fmx/WrapFmxGrids.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxGrids; interface diff --git a/Source/fmx/WrapFmxImgList.pas b/Source/fmx/WrapFmxImgList.pas new file mode 100644 index 00000000..12d39661 --- /dev/null +++ b/Source/fmx/WrapFmxImgList.pas @@ -0,0 +1,276 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + +{$I ..\Definition.Inc} + +unit WrapFmxImgList; + +interface + +uses + System.Classes, System.SysUtils, FMX.ImgList, + PythonEngine, WrapDelphi, WrapDelphiImageList; + +type + TPyDelphiCustomImageList = class (TPyDelphiBaseImageList) + private + function GetDelphiObject: TCustomImageList; + procedure SetDelphiObject(const Value: TCustomImageList); + protected + function BitmapItemByName_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + function BestSize_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + function AddOrSet_Wrapper(AArgs: PPyObject): PPyObject; cdecl; + public + class function DelphiObjectClass : TClass; override; + class procedure RegisterMethods(PythonType: TPythonType); override; + // Properties + property DelphiObject: TCustomImageList read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiImageList = class (TPyDelphiCustomImageList) + private + function GetDelphiObject: TImageList; + procedure SetDelphiObject(const Value: TImageList); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TImageList read GetDelphiObject write SetDelphiObject; + end; + +implementation + +uses + System.Types, + FMX.MultiResBitmap, + WrapDelphiTypes, + WrapFmxTypes, System.UITypes; + +{ Register the wrappers, the globals and the constants } +type + TFmxImageListRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TFmxImageListRegistration } + +function TFmxImageListRegistration.Name: string; +begin + Result := 'FmxImageList'; +end; + +procedure TFmxImageListRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomImageList); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageList); +end; + +{ TPyDelphiCustomImageList } + +function TPyDelphiCustomImageList.AddOrSet_Wrapper(AArgs: PPyObject): PPyObject; +var + LPySourceName: PPyObject; + LPyScales: PPyObject; + LPyFileNames: PPyObject; + + LSourceName: string; + LScales: array of single; + LFileNames: array of string; + LTransparentColor: integer; + LWidth: integer; + LHeight: integer; + I: integer; +begin + Adjust(@Self); + LTransparentColor := TColors.SysNone; + LWidth := 0; + LHeight := 0; + if GetPythonEngine().PyArg_ParseTuple(AArgs, 'OOO|iii:AddOrSet', + @LPySourceName, @LPyScales, @LPyFileNames, @LTransparentColor, @LWidth, @LHeight) <> 0 then + begin + if not CheckStrAttribute(LPySourceName, 'SourceName', LSourceName) then + Exit(nil); + + if not GetPythonEngine().PyList_Check(LPyScales) then + Exit(nil); + + if not GetPythonEngine().PyList_Check(LPyFileNames) then + Exit(nil); + + SetLength(LScales, PythonType.Engine.PyList_Size(LPyScales)); + for I := 0 to GetPythonEngine().PyList_Size(LPyScales) - 1 do + LScales[I] := GetPythonEngine().PyFloat_AsDouble( + GetPythonEngine().PyList_GetItem(LPyScales, I)); + + SetLength(LFileNames, PythonType.Engine.PyList_Size(LPyFileNames)); + for I := 0 to GetPythonEngine().PyList_Size(LPyFileNames) - 1 do + LFileNames[I] := GetPythonEngine.PyUnicodeAsString( + GetPythonEngine().PyList_GetItem(LPyFileNames, I)); + + Result := GetPythonEngine().PyLong_FromLong( + DelphiObject.AddOrSet(LSourceName, LScales, LFileNames, LTransparentColor, LWidth, LHeight)); + end else + Result := nil; +end; + +function TPyDelphiCustomImageList.BestSize_Wrapper(AArgs: PPyObject): PPyObject; + + procedure Append(const AList, AItem: PPyObject; const AIx: integer); + begin + with GetPythonEngine() do begin + PyTuple_SetItem(AList, AIx, AItem); + Py_XDecRef(AItem); + end; + end; + +var + LPySize: PPyObject; + LIndex: integer; + LSize: TSize; + LSizeF: TSizeF; +begin + //Signatures: + //function BestSize(const Index: Integer; var Size: TSize): Boolean; overload; + //function BestSize(const Index: Integer; var Size: TSizeF): Boolean; overload; + + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine().PyArg_ParseTuple(AArgs, 'iO:BestSize', @LIndex, @LPySize) <> 0 then begin + if (CheckSizeAttribute(LPySize, 'Size', LSize) or + (CheckSizeFAttribute(LPySize, 'Size', LSizeF))) then + begin + if not CheckIndex(LIndex, DelphiObject.Count) then + Exit(nil); + + Result := GetPythonEngine().PyTuple_New(2); + + if CheckSizeAttribute(LPySize, 'Size', LSize) then begin + Append(Result, GetPythonEngine().PyBool_FromLong( + Ord(DelphiObject.BestSize(LIndex, LSize))), 0); + Append(Result, WrapSize(PyDelphiWrapper, LSize), 1); + end + else + if CheckSizeFAttribute(LPySize, 'Size', LSizeF) then begin + Append(Result, GetPythonEngine().PyBool_FromLong( + Ord(DelphiObject.BestSize(LIndex, LSizeF))), 0); + Append(Result, WrapSizeF(PyDelphiWrapper, LSizeF), 1); + end; + end else + Result := nil; + end else + Result := nil; +end; + +function TPyDelphiCustomImageList.BitmapItemByName_Wrapper( + AArgs: PPyObject): PPyObject; + + procedure Append(const AList, AItem: PPyObject; const AIx: integer); + begin + with GetPythonEngine() do begin + PyTuple_SetItem(AList, AIx, AItem); + Py_XDecRef(AItem); + end; + end; + +var + LPyName: PPyObject; + LPyItem: PPyObject; + LPySize: PPyObject; + LName: string; + LItem: TCustomBitmapItem; + LSize: TSize; +begin + //Signature: + //function BitmapItemByName(const Name: string; var Item: TCustomBitmapItem; var Size: TSize): Boolean; + + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine().PyArg_ParseTuple(AArgs, 'OOO:BitmapItemByName', @LPyName, @LPyItem, @LPySize) <> 0 then begin + if CheckStrAttribute(LPyName, 'Name', LName) + and CheckObjAttribute(LPyItem, 'Item', TCustomBitmapItem, TObject(LItem)) + and CheckSizeAttribute(LPySize, 'Size', LSize) then + begin + Result := GetPythonEngine().PyTuple_New(3); + Append(Result, GetPythonEngine().PyBool_FromLong( + Ord(DelphiObject.BitmapItemByName(LName, LItem, LSize))), 0); + Append(Result, PyDelphiWrapper.Wrap(LItem), 1); + Append(Result, WrapSize(PyDelphiWrapper, LSize), 2); + end else + Result := nil; + end else + Result := nil; +end; + +class function TPyDelphiCustomImageList.DelphiObjectClass: TClass; +begin + Result := TCustomImageList; +end; + +function TPyDelphiCustomImageList.GetDelphiObject: TCustomImageList; +begin + Result := TCustomImageList(inherited DelphiObject); +end; + +class procedure TPyDelphiCustomImageList.RegisterMethods( + PythonType: TPythonType); +begin + inherited; + PythonType.AddMethod('BitmapItemByName', + @TPyDelphiCustomImageList.BitmapItemByName_Wrapper, + 'TCustomImageList.BitmapItemByName()'#10 + + 'Tries to find, in the source collection, the bitmap item specified by name.'); + + PythonType.AddMethod('BestSize', + @TPyDelphiCustomImageList.BestSize_Wrapper, + 'TCustomImageList.BestSize()'#10 + + 'Tries to find, in the source collection, the bitmap item specified by name. ' + + 'This method trying to determine the maximum size of layer, which less than input size. '+ + 'If TLayer.MultiResBitmap has multiple images for different scales, then the search is performed among all images.'); + + PythonType.AddMethod('AddOrSet', + @TPyDelphiCustomImageList.AddOrSet_Wrapper, + 'TCustomImageList.AddOrSet()'#10 + + 'Adds or replaces several files in the source collection, ' + + 'and adds the item to the destination collection if it does not exist.'); +end; + +procedure TPyDelphiCustomImageList.SetDelphiObject( + const Value: TCustomImageList); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiImageList } + +class function TPyDelphiImageList.DelphiObjectClass: TClass; +begin + Result := TImageList; +end; + +function TPyDelphiImageList.GetDelphiObject: TImageList; +begin + Result := TImageList(inherited DelphiObject); +end; + +procedure TPyDelphiImageList.SetDelphiObject(const Value: TImageList); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TFmxImageListRegistration.Create()); + +end. diff --git a/Source/fmx/WrapFmxListView.pas b/Source/fmx/WrapFmxListView.pas index 10270d4c..4994e411 100644 --- a/Source/fmx/WrapFmxListView.pas +++ b/Source/fmx/WrapFmxListView.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxListView; interface diff --git a/Source/fmx/WrapFmxMedia.pas b/Source/fmx/WrapFmxMedia.pas index 7b1d3fd2..92f7b02a 100644 --- a/Source/fmx/WrapFmxMedia.pas +++ b/Source/fmx/WrapFmxMedia.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapFmxMedia; interface diff --git a/Source/fmx/WrapFmxMemo.pas b/Source/fmx/WrapFmxMemo.pas index 462f383e..7a81b059 100644 --- a/Source/fmx/WrapFmxMemo.pas +++ b/Source/fmx/WrapFmxMemo.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxMemo; interface diff --git a/Source/fmx/WrapFmxScrollBox.pas b/Source/fmx/WrapFmxScrollBox.pas index bb46808e..6b63a287 100644 --- a/Source/fmx/WrapFmxScrollBox.pas +++ b/Source/fmx/WrapFmxScrollBox.pas @@ -11,6 +11,8 @@ (* LICENCE and Copyright: MIT (see project home) *) (**************************************************************************) +{$I ..\Definition.Inc} + unit WrapFmxScrollBox; interface diff --git a/Source/fmx/WrapFmxStdActns.pas b/Source/fmx/WrapFmxStdActns.pas index e28cea86..ef5025be 100644 --- a/Source/fmx/WrapFmxStdActns.pas +++ b/Source/fmx/WrapFmxStdActns.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapFmxStdActns; interface diff --git a/Source/fmx/WrapFmxStyles.pas b/Source/fmx/WrapFmxStyles.pas index 8bd2a761..1d814d18 100644 --- a/Source/fmx/WrapFmxStyles.pas +++ b/Source/fmx/WrapFmxStyles.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapFmxStyles; interface diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 68023bf3..c2babd8d 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapFmxTypes; interface diff --git a/Source/vcl/WrapDelphiVCL.pas b/Source/vcl/WrapDelphiVCL.pas index 1178ebb9..dd44d169 100644 --- a/Source/vcl/WrapDelphiVCL.pas +++ b/Source/vcl/WrapDelphiVCL.pas @@ -28,6 +28,7 @@ implementation WrapDelphiWindows, WrapDelphiDataBind, WrapActions, + WrapVclImgList, WrapVclControls, WrapVclGraphics, WrapVclForms, diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index a38d3505..b12d5d3b 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -22,6 +22,7 @@ interface System.SysUtils, System.Classes, System.TypInfo, + Vcl.Controls, Vcl.ComCtrls, PythonEngine, WrapDelphi, @@ -33,9 +34,9 @@ TTabChangingEventHandler = class(TEventHandler) protected procedure DoEvent(Sender: TObject; var AllowChange: Boolean); public - constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; - PropertyInfo : PPropInfo; Callable : PPyObject); override; - class function GetTypeInfo : PTypeInfo; override; + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + class function GetTypeInfo: PTypeInfo; override; end; {$IFNDEF FPC} @@ -44,7 +45,7 @@ TPyDelphiDateTimePicker = class (TPyDelphiWinControl) function GetDelphiObject: TDateTimePicker; procedure SetDelphiObject(const Value: TDateTimePicker); public - class function DelphiObjectClass : TClass; override; + class function DelphiObjectClass: TClass; override; // Properties property DelphiObject: TDateTimePicker read GetDelphiObject write SetDelphiObject; end; @@ -56,13 +57,13 @@ TPyDelphiTabSheet = class (TPyDelphiWinControl) procedure SetDelphiObject(const Value: TTabSheet); protected // Property Getters - function Get_TabIndex( AContext : Pointer) : PPyObject; cdecl; - function Get_PageControl( AContext : Pointer) : PPyObject; cdecl; + function Get_TabIndex( AContext: Pointer): PPyObject; cdecl; + function Get_PageControl( AContext: Pointer): PPyObject; cdecl; // Property Setters - function Set_PageControl( AValue : PPyObject; AContext : Pointer) : integer; cdecl; + function Set_PageControl( AValue: PPyObject; AContext: Pointer): integer; cdecl; public - class function DelphiObjectClass : TClass; override; - class procedure RegisterGetSets( PythonType : TPythonType ); override; + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets( PythonType: TPythonType ); override; // Properties property DelphiObject: TTabSheet read GetDelphiObject write SetDelphiObject; end; @@ -74,15 +75,15 @@ TPagesAccess = class(TContainerAccess) private function GetContainer: TPageControl; public - function GetItem(AIndex : Integer) : PPyObject; override; - function GetSize : Integer; override; - function IndexOf(AValue : PPyObject) : Integer; override; + function GetItem(AIndex: Integer): PPyObject; override; + function GetSize: Integer; override; + function IndexOf(AValue: PPyObject): Integer; override; - class function ExpectedContainerClass : TClass; override; - class function SupportsIndexOf : Boolean; override; - class function Name : string; override; + class function ExpectedContainerClass: TClass; override; + class function SupportsIndexOf: Boolean; override; + class function Name: string; override; - property Container : TPageControl read GetContainer; + property Container: TPageControl read GetContainer; end; TPyDelphiPageControl = class (TPyDelphiWinControl) @@ -92,33 +93,33 @@ TPyDelphiPageControl = class (TPyDelphiWinControl) protected // methods {$IFNDEF FPC} - function IndexOfTabAt_Wrapper(args : PPyObject) : PPyObject; cdecl; - function GetHitTestInfoAt_Wrapper(args : PPyObject) : PPyObject; cdecl; + function IndexOfTabAt_Wrapper(args: PPyObject): PPyObject; cdecl; + function GetHitTestInfoAt_Wrapper(args: PPyObject): PPyObject; cdecl; {$ENDIF FPC} - function TabRect_Wrapper(args : PPyObject) : PPyObject; cdecl; + function TabRect_Wrapper(args: PPyObject): PPyObject; cdecl; {$IFNDEF FPC} - function ScrollTabs_Wrapper(args : PPyObject) : PPyObject; cdecl; + function ScrollTabs_Wrapper(args: PPyObject): PPyObject; cdecl; {$ENDIF FPC} - function FindNextPage_Wrapper(args : PPyObject) : PPyObject; cdecl; - function SelectNextPage_Wrapper(args : PPyObject) : PPyObject; cdecl; + function FindNextPage_Wrapper(args: PPyObject): PPyObject; cdecl; + function SelectNextPage_Wrapper(args: PPyObject): PPyObject; cdecl; // Property Getters - function Get_ActivePage( AContext : Pointer) : PPyObject; cdecl; - function Get_ActivePageIndex( AContext : Pointer) : PPyObject; cdecl; + function Get_ActivePage( AContext: Pointer): PPyObject; cdecl; + function Get_ActivePageIndex( AContext: Pointer): PPyObject; cdecl; {$IFNDEF FPC} - function Get_Canvas( AContext : Pointer) : PPyObject; cdecl; + function Get_Canvas( AContext: Pointer): PPyObject; cdecl; {$ENDIF FPC} - function Get_PageCount( AContext : Pointer) : PPyObject; cdecl; - function Get_Pages( AContext : Pointer) : PPyObject; cdecl; + function Get_PageCount( AContext: Pointer): PPyObject; cdecl; + function Get_Pages( AContext: Pointer): PPyObject; cdecl; {$IFNDEF FPC} - function Get_RowCount( AContext : Pointer) : PPyObject; cdecl; + function Get_RowCount( AContext: Pointer): PPyObject; cdecl; {$ENDIF FPC} // Property Setters - function Set_ActivePage( AValue : PPyObject; AContext : Pointer) : integer; cdecl; - function Set_ActivePageIndex( AValue : PPyObject; AContext : Pointer) : integer; cdecl; + function Set_ActivePage( AValue: PPyObject; AContext: Pointer): integer; cdecl; + function Set_ActivePageIndex( AValue: PPyObject; AContext: Pointer): integer; cdecl; public - class function DelphiObjectClass : TClass; override; - class procedure RegisterGetSets( PythonType : TPythonType ); override; - class procedure RegisterMethods( PythonType : TPythonType ); override; + class function DelphiObjectClass: TClass; override; + class procedure RegisterGetSets( PythonType: TPythonType ); override; + class procedure RegisterMethods( PythonType: TPythonType ); override; // Properties property DelphiObject: TPageControl read GetDelphiObject write SetDelphiObject; end; @@ -128,7 +129,7 @@ TPyDelphiTrackBar = class (TPyDelphiWinControl) function GetDelphiObject: TTrackBar; procedure SetDelphiObject(const Value: TTrackBar); public - class function DelphiObjectClass : TClass; override; + class function DelphiObjectClass: TClass; override; // Properties property DelphiObject: TTrackBar read GetDelphiObject write SetDelphiObject; end; @@ -177,7 +178,7 @@ TPyDelphiCustomCustomTabControl = class (TPyDelphiWinControl) function GetDelphiObject: TCustomTabControl; procedure SetDelphiObject(const Value: TCustomTabControl); public - class function DelphiObjectClass : TClass; override; + class function DelphiObjectClass: TClass; override; property DelphiObject: TCustomTabControl read GetDelphiObject write SetDelphiObject; end; @@ -186,7 +187,7 @@ TPyDelphiCustomTabControl = class (TPyDelphiCustomCustomTabControl) function GetDelphiObject: TTabControl; procedure SetDelphiObject(const Value: TTabControl); public - class function DelphiObjectClass : TClass; override; + class function DelphiObjectClass: TClass; override; property DelphiObject: TTabControl read GetDelphiObject write SetDelphiObject; end; @@ -195,7 +196,7 @@ TPyDelphiCustomStatusBar = class (TPyDelphiWinControl) function GetDelphiObject: TCustomStatusBar; procedure SetDelphiObject(const Value: TCustomStatusBar); public - class function DelphiObjectClass : TClass; override; + class function DelphiObjectClass: TClass; override; property DelphiObject: TCustomStatusBar read GetDelphiObject write SetDelphiObject; end; @@ -204,731 +205,3473 @@ TPyDelphiStatusBar = class (TPyDelphiCustomStatusBar) function GetDelphiObject: TStatusBar; procedure SetDelphiObject(const Value: TStatusBar); public - class function DelphiObjectClass : TClass; override; + class function DelphiObjectClass: TClass; override; property DelphiObject: TStatusBar read GetDelphiObject write SetDelphiObject; end; -implementation + //TTVChangingEvent + TTVChangingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -uses - WrapDelphiTypes, - Vcl.ExtCtrls; + class function GetTypeInfo: PTypeInfo; override; + end; -{ Register the wrappers, the globals and the constants } -type - TComCtrlsRegistration = class(TRegisteredUnit) + //TTVChangedEvent + TTVChangedEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode); public - function Name : string; override; - procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; - procedure DefineVars(APyDelphiWrapper : TPyDelphiWrapper); override; + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; end; -{ TComCtrlsRegistration } + //TTVEditingEvent + TTVEditingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -procedure TComCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; -end; + class function GetTypeInfo: PTypeInfo; override; + end; -function TComCtrlsRegistration.Name: string; -begin - Result := 'ComCtrls'; -end; + //TTVEditedEvent + TTVEditedEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode; var S: string); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - {$IFNDEF FPC} - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimePicker); - {$ENDIF FPC} - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPageControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabSheet); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolbar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomTabControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTabControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStatusBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar); + class function GetTypeInfo: PTypeInfo; override; + end; - APyDelphiWrapper.EventHandlers.RegisterHandler(TTabChangingEventHandler); -end; + //TTVExpandingEvent + TTVExpandingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -{$IFNDEF FPC} -{ TPyDelphiDateTimePicker } + class function GetTypeInfo: PTypeInfo; override; + end; -class function TPyDelphiDateTimePicker.DelphiObjectClass: TClass; -begin - Result := TDateTimePicker; -end; + //TTVCollapsingEvent + TTVCollapsingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -function TPyDelphiDateTimePicker.GetDelphiObject: TDateTimePicker; -begin - Result := TDateTimePicker(inherited DelphiObject); -end; + class function GetTypeInfo: PTypeInfo; override; + end; -procedure TPyDelphiDateTimePicker.SetDelphiObject(const Value: TDateTimePicker); -begin - inherited DelphiObject := Value; -end; -{$ENDIF FPC} + //TTVExpandedEvent + TTVExpandedEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node: TTreeNode); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -{ TPyDelphiPageControl } + class function GetTypeInfo: PTypeInfo; override; + end; -class function TPyDelphiPageControl.DelphiObjectClass: TClass; -begin - Result := TPageControl; -end; + //TTVCompareEvent + TTVCompareEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Node1, Node2: TTreeNode; Data: Integer; var Compare: Integer); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -function TPyDelphiPageControl.FindNextPage_Wrapper( - args: PPyObject): PPyObject; -// function FindNextPage(CurPage: TTabSheet; GoForward, CheckTabVisible: Boolean): TTabSheet; -var - _CurPage: TObject; - _pCurPage: PPyObject; - _pGoForward, _pCheckTabVisible: PPyObject; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, 'OOO:FindNextPage',@_pCurPage, @_pGoForward, @_pCheckTabVisible ) <> 0 then begin - if CheckObjAttribute(_pCurPage, 'CurPage', TTabSheet, _CurPage) then - Result := Wrap( DelphiObject.FindNextPage(TTabSheet(_CurPage), PyObject_IsTrue(_pGoForward)<>0, PyObject_IsTrue(_pCheckTabVisible)<>0) ) - else - Result := nil; - end else - Result := nil; + class function GetTypeInfo: PTypeInfo; override; end; -end; -function TPyDelphiPageControl.GetDelphiObject: TPageControl; -begin - Result := TPageControl(inherited DelphiObject); -end; + //TTVHintEvent + TTVHintEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; const Node: TTreeNode; var Hint: String); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -{$IFNDEF FPC} -function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( - args: PPyObject): PPyObject; + class function GetTypeInfo: PTypeInfo; override; + end; - procedure AppendString(const AText : string); - var - _text : PPyObject; - begin - with GetPythonEngine do - begin - _text := PyUnicodeFromString(AText); - PyList_Append(Result, _text); - Py_DecRef(_text); - end; + //TTVCustomDrawEvent + TTVCustomDrawEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; const ARect: TRect; var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; end; -var - x, y: Integer; - _result : THitTests; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, 'ii:GetHitTestInfoAt',@x, @y ) <> 0 then begin - _result := DelphiObject.GetHitTestInfoAt(x, y); - Result := PyList_New(0); - if htAbove in _result then - AppendString('htAbove'); - if htBelow in _result then - AppendString('htBelow'); - if htNowhere in _result then - AppendString('htNowhere'); - if htOnItem in _result then - AppendString('htOnItem'); - if htOnButton in _result then - AppendString('htOnButton'); - if htOnIcon in _result then - AppendString('htOnIcon'); - if htOnIndent in _result then - AppendString('htOnIndent'); - if htOnLabel in _result then - AppendString('htOnLabel'); - if htOnRight in _result then - AppendString('htOnRight'); - if htOnStateIcon in _result then - AppendString('htOnStateIcon'); - if htToLeft in _result then - AppendString('htToLeft'); - if htToRight in _result then - AppendString('htToRight'); - end else - Result := nil; + //TTVCustomDrawItemEvent + TTVCustomDrawItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; + var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; end; -end; -{$ENDIF FPC} -function TPyDelphiPageControl.Get_ActivePage(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Wrap(DelphiObject.ActivePage); -end; + //TTVAdvancedCustomDrawEvent + TTVAdvancedCustomDrawEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; const ARect: TRect; Stage: TCustomDrawStage; + var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -function TPyDelphiPageControl.Get_ActivePageIndex( - AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ActivePageIndex); -end; + class function GetTypeInfo: PTypeInfo; override; + end; -{$IFNDEF FPC} -function TPyDelphiPageControl.Get_Canvas(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Wrap(DelphiObject.Canvas); -end; -{$ENDIF FPC} + //TTVAdvancedCustomDrawItemEvent + TTVAdvancedCustomDrawItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; + Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -function TPyDelphiPageControl.Get_PageCount(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.PageCount); -end; + class function GetTypeInfo: PTypeInfo; override; + end; -function TPyDelphiPageControl.Get_Pages(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TPagesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); -end; + //TTVCreateNodeClassEvent + TTVCreateNodeClassEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -{$IFNDEF FPC} -function TPyDelphiPageControl.Get_RowCount(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.RowCount); -end; + class function GetTypeInfo: PTypeInfo; override; + end; -function TPyDelphiPageControl.IndexOfTabAt_Wrapper( - args: PPyObject): PPyObject; -var - x, y: Integer; -begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, 'ii:IndexOfTabAt',@x, @y ) <> 0 then begin - Result := VariantAsPyObject( DelphiObject.IndexOfTabAt(x, y) ); - end else - Result := nil; + //TTVCheckStateChangedEvent + TTVCheckStateChangedEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; Node: TTreeNode; CheckState: TNodeCheckState); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; end; -end; -{$ENDIF FPC} -class procedure TPyDelphiPageControl.RegisterGetSets( - PythonType: TPythonType); -begin - PythonType.AddGetSet('ActivePage', @TPyDelphiPageControl.Get_ActivePage, @TPyDelphiPageControl.Set_ActivePage, - 'Specifies the page currently displayed by the page control.', nil); - PythonType.AddGetSet('ActivePageIndex', @TPyDelphiPageControl.Get_ActivePageIndex, @TPyDelphiPageControl.Set_ActivePageIndex, - 'Specifies the page currently displayed by the page control.', nil); - {$IFNDEF FPC} - PythonType.AddGetSet('Canvas', @TPyDelphiPageControl.Get_Canvas, nil, - 'Gives access to the tab control canvas.', nil); - {$ENDIF FPC} - PythonType.AddGetSet('PageCount', @TPyDelphiPageControl.Get_PageCount, nil, - 'Indicates the number of pages in the TPageControl object.', nil); - PythonType.AddGetSet('Pages', @TPyDelphiPageControl.Get_Pages, nil, - 'Lists all the pages in the TPageControl.', nil); - {$IFNDEF FPC} - PythonType.AddGetSet('RowCount', @TPyDelphiPageControl.Get_RowCount, nil, - '', nil); - {$ENDIF FPC} -end; + //TTVCheckStateChangingEvent + TTVCheckStateChangingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomTreeView; Node: TTreeNode; + NewCheckState, OldCheckState: TNodeCheckState; var AllowChange: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; -class procedure TPyDelphiPageControl.RegisterMethods( - PythonType: TPythonType); -begin - {$IFNDEF FPC} - PythonType.AddMethod('IndexOfTabAt', @TPyDelphiPageControl.IndexOfTabAt_Wrapper, - 'TPageControl.IndexOfTabAt()'#10 + - 'Indicates the index of the tab at a specified point.'); - PythonType.AddMethod('GetHitTestInfoAt', @TPyDelphiPageControl.GetHitTestInfoAt_Wrapper, - 'TPageControl.GetHitTestInfoAt()'#10 + - 'Returns information about the location of a point relative to the client area of the tab control.'); - {$ENDIF FPC} - PythonType.AddMethod('TabRect', @TPyDelphiPageControl.TabRect_Wrapper, - 'TPageControl.TabRect()'#10 + - 'Returns the bounding rectangle for a specified tab.'); + class function GetTypeInfo: PTypeInfo; override; + end; + + TPyDelphiTreeNode = class(TPyDelphiPersistent) + private + function GetDelphiObject: TTreeNode; + procedure SetDelphiObject(const Value: TTreeNode); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TTreeNode read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomTreeView = class(TPyDelphiWinControl) + private + function GetDelphiObject: TCustomTreeView; + procedure SetDelphiObject(const Value: TCustomTreeView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomTreeView read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiTreeView = class(TPyDelphiCustomTreeView) + private + function GetDelphiObject: TTreeView; + procedure SetDelphiObject(const Value: TTreeView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TTreeView read GetDelphiObject write SetDelphiObject; + end; + + //TLVDeletedEvent + TLVDeletedEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVEditingEvent + TLVEditingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; var AllowEdit: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVEditedEvent + TLVEditedEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; var S: string); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVChangeEvent + TLVChangeEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; Change: TItemChange); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVChangingEvent + TLVChangingEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; Change: TItemChange; + var AllowChange: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVColumnClickEvent + TLVColumnClickEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Column: TListColumn); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVColumnRClickEvent + TLVColumnRClickEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Column: TListColumn; Point: TPoint); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVCompareEvent + TLVCompareEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item1, Item2: TListItem; Data: Integer; + var Compare: Integer); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVNotifyEvent + TLVNotifyEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVSelectItemEvent + TLVSelectItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; Selected: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVCheckedItemEvent + TLVCheckedItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVDrawItemEvent + TLVDrawItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; Item: TListItem; + Rect: TRect; State: TOwnerDrawState); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVCustomDrawEvent + TLVCustomDrawEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; const ARect: TRect; + var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVCustomDrawItemEvent + TLVCustomDrawItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; Item: TListItem; + State: TCustomDrawState; var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVCustomDrawSubItemEvent + TLVCustomDrawSubItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; Item: TListItem; + SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVAdvancedCustomDrawEvent + TLVAdvancedCustomDrawEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; const ARect: TRect; + Stage: TCustomDrawStage; var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVAdvancedCustomDrawItemEvent + TLVAdvancedCustomDrawItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; Item: TListItem; + State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVAdvancedCustomDrawSubItemEvent + TLVAdvancedCustomDrawSubItemEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; Item: TListItem; + SubItem: Integer; State: TCustomDrawState; Stage: TCustomDrawStage; + var DefaultDraw: Boolean); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVOwnerDataEvent + TLVOwnerDataEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVOwnerDataFindEvent + TLVOwnerDataFindEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Find: TItemFind; + const FindString: string; const FindPosition: TPoint; FindData: TCustomData; + StartIndex: Integer; Direction: TSearchDirection; Wrap: Boolean; + var Index: Integer); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVOwnerDataHintEvent + TLVOwnerDataHintEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; StartIndex, EndIndex: Integer); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVOwnerDataStateChangeEvent + TLVOwnerDataStateChangeEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; StartIndex, + EndIndex: Integer; OldState, NewState: TItemStates); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVSubItemImageEvent + TLVSubItemImageEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; SubItem: Integer; + var ImageIndex: Integer); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVInfoTipEvent + TLVInfoTipEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; Item: TListItem; var InfoTip: string); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + //TLVCreateItemClassEvent + TLVCreateItemClassEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TCustomListView; var ItemClass: TListItemClass); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + + class function GetTypeInfo: PTypeInfo; override; + end; + + TPyDelphiListItem = class(TPyDelphiPersistent) + private + function GetDelphiObject: TListItem; + procedure SetDelphiObject(const Value: TListItem); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TListItem read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomListView = class(TPyDelphiCustomMultiListControl) + private + function GetDelphiObject: TCustomListView; + procedure SetDelphiObject(const Value: TCustomListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TCustomListView read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiListView = class(TPyDelphiCustomListView) + private + function GetDelphiObject: TListView; + procedure SetDelphiObject(const Value: TListView); + public + class function DelphiObjectClass: TClass; override; + property DelphiObject: TListView read GetDelphiObject write SetDelphiObject; + end; + + function NodeCheckStateToPython(const ANodeCheckState: TNodeCheckState): PPyObject; + + function CustomDrawTargetToPython(const ACustomDrawTarget: TCustomDrawTarget): PPyObject; + function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyObject; + function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState): PPyObject; + + function ItemChangeToPython(const AItemChange: TItemChange): PPyObject; + function ItemStateToPython(const AItemState: TItemState): PPyObject; + function ItemStatesToPython(const AItemStates: TItemStates): PPyObject; + function ItemFindToPython(const AItemFind: TItemFind): PPyObject; + function SearchDirectionToPython(const ASearchDirection: TSearchDirection): PPyObject; + +implementation + +uses + WrapDelphiTypes, WrapDelphiWindows, + Vcl.ExtCtrls; + +{ Register the wrappers, the globals and the constants } +type + TComCtrlsRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + +function NodeCheckStateToPython(const ANodeCheckState: TNodeCheckState): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TNodeCheckState), + Ord(ANodeCheckState))); +end; + +function CustomDrawTargetToPython(const ACustomDrawTarget: TCustomDrawTarget): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TCustomDrawTarget), + Ord(ACustomDrawTarget))); +end; + +function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TCustomDrawStage), + Ord(ACustomDrawStage))); +end; + +function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState): PPyObject; + + procedure Append(const AList: PPyObject; const AString: string); + var + LItem: PPyObject; + begin + with GetPythonEngine do begin + LItem := PyUnicodeFromString(AString); + PyList_Append(AList, LItem); + Py_XDecRef(LItem); + end; + end; + +var + LCompType: PTypeInfo; + LMin: integer; + LMax: integer; + LState: integer; +begin + Result := GetPythonEngine().PyList_New(0); + LCompType := GetTypeData(TypeInfo(TCustomDrawState)).CompType^; + LMin := LCompType^.TypeData^.MinValue; + LMax := LCompType^.TypeData^.MaxValue; + for LState := LMin to LMax do + Append(Result, GetEnumName(LCompType, LState)); +end; + +function ItemChangeToPython(const AItemChange: TItemChange): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TItemChange), + Ord(AItemChange))); +end; + +function ItemStateToPython(const AItemState: TItemState): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TItemState), + Ord(AItemState))); +end; + +function ItemStatesToPython(const AItemStates: TItemStates): PPyObject; + + procedure Append(const AList: PPyObject; const AItemState: TItemState); + var + LItem: PPyObject; + begin + with GetPythonEngine do begin + LItem := ItemStateToPython(AItemState); + PyList_Append(AList, LItem); + Py_XDecRef(LItem); + end; + end; + +var + LItemState: TItemState; +begin + Result := GetPythonEngine().PyList_New(0); + for LItemState := Low(TItemState) to High(TItemState) do + Append(Result, LItemState); +end; + +function ItemFindToPython(const AItemFind: TItemFind): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TItemFind), + Ord(AItemFind))); +end; + +function SearchDirectionToPython(const ASearchDirection: TSearchDirection): PPyObject; +begin + Result := GetPythonEngine().PyUnicodeFromString( + System.TypInfo.GetEnumName( + TypeInfo(TSearchDirection), + Ord(ASearchDirection))); +end; + +{ TComCtrlsRegistration } + +procedure TComCtrlsRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; +end; + +function TComCtrlsRegistration.Name: string; +begin + Result := 'ComCtrls'; +end; + +procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; {$IFNDEF FPC} - PythonType.AddMethod('ScrollTabs', @TPyDelphiPageControl.ScrollTabs_Wrapper, - 'TPageControl.ScrollTabs()'#10 + - 'Scrolls the tabs that are visible when the tab control is not multi-line.'); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimePicker); {$ENDIF FPC} - PythonType.AddMethod('FindNextPage', @TPyDelphiPageControl.FindNextPage_Wrapper, - 'TPageControl.FindNextPage()'#10 + - 'Returns the next page in the page control before or after a specified page.'); - PythonType.AddMethod('SelectNextPage', @TPyDelphiPageControl.SelectNextPage_Wrapper, - 'TPageControl.SelectNextPage()'#10 + - 'Changes the ActivePage to the first visible page that is before or after the currently active page.'); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPageControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabSheet); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolbar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomTabControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTabControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStatusBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTreeNode); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTreeView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTreeView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListItem); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListView); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TTabChangingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVChangingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVChangedEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVEditingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVEditedEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVExpandingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCollapsingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVExpandedEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCompareEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVHintEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCustomDrawEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCustomDrawItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVAdvancedCustomDrawEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVAdvancedCustomDrawItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCreateNodeClassEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCheckStateChangedEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCheckStateChangingEventHandler); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVDeletedEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVEditingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVEditedEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVChangeEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVChangingEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVColumnClickEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVColumnRClickEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCompareEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVNotifyEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVSelectItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCheckedItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVDrawItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCustomDrawEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCustomDrawItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCustomDrawSubItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVAdvancedCustomDrawEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVAdvancedCustomDrawItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVAdvancedCustomDrawSubItemEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVOwnerDataEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVOwnerDataFindEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVOwnerDataHintEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVOwnerDataStateChangeEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVSubItemImageEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVInfoTipEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCreateItemClassEventHandler); +end; + +{$IFNDEF FPC} + +{ TPyDelphiDateTimePicker } + +class function TPyDelphiDateTimePicker.DelphiObjectClass: TClass; +begin + Result := TDateTimePicker; +end; + +function TPyDelphiDateTimePicker.GetDelphiObject: TDateTimePicker; +begin + Result := TDateTimePicker(inherited DelphiObject); +end; + +procedure TPyDelphiDateTimePicker.SetDelphiObject(const Value: TDateTimePicker); +begin + inherited DelphiObject := Value; +end; +{$ENDIF FPC} + +{ TPyDelphiPageControl } + +class function TPyDelphiPageControl.DelphiObjectClass: TClass; +begin + Result := TPageControl; +end; + +function TPyDelphiPageControl.FindNextPage_Wrapper( + args: PPyObject): PPyObject; +// function FindNextPage(CurPage: TTabSheet; GoForward, CheckTabVisible: Boolean): TTabSheet; +var + _CurPage: TObject; + _pCurPage: PPyObject; + _pGoForward, _pCheckTabVisible: PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, 'OOO:FindNextPage',@_pCurPage, @_pGoForward, @_pCheckTabVisible ) <> 0 then begin + if CheckObjAttribute(_pCurPage, 'CurPage', TTabSheet, _CurPage) then + Result := Wrap( DelphiObject.FindNextPage(TTabSheet(_CurPage), PyObject_IsTrue(_pGoForward)<>0, PyObject_IsTrue(_pCheckTabVisible)<>0) ) + else + Result := nil; + end else + Result := nil; + end; +end; + +function TPyDelphiPageControl.GetDelphiObject: TPageControl; +begin + Result := TPageControl(inherited DelphiObject); +end; + +{$IFNDEF FPC} +function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( + args: PPyObject): PPyObject; + + procedure AppendString(const AText : string); + var + _text : PPyObject; + begin + with GetPythonEngine do + begin + _text := PyUnicodeFromString(AText); + PyList_Append(Result, _text); + Py_DecRef(_text); + end; + end; + +var + x, y: Integer; + _result : THitTests; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, 'ii:GetHitTestInfoAt',@x, @y ) <> 0 then begin + _result := DelphiObject.GetHitTestInfoAt(x, y); + Result := PyList_New(0); + if htAbove in _result then + AppendString('htAbove'); + if htBelow in _result then + AppendString('htBelow'); + if htNowhere in _result then + AppendString('htNowhere'); + if htOnItem in _result then + AppendString('htOnItem'); + if htOnButton in _result then + AppendString('htOnButton'); + if htOnIcon in _result then + AppendString('htOnIcon'); + if htOnIndent in _result then + AppendString('htOnIndent'); + if htOnLabel in _result then + AppendString('htOnLabel'); + if htOnRight in _result then + AppendString('htOnRight'); + if htOnStateIcon in _result then + AppendString('htOnStateIcon'); + if htToLeft in _result then + AppendString('htToLeft'); + if htToRight in _result then + AppendString('htToRight'); + end else + Result := nil; + end; +end; +{$ENDIF FPC} + +function TPyDelphiPageControl.Get_ActivePage(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.ActivePage); +end; + +function TPyDelphiPageControl.Get_ActivePageIndex( + AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ActivePageIndex); +end; + +{$IFNDEF FPC} +function TPyDelphiPageControl.Get_Canvas(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.Canvas); +end; +{$ENDIF FPC} + +function TPyDelphiPageControl.Get_PageCount(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.PageCount); +end; + +function TPyDelphiPageControl.Get_Pages(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Self.PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TPagesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); +end; + +{$IFNDEF FPC} +function TPyDelphiPageControl.Get_RowCount(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.RowCount); +end; + +function TPyDelphiPageControl.IndexOfTabAt_Wrapper( + args: PPyObject): PPyObject; +var + x, y: Integer; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, 'ii:IndexOfTabAt',@x, @y ) <> 0 then begin + Result := VariantAsPyObject( DelphiObject.IndexOfTabAt(x, y) ); + end else + Result := nil; + end; +end; +{$ENDIF FPC} + +class procedure TPyDelphiPageControl.RegisterGetSets( + PythonType: TPythonType); +begin + PythonType.AddGetSet('ActivePage', @TPyDelphiPageControl.Get_ActivePage, @TPyDelphiPageControl.Set_ActivePage, + 'Specifies the page currently displayed by the page control.', nil); + PythonType.AddGetSet('ActivePageIndex', @TPyDelphiPageControl.Get_ActivePageIndex, @TPyDelphiPageControl.Set_ActivePageIndex, + 'Specifies the page currently displayed by the page control.', nil); + {$IFNDEF FPC} + PythonType.AddGetSet('Canvas', @TPyDelphiPageControl.Get_Canvas, nil, + 'Gives access to the tab control canvas.', nil); + {$ENDIF FPC} + PythonType.AddGetSet('PageCount', @TPyDelphiPageControl.Get_PageCount, nil, + 'Indicates the number of pages in the TPageControl object.', nil); + PythonType.AddGetSet('Pages', @TPyDelphiPageControl.Get_Pages, nil, + 'Lists all the pages in the TPageControl.', nil); + {$IFNDEF FPC} + PythonType.AddGetSet('RowCount', @TPyDelphiPageControl.Get_RowCount, nil, + '', nil); + {$ENDIF FPC} +end; + +class procedure TPyDelphiPageControl.RegisterMethods( + PythonType: TPythonType); +begin + {$IFNDEF FPC} + PythonType.AddMethod('IndexOfTabAt', @TPyDelphiPageControl.IndexOfTabAt_Wrapper, + 'TPageControl.IndexOfTabAt()'#10 + + 'Indicates the index of the tab at a specified point.'); + PythonType.AddMethod('GetHitTestInfoAt', @TPyDelphiPageControl.GetHitTestInfoAt_Wrapper, + 'TPageControl.GetHitTestInfoAt()'#10 + + 'Returns information about the location of a point relative to the client area of the tab control.'); + {$ENDIF FPC} + PythonType.AddMethod('TabRect', @TPyDelphiPageControl.TabRect_Wrapper, + 'TPageControl.TabRect()'#10 + + 'Returns the bounding rectangle for a specified tab.'); + {$IFNDEF FPC} + PythonType.AddMethod('ScrollTabs', @TPyDelphiPageControl.ScrollTabs_Wrapper, + 'TPageControl.ScrollTabs()'#10 + + 'Scrolls the tabs that are visible when the tab control is not multi-line.'); + {$ENDIF FPC} + PythonType.AddMethod('FindNextPage', @TPyDelphiPageControl.FindNextPage_Wrapper, + 'TPageControl.FindNextPage()'#10 + + 'Returns the next page in the page control before or after a specified page.'); + PythonType.AddMethod('SelectNextPage', @TPyDelphiPageControl.SelectNextPage_Wrapper, + 'TPageControl.SelectNextPage()'#10 + + 'Changes the ActivePage to the first visible page that is before or after the currently active page.'); +end; + +{$IFNDEF FPC} +function TPyDelphiPageControl.ScrollTabs_Wrapper( + args: PPyObject): PPyObject; +var + delta: Integer; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, 'i:ScrollTabs',@delta ) <> 0 then begin + DelphiObject.ScrollTabs(delta); + Result := ReturnNone; + end else + Result := nil; + end; +end; +{$ENDIF FPC} + +function TPyDelphiPageControl.SelectNextPage_Wrapper( + args: PPyObject): PPyObject; +// procedure SelectNextPage(GoForward: Boolean; CheckTabVisible: Boolean = True); +var + _pGoForward, _pCheckTabVisible: PPyObject; +begin + // We adjust the transmitted self argument + Adjust(@Self); + with GetPythonEngine do begin + if PyArg_ParseTuple( args, 'OO:SelectNextPage',@_pGoForward, @_pCheckTabVisible ) <> 0 then begin + DelphiObject.SelectNextPage(PyObject_IsTrue(_pGoForward)<>0, PyObject_IsTrue(_pCheckTabVisible)<>0); + Result := ReturnNone; + end else + Result := nil; + end; + +end; + +procedure TPyDelphiPageControl.SetDelphiObject(const Value: TPageControl); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiPageControl.Set_ActivePage(AValue: PPyObject; + AContext: Pointer): integer; +var + _object : TObject; +begin + Adjust(@Self); + if CheckObjAttribute(AValue, 'ActivePage', TTabSheet, _object) then + begin + Self.DelphiObject.ActivePage := TTabSheet(_object); + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiPageControl.Set_ActivePageIndex(AValue: PPyObject; + AContext: Pointer): integer; +var + _value : Integer; +begin + Adjust(@Self); + if CheckIntAttribute(AValue, 'ActivePageIndex', _value) then + begin + DelphiObject.ActivePageIndex := _value; + Result := 0; + end + else + Result := -1; +end; + +function TPyDelphiPageControl.TabRect_Wrapper(args: PPyObject): PPyObject; +var + idx: Integer; +begin + // We adjust the transmitted self argument + Adjust(@Self); + if GetPythonEngine.PyArg_ParseTuple( args, 'i:TabRect',@idx ) <> 0 then begin + Result := WrapRect(PyDelphiWrapper, DelphiObject.TabRect(idx)); + end else + Result := nil; +end; + +{ TPyDelphiTabSheet } + +class function TPyDelphiTabSheet.DelphiObjectClass: TClass; +begin + Result := TTabSheet; +end; + +function TPyDelphiTabSheet.GetDelphiObject: TTabSheet; +begin + Result := TTabSheet(inherited DelphiObject); +end; + +function TPyDelphiTabSheet.Get_PageControl(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := Wrap(DelphiObject.PageControl); +end; + +function TPyDelphiTabSheet.Get_TabIndex(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.TabIndex); +end; + +class procedure TPyDelphiTabSheet.RegisterGetSets(PythonType: TPythonType); +begin + inherited; + PythonType.AddGetSet('TabIndex', @TPyDelphiTabSheet.Get_TabIndex, nil, + 'Indicates the position of the tab sheet in the set of visible tabs in a TPageControl object.', nil); + PythonType.AddGetSet('PageControl', @TPyDelphiTabSheet.Get_PageControl, @TPyDelphiTabSheet.Set_PageControl, + 'Indicates the page control object that contains the tab sheet.', nil); +end; + +procedure TPyDelphiTabSheet.SetDelphiObject(const Value: TTabSheet); +begin + inherited DelphiObject := Value; +end; + +function TPyDelphiTabSheet.Set_PageControl(AValue: PPyObject; + AContext: Pointer): integer; +var + _object : TObject; +begin + Adjust(@Self); + if CheckObjAttribute(AValue, 'PageControl', TPageControl, _object) then + begin + Self.DelphiObject.PageControl := TPageControl(_object); + Result := 0; + end + else + Result := -1; +end; + +{ TPagesAccess } + +class function TPagesAccess.ExpectedContainerClass: TClass; +begin + Result := TPageControl; +end; + +function TPagesAccess.GetContainer: TPageControl; +begin + Result := TPageControl(inherited Container); +end; + +function TPagesAccess.GetItem(AIndex: Integer): PPyObject; +begin + Result := Wrap( Container.Pages[AIndex] ); +end; + +function TPagesAccess.GetSize: Integer; +begin + Result := Container.PageCount; +end; + +function TPagesAccess.IndexOf(AValue: PPyObject): Integer; +var + i : Integer; + S : string; + _obj : TPyObject; + _value : TObject; + _ctrl : TTabSheet; +begin + Result := -1; + with GetPythonEngine do + begin + if PyUnicode_Check(AValue) then + begin + S := PyUnicodeAsString(AValue); + for i := 0 to Container.PageCount-1 do + if SameText( Container.Pages[i].Name, S) then + begin + Result := i; + Break; + end; + end + else if IsDelphiObject(AValue) then + begin + _obj := PythonToDelphi(AValue); + if _obj is TPyDelphiObject then + begin + _value := TPyDelphiObject(_obj).DelphiObject; + if _value is TTabSheet then + begin + _ctrl := TTabSheet(_value); + for i := 0 to Container.PageCount-1 do + if Container.Pages[i] = _ctrl then + begin + Result := i; + Break; + end; + end; + end; + end; + end; +end; + +class function TPagesAccess.Name: string; +begin + Result := 'Pages'; +end; + +class function TPagesAccess.SupportsIndexOf: Boolean; +begin + Result := True; +end; + +{ TTabChangingEventHandler } + +constructor TTabChangingEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTabChangingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +procedure TTabChangingEventHandler.DoEvent(Sender: TObject; + var AllowChange: Boolean); +Var + PyObject, PyTuple, PyResult, PyAllowChange: PPyObject; + _varParam : TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK then + with GetPythonEngine do begin + PyObject := PyDelphiWrapper.Wrap(Sender); + PyAllowChange := CreateVarParam(PyDelphiWrapper, AllowChange); + _varParam := PythonToDelphi(PyAllowChange) as TPyDelphiVarParameter; + PyTuple := PyTuple_New(2); + GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PyObject); + GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyAllowChange); + try + PyResult := PyObject_CallObject(Callable, PyTuple); + if Assigned(PyResult) then + begin + Py_DECREF(PyResult); + AllowChange := PyObject_IsTrue(_varParam.Value) = 1; + end; + finally + Py_DECREF(PyTuple); + end; + CheckError; + end; +end; + +class function TTabChangingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTabChangingEvent); +end; + +{ TPyDelphiTrackBar } + +class function TPyDelphiTrackBar.DelphiObjectClass: TClass; +begin + Result := TTrackBar; +end; + +function TPyDelphiTrackBar.GetDelphiObject: TTrackBar; +begin + Result := TTrackBar(inherited DelphiObject); +end; + +procedure TPyDelphiTrackBar.SetDelphiObject(const Value: TTrackBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiToolButton } + +class function TPyDelphiToolButton.DelphiObjectClass: TClass; +begin + Result := TToolButton; +end; + +function TPyDelphiToolButton.GetDelphiObject: TToolButton; +begin + Result := TToolButton(inherited DelphiObject); +end; + +procedure TPyDelphiToolButton.SetDelphiObject(const Value: TToolButton); +begin + inherited DelphiObject := Value; +end; + +{ TToolbarAccess } + +class function TToolbarAccess.ExpectedContainerClass: TClass; +begin + Result := TToolbar; +end; + +function TToolbarAccess.GetContainer: TToolbar; +begin + Result := TToolbar(inherited Container); +end; + +function TToolbarAccess.GetItem(AIndex: Integer): PPyObject; +begin + Result := Wrap( Container.Buttons[AIndex] ); +end; + +function TToolbarAccess.GetSize: Integer; +begin + Result := Container.ButtonCount; +end; + +function TToolbarAccess.IndexOf(AValue: PPyObject): Integer; +var + _obj: TPyObject; + _item: TToolButton; +begin + Result := -1; + with GetPythonEngine do + begin + if IsDelphiObject(AValue) then + begin + _obj := PythonToDelphi(AValue); + if (_obj is TPyDelphiObject) and + (TPyDelphiObject(_obj).DelphiObject is TToolButton) then + begin + _item := TToolButton(TPyDelphiObject(_obj).DelphiObject); + Result := _item.Index; + end; + end; + end; +end; + +class function TToolbarAccess.Name: string; +begin + Result := 'Toolbar.Buttons' +end; + +class function TToolbarAccess.SupportsIndexOf: Boolean; +begin + Result := True; +end; + +{ TPyDelphiToolbar } + +class function TPyDelphiToolbar.DelphiObjectClass: TClass; +begin + Result := TToolbar; +end; + +class function TPyDelphiToolbar.GetContainerAccessClass: TContainerAccessClass; +begin + Result := TToolbarAccess; +end; + +function TPyDelphiToolbar.GetDelphiObject: TToolbar; +begin + Result := TToolbar(inherited DelphiObject); +end; + +function TPyDelphiToolbar.Get_Buttons(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; + with PythonToDelphi(Result) as TPyDelphiContainer do + Setup(Self.PyDelphiWrapper, TToolbarAccess.Create(Self.PyDelphiWrapper, + Self.DelphiObject)); +end; + +function TPyDelphiToolbar.Get_ButtonCount(AContext: Pointer): PPyObject; +begin + Adjust(@Self); + Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ButtonCount); +end; + +class procedure TPyDelphiToolbar.RegisterGetSets(PythonType: TPythonType); +begin + with PythonType do + begin + AddGetSet('ButtonCount', @TPyDelphiToolbar.Get_ButtonCount, nil, + 'Indicates the number of buttons in the toolbar.', nil); + AddGetSet('Actions', @TPyDelphiToolbar.Get_Buttons, nil, + 'Lists the buttons of the toolbar.', nil); + end; +end; + +procedure TPyDelphiToolbar.SetDelphiObject(const Value: TToolbar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomCustomTabControl } + +class function TPyDelphiCustomCustomTabControl.DelphiObjectClass: TClass; +begin + Result := TCustomTabControl; +end; + +function TPyDelphiCustomCustomTabControl.GetDelphiObject: TCustomTabControl; +begin + Result := TCustomTabControl(inherited DelphiObject); +end; + +procedure TPyDelphiCustomCustomTabControl.SetDelphiObject( + const Value: TCustomTabControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomTabControl } + +class function TPyDelphiCustomTabControl.DelphiObjectClass: TClass; +begin + Result := TTabControl; +end; + +function TPyDelphiCustomTabControl.GetDelphiObject: TTabControl; +begin + Result := TTabControl(inherited DelphiObject); +end; + +procedure TPyDelphiCustomTabControl.SetDelphiObject(const Value: TTabControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomStatusBar } + +class function TPyDelphiCustomStatusBar.DelphiObjectClass: TClass; +begin + Result := TCustomStatusBar; +end; + +function TPyDelphiCustomStatusBar.GetDelphiObject: TCustomStatusBar; +begin + Result := TCustomStatusBar(inherited DelphiObject); +end; + +procedure TPyDelphiCustomStatusBar.SetDelphiObject( + const Value: TCustomStatusBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiStatusBar } + +class function TPyDelphiStatusBar.DelphiObjectClass: TClass; +begin + Result := TStatusBar; +end; + +function TPyDelphiStatusBar.GetDelphiObject: TStatusBar; +begin + Result := TStatusBar(inherited DelphiObject); +end; + +procedure TPyDelphiStatusBar.SetDelphiObject(const Value: TStatusBar); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTreeNode } + +class function TPyDelphiTreeNode.DelphiObjectClass: TClass; +begin + Result := TTreeNode; +end; + +function TPyDelphiTreeNode.GetDelphiObject: TTreeNode; +begin + Result := TTreeNode(inherited DelphiObject); +end; + +procedure TPyDelphiTreeNode.SetDelphiObject(const Value: TTreeNode); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomTreeView } + +class function TPyDelphiCustomTreeView.DelphiObjectClass: TClass; +begin + Result := TCustomTreeView; +end; + +function TPyDelphiCustomTreeView.GetDelphiObject: TCustomTreeView; +begin + Result := TCustomTreeView(inherited DelphiObject); +end; + +procedure TPyDelphiCustomTreeView.SetDelphiObject(const Value: TCustomTreeView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiTreeView } + +class function TPyDelphiTreeView.DelphiObjectClass: TClass; +begin + Result := TTreeView; +end; + +function TPyDelphiTreeView.GetDelphiObject: TTreeView; +begin + Result := TTreeView(inherited DelphiObject); +end; + +procedure TPyDelphiTreeView.SetDelphiObject(const Value: TTreeView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiListItem } + +class function TPyDelphiListItem.DelphiObjectClass: TClass; +begin + Result := TListItem; +end; + +function TPyDelphiListItem.GetDelphiObject: TListItem; +begin + Result := TListItem(inherited DelphiObject); +end; + +procedure TPyDelphiListItem.SetDelphiObject(const Value: TListItem); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomListView } + +class function TPyDelphiCustomListView.DelphiObjectClass: TClass; +begin + Result := TCustomListView; +end; + +function TPyDelphiCustomListView.GetDelphiObject: TCustomListView; +begin + Result := TCustomListView(inherited DelphiObject); +end; + +procedure TPyDelphiCustomListView.SetDelphiObject(const Value: TCustomListView); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiListView } + +class function TPyDelphiListView.DelphiObjectClass: TClass; +begin + Result := TListView; +end; + +function TPyDelphiListView.GetDelphiObject: TListView; +begin + Result := TListView(inherited DelphiObject); +end; + +procedure TPyDelphiListView.SetDelphiObject(const Value: TListView); +begin + inherited DelphiObject := Value; +end; + +{ TTVChangingEventHandler } + +constructor TTVChangingEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVChangingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVChangingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVChangingEvent); +end; + +procedure TTVChangingEventHandler.DoEvent(Sender: TObject; Node: TTreeNode; + var AllowChange: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyAllowChange: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyAllowChange := CreateVarParam(PyDelphiWrapper, AllowChange); + LVarParam := PythonToDelphi(LPyAllowChange) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, LPyAllowChange); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowChange := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVChangedEventHandler } + +constructor TTVChangedEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVChangedEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVChangedEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVChangedEvent); +end; + +procedure TTVChangedEventHandler.DoEvent(Sender: TObject; Node: TTreeNode); +var + LPyObject, LPyNode, LPyTuple, LPyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVEditingEventHandler } + +constructor TTVEditingEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVEditingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVEditingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVEditingEvent); +end; + +procedure TTVEditingEventHandler.DoEvent(Sender: TObject; Node: TTreeNode; + var AllowEdit: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyAllowEdit: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyAllowEdit := CreateVarParam(PyDelphiWrapper, AllowEdit); + LVarParam := PythonToDelphi(LPyAllowEdit) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, LPyAllowEdit); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowEdit := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVEditedEventHandler } + +constructor TTVEditedEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVEditedEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVEditedEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVEditedEvent); +end; + +procedure TTVEditedEventHandler.DoEvent(Sender: TObject; Node: TTreeNode; + var S: string); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyS: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyS := CreateVarParam(PyDelphiWrapper, S); + LVarParam := PythonToDelphi(LPyS) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, LPyS); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + S := PyObjectAsString(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVExpandingEventHandler } + +constructor TTVExpandingEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVExpandingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVExpandingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVExpandingEvent); +end; + +procedure TTVExpandingEventHandler.DoEvent(Sender: TObject; Node: TTreeNode; + var AllowExpansion: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyAllowExpansion: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyAllowExpansion := CreateVarParam(PyDelphiWrapper, AllowExpansion); + LVarParam := PythonToDelphi(LPyAllowExpansion) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, LPyAllowExpansion); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowExpansion := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCollapsingEventHandler } + +constructor TTVCollapsingEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCollapsingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCollapsingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCollapsingEvent); +end; + +procedure TTVCollapsingEventHandler.DoEvent(Sender: TObject; Node: TTreeNode; + var AllowCollapse: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyAllowCollapse: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyAllowCollapse := CreateVarParam(PyDelphiWrapper, AllowCollapse); + LVarParam := PythonToDelphi(LPyAllowCollapse) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, LPyAllowCollapse); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowCollapse := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVExpandedEventHandler } + +constructor TTVExpandedEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVExpandedEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVExpandedEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVExpandedEvent); +end; + +procedure TTVExpandedEventHandler.DoEvent(Sender: TObject; Node: TTreeNode); +var + LPyObject, LPyNode, LPyTuple, LPyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCompareEventHandler } + +constructor TTVCompareEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCompareEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCompareEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCompareEvent); +end; + +procedure TTVCompareEventHandler.DoEvent(Sender: TObject; Node1, Node2: TTreeNode; + Data: Integer; var Compare: Integer); +var + LPyObject, LPyNode1, LPyNode2, LPyTuple, LPyResult, LPyCompare: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode1 := PyDelphiWrapper.Wrap(Node1); + LPyNode2 := PyDelphiWrapper.Wrap(Node2); + LPyCompare := CreateVarParam(PyDelphiWrapper, Compare); + LVarParam := PythonToDelphi(LPyCompare) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(5); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode1); + PyTuple_SetItem(LPyTuple, 2, LPyNode2); + PyTuple_SetItem(LPyTuple, 3, PyLong_FromLong(Data)); + PyTuple_SetItem(LPyTuple, 4, LPyCompare); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + Compare := PyLong_AsLong(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVHintEventHandler } + +constructor TTVHintEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVHintEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVHintEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVHintEvent); +end; + +procedure TTVHintEventHandler.DoEvent(Sender: TObject; const Node: TTreeNode; + var Hint: String); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyHint: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyHint := CreateVarParam(PyDelphiWrapper, Hint); + LVarParam := PythonToDelphi(LPyHint) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, LPyHint); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + Hint := PyObjectAsString(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCustomDrawEventHandler } + +constructor TTVCustomDrawEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCustomDrawEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCustomDrawEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCustomDrawEvent); +end; + +procedure TTVCustomDrawEventHandler.DoEvent(Sender: TCustomTreeView; + const ARect: TRect; var DefaultDraw: Boolean); +var + LPyObject, LPyRect, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyRect := WrapRect(PyDelphiWrapper, ARect); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyRect); + PyTuple_SetItem(LPyTuple, 2, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCustomDrawItemEventHandler } + +constructor TTVCustomDrawItemEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCustomDrawItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCustomDrawItemEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCustomDrawItemEvent); +end; + +procedure TTVCustomDrawItemEventHandler.DoEvent(Sender: TCustomTreeView; + Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVAdvancedCustomDrawEventHandler } + +constructor TTVAdvancedCustomDrawEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVAdvancedCustomDrawEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVAdvancedCustomDrawEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVAdvancedCustomDrawEvent); +end; + +procedure TTVAdvancedCustomDrawEventHandler.DoEvent(Sender: TCustomTreeView; + const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean); +var + LPyObject, LPyRect, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyRect := WrapRect(PyDelphiWrapper, ARect); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyRect); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStageToPython(Stage)); + PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVAdvancedCustomDrawItemEventHandler } + +constructor TTVAdvancedCustomDrawItemEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVAdvancedCustomDrawItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVAdvancedCustomDrawItemEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVAdvancedCustomDrawItemEvent); +end; + +procedure TTVAdvancedCustomDrawItemEventHandler.DoEvent(Sender: TCustomTreeView; + Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; + var PaintImages, DefaultDraw: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyPaintImages, LPyDefaultDraw: PPyObject; + LVarPaintImages, LVarDefaultDraw: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyPaintImages := CreateVarParam(PyDelphiWrapper, PaintImages); + LVarPaintImages := PythonToDelphi(LPyPaintImages) as TPyDelphiVarParameter; + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarDefaultDraw := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(6); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStageToPython(Stage)); + PyTuple_SetItem(LPyTuple, 4, LPyPaintImages); + PyTuple_SetItem(LPyTuple, 5, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + PaintImages := PyObject_IsTrue(LVarPaintImages.Value) = 1; + DefaultDraw := PyObject_IsTrue(LVarDefaultDraw.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCreateNodeClassEventHandler } + +constructor TTVCreateNodeClassEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCreateNodeClassEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCreateNodeClassEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCreateNodeClassEvent); +end; + +procedure TTVCreateNodeClassEventHandler.DoEvent(Sender: TCustomTreeView; + var NodeClass: TTreeNodeClass); +var + LPyObject, LPyTuple, LPyResult, LPyNodeClass: PPyObject; + LVarParam: TPyDelphiVarParameter; + LClass: TClass; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNodeClass := CreateVarParam(PyDelphiWrapper, NodeClass); + LVarParam := PythonToDelphi(LPyNodeClass) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNodeClass); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + + LClass := TPyDelphiObjectClass( + PythonToPythonType(LVarParam.Value).PyObjectClass).DelphiObjectClass; + + NodeClass := TTreeNodeClass(LClass); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCheckStateChangedEventHandler } + +constructor TTVCheckStateChangedEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCheckStateChangedEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCheckStateChangedEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCheckStateChangedEvent); +end; + +procedure TTVCheckStateChangedEventHandler.DoEvent(Sender: TCustomTreeView; + Node: TTreeNode; CheckState: TNodeCheckState); +var + LPyObject, LPyNode, LPyTuple, LPyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, NodeCheckStateToPython(CheckState)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TTVCheckStateChangingEventHandler } + +constructor TTVCheckStateChangingEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TTVCheckStateChangingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TTVCheckStateChangingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTVCheckStateChangingEvent); +end; + +procedure TTVCheckStateChangingEventHandler.DoEvent(Sender: TCustomTreeView; + Node: TTreeNode; NewCheckState, OldCheckState: TNodeCheckState; + var AllowChange: Boolean); +var + LPyObject, LPyNode, LPyTuple, LPyResult, LPyAllowChange: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyNode := PyDelphiWrapper.Wrap(Node); + LPyAllowChange := CreateVarParam(PyDelphiWrapper, AllowChange); + LVarParam := PythonToDelphi(LPyAllowChange) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(5); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyNode); + PyTuple_SetItem(LPyTuple, 2, NodeCheckStateToPython(NewCheckState)); + PyTuple_SetItem(LPyTuple, 3, NodeCheckStateToPython(OldCheckState)); + PyTuple_SetItem(LPyTuple, 4, LPyAllowChange); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowChange := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TLVDeletedEventHandler } + +constructor TLVDeletedEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVDeletedEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TLVDeletedEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVDeletedEvent); +end; + +procedure TLVDeletedEventHandler.DoEvent(Sender: TObject; Item: TListItem); +var + LPyObject, LPyItem, LPyTuple, LPyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TLVEditingEventHandler } + +constructor TLVEditingEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVEditingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TLVEditingEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVEditingEvent); +end; + +procedure TLVEditingEventHandler.DoEvent(Sender: TObject; Item: TListItem; + var AllowEdit: Boolean); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyAllowEdit: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyAllowEdit := CreateVarParam(PyDelphiWrapper, AllowEdit); + LVarParam := PythonToDelphi(LPyAllowEdit) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, LPyAllowEdit); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowEdit := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TLVEditedEventHandler } + +constructor TLVEditedEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVEditedEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TLVEditedEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVEditedEvent); +end; + +procedure TLVEditedEventHandler.DoEvent(Sender: TObject; Item: TListItem; + var S: string); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyS: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyS := CreateVarParam(PyDelphiWrapper, S); + LVarParam := PythonToDelphi(LPyS) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, LPyS); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + S := PyObjectAsString(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{$IFNDEF FPC} -function TPyDelphiPageControl.ScrollTabs_Wrapper( - args: PPyObject): PPyObject; +{ TLVChangeEventHandler } + +constructor TLVChangeEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); var - delta: Integer; + LMethod: TMethod; begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, 'i:ScrollTabs',@delta ) <> 0 then begin - DelphiObject.ScrollTabs(delta); - Result := ReturnNone; - end else - Result := nil; - end; + inherited; + LMethod.Code := @TLVChangeEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -{$ENDIF FPC} -function TPyDelphiPageControl.SelectNextPage_Wrapper( - args: PPyObject): PPyObject; -// procedure SelectNextPage(GoForward: Boolean; CheckTabVisible: Boolean = True); +class function TLVChangeEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVChangeEvent); +end; + +procedure TLVChangeEventHandler.DoEvent(Sender: TObject; Item: TListItem; + Change: TItemChange); var - _pGoForward, _pCheckTabVisible: PPyObject; + LPyObject, LPyItem, LPyTuple, LPyResult: PPyObject; begin - // We adjust the transmitted self argument - Adjust(@Self); - with GetPythonEngine do begin - if PyArg_ParseTuple( args, 'OO:SelectNextPage',@_pGoForward, @_pCheckTabVisible ) <> 0 then begin - DelphiObject.SelectNextPage(PyObject_IsTrue(_pGoForward)<>0, PyObject_IsTrue(_pCheckTabVisible)<>0); - Result := ReturnNone; - end else - Result := nil; - end; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, ItemChangeToPython(Change)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; +{ TLVChangingEventHandler } + +constructor TLVChangingEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVChangingEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -procedure TPyDelphiPageControl.SetDelphiObject(const Value: TPageControl); +class function TLVChangingEventHandler.GetTypeInfo: PTypeInfo; begin - inherited DelphiObject := Value; + Result := System.TypeInfo(TLVChangingEvent); end; -function TPyDelphiPageControl.Set_ActivePage(AValue: PPyObject; - AContext: Pointer): integer; +procedure TLVChangingEventHandler.DoEvent(Sender: TObject; Item: TListItem; + Change: TItemChange; var AllowChange: Boolean); var - _object : TObject; + LPyObject, LPyItem, LPyTuple, LPyResult, LPyAllowChange: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'ActivePage', TTabSheet, _object) then - begin - Self.DelphiObject.ActivePage := TTabSheet(_object); - Result := 0; - end - else - Result := -1; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyAllowChange := CreateVarParam(PyDelphiWrapper, AllowChange); + LVarParam := PythonToDelphi(LPyAllowChange) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, ItemChangeToPython(Change)); + PyTuple_SetItem(LPyTuple, 3, LPyAllowChange); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + AllowChange := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -function TPyDelphiPageControl.Set_ActivePageIndex(AValue: PPyObject; - AContext: Pointer): integer; +{ TLVColumnClickEventHandler } + +constructor TLVColumnClickEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); var - _value : Integer; + LMethod: TMethod; begin - Adjust(@Self); - if CheckIntAttribute(AValue, 'ActivePageIndex', _value) then - begin - DelphiObject.ActivePageIndex := _value; - Result := 0; - end - else - Result := -1; + inherited; + LMethod.Code := @TLVColumnClickEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiPageControl.TabRect_Wrapper(args: PPyObject): PPyObject; +class function TLVColumnClickEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVColumnClickEvent); +end; + +procedure TLVColumnClickEventHandler.DoEvent(Sender: TObject; + Column: TListColumn); var - idx: Integer; + LPyObject, LPyColumn, LPyTuple, LPyResult: PPyObject; begin - // We adjust the transmitted self argument - Adjust(@Self); - if GetPythonEngine.PyArg_ParseTuple( args, 'i:TabRect',@idx ) <> 0 then begin - Result := WrapRect(PyDelphiWrapper, DelphiObject.TabRect(idx)); - end else - Result := nil; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyColumn := PyDelphiWrapper.Wrap(Column); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyColumn); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiTabSheet } +{ TLVColumnRClickEventHandler } -class function TPyDelphiTabSheet.DelphiObjectClass: TClass; +constructor TLVColumnRClickEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TTabSheet; + inherited; + LMethod.Code := @TLVColumnRClickEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiTabSheet.GetDelphiObject: TTabSheet; +class function TLVColumnRClickEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TTabSheet(inherited DelphiObject); + Result := System.TypeInfo(TLVColumnRClickEvent); end; -function TPyDelphiTabSheet.Get_PageControl(AContext: Pointer): PPyObject; +procedure TLVColumnRClickEventHandler.DoEvent(Sender: TObject; + Column: TListColumn; Point: TPoint); +var + LPyObject, LPyColumn, LPyPoint, LPyTuple, LPyResult: PPyObject; begin - Adjust(@Self); - Result := Wrap(DelphiObject.PageControl); + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyColumn := PyDelphiWrapper.Wrap(Column); + LPyPoint := WrapPoint(PyDelphiWrapper, Point); + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyColumn); + PyTuple_SetItem(LPyTuple, 2, LPyPoint); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -function TPyDelphiTabSheet.Get_TabIndex(AContext: Pointer): PPyObject; +{ TLVCompareEventHandler } + +constructor TLVCompareEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.TabIndex); + inherited; + LMethod.Code := @TLVCompareEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -class procedure TPyDelphiTabSheet.RegisterGetSets(PythonType: TPythonType); +class function TLVCompareEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVCompareEvent); +end; + +procedure TLVCompareEventHandler.DoEvent(Sender: TObject; Item1, + Item2: TListItem; Data: Integer; var Compare: Integer); +var + LPyObject, LPyItem1, LPyItem2, LPyTuple, LPyResult, LPyCompare: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem1 := PyDelphiWrapper.Wrap(Item1); + LPyItem2 := PyDelphiWrapper.Wrap(Item2); + LPyCompare := CreateVarParam(PyDelphiWrapper, Compare); + LVarParam := PythonToDelphi(LPyCompare) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(5); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem1); + PyTuple_SetItem(LPyTuple, 2, LPyItem2); + PyTuple_SetItem(LPyTuple, 3, PyLong_FromLong(Data)); + PyTuple_SetItem(LPyTuple, 4, LPyCompare); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + Compare := PyLong_AsLong(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TLVNotifyEventHandler } + +constructor TLVNotifyEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin inherited; - PythonType.AddGetSet('TabIndex', @TPyDelphiTabSheet.Get_TabIndex, nil, - 'Indicates the position of the tab sheet in the set of visible tabs in a TPageControl object.', nil); - PythonType.AddGetSet('PageControl', @TPyDelphiTabSheet.Get_PageControl, @TPyDelphiTabSheet.Set_PageControl, - 'Indicates the page control object that contains the tab sheet.', nil); + LMethod.Code := @TLVNotifyEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -procedure TPyDelphiTabSheet.SetDelphiObject(const Value: TTabSheet); +class function TLVNotifyEventHandler.GetTypeInfo: PTypeInfo; begin - inherited DelphiObject := Value; + Result := System.TypeInfo(TLVNotifyEvent); end; -function TPyDelphiTabSheet.Set_PageControl(AValue: PPyObject; - AContext: Pointer): integer; +procedure TLVNotifyEventHandler.DoEvent(Sender: TObject; Item: TListItem); var - _object : TObject; + LPyObject, LPyItem, LPyTuple, LPyResult: PPyObject; begin - Adjust(@Self); - if CheckObjAttribute(AValue, 'PageControl', TPageControl, _object) then - begin - Self.DelphiObject.PageControl := TPageControl(_object); - Result := 0; - end - else - Result := -1; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPagesAccess } +{ TLVSelectItemEventHandler } -class function TPagesAccess.ExpectedContainerClass: TClass; +constructor TLVSelectItemEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TPageControl; + inherited; + LMethod.Code := @TLVSelectItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPagesAccess.GetContainer: TPageControl; +class function TLVSelectItemEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TPageControl(inherited Container); + Result := System.TypeInfo(TLVSelectItemEvent); end; -function TPagesAccess.GetItem(AIndex: Integer): PPyObject; +procedure TLVSelectItemEventHandler.DoEvent(Sender: TObject; Item: TListItem; + Selected: Boolean); +var + LPyObject, LPyItem, LPyTuple, LPyResult: PPyObject; begin - Result := Wrap( Container.Pages[AIndex] ); + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, PyBool_FromLong(Ord(Selected))); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -function TPagesAccess.GetSize: Integer; +{ TLVCheckedItemEventHandler } + +constructor TLVCheckedItemEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := Container.PageCount; + inherited; + LMethod.Code := @TLVCheckedItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPagesAccess.IndexOf(AValue: PPyObject): Integer; +class function TLVCheckedItemEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVCheckedItemEvent); +end; + +procedure TLVCheckedItemEventHandler.DoEvent(Sender: TObject; Item: TListItem); var - i : Integer; - S : string; - _obj : TPyObject; - _value : TObject; - _ctrl : TTabSheet; + LPyObject, LPyItem, LPyTuple, LPyResult: PPyObject; begin - Result := -1; - with GetPythonEngine do - begin - if PyUnicode_Check(AValue) then - begin - S := PyUnicodeAsString(AValue); - for i := 0 to Container.PageCount-1 do - if SameText( Container.Pages[i].Name, S) then - begin - Result := i; - Break; - end; - end - else if IsDelphiObject(AValue) then - begin - _obj := PythonToDelphi(AValue); - if _obj is TPyDelphiObject then - begin - _value := TPyDelphiObject(_obj).DelphiObject; - if _value is TTabSheet then - begin - _ctrl := TTabSheet(_value); - for i := 0 to Container.PageCount-1 do - if Container.Pages[i] = _ctrl then - begin - Result := i; - Break; - end; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TLVDrawItemEventHandler } + +constructor TLVDrawItemEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVDrawItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TLVDrawItemEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVDrawItemEvent); +end; + +procedure TLVDrawItemEventHandler.DoEvent(Sender: TCustomListView; + Item: TListItem; Rect: TRect; State: TOwnerDrawState); +var + LPyObject, LPyItem, LPyRect, LPyTuple, LPyResult: PPyObject; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyRect := WrapRect(PyDelphiWrapper, Rect); + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, LPyRect); + PyTuple_SetItem(LPyTuple, 3, OwnerDrawStateToPython(State)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TLVCustomDrawEventHandler } + +constructor TLVCustomDrawEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVCustomDrawEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TLVCustomDrawEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVCustomDrawEvent); +end; + +procedure TLVCustomDrawEventHandler.DoEvent(Sender: TCustomListView; + const ARect: TRect; var DefaultDraw: Boolean); +var + LPyObject, LPyRect, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyRect := WrapRect(PyDelphiWrapper, ARect); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyRect); + PyTuple_SetItem(LPyTuple, 2, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; end; + finally + Py_DECREF(LPyTuple); end; + CheckError(); end; - end; end; -class function TPagesAccess.Name: string; +{ TLVCustomDrawItemEventHandler } + +constructor TLVCustomDrawItemEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; +begin + inherited; + LMethod.Code := @TLVCustomDrawItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TLVCustomDrawItemEventHandler.GetTypeInfo: PTypeInfo; begin - Result := 'Pages'; + Result := System.TypeInfo(TLVCustomDrawItemEvent); end; -class function TPagesAccess.SupportsIndexOf: Boolean; +procedure TLVCustomDrawItemEventHandler.DoEvent(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - Result := True; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TTabChangingEventHandler } +{ TLVCustomDrawSubItemEventHandler } -constructor TTabChangingEventHandler.Create( +constructor TLVCustomDrawSubItemEventHandler.Create( PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); var - Method : TMethod; + LMethod: TMethod; begin inherited; - Method.Code := @TTabChangingEventHandler.DoEvent; - Method.Data := Self; - SetMethodProp(Component, PropertyInfo, Method); + LMethod.Code := @TLVCustomDrawSubItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -procedure TTabChangingEventHandler.DoEvent(Sender: TObject; - var AllowChange: Boolean); -Var - PyObject, PyTuple, PyResult, PyAllowChange: PPyObject; - _varParam : TPyDelphiVarParameter; +class function TLVCustomDrawSubItemEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TLVCustomDrawSubItemEvent); +end; + +procedure TLVCustomDrawSubItemEventHandler.DoEvent(Sender: TCustomListView; + Item: TListItem; SubItem: Integer; State: TCustomDrawState; + var DefaultDraw: Boolean); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; begin Assert(Assigned(PyDelphiWrapper)); - if Assigned(Callable) and PythonOK then - with GetPythonEngine do begin - PyObject := PyDelphiWrapper.Wrap(Sender); - PyAllowChange := CreateVarParam(PyDelphiWrapper, AllowChange); - _varParam := PythonToDelphi(PyAllowChange) as TPyDelphiVarParameter; - PyTuple := PyTuple_New(2); - GetPythonEngine.PyTuple_SetItem(PyTuple, 0, PyObject); - GetPythonEngine.PyTuple_SetItem(PyTuple, 1, PyAllowChange); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(5); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(SubItem)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 4, LPyDefaultDraw); try - PyResult := PyObject_CallObject(Callable, PyTuple); - if Assigned(PyResult) then - begin - Py_DECREF(PyResult); - AllowChange := PyObject_IsTrue(_varParam.Value) = 1; + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; end; finally - Py_DECREF(PyTuple); + Py_DECREF(LPyTuple); end; - CheckError; + CheckError(); end; end; -class function TTabChangingEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TTabChangingEvent); -end; - -{ TPyDelphiTrackBar } +{ TLVAdvancedCustomDrawEventHandler } -class function TPyDelphiTrackBar.DelphiObjectClass: TClass; +constructor TLVAdvancedCustomDrawEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TTrackBar; + inherited; + LMethod.Code := @TLVAdvancedCustomDrawEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiTrackBar.GetDelphiObject: TTrackBar; +class function TLVAdvancedCustomDrawEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TTrackBar(inherited DelphiObject); + Result := System.TypeInfo(TLVAdvancedCustomDrawEvent); end; -procedure TPyDelphiTrackBar.SetDelphiObject(const Value: TTrackBar); +procedure TLVAdvancedCustomDrawEventHandler.DoEvent(Sender: TCustomListView; + const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean); +var + LPyObject, LPyRect, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyRect := WrapRect(PyDelphiWrapper, ARect); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyRect); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStageToPython(Stage)); + PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiToolButton } +{ TLVAdvancedCustomDrawItemEventHandler } -class function TPyDelphiToolButton.DelphiObjectClass: TClass; +constructor TLVAdvancedCustomDrawItemEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TToolButton; + inherited; + LMethod.Code := @TLVAdvancedCustomDrawItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiToolButton.GetDelphiObject: TToolButton; +class function TLVAdvancedCustomDrawItemEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TToolButton(inherited DelphiObject); + Result := System.TypeInfo(TLVAdvancedCustomDrawItemEvent); end; -procedure TPyDelphiToolButton.SetDelphiObject(const Value: TToolButton); +procedure TLVAdvancedCustomDrawItemEventHandler.DoEvent(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; + var DefaultDraw: Boolean); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarDefaultDraw: TPyDelphiVarParameter; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarDefaultDraw := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(5); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStageToPython(Stage)); + PyTuple_SetItem(LPyTuple, 4, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarDefaultDraw.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TToolbarAccess } +{ TLVAdvancedCustomDrawSubItemEventHandler } -class function TToolbarAccess.ExpectedContainerClass: TClass; +constructor TLVAdvancedCustomDrawSubItemEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TToolbar; + inherited; + LMethod.Code := @TLVAdvancedCustomDrawSubItemEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TToolbarAccess.GetContainer: TToolbar; +class function TLVAdvancedCustomDrawSubItemEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TToolbar(inherited Container); + Result := System.TypeInfo(TLVAdvancedCustomDrawSubItemEvent); end; -function TToolbarAccess.GetItem(AIndex: Integer): PPyObject; +procedure TLVAdvancedCustomDrawSubItemEventHandler.DoEvent( + Sender: TCustomListView; Item: TListItem; SubItem: Integer; + State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyDefaultDraw: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - Result := Wrap( Container.Buttons[AIndex] ); + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyDefaultDraw := CreateVarParam(PyDelphiWrapper, DefaultDraw); + LVarParam := PythonToDelphi(LPyDefaultDraw) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(6); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(SubItem)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 4, CustomDrawStageToPython(Stage)); + PyTuple_SetItem(LPyTuple, 5, LPyDefaultDraw); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + DefaultDraw := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -function TToolbarAccess.GetSize: Integer; -begin - Result := Container.ButtonCount; -end; +{ TLVOwnerDataEventHandler } -function TToolbarAccess.IndexOf(AValue: PPyObject): Integer; +constructor TLVOwnerDataEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); var - _obj: TPyObject; - _item: TToolButton; + LMethod: TMethod; begin - Result := -1; - with GetPythonEngine do - begin - if IsDelphiObject(AValue) then - begin - _obj := PythonToDelphi(AValue); - if (_obj is TPyDelphiObject) and - (TPyDelphiObject(_obj).DelphiObject is TToolButton) then - begin - _item := TToolButton(TPyDelphiObject(_obj).DelphiObject); - Result := _item.Index; - end; - end; - end; + inherited; + LMethod.Code := @TLVOwnerDataEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -class function TToolbarAccess.Name: string; +class function TLVOwnerDataEventHandler.GetTypeInfo: PTypeInfo; begin - Result := 'Toolbar.Buttons' + Result := System.TypeInfo(TLVOwnerDataEvent); end; -class function TToolbarAccess.SupportsIndexOf: Boolean; +procedure TLVOwnerDataEventHandler.DoEvent(Sender: TObject; Item: TListItem); +var + LPyObject, LPyItem, LPyTuple, LPyResult: PPyObject; begin - Result := True; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiToolbar } +{ TLVOwnerDataFindEventHandler } -class function TPyDelphiToolbar.DelphiObjectClass: TClass; +constructor TLVOwnerDataFindEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TToolbar; + inherited; + LMethod.Code := @TLVOwnerDataFindEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -class function TPyDelphiToolbar.GetContainerAccessClass: TContainerAccessClass; +class function TLVOwnerDataFindEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TToolbarAccess; + Result := System.TypeInfo(TLVOwnerDataFindEvent); end; -function TPyDelphiToolbar.GetDelphiObject: TToolbar; +procedure TLVOwnerDataFindEventHandler.DoEvent(Sender: TObject; Find: TItemFind; + const FindString: string; const FindPosition: TPoint; FindData: TCustomData; + StartIndex: Integer; Direction: TSearchDirection; Wrap: Boolean; + var Index: Integer); +var + LPyObject, LPyTuple, LPyResult, LPyIndex: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - Result := TToolbar(inherited DelphiObject); + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyIndex := CreateVarParam(PyDelphiWrapper, Index); + LVarParam := PythonToDelphi(LPyIndex) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(9); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, ItemFindToPython(Find)); + PyTuple_SetItem(LPyTuple, 2, PyUnicodeFromString(FindString)); + PyTuple_SetItem(LPyTuple, 3, WrapPoint(PyDelphiWrapper, FindPosition)); + PyTuple_SetItem(LPyTuple, 4, PyLong_FromLong(NativeInt(FindData))); + PyTuple_SetItem(LPyTuple, 5, PyLong_FromLong(StartIndex)); + PyTuple_SetItem(LPyTuple, 6, SearchDirectionToPython(Direction)); + PyTuple_SetItem(LPyTuple, 7, PyBool_FromLong(Ord(Wrap))); + PyTuple_SetItem(LPyTuple, 8, LPyIndex); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + Index := PyLong_AsLong(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -function TPyDelphiToolbar.Get_Buttons(AContext: Pointer): PPyObject; -begin - Adjust(@Self); - Result := PyDelphiWrapper.DefaultContainerType.CreateInstance; - with PythonToDelphi(Result) as TPyDelphiContainer do - Setup(Self.PyDelphiWrapper, TToolbarAccess.Create(Self.PyDelphiWrapper, - Self.DelphiObject)); -end; +{ TLVOwnerDataHintEventHandler } -function TPyDelphiToolbar.Get_ButtonCount(AContext: Pointer): PPyObject; +constructor TLVOwnerDataHintEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Adjust(@Self); - Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ButtonCount); + inherited; + LMethod.Code := @TLVOwnerDataHintEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -class procedure TPyDelphiToolbar.RegisterGetSets(PythonType: TPythonType); +class function TLVOwnerDataHintEventHandler.GetTypeInfo: PTypeInfo; begin - with PythonType do - begin - AddGetSet('ButtonCount', @TPyDelphiToolbar.Get_ButtonCount, nil, - 'Indicates the number of buttons in the toolbar.', nil); - AddGetSet('Actions', @TPyDelphiToolbar.Get_Buttons, nil, - 'Lists the buttons of the toolbar.', nil); - end; + Result := System.TypeInfo(TLVOwnerDataHintEvent); end; -procedure TPyDelphiToolbar.SetDelphiObject(const Value: TToolbar); +procedure TLVOwnerDataHintEventHandler.DoEvent(Sender: TObject; StartIndex, + EndIndex: Integer); +var + LPyObject, LPyTuple, LPyResult: PPyObject; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, PyLong_FromLong(StartIndex)); + PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(EndIndex)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiCustomCustomTabControl } +{ TLVOwnerDataStateChangeEventHandler } -class function TPyDelphiCustomCustomTabControl.DelphiObjectClass: TClass; +constructor TLVOwnerDataStateChangeEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TCustomTabControl; + inherited; + LMethod.Code := @TLVOwnerDataStateChangeEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiCustomCustomTabControl.GetDelphiObject: TCustomTabControl; +class function TLVOwnerDataStateChangeEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TCustomTabControl(inherited DelphiObject); + Result := System.TypeInfo(TLVOwnerDataStateChangeEvent); end; -procedure TPyDelphiCustomCustomTabControl.SetDelphiObject( - const Value: TCustomTabControl); +procedure TLVOwnerDataStateChangeEventHandler.DoEvent(Sender: TObject; + StartIndex, EndIndex: Integer; OldState, NewState: TItemStates); +var + LPyObject, LPyTuple, LPyResult: PPyObject; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyTuple := PyTuple_New(5); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, PyLong_FromLong(StartIndex)); + PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(EndIndex)); + PyTuple_SetItem(LPyTuple, 3, ItemStatesToPython(OldState)); + PyTuple_SetItem(LPyTuple, 4, ItemStatesToPython(NewState)); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then + Py_DECREF(LPyResult); + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiCustomTabControl } +{ TLVSubItemImageEventHandler } -class function TPyDelphiCustomTabControl.DelphiObjectClass: TClass; +constructor TLVSubItemImageEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TTabControl; + inherited; + LMethod.Code := @TLVSubItemImageEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiCustomTabControl.GetDelphiObject: TTabControl; +class function TLVSubItemImageEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TTabControl(inherited DelphiObject); + Result := System.TypeInfo(TLVSubItemImageEvent); end; -procedure TPyDelphiCustomTabControl.SetDelphiObject(const Value: TTabControl); +procedure TLVSubItemImageEventHandler.DoEvent(Sender: TObject; Item: TListItem; + SubItem: Integer; var ImageIndex: Integer); +var + LPyObject, LPyItem, LPySubItem, LPyTuple, LPyResult, LPyImageIndex: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPySubItem := PyLong_FromLong(SubItem); + LPyImageIndex := CreateVarParam(PyDelphiWrapper, ImageIndex); + LVarParam := PythonToDelphi(LPyImageIndex) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(4); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, LPySubItem); + PyTuple_SetItem(LPyTuple, 3, LPyImageIndex); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + ImageIndex := PyLong_AsLong(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiCustomStatusBar } +{ TLVInfoTipEventHandler } -class function TPyDelphiCustomStatusBar.DelphiObjectClass: TClass; +constructor TLVInfoTipEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TCustomStatusBar; + inherited; + LMethod.Code := @TLVInfoTipEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiCustomStatusBar.GetDelphiObject: TCustomStatusBar; +class function TLVInfoTipEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TCustomStatusBar(inherited DelphiObject); + Result := System.TypeInfo(TLVInfoTipEvent); end; -procedure TPyDelphiCustomStatusBar.SetDelphiObject( - const Value: TCustomStatusBar); +procedure TLVInfoTipEventHandler.DoEvent(Sender: TObject; Item: TListItem; + var InfoTip: string); +var + LPyObject, LPyItem, LPyTuple, LPyResult, LPyInfoTip: PPyObject; + LVarParam: TPyDelphiVarParameter; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItem := PyDelphiWrapper.Wrap(Item); + LPyInfoTip := CreateVarParam(PyDelphiWrapper, InfoTip); + LVarParam := PythonToDelphi(LPyInfoTip) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItem); + PyTuple_SetItem(LPyTuple, 2, LPyInfoTip); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + InfoTip := PyObjectAsString(LVarParam.Value); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; -{ TPyDelphiStatusBar } +{ TLVCreateItemClassEventHandler } -class function TPyDelphiStatusBar.DelphiObjectClass: TClass; +constructor TLVCreateItemClassEventHandler.Create( + PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod: TMethod; begin - Result := TStatusBar; + inherited; + LMethod.Code := @TLVCreateItemClassEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); end; -function TPyDelphiStatusBar.GetDelphiObject: TStatusBar; +class function TLVCreateItemClassEventHandler.GetTypeInfo: PTypeInfo; begin - Result := TStatusBar(inherited DelphiObject); + Result := System.TypeInfo(TLVCreateItemClassEvent); end; -procedure TPyDelphiStatusBar.SetDelphiObject(const Value: TStatusBar); +procedure TLVCreateItemClassEventHandler.DoEvent(Sender: TCustomListView; + var ItemClass: TListItemClass); +var + LPyObject, LPyTuple, LPyResult, LPyItemClass: PPyObject; + LVarParam: TPyDelphiVarParameter; + LClass: TClass; begin - inherited DelphiObject := Value; + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyItemClass := CreateVarParam(PyDelphiWrapper, ItemClass); + LVarParam := PythonToDelphi(LPyItemClass) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(2); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyItemClass); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + + LClass := TPyDelphiObjectClass( + PythonToPythonType(LVarParam.Value).PyObjectClass).DelphiObjectClass; + + ItemClass := TListItemClass(LClass); + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; end; initialization @@ -936,4 +3679,5 @@ initialization {$IFNDEF FPC} System.Classes.RegisterClasses([TDateTimePicker]); {$ENDIF FPC} + end. diff --git a/Source/vcl/WrapVclControls.pas b/Source/vcl/WrapVclControls.pas index c8171dc0..acc42e23 100644 --- a/Source/vcl/WrapVclControls.pas +++ b/Source/vcl/WrapVclControls.pas @@ -25,7 +25,8 @@ interface Vcl.Controls, PythonEngine, WrapDelphi, - WrapDelphiClasses; + WrapDelphiClasses, + WrapVclImgList; type { @@ -137,6 +138,45 @@ TPyDelphiCustomControl = class (TPyDelphiControl) property DelphiObject: TCustomControl read GetDelphiObject write SetDelphiObject; end; + TPyDelphiCustomListControl = class (TPyDelphiWinControl) + private + function GetDelphiObject: TCustomListControl; + procedure SetDelphiObject(const Value: TCustomListControl); + protected + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TCustomListControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiCustomMultiListControl = class (TPyDelphiCustomListControl) + private + function GetDelphiObject: TCustomMultiSelectListControl; + procedure SetDelphiObject(const Value: TCustomMultiSelectListControl); + protected + public + class function DelphiObjectClass : TClass; override; + property DelphiObject: TCustomMultiSelectListControl read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiDragImageList = class (TPyDelphiCustomImageList) + private + function GetDelphiObject: TDragImageList; + procedure SetDelphiObject(const Value: TDragImageList); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TDragImageList read GetDelphiObject write SetDelphiObject; + end; + + TPyDelphiImageList = class (TPyDelphiDragImageList) + private + function GetDelphiObject: TImageList; + procedure SetDelphiObject(const Value: TImageList); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TImageList read GetDelphiObject write SetDelphiObject; + end; { TKeyPressEvent wrapper } TKeyPressEventHandler = class(TEventHandler) @@ -178,6 +218,15 @@ TMouseMoveEventHandler = class(TEventHandler) class function GetTypeInfo : PTypeInfo; override; end; + TContextPopupEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; MousePos: TPoint; var Handled: Boolean); + public + constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; + PropertyInfo : PPropInfo; Callable : PPyObject); override; + class function GetTypeInfo : PTypeInfo; override; + end; + implementation uses @@ -222,12 +271,18 @@ procedure TControlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiWinControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMultiListControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDragImageList); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageList); APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyPressEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); + + APyDelphiWrapper.EventHandlers.RegisterHandler(TContextPopupEventHandler); end; { TPyDelphiControl } @@ -880,6 +935,125 @@ class function TMouseMoveEventHandler.GetTypeInfo: PTypeInfo; Result := System.TypeInfo(TMouseMoveEvent); end; +{ TPyDelphiCustomListControl } + +class function TPyDelphiCustomListControl.DelphiObjectClass: TClass; +begin + Result := TCustomListControl; +end; + +function TPyDelphiCustomListControl.GetDelphiObject: TCustomListControl; +begin + Result := TCustomListControl(inherited DelphiObject); +end; + +procedure TPyDelphiCustomListControl.SetDelphiObject( + const Value: TCustomListControl); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiCustomMultiListControl } + +class function TPyDelphiCustomMultiListControl.DelphiObjectClass: TClass; +begin + Result := TCustomMultiSelectListControl; +end; + +function TPyDelphiCustomMultiListControl.GetDelphiObject: TCustomMultiSelectListControl; +begin + Result := TCustomMultiSelectListControl(inherited DelphiObject); +end; + +procedure TPyDelphiCustomMultiListControl.SetDelphiObject( + const Value: TCustomMultiSelectListControl); +begin + inherited DelphiObject := Value; +end; + +{ TContextPopupEventHandler } + +constructor TContextPopupEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); +var + LMethod : TMethod; +begin + inherited; + LMethod.Code := @TContextPopupEventHandler.DoEvent; + LMethod.Data := Self; + SetMethodProp(Component, PropertyInfo, LMethod); +end; + +class function TContextPopupEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TContextPopupEvent); +end; + + +procedure TContextPopupEventHandler.DoEvent(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); +var + LPyObject, LPyMousePos, LPyTuple, LPyResult, LPyHandled: PPyObject; + LVarParam: TPyDelphiVarParameter; +begin + Assert(Assigned(PyDelphiWrapper)); + if Assigned(Callable) and PythonOK() then + with GetPythonEngine() do begin + LPyObject := PyDelphiWrapper.Wrap(Sender); + LPyMousePos := WrapPoint(PyDelphiWrapper, MousePos); + LPyHandled := CreateVarParam(PyDelphiWrapper, Handled); + LVarParam := PythonToDelphi(LPyHandled) as TPyDelphiVarParameter; + LPyTuple := PyTuple_New(3); + PyTuple_SetItem(LPyTuple, 0, LPyObject); + PyTuple_SetItem(LPyTuple, 1, LPyMousePos); + PyTuple_SetItem(LPyTuple, 2, LPyHandled); + try + LPyResult := PyObject_CallObject(Callable, LPyTuple); + if Assigned(LPyResult) then begin + Py_DECREF(LPyResult); + Handled := PyObject_IsTrue(LVarParam.Value) = 1; + end; + finally + Py_DECREF(LPyTuple); + end; + CheckError(); + end; +end; + +{ TPyDelphiDragImageList } + +class function TPyDelphiDragImageList.DelphiObjectClass: TClass; +begin + Result := TDragImageList; +end; + +function TPyDelphiDragImageList.GetDelphiObject: TDragImageList; +begin + Result := TDragImageList(inherited DelphiObject); +end; + +procedure TPyDelphiDragImageList.SetDelphiObject(const Value: TDragImageList); +begin + inherited DelphiObject := Value; +end; + +{ TPyDelphiImageList } + +class function TPyDelphiImageList.DelphiObjectClass: TClass; +begin + Result := TImageList; +end; + +function TPyDelphiImageList.GetDelphiObject: TImageList; +begin + Result := TImageList(inherited DelphiObject); +end; + +procedure TPyDelphiImageList.SetDelphiObject(const Value: TImageList); +begin + inherited DelphiObject := Value; +end; + initialization RegisteredUnits.Add(TControlsRegistration.Create); end. diff --git a/Source/vcl/WrapVclDialogs.pas b/Source/vcl/WrapVclDialogs.pas index ed205e7c..8d7c88a9 100644 --- a/Source/vcl/WrapVclDialogs.pas +++ b/Source/vcl/WrapVclDialogs.pas @@ -77,13 +77,13 @@ implementation { Global Functions } function ShowMessage_Wrapper(pself, args: PPyObject): PPyObject; cdecl; var - LMsg: PAnsiChar; + LPyMsg: PPyObject; begin with GetPythonEngine do begin - if PyArg_ParseTuple(args, 's:ShowMessage', @LMsg) <> 0 then + if PyArg_ParseTuple(args, 'O:ShowMessage', @LPyMsg) <> 0 then begin - ShowMessage(string(LMsg)); + ShowMessage(PyObjectAsString(LPyMsg)); Result := GetPythonEngine.ReturnNone; end else Result := nil; diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index ad62a6cf..57b7e3ad 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -1414,7 +1414,7 @@ class procedure TPyDelphiMonitor.RegisterGetSets(PythonType: TPythonType); AddGetSet('Handle', @TPyDelphiMonitor.Get_Handle, nil, 'Indicates the Windows handle for the monitor.', nil); AddGetSet('MonitorNum', @TPyDelphiMonitor.Get_MonitorNum, nil, - 'Specifies the index of the monitor in the global screen object’s Monitors list.', nil); + 'Specifies the index of the monitor in the global screen object''s Monitors list.', nil); AddGetSet('Left', @TPyDelphiMonitor.Get_Left, nil, 'Indicates the logical position of the left edge of the monitor.', nil); AddGetSet('Height', @TPyDelphiMonitor.Get_Height, nil, diff --git a/Source/vcl/WrapVclGraphics.pas b/Source/vcl/WrapVclGraphics.pas index cde54ed6..8859d75a 100644 --- a/Source/vcl/WrapVclGraphics.pas +++ b/Source/vcl/WrapVclGraphics.pas @@ -51,6 +51,8 @@ TPyDelphiGraphic = class(TPyDelphiPersistent) function Set_Transparent( AValue : PPyObject; AContext : Pointer) : integer; cdecl; function Set_Width( AValue : PPyObject; AContext : Pointer) : integer; cdecl; public + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets( PythonType : TPythonType ); override; class procedure RegisterMethods( PythonType : TPythonType ); override; @@ -101,6 +103,8 @@ TPyDelphiBitmap = class(TPyDelphiGraphic) function Set_TransparentColor( AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_TransparentMode( AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public + constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets( PythonType : TPythonType ); override; class procedure RegisterMethods( PythonType : TPythonType ); override; @@ -375,6 +379,13 @@ procedure TGraphicsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap { TPyDelphiGraphic } +constructor TPyDelphiGraphic.CreateWith(APythonType: TPythonType; + args: PPyObject); +begin + inherited; + DelphiObject := TGraphicClass(DelphiObjectClass()).Create(); +end; + class function TPyDelphiGraphic.DelphiObjectClass: TClass; begin Result := TGraphic; @@ -708,6 +719,16 @@ function TPyDelphiGraphic.Set_Width(AValue: PPyObject; { TPyDelphiBitmap } +constructor TPyDelphiBitmap.CreateWith(APythonType: TPythonType; + args: PPyObject); +var + LWidth, LHeight : Integer; +begin + inherited; + if APythonType.Engine.PyArg_ParseTuple(args, 'ii:Create', @LWidth, @LHeight) <> 0 then + DelphiObject.SetSize(LWidth, LHeight); +end; + class function TPyDelphiBitmap.DelphiObjectClass: TClass; begin Result := TBitmap; diff --git a/Source/vcl/WrapVclImgList.pas b/Source/vcl/WrapVclImgList.pas new file mode 100644 index 00000000..6a45f2bf --- /dev/null +++ b/Source/vcl/WrapVclImgList.pas @@ -0,0 +1,78 @@ +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) +{$I ..\Definition.Inc} + +unit WrapVclImgList; + +interface + +uses + System.Classes, System.SysUtils, Vcl.ImgList, + PythonEngine, WrapDelphi, WrapDelphiImageList; + +type + TPyDelphiCustomImageList = class (TPyDelphiBaseImageList) + private + function GetDelphiObject: TCustomImageList; + procedure SetDelphiObject(const Value: TCustomImageList); + public + class function DelphiObjectClass : TClass; override; + // Properties + property DelphiObject: TCustomImageList read GetDelphiObject write SetDelphiObject; + end; + +implementation + +{ Register the wrappers, the globals and the constants } +type + TVclImageListRegistration = class(TRegisteredUnit) + public + function Name : string; override; + procedure RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); override; + end; + +{ TVclImageListRegistration } + +function TVclImageListRegistration.Name: string; +begin + Result := 'VclImageList'; +end; + +procedure TVclImageListRegistration.RegisterWrappers( + APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomImageList); +end; + +{ TPyDelphiCustomImageList } + +class function TPyDelphiCustomImageList.DelphiObjectClass: TClass; +begin + Result := TCustomImageList; +end; + +function TPyDelphiCustomImageList.GetDelphiObject: TCustomImageList; +begin + Result := TCustomImageList(inherited DelphiObject); +end; + +procedure TPyDelphiCustomImageList.SetDelphiObject(const Value: TCustomImageList); +begin + inherited DelphiObject := Value; +end; + +initialization + RegisteredUnits.Add(TVclImageListRegistration.Create()); + +end. diff --git a/Source/vcl/WrapVclMedia.pas b/Source/vcl/WrapVclMedia.pas index f8ee1d55..1ce34d8a 100644 --- a/Source/vcl/WrapVclMedia.pas +++ b/Source/vcl/WrapVclMedia.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapVclMedia; interface diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index a5c3a850..202cec23 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapVclThemes; interface diff --git a/Source/vcl/WrapVclWinXCtrls.pas b/Source/vcl/WrapVclWinXCtrls.pas index 5d7c4bc6..f9bf1811 100644 --- a/Source/vcl/WrapVclWinXCtrls.pas +++ b/Source/vcl/WrapVclWinXCtrls.pas @@ -12,6 +12,7 @@ (**************************************************************************) {$I ..\Definition.Inc} + unit WrapVclWinXCtrls; interface From 8bb9b70182562ab868ac76a3f6a7147f8e93cb41 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 4 Oct 2023 15:41:31 +0300 Subject: [PATCH 059/174] Added class reference field test to WrapDelphiTest.pas. --- Tests/WrapDelphiTest.pas | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index ee6dffa7..ba562dc6 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -49,6 +49,7 @@ TTestRttiAccess = class ObjectField: TObject; RecordField: TTestRecord; InterfaceField: ITestInterface; + ClassRef: TClass; function GetData: TObject; procedure BuyFruits(AFruits: TFruits); procedure SellFruits(const AFruits: TFruitDynArray); @@ -61,6 +62,7 @@ TTestRttiAccess = class function SetStringField(const Value: string): string; overload; procedure PassVariantArray(const Value: Variant); function ClassRefParam(ClassRef: TPersistentClass): string; + class var ClassField: string; class function DoubleString(S: string): string; class function Square(I: Integer): Integer; static; end; @@ -133,6 +135,8 @@ TTestWrapDelphi = class(TObject) [Test] procedure TestClassRefParam; [Test] + procedure TestClassRefField; + [Test] procedure TestInheritance; [Test] procedure TestClassMethods; @@ -248,6 +252,12 @@ procedure TTestWrapDelphi.TestClassMethods; Assert.AreEqual(MainModule.TestSubclass.DoubleString('B'), 'BB'); end; +procedure TTestWrapDelphi.TestClassRefField; +begin + Rtti_Var.ClassRef := MainModule.TestRttiAccess; + Assert.AreEqual(TestRttiAccess.ClassRef, TTestRttiAccess); +end; + procedure TTestWrapDelphi.TestClassRefParam; begin Assert.AreEqual(Rtti_Var.ClassRefParam(MainModule.Collection), 'TCollection'); From e62bc011e98de2c5de6c1ab5d1cc2674b5b66db6 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 4 Oct 2023 22:20:47 +0300 Subject: [PATCH 060/174] ExposeFields and ExposeProperties added --- Source/WrapDelphi.pas | 383 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 353 insertions(+), 30 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index c085e037..1af78e5d 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -579,6 +579,12 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; AExcludedMethodNames: TArray = []); + class procedure ExposeFields(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedFieldNames: TArray = []); + class procedure ExposeProperties(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedPropertyNames: TArray = []); {$ENDIF EXTENDED_RTTI} // if the class is a container (TStrings, TComponent, TCollection...), // then return the class implementing the access to the contained items. @@ -930,10 +936,11 @@ TAbstractExposedMember = class abstract FDocString: AnsiString; FPyDelphiWrapper: TPyDelphiWrapper; FPythonType: TPythonType; + FRttiMember: TRttiMember; FParentRtti: TRttiStructuredType; - function GetDocString(): string; virtual; abstract; + function GetDefaultDocString(): string; virtual; abstract; public - constructor Create(const AName: string; + constructor Create(ARttiMember: TRttiMember; APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; AParentRtti: TRttiStructuredType); property DocString: AnsiString read FDocString write FDocString; @@ -942,19 +949,43 @@ TAbstractExposedMember = class abstract TExposedMethod = class(TAbstractExposedMember) private - FRttiMethod: TRttiMethod; FCallback: Pointer; + function GetRttiMethod: TRttiMethod; + function GetCallback: Pointer; protected - function GetDocString(): string; override; + function GetDefaultDocString(): string; override; public - constructor Create(APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; - AParentRtti: TRttiStructuredType; ARttiMethod: TRttiMethod); destructor Destroy; override; function MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; cdecl; - property Callback: Pointer read FCallback; + property RttiMethod: TRttiMethod read GetRttiMethod; + property Callback: Pointer read GetCallback; class function MethodDocStr(ARttiMethod: TRttiMethod): string; end; + TExposedGetSet = class(TAbstractExposedMember) + private + FGetterCallback: Pointer; + FSetterCallback: Pointer; + function GetGetterCallback: Pointer; + function GetSetterCallback: Pointer; + public + destructor Destroy; override; + function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; + function SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; + property GetterCallback: Pointer read GetGetterCallback; + property SetterCallback: Pointer read GetSetterCallback; + end; + + TExposedField = class(TExposedGetSet) + protected + function GetDefaultDocString(): string; override; + end; + + TExposedProperty = class(TExposedGetSet) + protected + function GetDefaultDocString(): string; override; + end; + // Documentation hook inerface // Implement to customize the creation of docstrings for exposed class members IDocServer = interface @@ -1060,8 +1091,19 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; AParentAddrIsClass: boolean = false): PPyObject; forward; -function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; - out ClassRef: TClass; out ErrMsg: string): Boolean; forward; +function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; + const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; + out ErrMsg: string): PPyObject; forward; + +function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType; + const AttrName: string; Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; + out ErrMsg: string): Boolean; forward; + + function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; + out ClassRef: TClass; out ErrMsg: string): Boolean; forward; + +function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; + out Obj: TObject; out ErrMsg: string): Boolean; forward; procedure InvalidArguments(const MethName, ErrMsg : string); begin @@ -1073,43 +1115,50 @@ procedure InvalidArguments(const MethName, ErrMsg : string); { TAbstractExposedMember } -constructor TAbstractExposedMember.Create(const AName: string; +constructor TAbstractExposedMember.Create(ARttiMember: TRttiMember; APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; AParentRtti: TRttiStructuredType); begin inherited Create; - FName := AnsiString(AName); + FRttiMember := ARttiMember; + FName := AnsiString(ARttiMember.Name); FPyDelphiWrapper := APyDelphiWrapper; FPythonType := APythonType; FParentRtti := AParentRtti; - FDocString := UTF8Encode(GetDocString); + FDocString := UTF8Encode(GetDefaultDocString); end; { TExposedMethod } -constructor TExposedMethod. Create(APyDelphiWrapper: TPyDelphiWrapper; - APythonType: TPythonType; AParentRtti: TRttiStructuredType; - ARttiMethod: TRttiMethod); +function TExposedMethod.GetCallback: Pointer; var Method: TDelphiMethodWithKW; begin - FRttiMethod := ARttiMethod; - inherited Create(ARttiMethod.Name, APyDelphiWrapper, APythonType, AParentRtti); - Method := MethodWrapper; - FCallBack := GetOfObjectCallBack(TCallBack(Method), 3, DEFAULT_CALLBACK_TYPE); + if FCallback = nil then + begin + Method := MethodWrapper; + FCallBack := GetOfObjectCallBack(TCallBack(Method), 3, DEFAULT_CALLBACK_TYPE); + end; + Result := FCallback; +end; + +function TExposedMethod.GetRttiMethod: TRttiMethod; +begin + Result := FRttiMember as TRttiMethod; end; destructor TExposedMethod.Destroy; begin - DeleteCallback(FCallback); + if FCallback <> nil then + DeleteCallback(FCallback); inherited; end; -function TExposedMethod.GetDocString: string; +function TExposedMethod.GetDefaultDocString: string; begin Result := Format('', [ - FRttiMethod.Name, FParentRtti.Name, NativeInt(FRttiMethod.CodeAddress)]); + RttiMethod.Name, FParentRtti.Name, NativeInt(RttiMethod.CodeAddress)]); end; function TExposedMethod.MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; @@ -1118,7 +1167,7 @@ function TExposedMethod.MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; RefClass, ClassRef: TClass; ErrMsg: string; begin - if FRttiMethod.IsStatic then + if RttiMethod.IsStatic then begin if ASelf <> nil then begin @@ -1128,14 +1177,14 @@ function TExposedMethod.MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; else ParentAddress := nil; end - else if FRttiMethod.IsClassMethod then + else if RttiMethod.IsClassMethod then begin // Class methods can be called from both instances and class references if IsDelphiObject(ASelf) then ParentAddress := TPyDelphiObject(PythonToDelphi(ASelf)).DelphiObject.ClassType else begin - RefClass := (FRttiMethod.Parent as TRttiInstanceType).MetaclassType; + RefClass := (RttiMethod.Parent as TRttiInstanceType).MetaclassType; if ValidateClassRef(ASelf, RefClass, ClassRef, ErrMsg) then ParentAddress := ClassRef else @@ -1168,7 +1217,7 @@ function TExposedMethod.MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; FParentRtti, Args, Kwds, - FRttiMethod.IsStatic or FRttiMethod.IsClassMethod); + RttiMethod.IsStatic or RttiMethod.IsClassMethod); end; class function TExposedMethod.MethodDocStr(ARttiMethod: TRttiMethod): string; @@ -1199,6 +1248,110 @@ class function TExposedMethod.MethodDocStr(ARttiMethod: TRttiMethod): string; Result := Result + #10; end; + +{ TExposedGetSet } + +destructor TExposedGetSet.Destroy; +begin + if FGetterCallback <> nil then + DeleteCallback(FGetterCallback); + if FSetterCallback <> nil then + DeleteCallback(FSetterCallback); + inherited; +end; + +function TExposedGetSet.GetGetterCallback: Pointer; +var + Method: function (AObj: PPyObject; AContext : Pointer): PPyObject of object; cdecl; +begin + if FGetterCallback = nil then + begin + Method := GetterWrapper; + FGetterCallback := GetOfObjectCallBack(TCallBack(Method), 2, DEFAULT_CALLBACK_TYPE); + end; + Result := FGetterCallback; +end; + +function TExposedGetSet.GetSetterCallback: Pointer; +var + Method: function(AObj, AValue: PPyObject; AContext: Pointer): Integer of object; cdecl; +begin + if FSetterCallback = nil then + begin + Method := SetterWrapper; + FSetterCallback := GetOfObjectCallBack(TCallBack(Method), 3, DEFAULT_CALLBACK_TYPE); + end; + Result := FSetterCallback; +end; + +function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; +var + Obj: TObject; + LOutMsg: string; +begin + Result := nil; + if not ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then + begin + InvalidArguments(FRttiMember.Name, LOutMsg); + Exit; + end; + + // TODO: Optimize out the property/field lookup, by passing FRttiMember + // directly to a GetRttiAttr/SetRtti overload + Result := GetRttiAttr(Obj, FParentRtti, FRttiMember.Name, FPyDelphiWrapper, LOutMsg); + if not Assigned(Result) then + with GetPythonEngine do + PyErr_SetObject (PyExc_AttributeError^, + PyUnicodeFromString(Format(rs_ErrAttrGet, [FRttiMember.Name, LOutMsg]))); +end; + +function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; +var + Obj: TObject; + LOutMsg: string; +begin + Result := -1; + if not ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then + begin + InvalidArguments(FRttiMember.Name, LOutMsg); + Exit; + end; + + if SetRttiAttr(Obj, FParentRtti, FRttiMember.Name, AValue, FPyDelphiWrapper, LOutMsg) then + Result := 0; + + if Result <> 0 then + with GetPythonEngine do + PyErr_SetObject (PyExc_AttributeError^, + PyUnicodeFromString(Format(rs_ErrAttrSetr, [FRttiMember.Name, LOutMsg]))); +end; + +{ TExposedField } + +function TExposedField.GetDefaultDocString: string; +var + FieldType: string; +begin + if Assigned((FRttiMember as TRttiField).FieldType) then + FieldType := TRttiField(FRttiMember).FieldType.Name; + + Result := Format('', [ + FParentRtti.Name, FRttiMember.Name, FieldType]); +end; + +{ TExposedProperty } + +function TExposedProperty.GetDefaultDocString: string; +var + PropertyType: string; +begin + if Assigned((FRttiMember as TRttiProperty).PropertyType) then + PropertyType := TRttiProperty(FRttiMember).PropertyType.Name; + + Result := Format('', [ + FParentRtti.Name, FRttiMember.Name, PropertyType]); +end; + {$ENDIF EXTENDED_RTTI} function RegisteredUnits : TRegisteredUnits; @@ -3336,14 +3489,17 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); ExposeMethods(DelphiObjectClass, NearestAncestorClass, PythonType, PyWrapper, ['Free', 'CPP_ABI_1', 'CPP_ABI_2', 'CPP_ABI_3']); + ExposeFields(DelphiObjectClass, NearestAncestorClass, PythonType, + PyWrapper, []); + ExposeProperties(DelphiObjectClass, NearestAncestorClass, PythonType, + PyWrapper, []); {$ENDIF EXTENDED_RTTI} end; {$IFDEF EXTENDED_RTTI} class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; - APyDelphiWrapper: TPyDelphiWrapper; - AExcludedMethodNames: TArray = []); + APyDelphiWrapper: TPyDelphiWrapper; AExcludedMethodNames: TArray); var LRttiCtx: TRttiContext; LRttiType: TRttiStructuredType; @@ -3387,8 +3543,8 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; AddedMethods := AddedMethods + [LRttiMethod.Name]; // Create the exposed method - LExposedMethod := TExposedMethod.Create(APyDelphiWrapper, APythonType, - LRttiType, LRttiMethod); + LExposedMethod := TExposedMethod.Create(LRttiMethod, + APyDelphiWrapper, APythonType, LRttiType); //Try to load the method doc string from doc server if Assigned(PyDocServer) and PyDocServer.Initialized then @@ -3432,6 +3588,173 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; LRttiCtx.Free; end; end; + +class procedure TPyDelphiObject.ExposeFields(AClass: TClass; + NearestAncestorClass: TClass; APythonType: TPythonType; + APyDelphiWrapper: TPyDelphiWrapper; AExcludedFieldNames: TArray); +var + LRttiCtx: TRttiContext; + LRttiType: TRttiStructuredType; + LRttiField: TRttiField; + AddedFields: TArray; + LExposedField: TExposedField; + LClass: TClass; + LDocStr: string; +begin + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; + + AddedFields := []; + for LRttiField in LRttiType.GetFields do begin + // Ignore methods with visibility lower than public + if (Ord(LRttiField.Visibility) < Ord(TMemberVisibility.mvPublic)) then + Continue; + + // Ignore excluded fields + if MatchStr(LRttiField.Name, AExcludedFieldNames) then + Continue; + + // Ignore duplicate fields + if MatchStr(LRttiField.Name, AddedFields) then + Continue; + + // Skip methods decleared in NearestAncestorClass and its ancestors + LClass := (LRttiField.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + + // Skip if the FieldType is missing + if LRttiField.FieldType = nil then + Continue; + + // Skip if the type cannot be handled + if not (LRttiField.FieldType.TypeKind in + [tkInteger, tkChar, tkFloat, tkString, tkWChar, tkLString, tkWString, + tkUString, tkInt64, tkVariant, tkEnumeration, tkSet, tkArray, + tkDynArray, tkClass, tkClassRef, + tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}]) + then + Continue; + + AddedFields := AddedFields + [LRttiField.Name]; + + // Create the exposed method + LExposedField := TExposedField.Create(LRttiField, + APyDelphiWrapper, APythonType, LRttiType); + + //Try to load the method doc string from doc server + if Assigned(PyDocServer) and PyDocServer.Initialized and + PyDocServer.ReadMemberDocStr(LClass.ClassInfo, LRttiField, LDocStr) + then + LExposedField.DocString := AnsiString(LDocStr); + + // Keep it alive until the Wrapper is Finalized + APyDelphiWrapper.fExposedMembers.Add(LExposedField); + + //Adds the Python getset + APythonType.AddGetSet( + PAnsiChar(LExposedField.Name), + LExposedField.GetterCallback, + LExposedField.SetterCallback, + PAnsiChar(LExposedField.DocString), + nil); + end; + finally + LRttiCtx.Free; + end; +end; + +class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; + NearestAncestorClass: TClass; APythonType: TPythonType; + APyDelphiWrapper: TPyDelphiWrapper; AExcludedPropertyNames: TArray); +var + LRttiCtx: TRttiContext; + LRttiType: TRttiStructuredType; + LRttiProperty: TRttiProperty; + AddedProperties: TArray; + LExposedProperty: TExposedProperty; + LClass: TClass; + LSetter: Pointer; + LDocStr: string; +begin + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; + + AddedProperties := []; + for LRttiProperty in LRttiType.GetProperties do begin + // Ignore methods with visibility lower than public + if (Ord(LRttiProperty.Visibility) < Ord(TMemberVisibility.mvPublic)) then + Continue; + + // Ignore excluded properties + if MatchStr(LRttiProperty.Name, AExcludedPropertyNames) then + Continue; + + // Ignore duplicate properties + if MatchStr(LRttiProperty.Name, AddedProperties) then + Continue; + + // Skip methods decleared in NearestAncestorClass and its ancestors + LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + + // Skip if the PropertyType is missing + if LRttiProperty.PropertyType = nil then + Continue; + + // Skip non readable properties + if not LRttiProperty.IsReadable then + Continue; + + // Skip if the type cannot be handled (as with fields + tkMethod) + if not (LRttiProperty.PropertyType.TypeKind in + [tkInteger, tkChar, tkFloat, tkString, tkWChar, tkLString, tkWString, + tkUString, tkInt64, tkVariant, tkEnumeration, tkSet, tkArray, + tkDynArray, tkClass, tkClassRef, tkMethod, + tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}]) + then + Continue; + + AddedProperties := AddedProperties + [LRttiProperty.Name]; + + // Create the exposed method + LExposedProperty := TExposedProperty.Create(LRttiProperty, + APyDelphiWrapper, APythonType, LRttiType); + + //Try to load the method doc string from doc server + if Assigned(PyDocServer) and PyDocServer.Initialized and + PyDocServer.ReadMemberDocStr(LClass.ClassInfo, LRttiProperty, LDocStr) + then + LExposedProperty.DocString := AnsiString(LDocStr); + + // Keep it alive until the Wrapper is Finalized + APyDelphiWrapper.fExposedMembers.Add(LExposedProperty); + + if LRttiProperty.IsWritable then + LSetter := LExposedProperty.SetterCallback + else + LSetter := nil; + + //Adds the Python getset + APythonType.AddGetSet( + PAnsiChar(LExposedProperty.Name), + LExposedProperty.GetterCallback, + LSetter, + PAnsiChar(LExposedProperty.DocString), + nil); + end; + finally + LRttiCtx.Free; + end; +end; + {$ENDIF EXTENDED_RTTI} function TPyDelphiObject.Set_Owned(AValue: PPyObject; From 458b5b2e368a4dab128f5c7de509465222a3f24e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 4 Oct 2023 23:42:07 +0300 Subject: [PATCH 061/174] Improvement of GetterWrapper and SetterWrapper --- Source/WrapDelphi.pas | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 1af78e5d..fe02fdec 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1290,15 +1290,11 @@ function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyO LOutMsg: string; begin Result := nil; - if not ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then - begin - InvalidArguments(FRttiMember.Name, LOutMsg); - Exit; - end; - + if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then // TODO: Optimize out the property/field lookup, by passing FRttiMember // directly to a GetRttiAttr/SetRtti overload Result := GetRttiAttr(Obj, FParentRtti, FRttiMember.Name, FPyDelphiWrapper, LOutMsg); + if not Assigned(Result) then with GetPythonEngine do PyErr_SetObject (PyExc_AttributeError^, @@ -1311,13 +1307,9 @@ function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer LOutMsg: string; begin Result := -1; - if not ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then - begin - InvalidArguments(FRttiMember.Name, LOutMsg); - Exit; - end; - - if SetRttiAttr(Obj, FParentRtti, FRttiMember.Name, AValue, FPyDelphiWrapper, LOutMsg) then + if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) and + SetRttiAttr(Obj, FParentRtti, FRttiMember.Name, AValue, FPyDelphiWrapper, LOutMsg) + then Result := 0; if Result <> 0 then From 146d4281141ffe66f0efbe9f08600cc90e62dd92 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 5 Oct 2023 02:16:12 +0300 Subject: [PATCH 062/174] Minor improvement in ExposeFields/Properties. --- Source/WrapDelphi.pas | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index fe02fdec..52c4e45c 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3623,12 +3623,7 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; Continue; // Skip if the type cannot be handled - if not (LRttiField.FieldType.TypeKind in - [tkInteger, tkChar, tkFloat, tkString, tkWChar, tkLString, tkWString, - tkUString, tkInt64, tkVariant, tkEnumeration, tkSet, tkArray, - tkDynArray, tkClass, tkClassRef, - tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}]) - then + if LRttiField.FieldType.TypeKind in [tkUnknown, tkMethod, tkProcedure] then Continue; AddedFields := AddedFields + [LRttiField.Name]; @@ -3705,13 +3700,8 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; if not LRttiProperty.IsReadable then Continue; - // Skip if the type cannot be handled (as with fields + tkMethod) - if not (LRttiProperty.PropertyType.TypeKind in - [tkInteger, tkChar, tkFloat, tkString, tkWChar, tkLString, tkWString, - tkUString, tkInt64, tkVariant, tkEnumeration, tkSet, tkArray, - tkDynArray, tkClass, tkClassRef, tkMethod, - tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}]) - then + // Skip if the type cannot be handled (as with fields - tkMethod) + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkProcedure] then Continue; AddedProperties := AddedProperties + [LRttiProperty.Name]; From 3e3983846c26b903349d0855284e27fde5a7c82d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 5 Oct 2023 18:37:17 +0300 Subject: [PATCH 063/174] Refactored TRttiCall and introduced an overload accepting an RttiMethod. --- Source/WrapDelphi.pas | 344 ++++++++++++++++++++++++------------------ 1 file changed, 195 insertions(+), 149 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 52c4e45c..eb5fb876 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1063,12 +1063,14 @@ implementation rs_IncompatibleClasses = 'Incompatible classes'; rs_IncompatibleRecords = 'Incompatible record types'; rs_IncompatibleInterfaces = 'Incompatible interfaces'; + rs_IncompatiblePythonType = 'Incompatible python value type'; rs_NotPublished = 'Event handling is available only for published properties'; rs_ExpectedObject = 'Expected a Pascal object'; rs_ExpectedRecord = 'Expected a Pascal record'; rs_ExpectedClass = 'Expected a Pascal class'; rs_ExpectedNil = 'In static methods Self should be nil'; rs_ExpectedInterface = 'Expected a Pascal interface'; + rs_ExpectedSequence = 'Expected a python sequence'; rs_InvalidClass = 'Invalid class'; rs_ErrEventNotReg = 'No Registered EventHandler for events of type "%s'; rs_ErrEventNoSuport = 'Class %s does not support events because it must '+ @@ -1089,7 +1091,11 @@ implementation function RttiCall(ParentAddress: pointer; PythonType: TPythonType; DelphiWrapper: TPyDelphiWrapper; MethName: string; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; - AParentAddrIsClass: boolean = false): PPyObject; forward; + AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; + +function RttiCall(ParentAddress: pointer; PythonType: TPythonType; + DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; + ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; @@ -1597,6 +1603,128 @@ function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; else ErrMsg := rs_ExpectedClass; end; + +function ValidateDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue; out ErrMsg: string): Boolean; +var + Arr: array of TValue; + I: Integer; + elType: PPTypeInfo; + V: Variant; + Num: Int64; + PyEngine: TPythonEngine; +begin + Result := False; + PyEngine := GetPythonEngine; + + if not PyEngine.PySequence_Check(PyValue) = 0 then + begin + ErrMsg := rs_ExpectedSequence; + Exit; + end; + + if (RttiParam.ParamType = nil) or (RttiParam.ParamType.Handle = nil) or (GetTypeData(RttiParam.ParamType.Handle) = nil) then + Exit; + elType := GetTypeData(RttiParam.ParamType.Handle).elType; + if elType = nil then + elType := GetTypeData(RttiParam.ParamType.Handle).elType2; + if elType = nil then + Exit; + + try + SetLength(Arr, PyEngine.PySequence_Length(PyValue)); + for I := 0 to PyEngine.PySequence_Length(PyValue) - 1 do + begin + V := PyEngine.GetSequenceItem(PyValue, i); + if elType^.Kind = tkEnumeration then + begin + Num := TValue.FromVariant(V).Cast(TypeInfo(Int64)).AsInt64; + Arr[i] := TValue.FromOrdinal(elType^, Num); + end + else + Arr[i] := TValue.FromVariant(V).Cast(elType^); + end; + ParamValue := TValue.FromArray(RttiParam.ParamType.Handle, Arr); + Result := True; + except + ErrMsg := rs_IncompatiblePythonType; + end; +end; + +function PyArgToValue(PyArg : PPyObject; Param: TRttiParameter; out Arg: TValue): Boolean; +var + ErrMsg: string; + Obj: TObject; + ClassRef: TClass; +begin + Result := False; + if (Param.ParamType = nil) or + (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) + then + Exit + else if Param.ParamType.TypeKind = tkClass then + begin + Result := ValidateClassProperty(PyArg, Param.ParamType.Handle, Obj, ErrMsg); + if Result then + Arg := Obj; + end + else if (Param.ParamType.TypeKind = tkClassRef) then + begin + Result := ValidateClassRef(PyArg, + (Param.ParamType as TRttiClassRefType).MetaclassType, ClassRef, ErrMsg); + if Result then + Arg := ClassRef; + end + else if Param.ParamType.TypeKind = tkInterface then + Result := ValidateInterfaceProperty(PyArg, + Param.ParamType as TRttiInterfaceType, Arg, ErrMsg) + else if Param.ParamType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then + Result := ValidateRecordProperty(PyArg, Param.ParamType.Handle, Arg, ErrMsg) + else if Param.ParamType.TypeKind = tkDynArray then + Result := ValidateDynArray(PyArg, Param, Arg, ErrMsg) + else + Result := SimplePythonToValue(PyArg, Param.ParamType.Handle, + Arg, ErrMsg); +end; + +function PyArgsToValues(PyArgs: PPyObject; Method: TRttiMethod; out Args: array of TValue): Boolean; +var + Index: Integer; + PyArg : PPyObject; + Param: TRttiParameter; + Engine: TPythonEngine; + Params : TArray; +begin + Params := Method.GetParameters; + if Length(Args) <> Length(Params) then + Exit(False); + + Engine := GetPythonEngine; + for Index := 0 to Length(Params) - 1 do + begin + Param := Params[Index]; + PyArg := Engine.PyTuple_GetItem(PyArgs, Index); + if not PyArgToValue(PyArg, Param, Args[Index]) then + Exit(False); + end; + Result := True; +end; + +function RetValueToPython(const RetValue: TValue; + DelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; +begin + if RetValue.IsEmpty then + Result := GetPythonEngine.ReturnNone + else if RetValue.Kind = tkClass then + Result := DelphiWrapper.Wrap(RetValue.AsObject) + else if RetValue.Kind = tkClassRef then + Result := DelphiWrapper.WrapClass(RetValue.AsClass) + else if RetValue.Kind = tkInterface then + Result := DelphiWrapper.WrapInterface(RetValue, True) + else if RetValue.Kind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then + Result := DelphiWrapper.WrapRecord(RetValue, True) + else + Result := SimpleValueToPython(RetValue, ErrMsg); +end; {$ENDIF} function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; @@ -2298,7 +2426,7 @@ procedure Rtti_Dir(SL: TStringList; RttiType: TRttiType); function RttiCall(ParentAddress: pointer; PythonType: TPythonType; DelphiWrapper: TPyDelphiWrapper; MethName: string; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; - AParentAddrIsClass: boolean): PPyObject; + AParentAddrIsClass: Boolean): PPyObject; { TODO: Handle methods with var parameters procedures/functions with var parameters should return a tuple @@ -2311,151 +2439,28 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; use in python: res, param = objref.Test(param) } - function ParamAsDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue): Boolean; - var - Arr: array of TValue; - I: Integer; - elType: PPTypeInfo; - V: Variant; - Num: Int64; - begin - Result := False; - if (RttiParam.ParamType = nil) or (RttiParam.ParamType.Handle = nil) or (GetTypeData(RttiParam.ParamType.Handle) = nil) then - Exit; - elType := GetTypeData(RttiParam.ParamType.Handle).elType; - if elType = nil then - elType := GetTypeData(RttiParam.ParamType.Handle).elType2; - if elType = nil then - Exit; - - SetLength(Arr, PythonType.Engine.PyList_Size(PyValue)); - for I := 0 to PythonType.Engine.PyList_Size(PyValue) - 1 do - begin - V := PythonType.Engine.PyObjectAsVariant(PythonType.Engine.PyList_GetItem(PyValue, i)); - if elType^.Kind = tkEnumeration then - begin - Num := TValue.FromVariant(V).Cast(TypeInfo(Int64)).AsInt64; - Arr[i] := TValue.FromOrdinal(elType^, Num); - end - else - Arr[i] := TValue.FromVariant(V).Cast(elType^); - end; - ParamValue := TValue.FromArray(RttiParam.ParamType.Handle, Arr); - Result := True; - end; - function FindMethod(const MethName:string; RttiType : TRttiType; PyArgs: PPyObject; var Args: array of TValue):TRttiMethod; // Deals with overloaded methods // Constructs the Arg Array // PyArgs is a Python tuple - Var + var Method: TRttiMethod; - Index: Integer; - ErrMsg: string; - Obj: TObject; - ClassRef: TClass; - PyValue : PPyObject; - Param: TRttiParameter; - Params : TArray; - SearchContinue: Boolean; begin Result := nil; for Method in RttiType.GetMethods do - if SameText(Method.Name, MethName) then + if SameText(Method.Name, MethName) and PyArgsToValues(PyArgs, Method, Args) then begin - Params := Method.GetParameters; - if Length(Args) = Length(Params) then - begin - Result := Method; - SearchContinue := False; - for Index := 0 to Length(Params) - 1 do - begin - Param := Params[Index]; - if (Param.ParamType = nil) or - (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) then - begin - Result := nil; - SearchContinue := True; - Break; - end; - - PyValue := PythonType.Engine.PyTuple_GetItem(PyArgs, Index); - if Param.ParamType = nil then - begin - Result := nil; - Break - end - else if Param.ParamType.TypeKind = tkClass then - begin - if ValidateClassProperty(PyValue, Param.ParamType.Handle, Obj, ErrMsg) - then - Args[Index] := Obj - else begin - Result := nil; - Break - end - end - else if (Param.ParamType.TypeKind = tkClassRef) then - begin - if ValidateClassRef(PyValue, - (Param.ParamType as TRttiClassRefType).MetaclassType, - ClassRef, ErrMsg) - then - Args[Index] := ClassRef - else begin - Result := nil; - Break - end - end - else if Param.ParamType.TypeKind = tkInterface then - begin - if not ValidateInterfaceProperty(PyValue, Param.ParamType as TRttiInterfaceType, Args[Index], ErrMsg) then - begin - Result := nil; - Break - end - end - else if Param.ParamType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then - begin - if not ValidateRecordProperty(PyValue, Param.ParamType.Handle, Args[Index], ErrMsg) then - begin - Result := nil; - Break - end - end - else if (Param.ParamType.TypeKind = tkDynArray) and PythonType.Engine.PyList_Check(PyValue) then - begin - if ParamAsDynArray(PyValue, Param, Args[Index]) then - Continue; //to avoid last check - end - else begin - if not SimplePythonToValue(PyValue, Param.ParamType.Handle, - Args[Index], ErrMsg) then - begin - Result := nil; - Break - end; - end; - - if (Param.ParamType <> nil) and not Args[Index].IsType(Param.ParamType.Handle) then - begin - Result :=nil; - Break; - end; - end; // for params - - if not SearchContinue then - Break; - end; - end; + Result := Method; + Break; + end; end; Var Args: array of TValue; ArgCount: Integer; meth: TRttiMethod; - ret: TValue; + ReturnValue: TValue; ErrMsg : string; Addr: TValue; @@ -2487,24 +2492,13 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; TValue.Make(@ParentAddress, ParentRtti.Handle, Addr) else Addr := TValue.From(ParentAddress); - ret := meth.Invoke(Addr, Args); - if ret.IsEmpty then - Result := GetPythonEngine.ReturnNone - else if ret.Kind = tkClass then - Result := DelphiWrapper.Wrap(ret.AsObject) - else if ret.Kind = tkClassRef then - Result := DelphiWrapper.WrapClass(ret.AsClass) - else if ret.Kind = tkInterface then - Result := DelphiWrapper.WrapInterface(ret, True) - else if ret.Kind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then - Result := DelphiWrapper.WrapRecord(ret, True) - else begin - Result := SimpleValueToPython(ret, ErrMsg); - if Result = nil then - with PythonType.Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); - end; + ReturnValue := meth.Invoke(Addr, Args); + + Result := RetValueToPython(ReturnValue, DelphiWrapper, ErrMsg); + if Result = nil then + with PythonType.Engine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); except on E: Exception do begin Result := nil; @@ -2513,6 +2507,58 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; end; end; +function RttiCall(ParentAddress: pointer; PythonType: TPythonType; + DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; + ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; +var + ArgCount: Integer; + Args: array of TValue; + Addr: TValue; + ReturnValue: TValue; + ErrMsg : string; +begin + Result := nil; + // Ignore keyword arguments ob2 + // ob1 is a tuple with zero or more elements + + ArgCount := PythonType.Engine.PyTuple_Size(ob1); + SetLength(Args, ArgCount); + + if not PyArgsToValues(ob1, Method, Args) then + begin + InvalidArguments(Method.Name, rs_IncompatibleArguments); + Exit; + end; + + try + if Method.Parent is TRttiInstanceType then + if Method.IsClassMethod or Method.IsStatic then + if AParentAddrIsClass then + Addr := TValue.From(TClass(ParentAddress)) + else + Addr := TValue.From(TObject(ParentAddress).ClassType) + else + Addr := TValue.From(TObject(ParentAddress)) + else if Method.Parent is TRttiInterfaceType then + TValue.Make(@ParentAddress, Method.Parent.Handle, Addr) + else + Addr := TValue.From(ParentAddress); + + ReturnValue := Method.Invoke(Addr, Args); + + Result := RetValueToPython(ReturnValue, DelphiWrapper, ErrMsg); + if Result = nil then + with PythonType.Engine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_ErrInvalidRet, [Method.Name, ErrMsg]))); + except + on E: Exception do begin + Result := nil; + InvalidArguments(Method.Name, E.Message); + end; + end; +end; + function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; From bed48ba13791261005bb9cb889b901929a936975 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 5 Oct 2023 19:36:33 +0300 Subject: [PATCH 064/174] Fix #435 --- Source/WrapDelphi.pas | 112 ++++++++++++++++----------------- Source/WrapDelphiWindows.pas | 25 +++++++- Source/vcl/WrapVclComCtrls.pas | 16 +++-- 3 files changed, 92 insertions(+), 61 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index eb5fb876..06d4e127 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1031,6 +1031,9 @@ TExposedProperty = class(TExposedGetSet) procedure RaiseNotifyEvent(PyDelphiWrapper : TPyDelphiWrapper; ACallable : PPyObject; Sender: TObject); {Sets mulptiple properties of PyObject from keywords argument} function SetProperties(PyObject: PPyObject; keywords: PPyObject): PPyObject; + function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; + out ClassRef: TClass; out ErrMsg: string): Boolean; + procedure InvalidArguments(const MethName, ErrMsg : string); implementation @@ -1105,20 +1108,9 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType const AttrName: string; Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): Boolean; forward; - function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; - out ClassRef: TClass; out ErrMsg: string): Boolean; forward; - function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; out Obj: TObject; out ErrMsg: string): Boolean; forward; -procedure InvalidArguments(const MethName, ErrMsg : string); -begin - with GetPythonEngine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidArgs, - [MethName, ErrMsg]))); -end; - { TAbstractExposedMember } constructor TAbstractExposedMember.Create(ARttiMember: TRttiMember; @@ -1373,6 +1365,59 @@ function GlobalDelphiWrapper: TPyDelphiWrapper; { Helper functions } +procedure InvalidArguments(const MethName, ErrMsg : string); +begin + with GetPythonEngine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_ErrInvalidArgs, + [MethName, ErrMsg]))); +end; + +function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; + out ClassRef: TClass; out ErrMsg: string): Boolean; +var + LTypeName: AnsiString; + LPythonType: TPythonType; +begin + ClassRef := nil; + if (PyValue = GetPythonEngine.Py_None) then begin + Result := True; + Exit; + end; + + Result := False; + // Is PyValue a Python type? + if PyValue^.ob_type^.tp_name = 'type' then + LTypeName := PPyTypeObject(PyValue).tp_name + else + begin + ErrMsg := rs_ExpectedClass; + Exit; + end; + + LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue)); + if not Assigned(LPythonType) then + // Try once more with the base type to catter for pascal classes + // subclassed in Python + LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue).tp_base); + + if Assigned(LPythonType) then + begin + if Assigned(LPythonType) and LPythonType.PyObjectClass.InheritsFrom(TPyDelphiObject) then + begin + ClassRef := TPyDelphiObjectClass(LPythonType.PyObjectClass).DelphiObjectClass; + if ClassRef.InheritsFrom(RefClass) then + Result := True + else + ErrMsg := rs_IncompatibleClasses; + end + else + ErrMsg := rs_ExpectedClass; + end + else + ErrMsg := rs_ExpectedClass; +end; + {$IFDEF EXTENDED_RTTI} function DynArrayToPython(const Value: TValue): PPyObject; var @@ -1559,51 +1604,6 @@ function ValidateInterfaceProperty(PyValue: PPyObject; RttiType: TRttiInterfaceT ErrMsg := rs_ExpectedInterface; end; -function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; - out ClassRef: TClass; out ErrMsg: string): Boolean; -var - LTypeName: AnsiString; - LPythonType: TPythonType; -begin - ClassRef := nil; - if (PyValue = GetPythonEngine.Py_None) then begin - Result := True; - Exit; - end; - - Result := False; - // Is PyValue a Python type? - if PyValue^.ob_type^.tp_name = 'type' then - LTypeName := PPyTypeObject(PyValue).tp_name - else - begin - ErrMsg := rs_ExpectedClass; - Exit; - end; - - LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue)); - if not Assigned(LPythonType) then - // Try once more with the base type to catter for pascal classes - // subclassed in Python - LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue).tp_base); - - if Assigned(LPythonType) then - begin - if Assigned(LPythonType) and LPythonType.PyObjectClass.InheritsFrom(TPyDelphiObject) then - begin - ClassRef := TPyDelphiObjectClass(LPythonType.PyObjectClass).DelphiObjectClass; - if ClassRef.InheritsFrom(RefClass) then - Result := True - else - ErrMsg := rs_IncompatibleClasses; - end - else - ErrMsg := rs_ExpectedClass; - end - else - ErrMsg := rs_ExpectedClass; -end; - function ValidateDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue; out ErrMsg: string): Boolean; var Arr: array of TValue; diff --git a/Source/WrapDelphiWindows.pas b/Source/WrapDelphiWindows.pas index 86845816..2e1ebc1f 100644 --- a/Source/WrapDelphiWindows.pas +++ b/Source/WrapDelphiWindows.pas @@ -19,7 +19,9 @@ interface {$IFDEF MSWINDOWS} uses - Windows, Classes, SysUtils, PythonEngine, WrapDelphi, WrapDelphiClasses; + Windows, Classes, SysUtils, TypInfo, PythonEngine, WrapDelphi, WrapDelphiClasses; + +function OwnerDrawStateToPython(const AOwnerDrawState: TOwnerDrawState): PPyObject; {$ENDIF MSWINDOWS} implementation @@ -31,6 +33,27 @@ implementation System.Win.HighDpi, Winapi.ShellScaling; {$ENDIF DELPHI11_OR_HIGHER} +function OwnerDrawStateToPython(const AOwnerDrawState: TOwnerDrawState): PPyObject; + + procedure Append(const AList: PPyObject; const AString: string); + var + LItem: PPyObject; + begin + with GetPythonEngine do begin + LItem := PyUnicodeFromString(AString); + PyList_Append(AList, LItem); + Py_XDecRef(LItem); + end; + end; + +var + LState: integer; +begin + Result := GetPythonEngine().PyList_New(0); + for LState := Ord(odSelected) to Ord(odComboBoxEdit) do + Append(Result, System.TypInfo.GetEnumName(TypeInfo(TOwnerDrawState), LState)); +end; + { Register the wrappers, the globals and the constants } type TWindowsRegistration = class(TRegisteredUnit) diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index b12d5d3b..9e17b288 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -2372,6 +2372,7 @@ procedure TTVCreateNodeClassEventHandler.DoEvent(Sender: TCustomTreeView; var LPyObject, LPyTuple, LPyResult, LPyNodeClass: PPyObject; LVarParam: TPyDelphiVarParameter; + ErrMsg: string; LClass: TClass; begin Assert(Assigned(PyDelphiWrapper)); @@ -2388,8 +2389,11 @@ procedure TTVCreateNodeClassEventHandler.DoEvent(Sender: TCustomTreeView; if Assigned(LPyResult) then begin Py_DECREF(LPyResult); - LClass := TPyDelphiObjectClass( - PythonToPythonType(LVarParam.Value).PyObjectClass).DelphiObjectClass; + if not ValidateClassRef(LVarParam.Value, TTreeNode, LClass, ErrMsg) then + begin + InvalidArguments('OnCreateNode', ErrMsg); + Exit; + end; NodeClass := TTreeNodeClass(LClass); end; @@ -3647,6 +3651,7 @@ procedure TLVCreateItemClassEventHandler.DoEvent(Sender: TCustomListView; LPyObject, LPyTuple, LPyResult, LPyItemClass: PPyObject; LVarParam: TPyDelphiVarParameter; LClass: TClass; + ErrMsg: string; begin Assert(Assigned(PyDelphiWrapper)); if Assigned(Callable) and PythonOK() then @@ -3662,8 +3667,11 @@ procedure TLVCreateItemClassEventHandler.DoEvent(Sender: TCustomListView; if Assigned(LPyResult) then begin Py_DECREF(LPyResult); - LClass := TPyDelphiObjectClass( - PythonToPythonType(LVarParam.Value).PyObjectClass).DelphiObjectClass; + if not ValidateClassRef(LVarParam.Value, TListItem, LClass, ErrMsg) then + begin + InvalidArguments('OnCreateItem', ErrMsg); + Exit; + end; ItemClass := TListItemClass(LClass); end; From a6ffce535a4d250393d206246c1b86674b579456 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 5 Oct 2023 23:31:44 +0300 Subject: [PATCH 065/174] ExposeIndexedProperties added and WrapDelphiTest.pas updated. --- Source/WrapDelphi.pas | 391 ++++++++++++++++++++++++++++++++------- Tests/WrapDelphiTest.pas | 38 ++++ 2 files changed, 359 insertions(+), 70 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 06d4e127..3ff5e2bb 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -585,6 +585,9 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) class procedure ExposeProperties(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; AExcludedPropertyNames: TArray = []); + class procedure ExposeIndexedProperties(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedPropertyNames: TArray = []); {$ENDIF EXTENDED_RTTI} // if the class is a container (TStrings, TComponent, TCollection...), // then return the class implementing the access to the contained items. @@ -930,62 +933,6 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) end; {$IFDEF EXTENDED_RTTI} - TAbstractExposedMember = class abstract - protected - FName: AnsiString; - FDocString: AnsiString; - FPyDelphiWrapper: TPyDelphiWrapper; - FPythonType: TPythonType; - FRttiMember: TRttiMember; - FParentRtti: TRttiStructuredType; - function GetDefaultDocString(): string; virtual; abstract; - public - constructor Create(ARttiMember: TRttiMember; - APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; - AParentRtti: TRttiStructuredType); - property DocString: AnsiString read FDocString write FDocString; - property Name: AnsiString read FName; - end; - - TExposedMethod = class(TAbstractExposedMember) - private - FCallback: Pointer; - function GetRttiMethod: TRttiMethod; - function GetCallback: Pointer; - protected - function GetDefaultDocString(): string; override; - public - destructor Destroy; override; - function MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; cdecl; - property RttiMethod: TRttiMethod read GetRttiMethod; - property Callback: Pointer read GetCallback; - class function MethodDocStr(ARttiMethod: TRttiMethod): string; - end; - - TExposedGetSet = class(TAbstractExposedMember) - private - FGetterCallback: Pointer; - FSetterCallback: Pointer; - function GetGetterCallback: Pointer; - function GetSetterCallback: Pointer; - public - destructor Destroy; override; - function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; - function SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; - property GetterCallback: Pointer read GetGetterCallback; - property SetterCallback: Pointer read GetSetterCallback; - end; - - TExposedField = class(TExposedGetSet) - protected - function GetDefaultDocString(): string; override; - end; - - TExposedProperty = class(TExposedGetSet) - protected - function GetDefaultDocString(): string; override; - end; - // Documentation hook inerface // Implement to customize the creation of docstrings for exposed class members IDocServer = interface @@ -1008,7 +955,6 @@ TExposedProperty = class(TExposedGetSet) function GlobalDelphiWrapper: TPyDelphiWrapper; { Helper Functions } - function CheckIndex(AIndex, ACount : Integer; const AIndexName : string = 'Index') : Boolean; function CheckIntAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : Integer) : Boolean; function CheckFloatAttribute(AAttribute : PPyObject; const AAttributeName : string; out AValue : Double) : Boolean; @@ -1079,7 +1025,7 @@ implementation rs_ErrEventNoSuport = 'Class %s does not support events because it must '+ 'either inherit from TComponent or implement interface IFreeNotification'; rs_ErrEventExpectCallable = 'You can only assign a callable to method property "%s"'; - rs_NotWritable = 'The class members is not writable'; + rs_NotWritable = 'The class member is not writable'; rs_NotReadable = 'The class member is not readable'; rs_NoAccess = 'Private and protected class members cannot be accessed'; rs_ErrValueToPython = 'Unsupported conversion from TValue to Python value'; @@ -1096,9 +1042,9 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; -function RttiCall(ParentAddress: pointer; PythonType: TPythonType; - DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; - ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; +function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; + Method: TRttiMethod; ob1, ob2: PPyObject; + AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; @@ -1111,6 +1057,88 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; out Obj: TObject; out ErrMsg: string): Boolean; forward; +type + TAbstractExposedMember = class abstract + protected + FName: AnsiString; + FDocString: AnsiString; + FPyDelphiWrapper: TPyDelphiWrapper; + FPythonType: TPythonType; + FRttiMember: TRttiMember; + FParentRtti: TRttiStructuredType; + function GetDefaultDocString(): string; virtual; abstract; + public + constructor Create(ARttiMember: TRttiMember; + APyDelphiWrapper: TPyDelphiWrapper; APythonType: TPythonType; + AParentRtti: TRttiStructuredType); + property DocString: AnsiString read FDocString write FDocString; + property Name: AnsiString read FName; + end; + + TExposedMethod = class(TAbstractExposedMember) + private + FCallback: Pointer; + function GetRttiMethod: TRttiMethod; + function GetCallback: Pointer; + protected + function GetDefaultDocString(): string; override; + public + destructor Destroy; override; + function MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; cdecl; + property RttiMethod: TRttiMethod read GetRttiMethod; + property Callback: Pointer read GetCallback; + class function MethodDocStr(ARttiMethod: TRttiMethod): string; + end; + + TExposedGetSet = class(TAbstractExposedMember) + private + FGetterCallback: Pointer; + FSetterCallback: Pointer; + function GetGetterCallback: Pointer; + function GetSetterCallback: Pointer; + public + destructor Destroy; override; + function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; + function SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; + property GetterCallback: Pointer read GetGetterCallback; + property SetterCallback: Pointer read GetSetterCallback; + end; + + TExposedField = class(TExposedGetSet) + protected + function GetDefaultDocString(): string; override; + end; + + TExposedProperty = class(TExposedGetSet) + protected + function GetDefaultDocString(): string; override; + end; + + TPyIndexedProperty = class(TPyObject) + private + FPyObj: PPyObject; + FPyDelphiWrapper: TPyDelphiWrapper; + FProperty: TRttiIndexedProperty; + public + procedure Setup(PyObj: PPyObject; Wrapper: TPyDelphiWrapper; Prop: TRttiIndexedProperty); + class procedure SetupType(PythonType: TPythonType); override; + // Mapping services + function MpSubscript(obj: PPyObject) : PPyObject; override; + function MpAssSubscript(obj1, obj2: PPyObject) : Integer; override; + end; + + TExposedIndexedProperty = class(TAbstractExposedMember) + private + FGetterCallback: Pointer; + function GetGetterCallback: Pointer; + protected + function GetDefaultDocString(): string; override; + public + destructor Destroy; override; + function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; + property GetterCallback: Pointer read GetGetterCallback; + end; + { TAbstractExposedMember } constructor TAbstractExposedMember.Create(ARttiMember: TRttiMember; @@ -1342,6 +1370,149 @@ function TExposedProperty.GetDefaultDocString: string; FParentRtti.Name, FRttiMember.Name, PropertyType]); end; +{ TExposedIndexedProperty } +function TExposedIndexedProperty.GetGetterCallback: Pointer; +var + Method: function (AObj: PPyObject; AContext : Pointer): PPyObject of object; cdecl; +begin + if FGetterCallback = nil then + begin + Method := GetterWrapper; + FGetterCallback := GetOfObjectCallBack(TCallBack(Method), 2, DEFAULT_CALLBACK_TYPE); + end; + Result := FGetterCallback; +end; + +function TExposedIndexedProperty.GetDefaultDocString(): string; +var + PropertyType: string; +begin + if Assigned((FRttiMember as TRttiIndexedProperty).PropertyType) then + PropertyType := TRttiIndexedProperty(FRttiMember).PropertyType.Name; + + Result := Format('', [ + FParentRtti.Name, FRttiMember.Name, PropertyType]); +end; + +destructor TExposedIndexedProperty.Destroy; +begin + if FGetterCallback <> nil then + DeleteCallback(FGetterCallback); +end; + +function TExposedIndexedProperty.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; +var + HelperType: TPythonType; +begin + HelperType := FPyDelphiWrapper.GetHelperType('IndexedPropertyType'); + Assert(HelperType <> nil); + + Result := HelperType.CreateInstance; + (PythonToDelphi(Result) as TPyIndexedProperty).Setup(AObj, FPyDelphiWrapper, + FRttiMember as TRttiIndexedProperty); +end; + +{ TPyIndexedProperty } + +procedure TPyIndexedProperty.Setup(PyObj: PPyObject; Wrapper: TPyDelphiWrapper; Prop: TRttiIndexedProperty); +begin + FPyObj:= PyObj; + FPyDelphiWrapper := Wrapper; + FProperty := Prop; +end; + +class procedure TPyIndexedProperty.SetupType(PythonType : TPythonType); +begin + inherited; + PythonType.Name := 'IndexedPropertyType'; + PythonType.TypeName := 'IndexedProperty'; + PythonType.GenerateCreateFunction := False; + PythonType.DocString.Text := 'Indexed property wrapper'; + PythonType.Services.Basic := [bsRepr, bsStr]; + if True then + + PythonType.Services.Mapping := [msSubscript, msAssSubscript] +end; + +function TPyIndexedProperty.MpSubscript(obj: PPyObject) : PPyObject; +var + PyArgs: PPyObject; + PascalObject: TObject; + ErrMsg: string; +begin + if not ValidateClassProperty(FPyObj, FProperty.Parent.Handle, PascalObject, ErrMsg) then + begin + InvalidArguments(FProperty.Name, ErrMsg); + Exit(nil); + end; + + // obj is a tuple only if we have more than one arguments + if FPyDelphiWrapper.Engine.PyTuple_Check(obj) then + PyArgs := obj + else + PyArgs := FPyDelphiWrapper.Engine.MakePyTuple([obj]); + + Result := RttiCall(PascalObject, FPyDelphiWrapper, FProperty.ReadMethod, + PyArgs, nil); + + if not FPyDelphiWrapper.Engine.PyTuple_Check(obj) then + FPyDelphiWrapper.Engine.Py_DECREF(PyArgs); // release created tuple +end; + +function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; +var + Engine: TPythonEngine; + PyArgs: PPyObject; + PascalObject: TObject; + TempPy: PPyObject; + Count, Index: Integer; + ErrMsg: string; +begin + Result := -1; // Signals failure + + Engine := FPyDelphiWrapper.Engine; + if not FProperty.IsWritable then + begin + with Engine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString(rs_NotWritable)); + Exit; + end; + + if not ValidateClassProperty(FPyObj, FProperty.Parent.Handle, PascalObject, ErrMsg) then + begin + InvalidArguments(FProperty.Name, ErrMsg); + Exit; + end; + + // obj is a tuple only if we have more than one arguments + if Engine.PyTuple_Check(obj1) then + begin + Count := Engine.PyTuple_Size(obj1); + PyArgs := Engine.PyTuple_New(Count + 1); + for Index := 0 to Count - 1 do + begin + TempPy := Engine.PyTuple_GetItem(obj1, Index); + Engine.Py_XINCREF(TempPy); + Engine.PyTuple_SetItem(PyArgs, Index, TempPy); + end; + Engine.Py_XINCREF(obj2); + Engine.PyTuple_SetItem(PyArgs, Count, obj2); + end + else + PyArgs := Engine.MakePyTuple([obj1, obj2]); + + TempPy := RttiCall(PascalObject, FPyDelphiWrapper, FProperty.WriteMethod, + PyArgs, nil); + + Engine.Py_DECREF(PyArgs); // release created tuple + + if TempPy <> nil then + begin + Engine.Py_DECREF(TempPy); //Should be Py_None + Result := 0; // Signal success + end; +end; + {$ENDIF EXTENDED_RTTI} function RegisteredUnits : TRegisteredUnits; @@ -2456,7 +2627,7 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; end; end; -Var +var Args: array of TValue; ArgCount: Integer; meth: TRttiMethod; @@ -2507,9 +2678,9 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; end; end; -function RttiCall(ParentAddress: pointer; PythonType: TPythonType; - DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; - ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; +function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; + Method: TRttiMethod; ob1, ob2: PPyObject; + AParentAddrIsClass: Boolean = false): PPyObject; var ArgCount: Integer; Args: array of TValue; @@ -2521,7 +2692,7 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; // Ignore keyword arguments ob2 // ob1 is a tuple with zero or more elements - ArgCount := PythonType.Engine.PyTuple_Size(ob1); + ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); SetLength(Args, ArgCount); if not PyArgsToValues(ob1, Method, Args) then @@ -2548,7 +2719,7 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; Result := RetValueToPython(ReturnValue, DelphiWrapper, ErrMsg); if Result = nil then - with PythonType.Engine do + with DelphiWrapper.Engine do PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( Format(rs_ErrInvalidRet, [Method.Name, ErrMsg]))); except @@ -3531,6 +3702,8 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); PyWrapper, []); ExposeProperties(DelphiObjectClass, NearestAncestorClass, PythonType, PyWrapper, []); + ExposeIndexedProperties(DelphiObjectClass, NearestAncestorClass, PythonType, + PyWrapper, []); {$ENDIF EXTENDED_RTTI} end; @@ -3571,7 +3744,7 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; if MatchStr(LRttiMethod.Name, AddedMethods) then Continue; - // Skip methods decleared in NearestAncestorClass and its ancestors + // Skip methods declared in NearestAncestorClass and its ancestors LClass := (LRttiMethod.Parent as TRttiInstanceType).MetaclassType; if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or not (LClass.InheritsFrom(NearestAncestorClass))) @@ -3657,7 +3830,7 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; if MatchStr(LRttiField.Name, AddedFields) then Continue; - // Skip methods decleared in NearestAncestorClass and its ancestors + // Skip methods declared in NearestAncestorClass and its ancestors LClass := (LRttiField.Parent as TRttiInstanceType).MetaclassType; if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or not (LClass.InheritsFrom(NearestAncestorClass))) @@ -3731,7 +3904,7 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; if MatchStr(LRttiProperty.Name, AddedProperties) then Continue; - // Skip methods decleared in NearestAncestorClass and its ancestors + // Skip methods declared in NearestAncestorClass and its ancestors LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or not (LClass.InheritsFrom(NearestAncestorClass))) @@ -3783,6 +3956,83 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; end; end; +class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; + NearestAncestorClass: TClass; APythonType: TPythonType; + APyDelphiWrapper: TPyDelphiWrapper; AExcludedPropertyNames: TArray); +var + LRttiCtx: TRttiContext; + LRttiType: TRttiStructuredType; + LRttiProperty: TRttiIndexedProperty; + AddedProperties: TArray; + LExposedProperty: TExposedIndexedProperty; + LClass: TClass; + LDocStr: string; +begin + LRttiCtx := TRttiContext.Create(); + try + LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; + + AddedProperties := []; + for LRttiProperty in LRttiType.GetIndexedProperties do begin + // Ignore methods with visibility lower than public + if (Ord(LRttiProperty.Visibility) < Ord(TMemberVisibility.mvPublic)) then + Continue; + + // Ignore excluded properties + if MatchStr(LRttiProperty.Name, AExcludedPropertyNames) then + Continue; + + // Ignore duplicate properties + if MatchStr(LRttiProperty.Name, AddedProperties) then + Continue; + + // Skip methods declared in NearestAncestorClass and its ancestors + LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + + // Skip if the PropertyType is missing + if LRttiProperty.PropertyType = nil then + Continue; + + // Skip non readable properties + if not LRttiProperty.IsReadable then + Continue; + + // Skip if the type cannot be handled (as with fields - tkMethod) + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkProcedure] then + Continue; + + AddedProperties := AddedProperties + [LRttiProperty.Name]; + + // Create the exposed method + LExposedProperty := TExposedIndexedProperty.Create(LRttiProperty, + APyDelphiWrapper, APythonType, LRttiType); + + //Try to load the method doc string from doc server + if Assigned(PyDocServer) and PyDocServer.Initialized and + PyDocServer.ReadMemberDocStr(LClass.ClassInfo, LRttiProperty, LDocStr) + then + LExposedProperty.DocString := AnsiString(LDocStr); + + // Keep it alive until the Wrapper is Finalized + APyDelphiWrapper.fExposedMembers.Add(LExposedProperty); + + //Adds the Python getset + APythonType.AddGetSet( + PAnsiChar(LExposedProperty.Name), + LExposedProperty.GetterCallback, + nil, + PAnsiChar(LExposedProperty.DocString), + nil); + end; + finally + LRttiCtx.Free; + end; +end; + {$ENDIF EXTENDED_RTTI} function TPyDelphiObject.Set_Owned(AValue: PPyObject; @@ -4527,6 +4777,7 @@ procedure TPyDelphiWrapper.CreateWrappers; PyDocServer.Initialize; fRecordType := RegisterHelperType(TPyPascalRecord); fInterfaceType := RegisterHelperType(TPyPascalInterface); + RegisterHelperType(TPyIndexedProperty); {$ENDIF} // Create and Register Wrapper for TObject diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index ba562dc6..28f0327f 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -41,6 +41,12 @@ TTestRttiAccess = class private FFruit: TFruit; FFruits: TFruits; + TempI: Integer; + TempS: string; + function GetIndexed2(S1, S2: string): string; + procedure SetIndexed2(S1, S2: string; const Value: string); + function GetIndexed(I: Integer): Integer; + procedure SetIndexed(I: Integer; const Value: Integer); public FruitField :TFruit; FruitsField: TFruits; @@ -62,6 +68,8 @@ TTestRttiAccess = class function SetStringField(const Value: string): string; overload; procedure PassVariantArray(const Value: Variant); function ClassRefParam(ClassRef: TPersistentClass): string; + property Indexed[I: Integer]: Integer read GetIndexed write SetIndexed; + property Indexed2[S1, S2: string]: string read GetIndexed2 write SetIndexed2; class var ClassField: string; class function DoubleString(S: string): string; class function Square(I: Integer): Integer; static; @@ -142,6 +150,8 @@ TTestWrapDelphi = class(TObject) procedure TestClassMethods; [Test] procedure TestStaticMethods; + [Test] + procedure TestIndexedProperties; end; implementation @@ -313,6 +323,14 @@ procedure TTestWrapDelphi.TestGetStaticArray; Assert.AreEqual(Int64(999), Int64(PythonEngine.PyObjectAsVariant(PythonEngine.PyList_GetItem(ExtractPythonObjectFrom(List), 999)))); end; +procedure TTestWrapDelphi.TestIndexedProperties; +begin + PythonEngine.ExecString('rtti_var.Indexed[2] = 4'); + Assert.AreEqual(VarPythonEval('rtti_var.Indexed[2]'), 6); + PythonEngine.ExecString('rtti_var.Indexed2["A", "B"] = "C"'); + Assert.AreEqual(VarPythonEval('rtti_var.Indexed2["A", "B"]'), 'A,B: C'); +end; + procedure TTestWrapDelphi.TestInheritance; var Py_Strings, Py_Persistent, Py_Object: PPyObject; @@ -501,6 +519,16 @@ procedure TTestWrapDelphi.TestMethodWithVarAndOverload; Assert.AreEqual('test', TestRttiAccess.StringField); end; +procedure TTestRttiAccess.SetIndexed(I: Integer; const Value: Integer); +begin + TempI := I + Value; +end; + +procedure TTestRttiAccess.SetIndexed2(S1, S2: string; const Value: string); +begin + TempS := Format('%s,%s: %s', [S1, S2, Value]); +end; + function TTestRttiAccess.SetStringField(const Value: string): string; begin StringField := Value; @@ -542,6 +570,16 @@ function TTestRttiAccess.GetDynArray: TInt64DynArray; Result[I] := I; end; +function TTestRttiAccess.GetIndexed(I: Integer): Integer; +begin + Result := TempI; +end; + +function TTestRttiAccess.GetIndexed2(S1, S2: string): string; +begin + Result := TempS; +end; + function TTestRttiAccess.GetStaticArray: TStaticArray; var I: Integer; From f3b3b6c0a165f2824c22c0e998f91b082aa3ac9c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 6 Oct 2023 00:07:14 +0300 Subject: [PATCH 066/174] Remove unused PythonType parameter from RtiiCall --- Source/WrapDelphi.pas | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 3ff5e2bb..cffaef98 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1037,9 +1037,8 @@ implementation gRegisteredUnits : TRegisteredUnits; {$IFDEF EXTENDED_RTTI} -function RttiCall(ParentAddress: pointer; PythonType: TPythonType; - DelphiWrapper: TPyDelphiWrapper; MethName: string; - ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; +function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; + MethName: string; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; @@ -1237,7 +1236,6 @@ function TExposedMethod.MethodWrapper(ASelf, Args, Kwds: PPyObject): PPyObject; Result := RttiCall( ParentAddress, - FPythonType, FPyDelphiWrapper, string(FName), FParentRtti, @@ -2594,9 +2592,8 @@ procedure Rtti_Dir(SL: TStringList; RttiType: TRttiType); SL.Add(RttiField.Name); end; -function RttiCall(ParentAddress: pointer; PythonType: TPythonType; - DelphiWrapper: TPyDelphiWrapper; MethName: string; - ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; +function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; + MethName: string; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; AParentAddrIsClass: Boolean): PPyObject; { TODO: Handle methods with var parameters @@ -2640,7 +2637,7 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; // Ignore keyword arguments ob2 // ob1 is a tuple with zero or more elements - ArgCount := PythonType.Engine.PyTuple_Size(ob1); + ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); SetLength(Args, ArgCount); meth := FindMethod(MethName, ParentRtti, ob1, Args); @@ -2667,7 +2664,7 @@ function RttiCall(ParentAddress: pointer; PythonType: TPythonType; Result := RetValueToPython(ReturnValue, DelphiWrapper, ErrMsg); if Result = nil then - with PythonType.Engine do + with DelphiWrapper.Engine do PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); except @@ -4188,7 +4185,7 @@ function TPyDelphiObject.Wrap(AObject: TObject; {$IFDEF EXTENDED_RTTI} function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; begin - Result := RttiCall(ParentAddress, PythonType, fDelphiWrapper, MethName, ParentRtti, ob1, ob2); + Result := RttiCall(ParentAddress, fDelphiWrapper, MethName, ParentRtti, ob1, ob2); end; {$ELSE)} From bc98c8e2651cb4d7e58e733cf5f131d3dbbcd88f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 6 Oct 2023 05:02:32 +0300 Subject: [PATCH 067/174] Minor improvements to TPyIndexedProperty --- Source/WrapDelphi.pas | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index cffaef98..02d36475 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1116,9 +1116,10 @@ TExposedProperty = class(TExposedGetSet) TPyIndexedProperty = class(TPyObject) private FPyObj: PPyObject; - FPyDelphiWrapper: TPyDelphiWrapper; + FPyWrapper: TPyDelphiWrapper; FProperty: TRttiIndexedProperty; public + destructor Destroy; override; procedure Setup(PyObj: PPyObject; Wrapper: TPyDelphiWrapper; Prop: TRttiIndexedProperty); class procedure SetupType(PythonType: TPythonType); override; // Mapping services @@ -1412,10 +1413,18 @@ function TExposedIndexedProperty.GetterWrapper(AObj: PPyObject; AContext : Point { TPyIndexedProperty } +destructor TPyIndexedProperty.Destroy; +begin + if Assigned(FPyWrapper) then + FPyWrapper.Engine.Py_XDECREF(FPyObj); + inherited; +end; + procedure TPyIndexedProperty.Setup(PyObj: PPyObject; Wrapper: TPyDelphiWrapper; Prop: TRttiIndexedProperty); begin FPyObj:= PyObj; - FPyDelphiWrapper := Wrapper; + Wrapper.Engine.Py_XINCREF(FPyObj); + FPyWrapper := Wrapper; FProperty := Prop; end; @@ -1445,16 +1454,16 @@ function TPyIndexedProperty.MpSubscript(obj: PPyObject) : PPyObject; end; // obj is a tuple only if we have more than one arguments - if FPyDelphiWrapper.Engine.PyTuple_Check(obj) then + if FPyWrapper.Engine.PyTuple_Check(obj) then PyArgs := obj else - PyArgs := FPyDelphiWrapper.Engine.MakePyTuple([obj]); + PyArgs := FPyWrapper.Engine.MakePyTuple([obj]); - Result := RttiCall(PascalObject, FPyDelphiWrapper, FProperty.ReadMethod, + Result := RttiCall(PascalObject, FPyWrapper, FProperty.ReadMethod, PyArgs, nil); - if not FPyDelphiWrapper.Engine.PyTuple_Check(obj) then - FPyDelphiWrapper.Engine.Py_DECREF(PyArgs); // release created tuple + if not FPyWrapper.Engine.PyTuple_Check(obj) then + FPyWrapper.Engine.Py_DECREF(PyArgs); // release created tuple end; function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; @@ -1468,7 +1477,7 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; begin Result := -1; // Signals failure - Engine := FPyDelphiWrapper.Engine; + Engine := FPyWrapper.Engine; if not FProperty.IsWritable then begin with Engine do @@ -1499,7 +1508,7 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; else PyArgs := Engine.MakePyTuple([obj1, obj2]); - TempPy := RttiCall(PascalObject, FPyDelphiWrapper, FProperty.WriteMethod, + TempPy := RttiCall(PascalObject, FPyWrapper, FProperty.WriteMethod, PyArgs, nil); Engine.Py_DECREF(PyArgs); // release created tuple From ffec29a70c0fa3e3716ee30e72bb8041e531d8c8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 6 Oct 2023 05:03:10 +0300 Subject: [PATCH 068/174] Minor improvements to TPyIndexedProperty --- Source/WrapDelphi.pas | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 02d36475..32605a81 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1436,7 +1436,6 @@ class procedure TPyIndexedProperty.SetupType(PythonType : TPythonType); PythonType.GenerateCreateFunction := False; PythonType.DocString.Text := 'Indexed property wrapper'; PythonType.Services.Basic := [bsRepr, bsStr]; - if True then PythonType.Services.Mapping := [msSubscript, msAssSubscript] end; From 2c244ddd33474c9bfd23d9b9d420e4f202d6740a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 6 Oct 2023 14:05:34 +0300 Subject: [PATCH 069/174] Exposed members defined after manually wrapped members, so that the latter take precedence. --- Source/PythonEngine.pas | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index fed4a0e8..485f94ea 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -140,6 +140,7 @@ TPythonVersionProp = record METH_KEYWORDS = $0002; METH_CLASS = $0010; METH_STATIC = $0020; + METH_COEXIST = $0040; // Masks for the co_flags field of PyCodeObject CO_OPTIMIZED = $0001; @@ -7986,10 +7987,10 @@ procedure TPythonType.SetPyObjectClass( val : TPyObjectClass ); if Assigned(val) then begin FType.tp_basicsize := val.InstanceSize + Sizeof(PyObject); - val.SetupType( Self ); val.RegisterMethods( Self ); val.RegisterMembers( Self ); val.RegisterGetSets( Self ); + val.SetupType( Self ); end; end; end; From 05c28f8ffdd9bd72e1681153a05d3487defbf6c4 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 6 Oct 2023 17:41:44 +0300 Subject: [PATCH 070/174] Introduced ExcludedExposedMembers. --- Source/WrapDelphi.pas | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 32605a81..7aba070a 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -576,6 +576,7 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) class procedure RegisterGetSets( PythonType : TPythonType ); override; class procedure SetupType( PythonType : TPythonType ); override; {$IFDEF EXTENDED_RTTI} + class function ExcludedExposedMembers: TArray; virtual; class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; AExcludedMethodNames: TArray = []); @@ -3702,17 +3703,22 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); PythonType.DocString.Text := LDocStr; ExposeMethods(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, ['Free', 'CPP_ABI_1', 'CPP_ABI_2', 'CPP_ABI_3']); + PyWrapper, ExcludedExposedMembers); ExposeFields(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, []); + PyWrapper, ExcludedExposedMembers); ExposeProperties(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, []); + PyWrapper, ExcludedExposedMembers); ExposeIndexedProperties(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, []); + PyWrapper, ExcludedExposedMembers); {$ENDIF EXTENDED_RTTI} end; {$IFDEF EXTENDED_RTTI} +class function TPyDelphiObject.ExcludedExposedMembers: TArray; +begin + Result := ['Free', 'CPP_ABI_1', 'CPP_ABI_2', 'CPP_ABI_3']; +end; + class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; AExcludedMethodNames: TArray); From e49d2dbbbdd10d1c5fcdde650b51df2b2561f8d0 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 6 Oct 2023 23:07:07 +0300 Subject: [PATCH 071/174] Refactoring of WrapDelphi.pas Introduced TValueToPyObject and PyObjectToTValue functions --- Source/WrapDelphi.pas | 313 +++++++++++++++--------------------------- 1 file changed, 114 insertions(+), 199 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 7aba070a..a2d0a5c1 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -549,6 +549,21 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) function Get_Bound(Acontext : Pointer) : PPyObject; cdecl; // implementation of interface IFreeNotificationSubscriber procedure Notify(ADeletedObject : TObject); + {$IFDEF EXTENDED_RTTI} + class function ExcludedExposedMembers: TArray; virtual; + class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedMethodNames: TArray = []); + class procedure ExposeFields(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedFieldNames: TArray = []); + class procedure ExposeProperties(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedPropertyNames: TArray = []); + class procedure ExposeIndexedProperties(AClass: TClass; NearestAncestorClass: TClass; + APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; + AExcludedPropertyNames: TArray = []); + {$ENDIF EXTENDED_RTTI} public PyDelphiWrapper : TPyDelphiWrapper; Owned: Boolean; @@ -569,27 +584,10 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) function SqContains( obj: PPyObject): integer; override; function SqAssItem( idx : NativeInt; obj : PPyObject) : Integer; override; - // CreateWith should be overwritten when a constuctor with - // parameters is needed. It should raise a python exception class function DelphiObjectClass : TClass; virtual; class procedure RegisterMethods( PythonType : TPythonType ); override; class procedure RegisterGetSets( PythonType : TPythonType ); override; class procedure SetupType( PythonType : TPythonType ); override; - {$IFDEF EXTENDED_RTTI} - class function ExcludedExposedMembers: TArray; virtual; - class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; - APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedMethodNames: TArray = []); - class procedure ExposeFields(AClass: TClass; NearestAncestorClass: TClass; - APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedFieldNames: TArray = []); - class procedure ExposeProperties(AClass: TClass; NearestAncestorClass: TClass; - APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedPropertyNames: TArray = []); - class procedure ExposeIndexedProperties(AClass: TClass; NearestAncestorClass: TClass; - APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedPropertyNames: TArray = []); - {$ENDIF EXTENDED_RTTI} // if the class is a container (TStrings, TComponent, TCollection...), // then return the class implementing the access to the contained items. class function GetContainerAccessClass : TContainerAccessClass; virtual; @@ -604,7 +602,6 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) end; TPyDelphiObjectClass = class of TPyDelphiObject; - { Generic wrapper for pascal classes @@ -938,10 +935,8 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) // Implement to customize the creation of docstrings for exposed class members IDocServer = interface ['{4AF0D319-47E9-4F0A-9C71-97B8CBB559FF}'] - function ReadTypeDocStr(const ATypeInfo: PTypeInfo; - out ADocStr: string): boolean; - function ReadMemberDocStr(const AParent: PTypeInfo; - const AMember: TRttiMember; out ADocStr: string): boolean; + function ReadTypeDocStr(ATypeInfo: PTypeInfo; out ADocStr: string): Boolean; + function ReadMemberDocStr(AMember: TRttiMember; out ADocStr: string): Boolean; procedure Initialize; procedure Finalize; function Initialized: Boolean; @@ -1330,18 +1325,18 @@ function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyO function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; var Obj: TObject; - LOutMsg: string; + ErrMsg: string; begin Result := -1; - if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) and - SetRttiAttr(Obj, FParentRtti, FRttiMember.Name, AValue, FPyDelphiWrapper, LOutMsg) + if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, ErrMsg) and + SetRttiAttr(Obj, FParentRtti, FRttiMember.Name, AValue, FPyDelphiWrapper, ErrMsg) then Result := 0; if Result <> 0 then with GetPythonEngine do PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrSetr, [FRttiMember.Name, LOutMsg]))); + PyUnicodeFromString(Format(rs_ErrAttrSetr, [FRttiMember.Name, ErrMsg]))); end; { TExposedField } @@ -1782,7 +1777,8 @@ function ValidateInterfaceProperty(PyValue: PPyObject; RttiType: TRttiInterfaceT ErrMsg := rs_ExpectedInterface; end; -function ValidateDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; out ParamValue: TValue; out ErrMsg: string): Boolean; +function ValidateDynArray(PyValue: PPyObject; const RttiType: TRttiType; + out ParamValue: TValue; out ErrMsg: string): Boolean; var Arr: array of TValue; I: Integer; @@ -1800,11 +1796,11 @@ function ValidateDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; o Exit; end; - if (RttiParam.ParamType = nil) or (RttiParam.ParamType.Handle = nil) or (GetTypeData(RttiParam.ParamType.Handle) = nil) then + if (RttiType = nil) or (RttiType.Handle = nil) or (GetTypeData(RttiType.Handle) = nil) then Exit; - elType := GetTypeData(RttiParam.ParamType.Handle).elType; + elType := GetTypeData(RttiType.Handle).elType; if elType = nil then - elType := GetTypeData(RttiParam.ParamType.Handle).elType2; + elType := GetTypeData(RttiType.Handle).elType2; if elType = nil then Exit; @@ -1821,55 +1817,56 @@ function ValidateDynArray(PyValue: PPyObject; const RttiParam: TRttiParameter; o else Arr[i] := TValue.FromVariant(V).Cast(elType^); end; - ParamValue := TValue.FromArray(RttiParam.ParamType.Handle, Arr); + ParamValue := TValue.FromArray(RttiType.Handle, Arr); Result := True; except ErrMsg := rs_IncompatiblePythonType; end; end; -function PyArgToValue(PyArg : PPyObject; Param: TRttiParameter; out Arg: TValue): Boolean; +function PyObjectToTValue(PyArg : PPyObject; ArgType: TRttiType; + out Arg: TValue; out ErrMsg: string): Boolean; var - ErrMsg: string; Obj: TObject; ClassRef: TClass; begin - Result := False; - if (Param.ParamType = nil) or - (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) - then - Exit - else if Param.ParamType.TypeKind = tkClass then - begin - Result := ValidateClassProperty(PyArg, Param.ParamType.Handle, Obj, ErrMsg); - if Result then - Arg := Obj; - end - else if (Param.ParamType.TypeKind = tkClassRef) then - begin - Result := ValidateClassRef(PyArg, - (Param.ParamType as TRttiClassRefType).MetaclassType, ClassRef, ErrMsg); - if Result then - Arg := ClassRef; - end - else if Param.ParamType.TypeKind = tkInterface then - Result := ValidateInterfaceProperty(PyArg, - Param.ParamType as TRttiInterfaceType, Arg, ErrMsg) - else if Param.ParamType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then - Result := ValidateRecordProperty(PyArg, Param.ParamType.Handle, Arg, ErrMsg) - else if Param.ParamType.TypeKind = tkDynArray then - Result := ValidateDynArray(PyArg, Param, Arg, ErrMsg) + if ArgType = nil then + Exit(False); + + case ArgType.TypeKind of + tkClass: + begin + Result := ValidateClassProperty(PyArg, ArgType.Handle, Obj, ErrMsg); + if Result then + Arg := Obj; + end; + tkClassRef: + begin + Result := ValidateClassRef(PyArg, + (ArgType as TRttiClassRefType).MetaclassType, ClassRef, ErrMsg); + if Result then + Arg := ClassRef; + end; + tkInterface: + Result := ValidateInterfaceProperty(PyArg, + ArgType as TRttiInterfaceType, Arg, ErrMsg); + tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}: + Result := ValidateRecordProperty(PyArg, ArgType.Handle, Arg, ErrMsg); + tkDynArray: + Result := ValidateDynArray(PyArg, ArgType, Arg, ErrMsg) else - Result := SimplePythonToValue(PyArg, Param.ParamType.Handle, - Arg, ErrMsg); + Result := SimplePythonToValue(PyArg, ArgType.Handle, Arg, ErrMsg); + end; end; + function PyArgsToValues(PyArgs: PPyObject; Method: TRttiMethod; out Args: array of TValue): Boolean; var Index: Integer; PyArg : PPyObject; Param: TRttiParameter; Engine: TPythonEngine; + ErrMsg: string; Params : TArray; begin Params := Method.GetParameters; @@ -1881,27 +1878,29 @@ function PyArgsToValues(PyArgs: PPyObject; Method: TRttiMethod; out Args: array begin Param := Params[Index]; PyArg := Engine.PyTuple_GetItem(PyArgs, Index); - if not PyArgToValue(PyArg, Param, Args[Index]) then + if (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) or + not PyObjectToTValue(PyArg, Param.ParamType, Args[Index], ErrMsg) + then Exit(False); end; Result := True; end; -function RetValueToPython(const RetValue: TValue; +function TValueToPyObject(const Value: TValue; DelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; begin - if RetValue.IsEmpty then + if Value.IsEmpty then Result := GetPythonEngine.ReturnNone - else if RetValue.Kind = tkClass then - Result := DelphiWrapper.Wrap(RetValue.AsObject) - else if RetValue.Kind = tkClassRef then - Result := DelphiWrapper.WrapClass(RetValue.AsClass) - else if RetValue.Kind = tkInterface then - Result := DelphiWrapper.WrapInterface(RetValue, True) - else if RetValue.Kind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then - Result := DelphiWrapper.WrapRecord(RetValue, True) else - Result := SimpleValueToPython(RetValue, ErrMsg); + case Value.Kind of + tkClass: Result := DelphiWrapper.Wrap(Value.AsObject); + tkClassRef: Result := DelphiWrapper.WrapClass(Value.AsClass); + tkInterface: Result := DelphiWrapper.WrapInterface(Value, True); + tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: + Result := DelphiWrapper.WrapRecord(Value, True); + else + Result := SimpleValueToPython(Value, ErrMsg); + end; end; {$ENDIF} @@ -2671,7 +2670,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; Addr := TValue.From(ParentAddress); ReturnValue := meth.Invoke(Addr, Args); - Result := RetValueToPython(ReturnValue, DelphiWrapper, ErrMsg); + Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg); if Result = nil then with DelphiWrapper.Engine do PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( @@ -2723,7 +2722,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; ReturnValue := Method.Invoke(Addr, Args); - Result := RetValueToPython(ReturnValue, DelphiWrapper, ErrMsg); + Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg); if Result = nil then with DelphiWrapper.Engine do PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( @@ -2770,26 +2769,14 @@ function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; ErrMsg := rs_NotReadable else if Prop.PropertyType = nil then ErrMsg := rs_ErrNoTypeInfo + else if Prop.PropertyType.TypeKind = tkMethod then + begin + if (ParentType is TRttiInstanceType) and (Prop is TRttiInstanceProperty) then + Result := PyDelphiWrapper.fEventHandlerList.GetCallable(TObject(ParentAddr), + TRttiInstanceProperty(Prop).PropInfo); + end else - case Prop.PropertyType.TypeKind of - tkClass: - Result := PyDelphiWrapper.Wrap(Prop.GetValue(ParentAddr).AsObject); - tkClassRef: - Result := PyDelphiWrapper.WrapClass(Prop.GetValue(ParentAddr).AsClass); - tkInterface: - // Must be a copy, otherwise reference counting fails and the returned - // interface might be freed while python is holding a reference to it - Result := PyDelphiWrapper.WrapInterface(Prop.GetValue(ParentAddr), True); - tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: - // Must be a copy, property getters are not allowed to leak access to underlying storage - Result := PyDelphiWrapper.WrapRecord(Prop.GetValue(ParentAddr), True); - tkMethod: - if (ParentType is TRttiInstanceType) and (Prop is TRttiInstanceProperty) then - Result := PyDelphiWrapper.fEventHandlerList.GetCallable(TObject(ParentAddr), - TRttiInstanceProperty(Prop).PropInfo); - else - Result := SimpleValueToPython(Prop.GetValue(ParentAddr), ErrMsg) - end; + Result := TValueToPyObject(Prop.GetValue(ParentAddr), PyDelphiWrapper, ErrMsg); end else begin @@ -2800,25 +2787,15 @@ function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; ErrMsg := rs_NoAccess else if Field.FieldType = nil then ErrMsg := rs_ErrNoTypeInfo + else if Field.FieldType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then + //Potentially dangerous as the returned value, which is a pointer into the object, + //could be stored on the python side, then the object freed, and the stored pointer later + //used to access no longer allocated memory + //But I can't see any good alternative if Python should be able to write directly into + //fields of a record that's part of an object. + Result := PyDelphiWrapper.WrapRecord(PByte(ParentAddr) + Field.Offset, TRttiStructuredType(Field.FieldType)) else - case Field.FieldType.TypeKind of - tkClass: - Result := PyDelphiWrapper.Wrap(Field.GetValue(ParentAddr).AsObject); // Returns None if Field is nil - tkClassRef: - Result := PyDelphiWrapper.WrapClass(Field.GetValue(ParentAddr).AsClass); // Returns None if Field is nil - tkInterface: - Result := PyDelphiWrapper.WrapInterface(Field.GetValue(ParentAddr), True); - tkRecord: - if Field.FieldType is TRttiStructuredType then - //Potentially dangerous as the returned value, which is a pointer into the object, - //could be stored on the python side, then the object freed, and the stored pointer later - //used to access no longer allocated memory - //But I can't see any good alternative if Python should be able to write directly into - //fields of a record that's part of an object. - Result := PyDelphiWrapper.WrapRecord(PByte(ParentAddr) + Field.Offset, TRttiStructuredType(Field.FieldType)); - else - Result := SimpleValueToPython(Field.GetValue(ParentAddr), ErrMsg) - end; + Result := TValueToPyObject(Field.GetValue(ParentAddr), PyDelphiWrapper, ErrMsg); end else ErrMsg := rs_UnknownAttribute; @@ -2838,10 +2815,7 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType var Prop: TRttiProperty; Field: TRttiField; - V: TValue; - Obj: TObject; - Cls: TClass; - ValueOut: TValue; + AttrValue: TValue; begin Result := False; @@ -2854,43 +2828,18 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType ErrMsg := rs_NotWritable else if Prop.PropertyType = nil then ErrMsg := rs_ErrNoTypeInfo - else - case Prop.PropertyType.TypeKind of - tkClass: - if ValidateClassProperty(Value, Prop.PropertyType.Handle, Obj, ErrMsg) then begin - Prop.SetValue(ParentAddr, Obj); - Result := True; - end; - tkClassRef: - if ValidateClassRef(Value, - (Prop.PropertyType as TRttiClassRefType).MetaclassType, - Cls, ErrMsg) then - begin - Prop.SetValue(ParentAddr, Cls); - Result := True; - end; - tkInterface: - if ValidateInterfaceProperty(Value, Prop.PropertyType as TRttiInterfaceType, ValueOut, ErrMsg) then begin - Prop.SetValue(ParentAddr, ValueOut); - Result := True; - end; - tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: - if ValidateRecordProperty(Value, Prop.PropertyType.Handle, ValueOut, ErrMsg) then begin - Prop.SetValue(ParentAddr, ValueOut); - Result := True; - end; - tkMethod: - if Prop.Visibility = mvPublished then - Result := PyDelphiWrapper.EventHandlers.Link(TObject(ParentAddr), - (Prop as TRttiInstanceProperty).PropInfo, Value, ErrMsg) - else - ErrMsg := rs_NotPublished; - else - begin - Result := SimplePythonToValue(Value, Prop.PropertyType.Handle, V, ErrMsg); - if Result then - Prop.SetValue(ParentAddr, V); - end; + else if Prop.PropertyType.TypeKind = tkMethod then + begin + if Prop.Visibility = mvPublished then + Result := PyDelphiWrapper.EventHandlers.Link(TObject(ParentAddr), + (Prop as TRttiInstanceProperty).PropInfo, Value, ErrMsg) + else + ErrMsg := rs_NotPublished; + end + else if PyObjectToTValue(Value, Prop.PropertyType, AttrValue, ErrMsg) then + begin + Prop.SetValue(ParentAddr, AttrValue); + Result := True; end; except on E: Exception do begin @@ -2907,37 +2856,10 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType ErrMsg := rs_NoAccess else if Field.FieldType = nil then ErrMsg := rs_ErrNoTypeInfo - else - case Field.FieldType.TypeKind of - tkClass: - if ValidateClassProperty(value, Field.FieldType.Handle, Obj, ErrMsg) then begin - Field.SetValue(ParentAddr, Obj); - Result := True; - end; - tkClassRef: - if ValidateClassRef(Value, - (Field.FieldType as TRttiClassRefType).MetaclassType, - Cls, ErrMsg) then - begin - Field.SetValue(ParentAddr, Cls); - Result := True; - end; - tkInterface: - if ValidateInterfaceProperty(Value, Field.FieldType as TRttiInterfaceType, ValueOut, ErrMsg) then begin - Field.SetValue(ParentAddr, ValueOut); - Result := True; - end; - tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: - if ValidateRecordProperty(Value, Field.FieldType.Handle, ValueOut, ErrMsg) then begin - Field.SetValue(ParentAddr, ValueOut); - Result := True; - end; - else - begin - Result := SimplePythonToValue(Value, Field.FieldType.Handle, V, ErrMsg); - if Result then - Field.SetValue(ParentAddr, V); - end; + else if PyObjectToTValue(Value, Field.FieldType, AttrValue, ErrMsg) then + begin + Field.SetValue(ParentAddr, AttrValue); + Result := True; end; except on E: Exception do begin @@ -3737,8 +3659,7 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; AddedMethods := []; for LRttiMethod in LRttiType.GetMethods do begin - // Ignore methods with visibility lower than protected - if (Ord(LRttiMethod.Visibility) < Ord(TMemberVisibility.mvProtected)) then + if (Ord(LRttiMethod.Visibility) < Ord(TMemberVisibility.mvPublic)) then Continue; // Ingnore constructors, destructors and operator overloads @@ -3769,17 +3690,11 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; APyDelphiWrapper, APythonType, LRttiType); //Try to load the method doc string from doc server - if Assigned(PyDocServer) and PyDocServer.Initialized then - begin - LClass := DelphiObjectClass; - LDocStr := String.Empty; - while Assigned(LClass) and (LDocStr = '') do begin - if PyDocServer.ReadMemberDocStr( - LClass.ClassInfo, LRttiMethod, LDocStr) then - LExposedMethod.DocString := AnsiString(LDocStr); - LClass := LClass.ClassParent; - end; - end; + //Try to load the method doc string from doc server + if Assigned(PyDocServer) and PyDocServer.Initialized and + PyDocServer.ReadMemberDocStr(LRttiMethod, LDocStr) + then + LExposedMethod.DocString := AnsiString(LDocStr); //Build the DocStr including method args LExposedMethod.DocString := @@ -3864,7 +3779,7 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; //Try to load the method doc string from doc server if Assigned(PyDocServer) and PyDocServer.Initialized and - PyDocServer.ReadMemberDocStr(LClass.ClassInfo, LRttiField, LDocStr) + PyDocServer.ReadMemberDocStr(LRttiField, LDocStr) then LExposedField.DocString := AnsiString(LDocStr); @@ -3942,7 +3857,7 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; //Try to load the method doc string from doc server if Assigned(PyDocServer) and PyDocServer.Initialized and - PyDocServer.ReadMemberDocStr(LClass.ClassInfo, LRttiProperty, LDocStr) + PyDocServer.ReadMemberDocStr(LRttiProperty, LDocStr) then LExposedProperty.DocString := AnsiString(LDocStr); @@ -4024,7 +3939,7 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; //Try to load the method doc string from doc server if Assigned(PyDocServer) and PyDocServer.Initialized and - PyDocServer.ReadMemberDocStr(LClass.ClassInfo, LRttiProperty, LDocStr) + PyDocServer.ReadMemberDocStr(LRttiProperty, LDocStr) then LExposedProperty.DocString := AnsiString(LDocStr); From bc0465abe5b10b332d1b4598e3b173123198fa4e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 7 Oct 2023 00:45:13 +0300 Subject: [PATCH 072/174] Minor refactoring of SetRttiAttr. --- Source/WrapDelphi.pas | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index a2d0a5c1..14125a52 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2819,9 +2819,10 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType begin Result := False; - Prop := ParentType.GetProperty(AttrName); - if Prop <> nil then - try + try + Prop := ParentType.GetProperty(AttrName); + if Prop <> nil then + begin if Ord(Prop.Visibility) < Ord(mvPublic) then ErrMsg := rs_NoAccess else if not Prop.IsWritable then @@ -2841,17 +2842,12 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType Prop.SetValue(ParentAddr, AttrValue); Result := True; end; - except - on E: Exception do begin - Result := False; - ErrMsg := E.Message; - end; end - else - begin - Field := ParentType.GetField(AttrName); - if Field <> nil then - try + else + begin + Field := ParentType.GetField(AttrName); + if Field <> nil then + begin if Ord(Field.Visibility) < Ord(mvPublic) then ErrMsg := rs_NoAccess else if Field.FieldType = nil then @@ -2861,12 +2857,15 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType Field.SetValue(ParentAddr, AttrValue); Result := True; end; - except - on E: Exception do begin - Result := False; - ErrMsg := E.Message; - end; end + else + ErrMsg := rs_UnknownAttribute; + end; + except + on E: Exception do begin + Result := False; + ErrMsg := E.Message; + end; end; end; From e978663ab9956a44174ce0c235e9296f0f1bfde4 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 9 Oct 2023 19:29:57 +0300 Subject: [PATCH 073/174] Python created PyDelphiObjects are owned by Python. DefineVar(string, TObject) gets an ownership parameter with a default soReference --- Source/WrapDelphi.pas | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 14125a52..962b6cbf 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -894,7 +894,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) procedure Initialize; override; procedure Finalize; override; procedure DefineVar(const AName : string; const AValue : Variant); overload; - procedure DefineVar(const AName : string; AValue : TObject); overload; + procedure DefineVar(const AName : string; AValue : TObject; AOwnership: TObjectOwnership = soReference); overload; procedure DefineVar(const AName : string; AValue : TClass); overload; function RegisterDelphiWrapper(AWrapperClass : TPyDelphiObjectClass): TPythonType; function RegisterHelperType(APyObjectClass : TPyObjectClass) : TPythonType; @@ -907,7 +907,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) {$IFDEF EXTENDED_RTTI} // Function that provides a Python object wrapping a record function WrapRecord(Address: Pointer; Typ: TRttiStructuredType): PPyObject; overload; - function WrapRecord(const AValue: TValue; const ACopy: Boolean = false): PPyObject; overload; + function WrapRecord(const AValue: TValue; ACopy: Boolean = false): PPyObject; overload; // Function that provides a Python object wrapping an interface // Note the the interface must be compiled in {$M+} mode and have a guid // Usage: WrapInterface(TValue.From(YourInterfaceReference)) @@ -915,7 +915,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) // Use ACopy = True to retrieve a normal counted reference // that will keep the interface alive as long as python has a // reference to it. - function WrapInterface(const IValue: TValue; const ACopy: Boolean = False): PPyObject; + function WrapInterface(const IValue: TValue; ACopy: Boolean = False): PPyObject; {$ENDIF} // properties property EventHandlers : TEventHandlers read fEventHandlerList; @@ -931,7 +931,7 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) end; {$IFDEF EXTENDED_RTTI} - // Documentation hook inerface + // Documentation hook interface // Implement to customize the creation of docstrings for exposed class members IDocServer = interface ['{4AF0D319-47E9-4F0A-9C71-97B8CBB559FF}'] @@ -2534,6 +2534,9 @@ function TPyDelphiObject.Compare(obj: PPyObject): Integer; constructor TPyDelphiObject.Create(APythonType: TPythonType); begin inherited; + // PyObjects created by python should be owned by python. + // PyObjects created by wrapping pascal object be default are not + Owned := True; if Assigned(APythonType) and (APythonType.Owner is TPyDelphiWrapper) then PyDelphiWrapper := TPyDelphiWrapper(APythonType.Owner); end; @@ -4731,12 +4734,13 @@ procedure TPyDelphiWrapper.DefineVar(const AName: string; const AValue: Variant) Engine.Py_DECREF(_obj); end; -procedure TPyDelphiWrapper.DefineVar(const AName: string; AValue: TObject); +procedure TPyDelphiWrapper.DefineVar(const AName: string; AValue: TObject; + AOwnership: TObjectOwnership); var _obj : PPyObject; begin Assert(Assigned(Module)); - _obj := Wrap(AValue); + _obj := Wrap(AValue, AOwnership); Module.SetVar(AnsiString(AName), _obj); Engine.Py_DECREF(_obj); end; @@ -5029,7 +5033,7 @@ function TPyDelphiWrapper.WrapRecord(Address: Pointer; Typ: TRttiStructuredType) end; end; -function TPyDelphiWrapper.WrapRecord(const AValue: TValue; const ACopy: Boolean): PPyObject; +function TPyDelphiWrapper.WrapRecord(const AValue: TValue; ACopy: Boolean): PPyObject; var LPythonType: TPythonType; begin @@ -5055,7 +5059,7 @@ function TPyDelphiWrapper.WrapRecord(const AValue: TValue; const ACopy: Boolean) end; function TPyDelphiWrapper.WrapInterface(const IValue: TValue; - const ACopy: Boolean = False): PPyObject; + ACopy: Boolean = False): PPyObject; var LPythonType: TPythonType; begin From 0eeecdc91ec09c678f8a0393f5ca96f7a7d94dec Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 9 Oct 2023 20:10:57 +0300 Subject: [PATCH 074/174] Simplified and clarified WrapRecord and WrapInterface. Added a DefineVar overload that works with a TValue. --- Source/WrapDelphi.pas | 69 ++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 962b6cbf..3be4341c 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -675,8 +675,7 @@ TPyRttiObject = class (TPyObject) PyDelphiWrapper : TPyDelphiWrapper; constructor Create( APythonType : TPythonType ); override; procedure SetAddrAndType(Address: Pointer; Typ: TRttiStructuredType); - procedure SetValueAndType(const AValue: TValue; - const ACopy: Boolean = false); + procedure SetupFromTValue(const AValue: TValue); function GetAttrO( key: PPyObject) : PPyObject; override; function SetAttrO( key, value: PPyObject) : Integer; override; @@ -905,17 +904,17 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) function Wrap(AObj : TObject; AOwnership: TObjectOwnership = soReference) : PPyObject; function WrapClass(AClass: TClass): PPyObject; {$IFDEF EXTENDED_RTTI} - // Function that provides a Python object wrapping a record + // Functions that provides a Python object wrapping a record + // The first overload wraps the record itself and the record needs to be kept alive. + // The second overload wraps a copy of the record contained in a TValue function WrapRecord(Address: Pointer; Typ: TRttiStructuredType): PPyObject; overload; - function WrapRecord(const AValue: TValue; ACopy: Boolean = false): PPyObject; overload; + function WrapRecord(const AValue: TValue): PPyObject; overload; // Function that provides a Python object wrapping an interface // Note the the interface must be compiled in {$M+} mode and have a guid + // The interface will be kept alive as long as python has areference to it. // Usage: WrapInterface(TValue.From(YourInterfaceReference)) - // Warning: WrapInterface represents a weak (uncounted) reference! - // Use ACopy = True to retrieve a normal counted reference - // that will keep the interface alive as long as python has a - // reference to it. - function WrapInterface(const IValue: TValue; ACopy: Boolean = False): PPyObject; + function WrapInterface(const IValue: TValue): PPyObject; + procedure DefineVar(const AName: string; AValue: TValue); overload; {$ENDIF} // properties property EventHandlers : TEventHandlers read fEventHandlerList; @@ -1895,9 +1894,9 @@ function TValueToPyObject(const Value: TValue; case Value.Kind of tkClass: Result := DelphiWrapper.Wrap(Value.AsObject); tkClassRef: Result := DelphiWrapper.WrapClass(Value.AsClass); - tkInterface: Result := DelphiWrapper.WrapInterface(Value, True); + tkInterface: Result := DelphiWrapper.WrapInterface(Value); tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: - Result := DelphiWrapper.WrapRecord(Value, True); + Result := DelphiWrapper.WrapRecord(Value); else Result := SimpleValueToPython(Value, ErrMsg); end; @@ -2977,8 +2976,7 @@ procedure TPyRttiObject.SetAddrAndType(Address: Pointer; Typ: TRttiStructuredTyp fRttiType := Typ; end; -procedure TPyRttiObject.SetValueAndType(const AValue: TValue; - const ACopy: Boolean); +procedure TPyRttiObject.SetUpFromTValue(const AValue: TValue); var LRttiCtx: TRttiContext; LRttiType: TRttiStructuredType; @@ -2990,21 +2988,11 @@ procedure TPyRttiObject.SetValueAndType(const AValue: TValue; LRttiCtx.Free(); end; - if ACopy then - begin - FCopy := AValue; - if LRttiType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}] then - SetAddrAndType(FCopy.GetReferenceToRawData(), LRttiType) - else if LRttiType.TypeKind = tkInterface then - SetAddrAndType(Pointer(FCopy.GetReferenceToRawData()^), LRttiType) - end - else - begin - if LRttiType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}] then - SetAddrAndType(AValue.GetReferenceToRawData(), LRttiType) - else if LRttiType.TypeKind = tkInterface then - SetAddrAndType(Pointer(AValue.GetReferenceToRawData()^), LRttiType) - end; + FCopy := AValue; + if LRttiType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}] then + SetAddrAndType(FCopy.GetReferenceToRawData(), LRttiType) + else if LRttiType.TypeKind = tkInterface then + SetAddrAndType(Pointer(FCopy.GetReferenceToRawData()^), LRttiType) end; { TPyPascalRecord } @@ -5033,7 +5021,7 @@ function TPyDelphiWrapper.WrapRecord(Address: Pointer; Typ: TRttiStructuredType) end; end; -function TPyDelphiWrapper.WrapRecord(const AValue: TValue; ACopy: Boolean): PPyObject; +function TPyDelphiWrapper.WrapRecord(const AValue: TValue): PPyObject; var LPythonType: TPythonType; begin @@ -5053,13 +5041,12 @@ function TPyDelphiWrapper.WrapRecord(const AValue: TValue; ACopy: Boolean): PPyO Result := LPythonType.CreateInstance(); with PythonToDelphi(Result) as TPyPascalRecord do begin - SetValueAndType(AValue, ACopy); + SetupFromTValue(AValue); PyDelphiWrapper := Self; end; end; -function TPyDelphiWrapper.WrapInterface(const IValue: TValue; - ACopy: Boolean = False): PPyObject; +function TPyDelphiWrapper.WrapInterface(const IValue: TValue): PPyObject; var LPythonType: TPythonType; begin @@ -5079,11 +5066,27 @@ function TPyDelphiWrapper.WrapInterface(const IValue: TValue; Result := LPythonType.CreateInstance; with PythonToDelphi(Result) as TPyPascalInterface do begin - SetValueAndType(IValue, ACopy); + SetupFromTValue(IValue); PyDelphiWrapper := Self; end; end; +procedure TPyDelphiWrapper.DefineVar(const AName: string; AValue: TValue); +var + _obj : PPyObject; + ErrMsg: string; +begin + Assert(Assigned(Module)); + _obj := TValueToPyObject(AValue, Self, ErrMsg); + if Assigned(_obj) then + begin + Module.SetVar(AnsiString(AName), _obj); + Engine.Py_DECREF(_obj); + end + else + raise Exception.Create(ErrMsg); +end; + // To keep the RTTI Pool alive and avoid continuously creating/destroying it // See also https://stackoverflow.com/questions/27368556/trtticontext-multi-thread-issue Var From dc99c7f438e530e672e4ec1004ba3182b13988ea Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 9 Oct 2023 20:20:46 +0300 Subject: [PATCH 075/174] Update WrapDelphiTest to cover the previous commit. --- Tests/WrapDelphiTest.pas | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 28f0327f..608a55a9 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -225,16 +225,12 @@ procedure TTestWrapDelphi.SetupFixture; // is destroyed, so we need to set its Owned property to True; TestRttiAccess := TTestRTTIAccess.Create; TestRttiAccess.InterfaceField := TTestInterfaceImpl.Create; - Py := PyDelphiWrapper.Wrap(TestRttiAccess, TObjectOwnership.soReference); - DelphiModule.SetVar('rtti_var', Py); - PythonEngine.Py_DecRef(Py); + PyDelphiWrapper.DefineVar('rtti_var', TestRttiAccess, TObjectOwnership.soReference); Py := PyDelphiWrapper.WrapRecord(@Rec, TRttiContext.Create.GetType(TypeInfo(TTestRecord)) as TRttiStructuredType); DelphiModule.SetVar('rtti_rec', Py); PythonEngine.Py_DecRef(Py); FTestInterface := TTestInterfaceImpl.Create; - Py := PyDelphiWrapper.WrapInterface(TValue.From(FTestInterface)); - DelphiModule.SetVar('rtti_interface', Py); - PythonEngine.Py_DecRef(Py); + PyDelphiWrapper.DefineVar('rtti_interface', TValue.From(FTestInterface)); PythonEngine.ExecString('from delphi import rtti_var, rtti_rec, rtti_interface, Object, Persistent, Collection, Strings, TestRttiAccess, TestSubclass'); Rtti_Var := MainModule.rtti_var; Rtti_Rec := MainModule.rtti_rec; From 0117d7d581d1157f8fadeda3b44f39644e873e95 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 10 Oct 2023 00:58:03 +0300 Subject: [PATCH 076/174] Made TPyObject.PythonType a class var. ExcludedExposedMembers implemented. --- Source/PythonEngine.pas | 7 ++-- Source/WrapDelphi.pas | 81 ++++++++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 485f94ea..0627f50d 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2387,9 +2387,9 @@ TPyObject = class procedure Set_ob_refcnt(const Value: NativeInt); procedure Set_ob_type(const Value: PPyTypeObject); public - PythonType : TPythonType; - IsSubtype : Boolean; - PythonAlloc : Boolean; + IsSubtype: Boolean; + PythonAlloc: Boolean; + class var PythonType: TPythonType; // Constructors & Destructors constructor Create(APythonType: TPythonType); virtual; @@ -7987,6 +7987,7 @@ procedure TPythonType.SetPyObjectClass( val : TPyObjectClass ); if Assigned(val) then begin FType.tp_basicsize := val.InstanceSize + Sizeof(PyObject); + val.PythonType := Self; val.RegisterMethods( Self ); val.RegisterMembers( Self ); val.RegisterGetSets( Self ); diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 3be4341c..7a40ece3 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3268,7 +3268,7 @@ function TPyDelphiObject.Dir_Wrapper(args: PPyObject): PPyObject; class function TPyDelphiObject.GetTypeName : string; begin - Result := Copy(DelphiObjectClass.ClassName, 2, MaxInt); + Result := Copy(DelphiObjectClass.ClassName, 2); end; function TPyDelphiObject.HasContainerAccessClass: Boolean; @@ -3353,11 +3353,9 @@ class procedure TPyDelphiObject.RegisterMethods(PythonType: TPythonType); PythonType.AddMethod('Free', @TPyDelphiObject.Free_Wrapper, 'TObject.Free()'#10 + 'Frees the Wrapped Delphi Object'); - {$IFNDEF EXTENDED_RTTI} PythonType.AddMethod('InheritsFrom', @TPyDelphiObject.InheritsFrom_Wrapper, 'TObject.InheritsFrom(ClassName)'#10 + 'Returns True if Delphi Object is or inherits from ClassName'); - {$ENDIF EXTENDED_RTTI} PythonType.AddMethod('ToTuple', @TPyDelphiObject.ToTuple_Wrapper, 'TStrings.ToTuple()'#10 + 'If the object is a container (TStrings, TComponent...), it returns the content of the sequence as a Python tuple object.'); @@ -3627,8 +3625,17 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); {$IFDEF EXTENDED_RTTI} class function TPyDelphiObject.ExcludedExposedMembers: TArray; +var + I, MethodCount: Integer; begin - Result := ['Free', 'CPP_ABI_1', 'CPP_ABI_2', 'CPP_ABI_3']; + MethodCount := PythonType.MethodCount; + SetLength(Result, MethodCount + PythonType.GetSetCount); + + for I := 0 to MethodCount - 1 do + Result[I] := string(PythonType.Methods[I].ml_name); + + for I := 0 to PythonType.GetSetCount - 1 do + Result[MethodCount + I] := string(PythonType.GetSet[I].name); end; class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; @@ -3658,12 +3665,10 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; then Continue; - // Ignore excluded methods - if MatchStr(LRttiMethod.Name, AExcludedMethodNames) then - Continue; - - // Ignore duplicate methods - if MatchStr(LRttiMethod.Name, AddedMethods) then + // Ignore methods with unhandled return type + if Assigned(LRttiMethod.ReturnType) and (LRttiMethod.ReturnType.TypeKind + in [tkUnknown, tkMethod, tkPointer, tkProcedure]) + then Continue; // Skip methods declared in NearestAncestorClass and its ancestors @@ -3673,6 +3678,14 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; then Continue; + // Ignore excluded methods + if MatchStr(LRttiMethod.Name, AExcludedMethodNames) then + Continue; + + // Ignore duplicate methods + if MatchStr(LRttiMethod.Name, AddedMethods) then + Continue; + AddedMethods := AddedMethods + [LRttiMethod.Name]; // Create the exposed method @@ -3738,6 +3751,13 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; if (Ord(LRttiField.Visibility) < Ord(TMemberVisibility.mvPublic)) then Continue; + // Skip methods declared in NearestAncestorClass and its ancestors + LClass := (LRttiField.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + // Ignore excluded fields if MatchStr(LRttiField.Name, AExcludedFieldNames) then Continue; @@ -3746,19 +3766,12 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; if MatchStr(LRttiField.Name, AddedFields) then Continue; - // Skip methods declared in NearestAncestorClass and its ancestors - LClass := (LRttiField.Parent as TRttiInstanceType).MetaclassType; - if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or - not (LClass.InheritsFrom(NearestAncestorClass))) - then - Continue; - // Skip if the FieldType is missing if LRttiField.FieldType = nil then Continue; // Skip if the type cannot be handled - if LRttiField.FieldType.TypeKind in [tkUnknown, tkMethod, tkProcedure] then + if LRttiField.FieldType.TypeKind in [tkUnknown, tkMethod, tkPointer, tkProcedure] then Continue; AddedFields := AddedFields + [LRttiField.Name]; @@ -3812,6 +3825,13 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; if (Ord(LRttiProperty.Visibility) < Ord(TMemberVisibility.mvPublic)) then Continue; + // Skip methods declared in NearestAncestorClass and its ancestors + LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + // Ignore excluded properties if MatchStr(LRttiProperty.Name, AExcludedPropertyNames) then Continue; @@ -3820,13 +3840,6 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; if MatchStr(LRttiProperty.Name, AddedProperties) then Continue; - // Skip methods declared in NearestAncestorClass and its ancestors - LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; - if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or - not (LClass.InheritsFrom(NearestAncestorClass))) - then - Continue; - // Skip if the PropertyType is missing if LRttiProperty.PropertyType = nil then Continue; @@ -3836,7 +3849,7 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; Continue; // Skip if the type cannot be handled (as with fields - tkMethod) - if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkProcedure] then + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkProcedure] then Continue; AddedProperties := AddedProperties + [LRttiProperty.Name]; @@ -3894,6 +3907,13 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; if (Ord(LRttiProperty.Visibility) < Ord(TMemberVisibility.mvPublic)) then Continue; + // Skip methods declared in NearestAncestorClass and its ancestors + LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; + if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or + not (LClass.InheritsFrom(NearestAncestorClass))) + then + Continue; + // Ignore excluded properties if MatchStr(LRttiProperty.Name, AExcludedPropertyNames) then Continue; @@ -3902,13 +3922,6 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; if MatchStr(LRttiProperty.Name, AddedProperties) then Continue; - // Skip methods declared in NearestAncestorClass and its ancestors - LClass := (LRttiProperty.Parent as TRttiInstanceType).MetaclassType; - if (NearestAncestorClass <> nil) and ((LClass = NearestAncestorClass) or - not (LClass.InheritsFrom(NearestAncestorClass))) - then - Continue; - // Skip if the PropertyType is missing if LRttiProperty.PropertyType = nil then Continue; @@ -3918,7 +3931,7 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; Continue; // Skip if the type cannot be handled (as with fields - tkMethod) - if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkProcedure] then + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkProcedure] then Continue; AddedProperties := AddedProperties + [LRttiProperty.Name]; From ba6f5134751894acbb2525454b983e0d525e7f6a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 10 Oct 2023 03:14:52 +0300 Subject: [PATCH 077/174] Reversed making TPyObject.PythonType a class var. Bad idea! --- Source/PythonEngine.pas | 7 ++--- Source/WrapDelphi.pas | 62 +++++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 0627f50d..485f94ea 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2387,9 +2387,9 @@ TPyObject = class procedure Set_ob_refcnt(const Value: NativeInt); procedure Set_ob_type(const Value: PPyTypeObject); public - IsSubtype: Boolean; - PythonAlloc: Boolean; - class var PythonType: TPythonType; + PythonType : TPythonType; + IsSubtype : Boolean; + PythonAlloc : Boolean; // Constructors & Destructors constructor Create(APythonType: TPythonType); virtual; @@ -7987,7 +7987,6 @@ procedure TPythonType.SetPyObjectClass( val : TPyObjectClass ); if Assigned(val) then begin FType.tp_basicsize := val.InstanceSize + Sizeof(PyObject); - val.PythonType := Self; val.RegisterMethods( Self ); val.RegisterMembers( Self ); val.RegisterGetSets( Self ); diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 7a40ece3..86c502df 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -550,7 +550,7 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) // implementation of interface IFreeNotificationSubscriber procedure Notify(ADeletedObject : TObject); {$IFDEF EXTENDED_RTTI} - class function ExcludedExposedMembers: TArray; virtual; + class function ExcludedExposedMembers(APythonType: TPythonType): TArray; virtual; class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; AExcludedMethodNames: TArray = []); @@ -587,7 +587,7 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) class function DelphiObjectClass : TClass; virtual; class procedure RegisterMethods( PythonType : TPythonType ); override; class procedure RegisterGetSets( PythonType : TPythonType ); override; - class procedure SetupType( PythonType : TPythonType ); override; + class procedure SetupType(APythonType: TPythonType ); override; // if the class is a container (TStrings, TComponent, TCollection...), // then return the class implementing the access to the contained items. class function GetContainerAccessClass : TContainerAccessClass; virtual; @@ -3564,7 +3564,7 @@ function TPyDelphiObject.SetProps(args, keywords: PPyObject): PPyObject; Result := SetProperties(GetSelf, keywords); end; -class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); +class procedure TPyDelphiObject.SetupType(APythonType: TPythonType); var _ContainerAccessClass : TContainerAccessClass; PyWrapper: TPyDelphiWrapper; @@ -3573,34 +3573,35 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); Index: Integer; {$IFDEF EXTENDED_RTTI} LDocStr: string; + ExcludedMembers: TArray; {$ENDIF EXTENDED_RTTI} begin inherited; - PythonType.TypeName := AnsiString(GetTypeName); - PythonType.Name := string(PythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; - PythonType.GenerateCreateFunction := False; - PythonType.DocString.Text := 'Wrapper for Delphi ' + DelphiObjectClass.ClassName; - PythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; + APythonType.TypeName := AnsiString(GetTypeName); + APythonType.Name := string(APythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; + APythonType.GenerateCreateFunction := False; + APythonType.DocString.Text := 'Wrapper for Pascal class ' + DelphiObjectClass.ClassName; + APythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; _ContainerAccessClass := GetContainerAccessClass; if Assigned(_ContainerAccessClass) then begin - PythonType.Services.Basic := PythonType.Services.Basic + [bsIter]; - PythonType.Services.Sequence := PythonType.Services.Sequence + [ssLength, ssItem]; + APythonType.Services.Basic := APythonType.Services.Basic + [bsIter]; + APythonType.Services.Sequence := APythonType.Services.Sequence + [ssLength, ssItem]; if _ContainerAccessClass.SupportsWrite then - PythonType.Services.Sequence := PythonType.Services.Sequence + [ssAssItem]; + APythonType.Services.Sequence := APythonType.Services.Sequence + [ssAssItem]; if _ContainerAccessClass.SupportsIndexOf then - PythonType.Services.Sequence := PythonType.Services.Sequence + [ssContains]; + APythonType.Services.Sequence := APythonType.Services.Sequence + [ssContains]; end; // Find nearest registered ancestor class and set it as base - PyWrapper := PythonType.Owner as TPyDelphiWrapper; + PyWrapper := APythonType.Owner as TPyDelphiWrapper; NearestAncestorClass := nil; for Index := PyWrapper.fClassRegister.Count - 1 downto 0 do begin RegisteredClass := PyWrapper.fClassRegister[Index] as TRegisteredClass; if DelphiObjectClass.InheritsFrom(RegisteredClass.DelphiClass) then begin - PythonType.BaseType := RegisteredClass.PythonType; + APythonType.BaseType := RegisteredClass.PythonType; NearestAncestorClass := RegisteredClass.DelphiClass; Break; end; @@ -3610,32 +3611,33 @@ class procedure TPyDelphiObject.SetupType(PythonType: TPythonType); if Assigned(PyDocServer) and PyDocServer.Initialized and PyDocServer.ReadTypeDocStr(DelphiObjectClass.ClassInfo, LDocStr) then - PythonType.DocString.Text := LDocStr; - - ExposeMethods(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, ExcludedExposedMembers); - ExposeFields(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, ExcludedExposedMembers); - ExposeProperties(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, ExcludedExposedMembers); - ExposeIndexedProperties(DelphiObjectClass, NearestAncestorClass, PythonType, - PyWrapper, ExcludedExposedMembers); + APythonType.DocString.Text := LDocStr; + + ExcludedMembers := ExcludedExposedMembers(APythonType); + ExposeMethods(DelphiObjectClass, NearestAncestorClass, APythonType, + PyWrapper, ExcludedMembers); + ExposeFields(DelphiObjectClass, NearestAncestorClass, APythonType, + PyWrapper, ExcludedMembers); + ExposeProperties(DelphiObjectClass, NearestAncestorClass, APythonType, + PyWrapper, ExcludedMembers); + ExposeIndexedProperties(DelphiObjectClass, NearestAncestorClass, APythonType, + PyWrapper, ExcludedMembers); {$ENDIF EXTENDED_RTTI} end; {$IFDEF EXTENDED_RTTI} -class function TPyDelphiObject.ExcludedExposedMembers: TArray; +class function TPyDelphiObject.ExcludedExposedMembers(APythonType: TPythonType): TArray; var I, MethodCount: Integer; begin - MethodCount := PythonType.MethodCount; - SetLength(Result, MethodCount + PythonType.GetSetCount); + MethodCount := APythonType.MethodCount; + SetLength(Result, MethodCount + APythonType.GetSetCount); for I := 0 to MethodCount - 1 do - Result[I] := string(PythonType.Methods[I].ml_name); + Result[I] := string(APythonType.Methods[I].ml_name); - for I := 0 to PythonType.GetSetCount - 1 do - Result[MethodCount + I] := string(PythonType.GetSet[I].name); + for I := 0 to APythonType.GetSetCount - 1 do + Result[MethodCount + I] := string(APythonType.GetSet[I].name); end; class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; From 64112f2510ca28b7f1324e60cb0bcd636925dd48 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 11 Oct 2023 01:20:55 +0300 Subject: [PATCH 078/174] Breaking change: Removed CreateWith overload with 3 arguments TPyDelphiObject.CreateWith raises a python TypeError 'Cannot create instances of class %s' CreateWith overrides in general should call Create and create an instance and assign it to DelphiObject --- Demos/Demo08/Unit1.pas | 6 +- Demos/Demo21/Unit1.pas | 6 +- Demos/Demo26/Unit1.pas | 6 +- Demos/Demo28/Unit1.pas | 12 ++-- Demos/Demo32/Unit1.pas | 2 +- Demos/Demo34/Unit1.pas | 6 +- Source/PythonEngine.pas | 16 ++--- Source/WrapDelphi.pas | 15 ++++ Source/WrapDelphiClasses.pas | 15 +++- Source/WrapDelphiTypes.pas | 21 +++--- Source/fmx/WrapFmxImgList.pas | 1 - Source/fmx/WrapFmxStyles.pas | 13 ++-- Source/fmx/WrapFmxTypes.pas | 54 +++++++------- Source/vcl/WrapVclComCtrls.pas | 33 --------- Source/vcl/WrapVclForms.pas | 90 ------------------------ Source/vcl/WrapVclGraphics.pas | 10 +-- Source/vcl/WrapVclThemes.pas | 22 +++--- Tests/FMX/Android/NumberServicesTest.pas | 8 +-- Tests/NumberServicesTest.pas | 9 ++- 19 files changed, 122 insertions(+), 223 deletions(-) diff --git a/Demos/Demo08/Unit1.pas b/Demos/Demo08/Unit1.pas index a8b2bc73..6c254feb 100644 --- a/Demos/Demo08/Unit1.pas +++ b/Demos/Demo08/Unit1.pas @@ -38,7 +38,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -88,9 +88,9 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(PythonType); with GetPythonEngine do begin if PyArg_ParseTuple( args, 'ii:CreatePoint',@x, @y ) = 0 then diff --git a/Demos/Demo21/Unit1.pas b/Demos/Demo21/Unit1.pas index 351e451b..ac470efb 100644 --- a/Demos/Demo21/Unit1.pas +++ b/Demos/Demo21/Unit1.pas @@ -46,7 +46,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -81,9 +81,9 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(PythonType); with GetPythonEngine do begin if PyArg_ParseTuple( args, 'ii:CreatePoint',@x, @y ) = 0 then diff --git a/Demos/Demo26/Unit1.pas b/Demos/Demo26/Unit1.pas index 45c5e641..1095bdde 100644 --- a/Demos/Demo26/Unit1.pas +++ b/Demos/Demo26/Unit1.pas @@ -35,7 +35,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -84,9 +84,9 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will be automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(PythonType); with GetPythonEngine do begin if PyArg_ParseTuple( args, 'ii:CreatePoint',@x, @y ) = 0 then diff --git a/Demos/Demo28/Unit1.pas b/Demos/Demo28/Unit1.pas index 7ca2799c..9997337d 100644 --- a/Demos/Demo28/Unit1.pas +++ b/Demos/Demo28/Unit1.pas @@ -18,7 +18,7 @@ TPyStringList = class(TPyObject) public // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; // Basic services @@ -46,7 +46,7 @@ TPyStringListIterator = class(TPyObject) procedure SetStringList(const Value: TPyStringList); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; // Basic services @@ -145,11 +145,11 @@ constructor TPyStringList.Create(APythonType: TPythonType); fStrings := TStringList.Create; end; -constructor TPyStringList.CreateWith(PythonType: TPythonType; args: PPyObject); +constructor TPyStringList.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); var i : Integer; begin - inherited; + Create(PythonType); with GetPythonEngine do begin for i := 0 to PyTuple_Size(args)-1 do @@ -241,12 +241,12 @@ constructor TPyStringListIterator.Create(APythonType: TPythonType); inherited; end; -constructor TPyStringListIterator.CreateWith(PythonType: TPythonType; args: PPyObject); +constructor TPyStringListIterator.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); var _obj : PPyObject; _stringList : TPyStringList; begin - inherited; + Create(PythonType); with GetPythonEngine do begin if PyArg_ParseTuple( args, 'O:TPyStringListIterator constructor',@_obj ) <> 0 then diff --git a/Demos/Demo32/Unit1.pas b/Demos/Demo32/Unit1.pas index 57195d50..3e1ab633 100644 --- a/Demos/Demo32/Unit1.pas +++ b/Demos/Demo32/Unit1.pas @@ -111,7 +111,7 @@ constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); KeyArray: array of AnsiString; KeyPointerArray: array of PAnsiChar; begin - inherited; + Create(PythonType); KeyArray := ['x', 'y']; KeyPointerArray := [PAnsiChar(KeyArray[0]), PAnsiChar(KeyArray[1]), nil]; with GetPythonEngine, DelphiObject as TPoint do diff --git a/Demos/Demo34/Unit1.pas b/Demos/Demo34/Unit1.pas index e971946a..e9810fd8 100644 --- a/Demos/Demo34/Unit1.pas +++ b/Demos/Demo34/Unit1.pas @@ -43,7 +43,7 @@ TPyPoint = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Type services //////////////// @@ -158,9 +158,9 @@ constructor TPyPoint.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyPoint.Create will automatically be called. -constructor TPyPoint.CreateWith(PythonType: TPythonType; args: PPyObject); +constructor TPyPoint.CreateWith(PythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(PythonType); with GetPythonEngine do begin if PyArg_ParseTuple( args, 'ii:CreatePoint',@x, @y ) = 0 then diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 485f94ea..ffa4e9bd 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2393,8 +2393,7 @@ TPyObject = class // Constructors & Destructors constructor Create(APythonType: TPythonType); virtual; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); overload; virtual; - constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); overload; virtual; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); virtual; destructor Destroy; override; class function NewInstance: TObject; override; @@ -2697,7 +2696,7 @@ TPyVar = class(TPyObject) // Constructors & Destructors constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; // Type services @@ -7462,15 +7461,10 @@ constructor TPyObject.Create(APythonType: TPythonType); end; end; -constructor TPyObject.CreateWith(APythonType: TPythonType; args: PPyObject); -begin - Create(APythonType); -end; - constructor TPyObject.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin - CreateWith(APythonType, args); + Create(APythonType); end; destructor TPyObject.Destroy; @@ -8960,9 +8954,9 @@ constructor TPyVar.Create( APythonType : TPythonType ); // the Create constructor first, and because the constructors // are virtual, TPyVar.Create will be automatically be called. -constructor TPyVar.CreateWith(APythonType: TPythonType; args: PPyObject); +constructor TPyVar.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(APythonType); with GetPythonEngine do begin if PyArg_ParseTuple( args, 'O:CreateVar',@dv_object ) = 0 then diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 86c502df..808d681a 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -569,6 +569,11 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) Owned: Boolean; constructor Create( APythonType : TPythonType ); override; + // CreateWith raises a python TypeError 'Cannot create instances..' + // Subclasses that can be instantiated need to overwrite this method and + // a) Call the virtual constructor Create + // b) Create the pascal object and assign it to DelphiObject + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; destructor Destroy; override; function GetAttrO( key: PPyObject) : PPyObject; override; @@ -985,6 +990,7 @@ implementation MethodCallback; resourcestring + rs_CannotCreate = 'Cannot create instances of class %s'; rs_ErrCheckIndex = '%s "%d" out of range'; rs_ErrCheckInt = '%s receives only integer values'; rs_ErrCheckFloat = '%s receives only float values'; @@ -2540,6 +2546,13 @@ constructor TPyDelphiObject.Create(APythonType: TPythonType); PyDelphiWrapper := TPyDelphiWrapper(APythonType.Owner); end; +constructor TPyDelphiObject.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); +begin + with APythonType.Engine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( + Format(rs_CannotCreate, [APythonType.TypeName]))); +end; + function TPyDelphiObject.CreateContainerAccess: TContainerAccess; var _ContainerAccessClass : TContainerAccessClass; @@ -3899,6 +3912,8 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; LClass: TClass; LDocStr: string; begin + // TODO: Identify and handle the default property + LRttiCtx := TRttiContext.Create(); try LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 5a00f9aa..90d18d96 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -330,6 +330,7 @@ TPyDelphiMemoryStream = class(TPyDelphiCustomMemoryStream) function GetDelphiObject: TMemoryStream; procedure SetDelphiObject(const Value: TMemoryStream); public + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; // Class methods class function DelphiObjectClass : TClass; override; // Properties @@ -1257,7 +1258,7 @@ constructor TPyDelphiComponent.CreateWith(APythonType: TPythonType; args, kwds: _obj : PPyObject; _owner : TObject; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple( args, 'O:Create',@_obj ) <> 0 then begin _owner := nil; @@ -1938,7 +1939,6 @@ class procedure TPyDelphiStream.SetupType(PythonType: TPythonType); class procedure TPyDelphiStream.RegisterMethods(PythonType: TPythonType); begin - inherited; PythonType.AddMethod('ReadBytes', @TPyDelphiStream.ReadBytes_Wrapper, 'TPyDelphiStream.ReadBytes()' + #10 + 'Read content as bytes.'); PythonType.AddMethod('ReadInt', @TPyDelphiStream.ReadInt_Wrapper, @@ -2132,7 +2132,7 @@ THandleStreamClass = class of THandleStream; LParamCount: NativeInt; LHandle: THandle; begin - inherited; + Create(APythonType); //Clear unsuccessful overloaded constructor error APythonType.Engine.PyErr_Clear(); @@ -2295,6 +2295,15 @@ procedure TPyDelphiCustomMemoryStream.SetDelphiObject( { TPyDelphiMemoryStream } +constructor TPyDelphiMemoryStream.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); +type + TMemoryStreamClass = class of TMemoryStream; +begin + Create(APythonType); + if APythonType.Engine.PyArg_ParseTuple(args, ':Create') <> 0 then + DelphiObject := TMemoryStreamClass(DelphiObjectClass).Create; +end; + class function TPyDelphiMemoryStream.DelphiObjectClass: TClass; begin Result := TMemoryStream; diff --git a/Source/WrapDelphiTypes.pas b/Source/WrapDelphiTypes.pas index 76c22c85..e572b851 100644 --- a/Source/WrapDelphiTypes.pas +++ b/Source/WrapDelphiTypes.pas @@ -40,7 +40,7 @@ TPyDelphiPoint = class(TPyObject) function Set_X(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_Y(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -72,7 +72,7 @@ TPyDelphiRect = class(TPyObject) public PyDelphiWrapper : TPyDelphiWrapper; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -94,7 +94,7 @@ TPyDelphiSize = class(TPyObject) function Set_CX(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_CY(AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare( obj: PPyObject) : Integer; override; function Repr : PPyObject; override; @@ -290,12 +290,12 @@ function TPyDelphiPoint.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiPoint.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var x, y : Integer; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple( args, 'ii:Create',@x, @y ) <> 0 then begin fValue.X := x; @@ -395,9 +395,10 @@ function TPyDelphiRect.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; args: PPyObject); +constructor TPyDelphiRect.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); begin - inherited; + Create(APythonType); APythonType.Engine.PyArg_ParseTuple( args, 'iiii:Create',@fValue.Left, @fValue.Top, @fValue.Right, @fValue.Bottom ); end; @@ -581,11 +582,11 @@ function TPyDelphiSize.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; args: PPyObject); +constructor TPyDelphiSize.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); var cx, cy : Integer; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple( args, 'ii:Create',@cx, @cy ) <> 0 then begin fValue.cx := cx; diff --git a/Source/fmx/WrapFmxImgList.pas b/Source/fmx/WrapFmxImgList.pas index 12d39661..a747e8ec 100644 --- a/Source/fmx/WrapFmxImgList.pas +++ b/Source/fmx/WrapFmxImgList.pas @@ -227,7 +227,6 @@ function TPyDelphiCustomImageList.GetDelphiObject: TCustomImageList; class procedure TPyDelphiCustomImageList.RegisterMethods( PythonType: TPythonType); begin - inherited; PythonType.AddMethod('BitmapItemByName', @TPyDelphiCustomImageList.BitmapItemByName_Wrapper, 'TCustomImageList.BitmapItemByName()'#10 + diff --git a/Source/fmx/WrapFmxStyles.pas b/Source/fmx/WrapFmxStyles.pas index 1d814d18..7ca73052 100644 --- a/Source/fmx/WrapFmxStyles.pas +++ b/Source/fmx/WrapFmxStyles.pas @@ -27,7 +27,7 @@ TPyDelphiStyleStreaming = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TStyleStreaming); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; class procedure RegisterMethods(PythonType: TPythonType); override; @@ -86,9 +86,9 @@ constructor TPyDelphiStyleStreaming.Create(APythonType: TPythonType); inherited; end; -constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args: PPyObject); +constructor TPyDelphiStyleStreaming.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(APythonType); DelphiObject := TStyleStreaming.Create(); end; @@ -116,25 +116,30 @@ procedure TPyDelphiStyleStreaming.SetDelphiObject(const Value: TStyleStreaming); begin inherited DelphiObject := Value; end; + { TPyDelphiStyleManager } constructor TPyDelphiStyleManager.Create(APythonType: TPythonType); begin inherited; end; + constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin - inherited; + Create(APythonType); DelphiObject := TStyleManager.Create(); end; + class function TPyDelphiStyleManager.DelphiObjectClass: TClass; begin Result := TStyleManager; end; + function TPyDelphiStyleManager.GetDelphiObject: TStyleManager; begin Result := TStyleManager(inherited DelphiObject); end; + class procedure TPyDelphiStyleManager.RegisterGetSets(PythonType: TPythonType); begin end; diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index c2babd8d..5975c513 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -37,7 +37,7 @@ TPyDelphiPointF = class(TPyObject) function Set_X(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -56,7 +56,7 @@ TPyDelphiSizeF = class(TPyObject) function Set_Width(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Height(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -79,7 +79,7 @@ TPyDelphiRectF = class(TPyObject) function Set_Left(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Right(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -98,7 +98,7 @@ TPyDelphiTouch = class(TPyObject) function Set_Location(AValue: PPyObject; AContext: Pointer): integer; cdecl; public constructor Create(APythonType: TPythonType); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(obj: PPyObject): Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -137,7 +137,7 @@ TPyDelphiPosition = class(TPyDelphiPersistent) function Set_Y(AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_Point(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterMethods(PythonType: TPythonType); override; class procedure RegisterGetSets(PythonType: TPythonType); override; @@ -162,7 +162,7 @@ TPyDelphiBounds = class(TPyDelphiPersistent) function Get_Rect(Acontext: Pointer): PPyObject; cdecl; function Set_Rect(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; property DelphiObject: TBounds read GetDelphiObject write SetDelphiObject; @@ -176,7 +176,7 @@ TPyDelphiControlSize = class(TPyDelphiPersistent) function Get_SizeF(Acontext: Pointer): PPyObject; cdecl; function Set_SizeF(AValue: PPyObject; AContext: Pointer): integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass: TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; property DelphiObject: TControlSize read GetDelphiObject write SetDelphiObject; @@ -350,12 +350,12 @@ function TPyDelphiPointF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiPointF.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var x, y : single; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'ff:Create', @x, @y) <> 0 then begin FValue.X := x; @@ -623,13 +623,13 @@ function TPyDelphiFmxObject.Set_Parent(AValue: PPyObject; end; { TPyDelphiPosition } -constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiPosition.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LPPosition: PPyObject; LPointF: TPointF; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPPosition) <> 0 then if CheckPointFAttribute(LPPosition, 'PointF', LPointF) then DelphiObject := TPosition.Create(LPointF); @@ -744,12 +744,12 @@ function TPyDelphiSizeF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiSizeF.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LWidth, LHeight : single; begin - inherited; + Create(PythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'ff:Create', @LWidth, @LHeight) <> 0 then begin FValue.Width := LWidth; @@ -848,13 +848,13 @@ procedure TPyDelphiCustomPopupMenu.SetDelphiObject( { TPyDelphiBounds } -constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiBounds.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LPBounds: PPyObject; LRectF: TRectF; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPBounds) <> 0 then if CheckRectFAttribute(LPBounds, 'RectF', LRectF) then DelphiObject := TBounds.Create(LRectF); @@ -906,13 +906,13 @@ function TPyDelphiBounds.Set_Rect(AValue: PPyObject; { TPyDelphiControlSize } -constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiControlSize.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LPControlSize: PPyObject; LSizeF: TSizeF; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'O:Create', @LPControlSize) <> 0 then if CheckSizeFAttribute(LPControlSize, 'SizeF', LSizeF) then DelphiObject := TControlSize.Create(LSizeF); @@ -979,12 +979,12 @@ function TPyDelphiRectF.Compare(obj: PPyObject): Integer; Result := 1; end; -constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiRectF.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LLeft, LTop, LRight, LBottom : single; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'ffff:Create', @LLeft, @LTop, @LRight, @LBottom) <> 0 then begin FValue.Left := LLeft; @@ -1134,12 +1134,12 @@ constructor TPyDelphiTouch.Create(APythonType: TPythonType); end; constructor TPyDelphiTouch.CreateWith(APythonType: TPythonType; - args: PPyObject); + args, kwds: PPyObject); var LPointF : TPointF; LPyPointF : PPyObject; begin - inherited; + Create(APythonType); with GetPythonEngine do if PyArg_ParseTuple(args, 'O:Create', @LPyPointF) <> 0 then if CheckPointFAttribute(LPyPointF, 'pointf', LPointF) then begin diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index 9e17b288..5e5c03ec 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -39,7 +39,6 @@ TTabChangingEventHandler = class(TEventHandler) class function GetTypeInfo: PTypeInfo; override; end; - {$IFNDEF FPC} TPyDelphiDateTimePicker = class (TPyDelphiWinControl) private function GetDelphiObject: TDateTimePicker; @@ -49,7 +48,6 @@ TPyDelphiDateTimePicker = class (TPyDelphiWinControl) // Properties property DelphiObject: TDateTimePicker read GetDelphiObject write SetDelphiObject; end; - {$ENDIF FPC} TPyDelphiTabSheet = class (TPyDelphiWinControl) private @@ -92,27 +90,19 @@ TPyDelphiPageControl = class (TPyDelphiWinControl) procedure SetDelphiObject(const Value: TPageControl); protected // methods - {$IFNDEF FPC} function IndexOfTabAt_Wrapper(args: PPyObject): PPyObject; cdecl; function GetHitTestInfoAt_Wrapper(args: PPyObject): PPyObject; cdecl; - {$ENDIF FPC} function TabRect_Wrapper(args: PPyObject): PPyObject; cdecl; - {$IFNDEF FPC} function ScrollTabs_Wrapper(args: PPyObject): PPyObject; cdecl; - {$ENDIF FPC} function FindNextPage_Wrapper(args: PPyObject): PPyObject; cdecl; function SelectNextPage_Wrapper(args: PPyObject): PPyObject; cdecl; // Property Getters function Get_ActivePage( AContext: Pointer): PPyObject; cdecl; function Get_ActivePageIndex( AContext: Pointer): PPyObject; cdecl; - {$IFNDEF FPC} function Get_Canvas( AContext: Pointer): PPyObject; cdecl; - {$ENDIF FPC} function Get_PageCount( AContext: Pointer): PPyObject; cdecl; function Get_Pages( AContext: Pointer): PPyObject; cdecl; - {$IFNDEF FPC} function Get_RowCount( AContext: Pointer): PPyObject; cdecl; - {$ENDIF FPC} // Property Setters function Set_ActivePage( AValue: PPyObject; AContext: Pointer): integer; cdecl; function Set_ActivePageIndex( AValue: PPyObject; AContext: Pointer): integer; cdecl; @@ -879,9 +869,7 @@ function TComCtrlsRegistration.Name: string; procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); begin inherited; - {$IFNDEF FPC} APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimePicker); - {$ENDIF FPC} APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPageControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabSheet); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); @@ -943,7 +931,6 @@ procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCreateItemClassEventHandler); end; -{$IFNDEF FPC} { TPyDelphiDateTimePicker } @@ -961,7 +948,6 @@ procedure TPyDelphiDateTimePicker.SetDelphiObject(const Value: TDateTimePicker); begin inherited DelphiObject := Value; end; -{$ENDIF FPC} { TPyDelphiPageControl } @@ -996,7 +982,6 @@ function TPyDelphiPageControl.GetDelphiObject: TPageControl; Result := TPageControl(inherited DelphiObject); end; -{$IFNDEF FPC} function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( args: PPyObject): PPyObject; @@ -1050,7 +1035,6 @@ function TPyDelphiPageControl.GetHitTestInfoAt_Wrapper( Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiPageControl.Get_ActivePage(AContext: Pointer): PPyObject; begin @@ -1065,13 +1049,11 @@ function TPyDelphiPageControl.Get_ActivePageIndex( Result := GetPythonEngine.PyLong_FromLong(DelphiObject.ActivePageIndex); end; -{$IFNDEF FPC} function TPyDelphiPageControl.Get_Canvas(AContext: Pointer): PPyObject; begin Adjust(@Self); Result := Wrap(DelphiObject.Canvas); end; -{$ENDIF FPC} function TPyDelphiPageControl.Get_PageCount(AContext: Pointer): PPyObject; begin @@ -1087,7 +1069,6 @@ function TPyDelphiPageControl.Get_Pages(AContext: Pointer): PPyObject; Setup(Self.PyDelphiWrapper, TPagesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; -{$IFNDEF FPC} function TPyDelphiPageControl.Get_RowCount(AContext: Pointer): PPyObject; begin Adjust(@Self); @@ -1108,7 +1089,6 @@ function TPyDelphiPageControl.IndexOfTabAt_Wrapper( Result := nil; end; end; -{$ENDIF FPC} class procedure TPyDelphiPageControl.RegisterGetSets( PythonType: TPythonType); @@ -1117,39 +1097,31 @@ class procedure TPyDelphiPageControl.RegisterGetSets( 'Specifies the page currently displayed by the page control.', nil); PythonType.AddGetSet('ActivePageIndex', @TPyDelphiPageControl.Get_ActivePageIndex, @TPyDelphiPageControl.Set_ActivePageIndex, 'Specifies the page currently displayed by the page control.', nil); - {$IFNDEF FPC} PythonType.AddGetSet('Canvas', @TPyDelphiPageControl.Get_Canvas, nil, 'Gives access to the tab control canvas.', nil); - {$ENDIF FPC} PythonType.AddGetSet('PageCount', @TPyDelphiPageControl.Get_PageCount, nil, 'Indicates the number of pages in the TPageControl object.', nil); PythonType.AddGetSet('Pages', @TPyDelphiPageControl.Get_Pages, nil, 'Lists all the pages in the TPageControl.', nil); - {$IFNDEF FPC} PythonType.AddGetSet('RowCount', @TPyDelphiPageControl.Get_RowCount, nil, '', nil); - {$ENDIF FPC} end; class procedure TPyDelphiPageControl.RegisterMethods( PythonType: TPythonType); begin - {$IFNDEF FPC} PythonType.AddMethod('IndexOfTabAt', @TPyDelphiPageControl.IndexOfTabAt_Wrapper, 'TPageControl.IndexOfTabAt()'#10 + 'Indicates the index of the tab at a specified point.'); PythonType.AddMethod('GetHitTestInfoAt', @TPyDelphiPageControl.GetHitTestInfoAt_Wrapper, 'TPageControl.GetHitTestInfoAt()'#10 + 'Returns information about the location of a point relative to the client area of the tab control.'); - {$ENDIF FPC} PythonType.AddMethod('TabRect', @TPyDelphiPageControl.TabRect_Wrapper, 'TPageControl.TabRect()'#10 + 'Returns the bounding rectangle for a specified tab.'); - {$IFNDEF FPC} PythonType.AddMethod('ScrollTabs', @TPyDelphiPageControl.ScrollTabs_Wrapper, 'TPageControl.ScrollTabs()'#10 + 'Scrolls the tabs that are visible when the tab control is not multi-line.'); - {$ENDIF FPC} PythonType.AddMethod('FindNextPage', @TPyDelphiPageControl.FindNextPage_Wrapper, 'TPageControl.FindNextPage()'#10 + 'Returns the next page in the page control before or after a specified page.'); @@ -1158,7 +1130,6 @@ class procedure TPyDelphiPageControl.RegisterMethods( 'Changes the ActivePage to the first visible page that is before or after the currently active page.'); end; -{$IFNDEF FPC} function TPyDelphiPageControl.ScrollTabs_Wrapper( args: PPyObject): PPyObject; var @@ -1174,7 +1145,6 @@ function TPyDelphiPageControl.ScrollTabs_Wrapper( Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiPageControl.SelectNextPage_Wrapper( args: PPyObject): PPyObject; @@ -3684,8 +3654,5 @@ procedure TLVCreateItemClassEventHandler.DoEvent(Sender: TCustomListView; initialization RegisteredUnits.Add( TComCtrlsRegistration.Create ); - {$IFNDEF FPC} System.Classes.RegisterClasses([TDateTimePicker]); - {$ENDIF FPC} - end. diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index 57b7e3ad..e7b8040d 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -195,18 +195,14 @@ TPyDelphiScreen = class (TPyDelphiComponent) procedure HandleOnActiveFormChange(Sender : TObject); protected // Exposed Methods - {$IFNDEF FPC} function DisableAlign_Wrapper(args : PPyObject) : PPyObject; cdecl; function EnableAlign_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$ENDIF FPC} function MonitorFromPoint_Wrapper(args : PPyObject) : PPyObject; cdecl; //TODO: implementation //function MonitorFromRect(const Rect: TRect; MonitorDefault: TMonitorDefaultTo = mdNearest): TMonitor; //function MonitorFromWindow(const Handle: THandle; MonitorDefault: TMonitorDefaultTo = mdNearest): TMonitor; - {$IFNDEF FPC} function Realign_Wrapper(args : PPyObject) : PPyObject; cdecl; function ResetFonts_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$ENDIF FPC} // Property Getters function Get_ActiveControl(AContext : Pointer) : PPyObject; cdecl; function Get_ActiveCustomForm(AContext : Pointer) : PPyObject; cdecl; @@ -219,31 +215,25 @@ TPyDelphiScreen = class (TPyDelphiComponent) function Get_DataModuleCount(AContext : Pointer) : PPyObject; cdecl; function Get_MonitorCount(AContext : Pointer) : PPyObject; cdecl; function Get_Monitors(AContext : Pointer) : PPyObject; cdecl; - {$IFNDEF FPC} function Get_DesktopRect(AContext : Pointer) : PPyObject; cdecl; function Get_DesktopLeft(AContext : Pointer) : PPyObject; cdecl; function Get_DesktopTop(AContext : Pointer) : PPyObject; cdecl; - {$ENDIF FPC} function Get_DesktopWidth(AContext : Pointer) : PPyObject; cdecl; function Get_DesktopHeight(AContext : Pointer) : PPyObject; cdecl; - {$IFNDEF FPC} function Get_WorkAreaRect(AContext : Pointer) : PPyObject; cdecl; function Get_WorkAreaHeight(AContext : Pointer) : PPyObject; cdecl; function Get_WorkAreaLeft(AContext : Pointer) : PPyObject; cdecl; function Get_WorkAreaTop(AContext : Pointer) : PPyObject; cdecl; function Get_WorkAreaWidth(AContext : Pointer) : PPyObject; cdecl; - {$ENDIF FPC} function Get_HintFont(AContext : Pointer) : PPyObject; cdecl; function Get_IconFont(AContext : Pointer) : PPyObject; cdecl; function Get_MenuFont(AContext : Pointer) : PPyObject; cdecl; function Get_Fonts(AContext : Pointer) : PPyObject; cdecl; function Get_FormCount(AContext : Pointer) : PPyObject; cdecl; function Get_Forms(AContext : Pointer) : PPyObject; cdecl; - {$IFNDEF FPC} function Get_Imes(AContext : Pointer) : PPyObject; cdecl; function Get_DefaultIme(AContext : Pointer) : PPyObject; cdecl; function Get_DefaultKbLayout(AContext : Pointer) : PPyObject; cdecl; - {$ENDIF FPC} function Get_Height(AContext : Pointer) : PPyObject; cdecl; function Get_PixelsPerInch(AContext : Pointer) : PPyObject; cdecl; function Get_Width(AContext : Pointer) : PPyObject; cdecl; @@ -280,44 +270,34 @@ TPyDelphiApplication = class (TPyDelphiComponent) function HandleMessage_Wrapper(args : PPyObject) : PPyObject; cdecl; function HelpCommand_Wrapper(args : PPyObject) : PPyObject; cdecl; function HelpContext_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$IFNDEF FPC} function HelpJump_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$ENDIF FPC} function HelpKeyword_Wrapper(args : PPyObject) : PPyObject; cdecl; function HideHint_Wrapper(args : PPyObject) : PPyObject; cdecl; function Initialize_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$IFNDEF FPC} function IsRightToLeft_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$ENDIF FPC} function MessageBox_Wrapper(args : PPyObject) : PPyObject; cdecl; function Minimize_Wrapper(args : PPyObject) : PPyObject; cdecl; function ModalStarted_Wrapper(args : PPyObject) : PPyObject; cdecl; function ModalFinished_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$IFNDEF FPC} function NormalizeAllTopMosts_Wrapper(args : PPyObject) : PPyObject; cdecl; function NormalizeTopMosts_Wrapper(args : PPyObject) : PPyObject; cdecl; function RestoreTopMosts_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$ENDIF FPC} function ProcessMessages_Wrapper(args : PPyObject) : PPyObject; cdecl; function Restore_Wrapper(args : PPyObject) : PPyObject; cdecl; function Run_Wrapper(args : PPyObject) : PPyObject; cdecl; function ShowException_Wrapper(args : PPyObject) : PPyObject; cdecl; function Terminate_Wrapper(args : PPyObject) : PPyObject; cdecl; function UpdateAction_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$IFNDEF FPC} function UseRightToLeftAlignment_Wrapper(args : PPyObject) : PPyObject; cdecl; function UseRightToLeftReading_Wrapper(args : PPyObject) : PPyObject; cdecl; function UseRightToLeftScrollBar_Wrapper(args : PPyObject) : PPyObject; cdecl; - {$ENDIF FPC} // property getters function Get_Active(AContext : Pointer): PPyObject; cdecl; - {$IFNDEF FPC} function Get_AllowTesting(AContext : Pointer): PPyObject; cdecl; function Get_AutoDragDocking(AContext : Pointer): PPyObject; cdecl; function Get_CurrentHelpFile(AContext : Pointer): PPyObject; cdecl; function Get_DialogHandle(AContext : Pointer): PPyObject; cdecl; function Get_Handle(AContext : Pointer): PPyObject; cdecl; - {$ENDIF FPC} function Get_ExeName(AContext : Pointer): PPyObject; cdecl; function Get_HelpFile(AContext : Pointer): PPyObject; cdecl; function Get_Hint(AContext : Pointer): PPyObject; cdecl; @@ -329,25 +309,19 @@ TPyDelphiApplication = class (TPyDelphiComponent) function Get_Icon(AContext : Pointer): PPyObject; cdecl; function Get_MainForm(AContext : Pointer): PPyObject; cdecl; function Get_BiDiMode(AContext : Pointer): PPyObject; cdecl; - {$IFNDEF FPC} function Get_BiDiKeyboard(AContext : Pointer): PPyObject; cdecl; function Get_NonBiDiKeyboard(AContext : Pointer): PPyObject; cdecl; - {$ENDIF FPC} function Get_ShowHint(AContext : Pointer): PPyObject; cdecl; function Get_ShowMainForm(AContext : Pointer): PPyObject; cdecl; function Get_Terminated(AContext : Pointer): PPyObject; cdecl; function Get_Title(AContext : Pointer): PPyObject; cdecl; - {$IFNDEF FPC} function Get_UpdateFormatSettings(AContext : Pointer): PPyObject; cdecl; function Get_UpdateMetricSettings(AContext : Pointer): PPyObject; cdecl; - {$ENDIF FPC} // property setters - {$IFNDEF FPC} function Set_AllowTesting(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_AutoDragDocking(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_DialogHandle(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_Handle(AValue : PPyObject; AContext : Pointer): Integer; cdecl; - {$ENDIF FPC} function Set_HelpFile(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_Hint(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_HintColor(AValue : PPyObject; AContext : Pointer): Integer; cdecl; @@ -357,17 +331,13 @@ TPyDelphiApplication = class (TPyDelphiComponent) function Set_HintShortPause(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_Icon(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_BiDiMode(AValue : PPyObject; AContext : Pointer): Integer; cdecl; - {$IFNDEF FPC} function Set_BiDiKeyboard(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_NonBiDiKeyboard(AValue : PPyObject; AContext : Pointer): Integer; cdecl; - {$ENDIF FPC} function Set_ShowHint(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_ShowMainForm(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_Title(AValue : PPyObject; AContext : Pointer): Integer; cdecl; - {$IFNDEF FPC} function Set_UpdateFormatSettings(AValue : PPyObject; AContext : Pointer): Integer; cdecl; function Set_UpdateMetricSettings(AValue : PPyObject; AContext : Pointer): Integer; cdecl; - {$ENDIF FPC} public // Class methods class function DelphiObjectClass : TClass; override; @@ -688,7 +658,6 @@ destructor TPyDelphiScreen.Destroy; inherited; end; -{$IFNDEF FPC} function TPyDelphiScreen.DisableAlign_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument @@ -714,7 +683,6 @@ function TPyDelphiScreen.EnableAlign_Wrapper(args: PPyObject): PPyObject; Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiScreen.GetDelphiObject: TScreen; begin @@ -782,7 +750,6 @@ function TPyDelphiScreen.Get_DataModules(AContext: Pointer): PPyObject; Setup(Self.PyDelphiWrapper, TScreenDataModulesAccess.Create(Self.PyDelphiWrapper, Self.DelphiObject)); end; -{$IFNDEF FPC} function TPyDelphiScreen.Get_DefaultIme(AContext: Pointer): PPyObject; begin Adjust(@Self); @@ -794,7 +761,6 @@ function TPyDelphiScreen.Get_DefaultKbLayout(AContext: Pointer): PPyObject; Adjust(@Self); Result := GetPythonEngine.PyLong_FromLong(DelphiObject.DefaultKbLayout); end; -{$ENDIF FPC} function TPyDelphiScreen.Get_DesktopHeight(AContext: Pointer): PPyObject; begin @@ -802,7 +768,6 @@ function TPyDelphiScreen.Get_DesktopHeight(AContext: Pointer): PPyObject; Result := GetPythonEngine.PyLong_FromLong(DelphiObject.DesktopHeight); end; -{$IFNDEF FPC} function TPyDelphiScreen.Get_DesktopLeft(AContext: Pointer): PPyObject; begin Adjust(@Self); @@ -820,7 +785,6 @@ function TPyDelphiScreen.Get_DesktopTop(AContext: Pointer): PPyObject; Adjust(@Self); Result := GetPythonEngine.PyLong_FromLong(DelphiObject.DesktopTop); end; -{$ENDIF FPC} function TPyDelphiScreen.Get_DesktopWidth(AContext: Pointer): PPyObject; begin @@ -866,13 +830,11 @@ function TPyDelphiScreen.Get_IconFont(AContext: Pointer): PPyObject; Result := Wrap(DelphiObject.IconFont); end; -{$IFNDEF FPC} function TPyDelphiScreen.Get_Imes(AContext: Pointer): PPyObject; begin Adjust(@Self); Result := Wrap(DelphiObject.Imes); end; -{$ENDIF FPC} function TPyDelphiScreen.Get_MenuFont(AContext: Pointer): PPyObject; begin @@ -936,7 +898,6 @@ function TPyDelphiScreen.Get_Width(AContext: Pointer): PPyObject; Result := GetPythonEngine.PyLong_FromLong(DelphiObject.Width); end; -{$IFNDEF FPC} function TPyDelphiScreen.Get_WorkAreaHeight(AContext: Pointer): PPyObject; begin Adjust(@Self); @@ -966,7 +927,6 @@ function TPyDelphiScreen.Get_WorkAreaWidth(AContext: Pointer): PPyObject; Adjust(@Self); Result := GetPythonEngine.PyLong_FromLong(DelphiObject.WorkAreaWidth); end; -{$ENDIF FPC} procedure TPyDelphiScreen.HandleOnActiveControlChange(Sender: TObject); begin @@ -1000,7 +960,6 @@ function TPyDelphiScreen.MonitorFromPoint_Wrapper(args: PPyObject): PPyObject; Result := nil; end; -{$IFNDEF FPC} function TPyDelphiScreen.Realign_Wrapper(args: PPyObject): PPyObject; begin // We adjust the transmitted self argument @@ -1026,7 +985,6 @@ function TPyDelphiScreen.ResetFonts_Wrapper(args: PPyObject): PPyObject; Result := nil; end; end; -{$ENDIF FPC} class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); begin @@ -1054,19 +1012,16 @@ class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); 'Specifies the number of monitors used to comprise the desktop.', nil); AddGetSet('Monitors', @TPyDelphiScreen.Get_Monitors, nil, 'Provides access to an individual monitor used to comprise the desktop.', nil); - {$IFNDEF FPC} AddGetSet('DesktopRect', @TPyDelphiScreen.Get_DesktopRect, nil, 'Specifies the boundaries of the virtual desktop relative to the upper-left corner of the primary monitor.', nil); AddGetSet('DesktopLeft', @TPyDelphiScreen.Get_DesktopLeft, nil, 'Specifies the x-coordinate of the desktop’s left edge relative to the upper-left corner of the primary monitor.', nil); AddGetSet('DesktopTop', @TPyDelphiScreen.Get_DesktopTop, nil, 'Specifies the y-coordinate of the entire desktop’s top edge relative to the upper-left corner of the primary monitor.', nil); - {$ENDIF FPC} AddGetSet('DesktopWidth', @TPyDelphiScreen.Get_DesktopWidth, nil, 'Specifies the width of the entire virtual desktop.', nil); AddGetSet('DesktopHeight', @TPyDelphiScreen.Get_DesktopHeight, nil, 'Specifies the height of the entire virtual desktop.', nil); - {$IFNDEF FPC} AddGetSet('WorkAreaRect', @TPyDelphiScreen.Get_WorkAreaRect, nil, 'Specifies the boundaries of the usable work area on the primary monitor.', nil); AddGetSet('WorkAreaHeight', @TPyDelphiScreen.Get_WorkAreaHeight, nil, @@ -1077,7 +1032,6 @@ class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); 'Specifies the top edge of the work area on the primary monitor.', nil); AddGetSet('WorkAreaWidth', @TPyDelphiScreen.Get_WorkAreaWidth, nil, 'Specifies the width of the work area on the primary monitor.', nil); - {$ENDIF FPC} AddGetSet('HintFont', @TPyDelphiScreen.Get_HintFont, @TPyDelphiScreen.Set_HintFont, 'Specifies the font used to display help hints.', nil); AddGetSet('IconFont', @TPyDelphiScreen.Get_IconFont, @TPyDelphiScreen.Set_IconFont, @@ -1090,14 +1044,12 @@ class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); 'Indicates the number of forms or property pages displayed on the screen.', nil); AddGetSet('Forms', @TPyDelphiScreen.Get_Forms, nil, 'Lists all the forms currently displayed in the application.', nil); - {$IFNDEF FPC} AddGetSet('Imes', @TPyDelphiScreen.Get_Imes, nil, 'Lists all input method editors (IMEs) installed on the system.', nil); AddGetSet('DefaultIme', @TPyDelphiScreen.Get_DefaultIme, nil, 'Indicates which input method editor (IME) is active when the TScreen object is created.', nil); AddGetSet('DefaultKbLayout', @TPyDelphiScreen.Get_DefaultKbLayout, nil, 'Indicates the Windows handle to the keyboard layout that was active when the application started running.', nil); - {$ENDIF FPC} AddGetSet('Height', @TPyDelphiScreen.Get_Height, nil, 'Indicates the vertical size of the screen in pixels.', nil); AddGetSet('PixelsPerInch', @TPyDelphiScreen.Get_PixelsPerInch, nil, @@ -1113,7 +1065,6 @@ class procedure TPyDelphiScreen.RegisterGetSets(PythonType: TPythonType); class procedure TPyDelphiScreen.RegisterMethods(PythonType: TPythonType); begin - {$IFNDEF FPC} PythonType.AddMethod('DisableAlign', @TPyDelphiScreen.DisableAlign_Wrapper, 'TScreen.DisableAlign()'#10 + 'Prevents forms from being aligned in the screen.'); @@ -1126,7 +1077,6 @@ class procedure TPyDelphiScreen.RegisterMethods(PythonType: TPythonType); PythonType.AddMethod('ResetFonts', @TPyDelphiScreen.ResetFonts_Wrapper, 'TScreen.ResetFonts()'#10 + 'Reinitializes the fonts listed in the Fonts property.'); - {$ENDIF FPC} PythonType.AddMethod('MonitorFromPoint', @TPyDelphiScreen.MonitorFromPoint_Wrapper, 'TScreen.MonitorFromPoint(APoint, AMonitorDefault)'#10 + 'Returns the monitor where a specified point is located.'); @@ -1584,7 +1534,6 @@ function TPyDelphiApplication.HelpContext_Wrapper( end; end; -{$IFNDEF FPC} function TPyDelphiApplication.HelpJump_Wrapper(args: PPyObject): PPyObject; var _jumpID : PAnsiChar; @@ -1598,7 +1547,6 @@ function TPyDelphiApplication.HelpJump_Wrapper(args: PPyObject): PPyObject; Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiApplication.HelpKeyword_Wrapper( args: PPyObject): PPyObject; @@ -1642,7 +1590,6 @@ function TPyDelphiApplication.Initialize_Wrapper( end; end; -{$IFNDEF FPC} function TPyDelphiApplication.IsRightToLeft_Wrapper( args: PPyObject): PPyObject; begin @@ -1655,7 +1602,6 @@ function TPyDelphiApplication.IsRightToLeft_Wrapper( Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiApplication.MessageBox_Wrapper( args: PPyObject): PPyObject; @@ -1716,7 +1662,6 @@ function TPyDelphiApplication.ModalStarted_Wrapper( end; end; -{$IFNDEF FPC} function TPyDelphiApplication.NormalizeAllTopMosts_Wrapper( args: PPyObject): PPyObject; begin @@ -1758,7 +1703,6 @@ function TPyDelphiApplication.RestoreTopMosts_Wrapper( Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiApplication.ProcessMessages_Wrapper( args: PPyObject): PPyObject; @@ -1781,22 +1725,18 @@ class procedure TPyDelphiApplication.RegisterGetSets( begin AddGetSet('Active', @TPyDelphiApplication.Get_Active, nil, 'Specifies whether the application is active and has focus.', nil); - {$IFNDEF FPC} AddGetSet('AllowTesting', @TPyDelphiApplication.Get_AllowTesting, @TPyDelphiApplication.Set_AllowTesting, 'Represents information for the IDE.', nil); AddGetSet('AutoDragDocking', @TPyDelphiApplication.Get_AutoDragDocking, @TPyDelphiApplication.Set_AutoDragDocking, 'Indicates whether dragged windows are automatically docked.', nil); AddGetSet('CurrentHelpFile', @TPyDelphiApplication.Get_CurrentHelpFile, nil, 'Indicates the current help file.', nil); - {$ENDIF FPC} AddGetSet('ExeName', @TPyDelphiApplication.Get_ExeName, nil, 'Contains the file name of the application''s executable file including path information.', nil); - {$IFNDEF FPC} AddGetSet('DialogHandle', @TPyDelphiApplication.Get_DialogHandle, @TPyDelphiApplication.Set_DialogHandle, 'Provides a mechanism for using non-VCL dialog boxes in an application.', nil); AddGetSet('Handle', @TPyDelphiApplication.Get_Handle, @TPyDelphiApplication.Set_Handle, 'Provides access to the window handle of the main form (window) of the application.', nil); - {$ENDIF FPC} AddGetSet('HelpFile', @TPyDelphiApplication.Get_HelpFile, @TPyDelphiApplication.Set_HelpFile, 'Specifies the name of the default file the application uses to display Help.', nil); AddGetSet('Hint', @TPyDelphiApplication.Get_Hint, @TPyDelphiApplication.Set_Hint, @@ -1817,12 +1757,10 @@ class procedure TPyDelphiApplication.RegisterGetSets( 'Identifies which form in the application is the main window.', nil); AddGetSet('BiDiMode', @TPyDelphiApplication.Get_BiDiMode, @TPyDelphiApplication.Set_BiDiMode, 'Indicates the layout of the application when running under Middle Eastern versions of Windows.', nil); - {$IFNDEF FPC} AddGetSet('BiDiKeyboard', @TPyDelphiApplication.Get_BiDiKeyboard, @TPyDelphiApplication.Set_BiDiKeyboard, 'Specifies the name of the keyboard map that should be used in middle-east locales when text reads from right to left.', nil); AddGetSet('NonBiDiKeyboard', @TPyDelphiApplication.Get_NonBiDiKeyboard, @TPyDelphiApplication.Set_NonBiDiKeyboard, 'Specifies the name of the keyboard map that should be used unless text reads from right to left.', nil); - {$ENDIF FPC} AddGetSet('ShowHint', @TPyDelphiApplication.Get_ShowHint, @TPyDelphiApplication.Set_ShowHint, 'Determines whether Help Hints are enabled or disabled for the entire application.', nil); AddGetSet('ShowMainForm', @TPyDelphiApplication.Get_ShowMainForm, @TPyDelphiApplication.Set_ShowMainForm, @@ -1831,12 +1769,10 @@ class procedure TPyDelphiApplication.RegisterGetSets( 'Reports whether the application is in the process of shutting down.', nil); AddGetSet('Title', @TPyDelphiApplication.Get_Title, @TPyDelphiApplication.Set_Title, 'Contains the text that appears below the icon representing the application when it is minimized.', nil); - {$IFNDEF FPC} AddGetSet('UpdateFormatSettings', @TPyDelphiApplication.Get_UpdateFormatSettings, @TPyDelphiApplication.Set_UpdateFormatSettings, 'Specifies whether format settings are updated automatically when the user alters the system configuration.', nil); AddGetSet('UpdateMetricSettings', @TPyDelphiApplication.Get_UpdateMetricSettings, @TPyDelphiApplication.Set_UpdateMetricSettings, 'Specifies whether the settings used for the hint window font and the icon title font are updated.', nil); - {$ENDIF FPC} end; end; @@ -1867,11 +1803,9 @@ class procedure TPyDelphiApplication.RegisterMethods( PythonType.AddMethod('HelpContext', @TPyDelphiApplication.HelpContext_Wrapper, 'TApplication.HelpContext()'#10 + 'Displays a specified help topic.'); - {$IFNDEF FPC} PythonType.AddMethod('HelpJump', @TPyDelphiApplication.HelpJump_Wrapper, 'TApplication.HelpJump()'#10 + 'Displays a specified help topic.'); - {$ENDIF FPC} PythonType.AddMethod('HelpKeyword', @TPyDelphiApplication.HelpKeyword_Wrapper, 'TApplication.HelpKeyword()'#10 + 'Displays a specified help topic.'); @@ -1881,11 +1815,9 @@ class procedure TPyDelphiApplication.RegisterMethods( PythonType.AddMethod('Initialize', @TPyDelphiApplication.Initialize_Wrapper, 'TApplication.Initialize()'#10 + 'Provides an opportunity to initialize subsystems.'); - {$IFNDEF FPC} PythonType.AddMethod('IsRightToLeft', @TPyDelphiApplication.IsRightToLeft_Wrapper, 'TApplication.IsRightToLeft()'#10 + 'Specifies whether the application adjusts its interface for Middle Eastern locales.'); - {$ENDIF FPC} PythonType.AddMethod('MessageBox', @TPyDelphiApplication.MessageBox_Wrapper, 'TApplication.MessageBox()'#10 + 'Displays a specified message to the user.'); @@ -1898,14 +1830,12 @@ class procedure TPyDelphiApplication.RegisterMethods( PythonType.AddMethod('ModalFinished', @TPyDelphiApplication.ModalFinished_Wrapper, 'TApplication.ModalFinished()'#10 + 'Track closing of modal form.'); - {$IFNDEF FPC} PythonType.AddMethod('NormalizeAllTopMosts', @TPyDelphiApplication.NormalizeAllTopMosts_Wrapper, 'TApplication.NormalizeAllTopMosts()'#10 + 'Makes forms that have been designated as topmost forms (their FormStyle is fsStayOnTop) behave as if they were not topmost forms. '); PythonType.AddMethod('RestoreTopMosts', @TPyDelphiApplication.RestoreTopMosts_Wrapper, 'TApplication.RestoreTopMosts()'#10 + 'Restores forms designated as fsStayOnTop to be topmost again.'); - {$ENDIF FPC} PythonType.AddMethod('ProcessMessages', @TPyDelphiApplication.ProcessMessages_Wrapper, 'TApplication.ProcessMessages()'#10 + 'Interrupts the execution of an application so that it can process the message queue.'); @@ -1924,7 +1854,6 @@ class procedure TPyDelphiApplication.RegisterMethods( PythonType.AddMethod('UpdateAction', @TPyDelphiApplication.UpdateAction_Wrapper, 'TApplication.UpdateAction()'#10 + 'Generates an OnActionUpdate event.'); - {$IFNDEF FPC} PythonType.AddMethod('UseRightToLeftAlignment', @TPyDelphiApplication.UseRightToLeftAlignment_Wrapper, 'TApplication.UseRightToLeftAlignment()'#10 + 'Specifies whether the application object is in a right-to-left alignment mode.'); @@ -1934,7 +1863,6 @@ class procedure TPyDelphiApplication.RegisterMethods( PythonType.AddMethod('UseRightToLeftScrollBar', @TPyDelphiApplication.UseRightToLeftScrollBar_Wrapper, 'TApplication.UseRightToLeftScrollBar()'#10 + 'Specifies whether the vertical scroll bar appears on the left side controls.'); - {$ENDIF FPC} end; function TPyDelphiApplication.Restore_Wrapper(args: PPyObject): PPyObject; @@ -2026,7 +1954,6 @@ function TPyDelphiApplication.UpdateAction_Wrapper( end; end; -{$IFNDEF FPC} function TPyDelphiApplication.UseRightToLeftAlignment_Wrapper( args: PPyObject): PPyObject; begin @@ -2068,7 +1995,6 @@ function TPyDelphiApplication.UseRightToLeftScrollBar_Wrapper( Result := nil; end; end; -{$ENDIF FPC} function TPyDelphiApplication.Get_Active(AContext: Pointer): PPyObject; begin @@ -2076,7 +2002,6 @@ function TPyDelphiApplication.Get_Active(AContext: Pointer): PPyObject; Result := GetPythonEngine.VariantAsPyObject(DelphiObject.Active); end; -{$IFNDEF FPC} function TPyDelphiApplication.Get_AllowTesting( AContext: Pointer): PPyObject; begin @@ -2097,7 +2022,6 @@ function TPyDelphiApplication.Get_BiDiKeyboard( Adjust(@Self); Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.BiDiKeyboard); end; -{$ENDIF FPC} function TPyDelphiApplication.Get_BiDiMode(AContext: Pointer): PPyObject; begin @@ -2105,7 +2029,6 @@ function TPyDelphiApplication.Get_BiDiMode(AContext: Pointer): PPyObject; Result := GetPythonEngine.PyLong_FromLong(Ord(DelphiObject.BiDiMode)); end; -{$IFNDEF FPC} function TPyDelphiApplication.Get_CurrentHelpFile( AContext: Pointer): PPyObject; begin @@ -2119,7 +2042,6 @@ function TPyDelphiApplication.Get_DialogHandle( Adjust(@Self); Result := GetPythonEngine.PyLong_FromLong(DelphiObject.DialogHandle); end; -{$ENDIF FPC} function TPyDelphiApplication.Get_ExeName(AContext: Pointer): PPyObject; begin @@ -2127,13 +2049,11 @@ function TPyDelphiApplication.Get_ExeName(AContext: Pointer): PPyObject; Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.ExeName); end; -{$IFNDEF FPC} function TPyDelphiApplication.Get_Handle(AContext: Pointer): PPyObject; begin Adjust(@Self); Result := GetPythonEngine.PyLong_FromLong(DelphiObject.Handle); end; -{$ENDIF FPC} function TPyDelphiApplication.Get_HelpFile(AContext: Pointer): PPyObject; begin @@ -2192,14 +2112,12 @@ function TPyDelphiApplication.Get_MainForm(AContext: Pointer): PPyObject; Result := Wrap(DelphiObject.MainForm); end; -{$IFNDEF FPC} function TPyDelphiApplication.Get_NonBiDiKeyboard( AContext: Pointer): PPyObject; begin Adjust(@Self); Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.NonBiDiKeyboard); end; -{$ENDIF FPC} function TPyDelphiApplication.Get_ShowHint(AContext: Pointer): PPyObject; begin @@ -2226,7 +2144,6 @@ function TPyDelphiApplication.Get_Title(AContext: Pointer): PPyObject; Result := GetPythonEngine.PyUnicodeFromString(DelphiObject.Title); end; -{$IFNDEF FPC} function TPyDelphiApplication.Get_UpdateFormatSettings( AContext: Pointer): PPyObject; begin @@ -2285,7 +2202,6 @@ function TPyDelphiApplication.Set_BiDiKeyboard(AValue: PPyObject; else Result := -1; end; -{$ENDIF FPC} function TPyDelphiApplication.Set_BiDiMode(AValue: PPyObject; AContext: Pointer): Integer; @@ -2302,7 +2218,6 @@ function TPyDelphiApplication.Set_BiDiMode(AValue: PPyObject; Result := -1; end; -{$IFNDEF FPC} function TPyDelphiApplication.Set_DialogHandle(AValue: PPyObject; AContext: Pointer): Integer; var @@ -2332,7 +2247,6 @@ function TPyDelphiApplication.Set_Handle(AValue: PPyObject; else Result := -1; end; -{$ENDIF FPC} function TPyDelphiApplication.Set_HelpFile(AValue: PPyObject; AContext: Pointer): Integer; @@ -2454,7 +2368,6 @@ function TPyDelphiApplication.Set_Icon(AValue: PPyObject; Result := -1; end; -{$IFNDEF FPC} function TPyDelphiApplication.Set_NonBiDiKeyboard(AValue: PPyObject; AContext: Pointer): Integer; var @@ -2469,7 +2382,6 @@ function TPyDelphiApplication.Set_NonBiDiKeyboard(AValue: PPyObject; else Result := -1; end; -{$ENDIF FPC} function TPyDelphiApplication.Set_ShowHint(AValue: PPyObject; AContext: Pointer): Integer; @@ -2516,7 +2428,6 @@ function TPyDelphiApplication.Set_Title(AValue: PPyObject; Result := -1; end; -{$IFNDEF FPC} function TPyDelphiApplication.Set_UpdateFormatSettings(AValue: PPyObject; AContext: Pointer): Integer; var @@ -2546,7 +2457,6 @@ function TPyDelphiApplication.Set_UpdateMetricSettings(AValue: PPyObject; else Result := -1; end; -{$ENDIF FPC} class function TPyDelphiApplication.DelphiObjectClass: TClass; begin diff --git a/Source/vcl/WrapVclGraphics.pas b/Source/vcl/WrapVclGraphics.pas index 8859d75a..1479d5f6 100644 --- a/Source/vcl/WrapVclGraphics.pas +++ b/Source/vcl/WrapVclGraphics.pas @@ -51,7 +51,7 @@ TPyDelphiGraphic = class(TPyDelphiPersistent) function Set_Transparent( AValue : PPyObject; AContext : Pointer) : integer; cdecl; function Set_Width( AValue : PPyObject; AContext : Pointer) : integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets( PythonType : TPythonType ); override; @@ -103,7 +103,7 @@ TPyDelphiBitmap = class(TPyDelphiGraphic) function Set_TransparentColor( AValue : PPyObject; AContext : Pointer) : Integer; cdecl; function Set_TransparentMode( AValue : PPyObject; AContext : Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets( PythonType : TPythonType ); override; @@ -380,9 +380,9 @@ procedure TGraphicsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap { TPyDelphiGraphic } constructor TPyDelphiGraphic.CreateWith(APythonType: TPythonType; - args: PPyObject); + args, kwds: PPyObject); begin - inherited; + Create(APythonType); DelphiObject := TGraphicClass(DelphiObjectClass()).Create(); end; @@ -720,7 +720,7 @@ function TPyDelphiGraphic.Set_Width(AValue: PPyObject; { TPyDelphiBitmap } constructor TPyDelphiBitmap.CreateWith(APythonType: TPythonType; - args: PPyObject); + args, kwds: PPyObject); var LWidth, LHeight : Integer; begin diff --git a/Source/vcl/WrapVclThemes.pas b/Source/vcl/WrapVclThemes.pas index 202cec23..45030e8e 100644 --- a/Source/vcl/WrapVclThemes.pas +++ b/Source/vcl/WrapVclThemes.pas @@ -38,7 +38,7 @@ TPyDelphiStyleInfo = class(TPyObject) function Set_AuthorUrl(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; function Set_Version(AValue: PPyObject; AContext: Pointer) : Integer; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; function Compare(AObj: PPyObject) : Integer; override; function Repr: PPyObject; override; class procedure RegisterGetSets(APythonType: TPythonType ); override; @@ -52,7 +52,7 @@ TPyDelphiCustomStyleServices = class(TPyDelphiObject) procedure SetDelphiObject(const Value: TCustomStyleServices); public constructor Create( APythonType : TPythonType ); override; - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterMethods( PythonType : TPythonType ); override; // Properties @@ -70,7 +70,7 @@ TPyDelphiStyleManager = class(TPyDelphiObject) function LoadFromFileName_Wrapper(AArgs: PPyObject): PPyObject; cdecl; function IsValidStyle_Wrapper(AArgs: PPyObject): PPyObject; cdecl; public - constructor CreateWith(APythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); override; class function DelphiObjectClass : TClass; override; class procedure RegisterGetSets(PythonType: TPythonType); override; class procedure RegisterMethods(PythonType: TPythonType); override; @@ -172,10 +172,10 @@ procedure TVclThemesRegistration.RegisterWrappers( end; { TPyDelphiStyleManager } -constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiStyleManager.CreateWith(APythonType: TPythonType; + args, kwds: PPyObject); begin - inherited; + Create(APythonType); DelphiObject := TStyleManager.Create(); end; @@ -293,8 +293,8 @@ class function TStyleManagerStyleNamesAccess.Name: string; end; { TPyDelphiStyleInfo } -constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args: - PPyObject); +constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args, + kwds: PPyObject); var LName: PAnsiChar; LAuthor: PAnsiChar; @@ -302,7 +302,7 @@ constructor TPyDelphiStyleInfo.CreateWith(APythonType: TPythonType; args: LAuthorURL: PAnsiChar; LVersion: PAnsiChar; begin - inherited; + Create(APythonType); if APythonType.Engine.PyArg_ParseTuple(args, 'sssss:Create', @LName, @LAuthor, @LAuthorEMail, @LAuthorURL, @LVersion) <> 0 then begin FValue.Name := string(LName); @@ -479,9 +479,9 @@ constructor TPyDelphiCustomStyleServices.Create(APythonType: TPythonType); end; constructor TPyDelphiCustomStyleServices.CreateWith(APythonType: TPythonType; - args: PPyObject); + args, kwds: PPyObject); begin - inherited; + Create(APythonType); DelphiObject := StyleServices(); end; diff --git a/Tests/FMX/Android/NumberServicesTest.pas b/Tests/FMX/Android/NumberServicesTest.pas index 9494a5a0..115ba066 100644 --- a/Tests/FMX/Android/NumberServicesTest.pas +++ b/Tests/FMX/Android/NumberServicesTest.pas @@ -50,7 +50,7 @@ PyTRandomInteger = class(TPyObject) private FRandomInteger: TRandomInteger; public - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Basic services function Repr: PPyObject; override; // Number services @@ -269,15 +269,15 @@ function PyTRandomInteger.Repr: PPyObject; end; { PyTRandomInteger } -constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args: - PPyObject); +constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, + kwds: PPyObject); var val1: PPyObject; begin + Create(PythonType); with GetPythonEngine do begin try - inherited; // create object FRandomInteger := TRandomInteger.Create; // try to parse the parameter diff --git a/Tests/NumberServicesTest.pas b/Tests/NumberServicesTest.pas index 0b3848d0..d1e1a3cf 100644 --- a/Tests/NumberServicesTest.pas +++ b/Tests/NumberServicesTest.pas @@ -22,7 +22,7 @@ PyTRandomInteger = class(TPyObject) FRandomInteger: TRandomInteger; public - constructor CreateWith(PythonType: TPythonType; args: PPyObject); override; + constructor CreateWith(PythonType: TPythonType; args, kwds: PPyObject); override; // Basic services function Repr: PPyObject; override; @@ -272,16 +272,15 @@ function PyTRandomInteger.Repr: PPyObject; { PyTRandomInteger } -constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args: - PPyObject); +constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, + kwds: PPyObject); var val1: PPyObject; begin + Create(PythonType); with GetPythonEngine do begin try - inherited; - // create object FRandomInteger := TRandomInteger.Create; From 83f79038c1affa751c0746f3dcce68ac77efa600 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 11 Oct 2023 01:27:47 +0300 Subject: [PATCH 079/174] Delphi 12 support --- Source/Definition.Inc | 58 +++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/Source/Definition.Inc b/Source/Definition.Inc index 826b61a9..8b05a797 100644 --- a/Source/Definition.Inc +++ b/Source/Definition.Inc @@ -25,40 +25,23 @@ // Delphi, C++ Builder versions ///////////////////////////////////////////////////////////////////////////// -{$IFDEF VER210} // Delphi 2010 - {$DEFINE DELPHI2010} - {$DEFINE DELPHI2010_OR_HIGHER} -{$ENDIF} -{$IFDEF VER220} // Delphi XE - {$DEFINE DELPHIXE} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} -{$ENDIF} {$IFDEF VER230} // Delphi XE2 {$DEFINE DELPHIXE2} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$ENDIF} {$IFDEF VER240} // Delphi XE3 {$DEFINE DELPHIXE3} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$ENDIF} {$IFDEF VER250} // Delphi XE4 {$DEFINE DELPHIXE4} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} {$ENDIF} {$IFDEF VER260} // Delphi XE5 {$DEFINE DELPHIXE5} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -66,8 +49,6 @@ {$ENDIF} {$IFDEF VER270} // Delphi XE6 {$DEFINE DELPHIXE6} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -76,8 +57,6 @@ {$ENDIF} {$IFDEF VER280} // Delphi XE7 {$DEFINE DELPHIXE7} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -87,8 +66,6 @@ {$ENDIF} {$IFDEF VER290} // Delphi XE8 {$DEFINE DELPHIXE8} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -99,8 +76,6 @@ {$ENDIF} {$IFDEF VER300} // Delphi 10 {$DEFINE DELPHI10} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -112,8 +87,6 @@ {$ENDIF} {$IFDEF VER310} // Delphi 10.1 {$DEFINE DELPHI10_1} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -126,8 +99,6 @@ {$ENDIF} {$IFDEF VER320} // Delphi 10.2 {$DEFINE DELPHI10_2} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -141,8 +112,6 @@ {$ENDIF} {$IFDEF VER330} // Delphi 10.3 {$DEFINE DELPHI10_3} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -157,8 +126,6 @@ {$ENDIF} {$IFDEF VER340} // Delphi 10.4 {$DEFINE DELPHI10_4} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -177,8 +144,6 @@ {$ENDIF} {$IFDEF VER350} // Delphi 11 {$DEFINE DELPHI11} - {$DEFINE DELPHI2010_OR_HIGHER} - {$DEFINE DELPHIXE_OR_HIGHER} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} @@ -193,6 +158,23 @@ {$DEFINE DELPHI10_4_OR_HIGHER} {$DEFINE DELPHI11_OR_HIGHER} {$ENDIF} +{$IFDEF VER360} // Delphi 12 + {$DEFINE DELPHI11} + {$DEFINE DELPHIXE2_OR_HIGHER} + {$DEFINE DELPHIXE3_OR_HIGHER} + {$DEFINE DELPHIXE4_OR_HIGHER} + {$DEFINE DELPHIXE5_OR_HIGHER} + {$DEFINE DELPHIXE6_OR_HIGHER} + {$DEFINE DELPHIXE7_OR_HIGHER} + {$DEFINE DELPHIXE8_OR_HIGHER} + {$DEFINE DELPHI10_OR_HIGHER} + {$DEFINE DELPHI10_1_OR_HIGHER} + {$DEFINE DELPHI10_2_OR_HIGHER} + {$DEFINE DELPHI10_3_OR_HIGHER} + {$DEFINE DELPHI10_4_OR_HIGHER} + {$DEFINE DELPHI11_OR_HIGHER} + {$DEFINE DELPHI12_OR_HIGHER} +{$ENDIF} ///////////////////////////////////////////////////////////////////////////// // Misc @@ -233,7 +215,7 @@ {$DEFINE CPUARM} {$DEFINE CPUARM64} {$ENDIF} - + {$IFDEF UNIX} {$DEFINE POSIX} {$ENDIF UNIX} @@ -243,9 +225,9 @@ {$ENDIF ANDROID} {$ENDIF FPC} -{$IFDEF DELPHIXE_OR_HIGHER} +{$IFDEF DELPHIXE2_OR_HIGHER} {$DEFINE EXTENDED_RTTI} -{$ENDIF DELPHIXE_OR_HIGHER} +{$ENDIF DELPHIXE2_OR_HIGHER} {$IFDEF DELPHIXE4_OR_HIGHER} {$LEGACYIFEND ON} From 176ead8025901295cfad021b5e27c41b843e8d35 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 11 Oct 2023 01:40:54 +0300 Subject: [PATCH 080/174] Fix to Delphi 12 support --- Source/Definition.Inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Definition.Inc b/Source/Definition.Inc index 8b05a797..efafdd5a 100644 --- a/Source/Definition.Inc +++ b/Source/Definition.Inc @@ -159,7 +159,7 @@ {$DEFINE DELPHI11_OR_HIGHER} {$ENDIF} {$IFDEF VER360} // Delphi 12 - {$DEFINE DELPHI11} + {$DEFINE DELPHI12} {$DEFINE DELPHIXE2_OR_HIGHER} {$DEFINE DELPHIXE3_OR_HIGHER} {$DEFINE DELPHIXE4_OR_HIGHER} From 96c573700310ec91666490a15a31c7b159d52599 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 11 Oct 2023 13:22:37 +0300 Subject: [PATCH 081/174] Fix #435 --- Source/vcl/WrapVclComCtrls.pas | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index 5e5c03ec..62f30629 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -356,6 +356,7 @@ TTVCreateNodeClassEventHandler = class(TEventHandler) class function GetTypeInfo: PTypeInfo; override; end; +{$IFDEF DELPHI11_OR_HIGHER} //TTVCheckStateChangedEvent TTVCheckStateChangedEventHandler = class(TEventHandler) protected @@ -378,6 +379,7 @@ TTVCheckStateChangingEventHandler = class(TEventHandler) class function GetTypeInfo: PTypeInfo; override; end; +{$ENDIF} TPyDelphiTreeNode = class(TPyDelphiPersistent) private @@ -723,7 +725,9 @@ TPyDelphiListView = class(TPyDelphiCustomListView) property DelphiObject: TListView read GetDelphiObject write SetDelphiObject; end; +{$IFDEF DELPHI11_OR_HIGHER} function NodeCheckStateToPython(const ANodeCheckState: TNodeCheckState): PPyObject; +{$ENDIF} function CustomDrawTargetToPython(const ACustomDrawTarget: TCustomDrawTarget): PPyObject; function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyObject; @@ -750,6 +754,7 @@ TComCtrlsRegistration = class(TRegisteredUnit) procedure DefineVars(APyDelphiWrapper: TPyDelphiWrapper); override; end; +{$IFDEF DELPHI11_OR_HIGHER} function NodeCheckStateToPython(const ANodeCheckState: TNodeCheckState): PPyObject; begin Result := GetPythonEngine().PyUnicodeFromString( @@ -757,6 +762,7 @@ function NodeCheckStateToPython(const ANodeCheckState: TNodeCheckState): PPyObje TypeInfo(TNodeCheckState), Ord(ANodeCheckState))); end; +{$ENDIF} function CustomDrawTargetToPython(const ACustomDrawTarget: TCustomDrawTarget): PPyObject; begin @@ -901,8 +907,10 @@ procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.EventHandlers.RegisterHandler(TTVAdvancedCustomDrawEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTVAdvancedCustomDrawItemEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCreateNodeClassEventHandler); +{$IFDEF DELPHI11_OR_HIGHER} APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCheckStateChangedEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCheckStateChangingEventHandler); +{$ENDIF} APyDelphiWrapper.EventHandlers.RegisterHandler(TLVDeletedEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TLVEditingEventHandler); @@ -2374,6 +2382,7 @@ procedure TTVCreateNodeClassEventHandler.DoEvent(Sender: TCustomTreeView; end; end; +{$IFDEF DELPHI11_OR_HIGHER} { TTVCheckStateChangedEventHandler } constructor TTVCheckStateChangedEventHandler.Create( @@ -2469,6 +2478,7 @@ procedure TTVCheckStateChangingEventHandler.DoEvent(Sender: TCustomTreeView; CheckError(); end; end; +{$ENDIF} { TLVDeletedEventHandler } From 8dfe703062a740b88ee4bc5fcdfacd2c68606b6d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 14 Oct 2023 13:34:26 +0300 Subject: [PATCH 082/174] Important FindClass and ValidateClassRef optimization. --- Source/PythonEngine.pas | 48 ++++++++++++++++------------------------- Source/WrapDelphi.pas | 16 ++++---------- 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ffa4e9bd..97a95f56 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -610,7 +610,6 @@ TPythonVersionProp = record m_free : inquiry; end; - // object.h PyTypeObject = {$IFDEF CPUX86}packed{$ENDIF} record ob_refcnt: NativeInt; @@ -699,6 +698,7 @@ TPythonVersionProp = record tp_xxx8 : NativeInt; tp_xxx9 : NativeInt; tp_xxx10 : NativeInt; + tp_pythontype : Pointer; // Introduced for FindPythonType optimization end; // from pystate.h @@ -1903,8 +1903,7 @@ TPythonEngine = class(TPythonInterface) procedure AddClient( client : TEngineClient ); procedure RemoveClient( client : TEngineClient ); function FindClient( const aName : string ) : TEngineClient; - function FindPythonType(const TypeName : AnsiString): TPythonType; overload; - function FindPythonType(PyType: PPyTypeObject): TPythonType; overload; + function FindPythonType(const TypeName : AnsiString): TPythonType; function TypeByName( const aTypeName : AnsiString ) : PPyTypeObject; function ModuleByName( const aModuleName : AnsiString ) : PPyObject; function MethodsByName( const aMethodsContainer: string ) : PPyMethodDef; @@ -2780,6 +2779,7 @@ function pyio_GetTypesStats(self, args : PPyObject) : PPyObject; cdecl; function GetPythonEngine : TPythonEngine; function PythonOK : Boolean; function PythonToDelphi( obj : PPyObject ) : TPyObject; +function FindPythonType(PyType: PPyTypeObject): TPythonType; function IsDelphiObject( obj : PPyObject ) : Boolean; procedure PyObjectDestructor( pSelf : PPyObject); cdecl; procedure Register; @@ -6153,19 +6153,6 @@ function TPythonEngine.FindPythonType(const TypeName: AnsiString): TPythonType; end; end; -function TPythonEngine.FindPythonType(PyType: PPyTypeObject): TPythonType; -var - I : Integer; -begin - Result := nil; - for I := 0 to ClientCount - 1 do - if (Clients[I] is TPythonType) and (TPythonType(Clients[I]).TheTypePtr = PyType) then - begin - Result := TPythonType(Clients[I]); - Break; - end; -end; - function TPythonEngine.FindFunction(const ModuleName,FuncName: AnsiString): PPyObject; var module,func: PPyObject; @@ -8649,6 +8636,7 @@ procedure TPythonType.Initialize; InitServices; if Engine.PyType_Ready(TheTypePtr) <> 0 then Engine.CheckError; + FType.tp_pythontype := Self; // Store self into FType inherited; end; @@ -9370,27 +9358,27 @@ function PythonOK : Boolean; (gPythonEngine.Initialized or gPythonEngine.Finalizing); end; -function IsDelphiObject( obj : PPyObject ) : Boolean; +function FindPythonType(PyType: PPyTypeObject): TPythonType; var - t : PPyTypeObject; + Typ : PPyTypeObject; begin - Result := False; + Result := nil; // Here's a simple trick: we compare the object destructor to // our special destructor for Delphi objects, or // we check if one of the parent types of obj has a Delphi destructor. - if Assigned(obj) then + Typ := PyType; + while Assigned(Typ) do begin - t := obj^.ob_type; - while Assigned(t) do - begin - if @t^.tp_dealloc = @PyObjectDestructor then - begin - Result := True; - Break; - end; - t := t^.tp_base; - end; + if @Typ^.tp_dealloc = @PyObjectDestructor then + Exit(Typ.tp_pythontype); + Typ := Typ^.tp_base; end; +//var +end; + +function IsDelphiObject( obj : PPyObject ) : Boolean; +begin + Result := Assigned(obj) and (FindPythonType(obj^.ob_type) <> nil); end; procedure Register; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 808d681a..0f9ec277 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1554,31 +1554,23 @@ procedure InvalidArguments(const MethName, ErrMsg : string); function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; out ClassRef: TClass; out ErrMsg: string): Boolean; var - LTypeName: AnsiString; LPythonType: TPythonType; begin ClassRef := nil; if (PyValue = GetPythonEngine.Py_None) then begin - Result := True; - Exit; + Result := True; + Exit; end; Result := False; // Is PyValue a Python type? - if PyValue^.ob_type^.tp_name = 'type' then - LTypeName := PPyTypeObject(PyValue).tp_name - else + if not GetPythonEngine.PyClass_Check(PyValue) then begin ErrMsg := rs_ExpectedClass; Exit; end; - LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue)); - if not Assigned(LPythonType) then - // Try once more with the base type to catter for pascal classes - // subclassed in Python - LPythonType := GetPythonEngine.FindPythonType(PPyTypeObject(PyValue).tp_base); - + LPythonType := FindPythonType(PPyTypeObject(PyValue)); if Assigned(LPythonType) then begin if Assigned(LPythonType) and LPythonType.PyObjectClass.InheritsFrom(TPyDelphiObject) then From 6d985e73fb18b5bf5c124053b01e6c6c733b7da2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 14 Oct 2023 15:38:10 +0300 Subject: [PATCH 083/174] WrapDelphi: Handle default Indexed property. --- Source/WrapDelphi.pas | 89 +++++++++++++++++++++++++++++++++++++++- Tests/WrapDelphiTest.pas | 5 ++- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 0f9ec277..a4938b3c 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -588,6 +588,11 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) function SqItem( idx : NativeInt ) : PPyObject; override; function SqContains( obj: PPyObject): integer; override; function SqAssItem( idx : NativeInt; obj : PPyObject) : Integer; override; + // Mapping services + {$IFDEF EXTENDED_RTTI} + function MpSubscript(obj: PPyObject) : PPyObject; override; + function MpAssSubscript(obj1, obj2: PPyObject) : Integer; override; + {$ENDIF EXTENDED_RTTI} class function DelphiObjectClass : TClass; virtual; class procedure RegisterMethods( PythonType : TPythonType ); override; @@ -3904,8 +3909,6 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; LClass: TClass; LDocStr: string; begin - // TODO: Identify and handle the default property - LRttiCtx := TRttiContext.Create(); try LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; @@ -3965,12 +3968,94 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; nil, PAnsiChar(LExposedProperty.DocString), nil); + + // Store the default property in the type + if LRttiProperty.IsDefault and (APythonType.Tag = 0) then + begin + APythonType.Tag := NativeInt(LRttiProperty); + if LRttiProperty.IsWritable then + APythonType.Services.Mapping := [msSubscript, msAssSubscript] + else + APythonType.Services.Mapping := [msSubscript]; + end; end; finally LRttiCtx.Free; end; end; +function TPyDelphiObject.MpSubscript(obj: PPyObject) : PPyObject; +var + PyArgs: PPyObject; + Prop: TRttiIndexedProperty; +begin + Assert(PythonType.Tag <> 0); + Prop := TRttiIndexedProperty(PythonType.Tag); + + // obj is a tuple only if we have more than one arguments + if PyDelphiWrapper.Engine.PyTuple_Check(obj) then + PyArgs := obj + else + PyArgs := PyDelphiWrapper.Engine.MakePyTuple([obj]); + + Result := RttiCall(DelphiObject, PyDelphiWrapper, Prop.ReadMethod, + PyArgs, nil); + + if not PyDelphiWrapper.Engine.PyTuple_Check(obj) then + PyDelphiWrapper.Engine.Py_DECREF(PyArgs); // release created tuple +end; + +function TPyDelphiObject.MpAssSubscript(obj1, obj2: PPyObject) : Integer; +var + Engine: TPythonEngine; + Prop: TRttiIndexedProperty; + PyArgs: PPyObject; + TempPy: PPyObject; + Count, Index: Integer; +begin + Result := -1; // Signals failure + + Assert(PythonType.Tag <> 0); + Prop := TRttiIndexedProperty(PythonType.Tag); + + Engine := PyDelphiWrapper.Engine; + if not Prop.IsWritable then + begin + with Engine do + PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString(rs_NotWritable)); + Exit; + end; + + // obj is a tuple only if we have more than one arguments + if Engine.PyTuple_Check(obj1) then + begin + Count := Engine.PyTuple_Size(obj1); + PyArgs := Engine.PyTuple_New(Count + 1); + for Index := 0 to Count - 1 do + begin + TempPy := Engine.PyTuple_GetItem(obj1, Index); + Engine.Py_XINCREF(TempPy); + Engine.PyTuple_SetItem(PyArgs, Index, TempPy); + end; + Engine.Py_XINCREF(obj2); + Engine.PyTuple_SetItem(PyArgs, Count, obj2); + end + else + PyArgs := Engine.MakePyTuple([obj1, obj2]); + + TempPy := RttiCall(DelphiObject, PyDelphiWrapper, Prop.WriteMethod, + PyArgs, nil); + + Engine.Py_DECREF(PyArgs); // release created tuple + + if TempPy <> nil then + begin + Engine.Py_DECREF(TempPy); //Should be Py_None + Result := 0; // Signal success + end; +end; + + {$ENDIF EXTENDED_RTTI} function TPyDelphiObject.Set_Owned(AValue: PPyObject; diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 608a55a9..708093ba 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -69,7 +69,7 @@ TTestRttiAccess = class procedure PassVariantArray(const Value: Variant); function ClassRefParam(ClassRef: TPersistentClass): string; property Indexed[I: Integer]: Integer read GetIndexed write SetIndexed; - property Indexed2[S1, S2: string]: string read GetIndexed2 write SetIndexed2; + property Indexed2[S1, S2: string]: string read GetIndexed2 write SetIndexed2; default; class var ClassField: string; class function DoubleString(S: string): string; class function Square(I: Integer): Integer; static; @@ -325,6 +325,9 @@ procedure TTestWrapDelphi.TestIndexedProperties; Assert.AreEqual(VarPythonEval('rtti_var.Indexed[2]'), 6); PythonEngine.ExecString('rtti_var.Indexed2["A", "B"] = "C"'); Assert.AreEqual(VarPythonEval('rtti_var.Indexed2["A", "B"]'), 'A,B: C'); + // default property + PythonEngine.ExecString('rtti_var["A", "B"] = "C"'); + Assert.AreEqual(VarPythonEval('rtti_var["A", "B"]'), 'A,B: C'); end; procedure TTestWrapDelphi.TestInheritance; From 1ee3012f667534367ff0b23415b8b5299b14a118 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 14 Oct 2023 15:45:21 +0300 Subject: [PATCH 084/174] TPythonType.Finalize needs to reset tp_pythontype and Tag. --- Source/PythonEngine.pas | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 97a95f56..dd965047 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -8645,6 +8645,10 @@ procedure TPythonType.Finalize; if Assigned(Engine) then Engine.Py_CLEAR(FCreateFunc); FCreateFunc := nil; + + FType.tp_pythontype := nil; + Tag := 0; // TPyDelphiObject stores the default indexed property + inherited; end; From 7faa2adde2b43c10b51c2f0718810aa8bf49158f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Oct 2023 17:49:38 +0300 Subject: [PATCH 085/174] Reverse previous change. --- Source/PythonEngine.pas | 3 --- Source/WrapDelphi.pas | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index dd965047..bc3d3afc 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -8646,9 +8646,6 @@ procedure TPythonType.Finalize; Engine.Py_CLEAR(FCreateFunc); FCreateFunc := nil; - FType.tp_pythontype := nil; - Tag := 0; // TPyDelphiObject stores the default indexed property - inherited; end; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index a4938b3c..9d717493 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3592,7 +3592,6 @@ class procedure TPyDelphiObject.SetupType(APythonType: TPythonType); APythonType.GenerateCreateFunction := False; APythonType.DocString.Text := 'Wrapper for Pascal class ' + DelphiObjectClass.ClassName; APythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; - _ContainerAccessClass := GetContainerAccessClass; if Assigned(_ContainerAccessClass) then begin APythonType.Services.Basic := APythonType.Services.Basic + [bsIter]; @@ -3910,6 +3909,7 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; LDocStr: string; begin LRttiCtx := TRttiContext.Create(); + APythonType.Tag := 0; // may be assigned a default indexed property try LRttiType := LRttiCtx.GetType(AClass) as TRttiStructuredType; From caf0e0f643ca0bee421605497713edcd40d5511c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Oct 2023 17:55:12 +0300 Subject: [PATCH 086/174] Accidentally deleted a line in WrapDelphi.pas --- Source/WrapDelphi.pas | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 9d717493..eaf7daf8 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3592,6 +3592,7 @@ class procedure TPyDelphiObject.SetupType(APythonType: TPythonType); APythonType.GenerateCreateFunction := False; APythonType.DocString.Text := 'Wrapper for Pascal class ' + DelphiObjectClass.ClassName; APythonType.Services.Basic := [bsGetAttrO, bsSetAttrO, bsRepr, bsStr, bsRichCompare]; + _ContainerAccessClass := GetContainerAccessClass; if Assigned(_ContainerAccessClass) then begin APythonType.Services.Basic := APythonType.Services.Basic + [bsIter]; From 385977d048e47899cbda91178e425128fb5454c0 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 15 Oct 2023 20:40:15 +0300 Subject: [PATCH 087/174] Refactored RttiCall overloads --- Source/WrapDelphi.pas | 87 +++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 49 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index eaf7daf8..83caf322 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1048,7 +1048,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; - Method: TRttiMethod; ob1, ob2: PPyObject; + Method: TRttiMethod; ob1, ob2: PPyObject; const Args: TArray; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; @@ -1465,7 +1465,7 @@ function TPyIndexedProperty.MpSubscript(obj: PPyObject) : PPyObject; PyArgs := FPyWrapper.Engine.MakePyTuple([obj]); Result := RttiCall(PascalObject, FPyWrapper, FProperty.ReadMethod, - PyArgs, nil); + PyArgs, nil, []); if not FPyWrapper.Engine.PyTuple_Check(obj) then FPyWrapper.Engine.Py_DECREF(PyArgs); // release created tuple @@ -1514,7 +1514,7 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; PyArgs := Engine.MakePyTuple([obj1, obj2]); TempPy := RttiCall(PascalObject, FPyWrapper, FProperty.WriteMethod, - PyArgs, nil); + PyArgs, nil, []); Engine.Py_DECREF(PyArgs); // release created tuple @@ -2628,7 +2628,8 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; res, param = objref.Test(param) } function FindMethod(const MethName:string; RttiType : TRttiType; - PyArgs: PPyObject; var Args: array of TValue):TRttiMethod; + PyArgs: PPyObject; var Args: array of TValue; + out ErrMsg: string):TRttiMethod; // Deals with overloaded methods // Constructs the Arg Array // PyArgs is a Python tuple @@ -2636,16 +2637,21 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; begin Result := nil; + ErrMsg := rs_UnknownAttribute; for Method in RttiType.GetMethods do - if SameText(Method.Name, MethName) and PyArgsToValues(PyArgs, Method, Args) then - begin - Result := Method; - Break; + if SameText(Method.Name, MethName) then begin + if PyArgsToValues(PyArgs, Method, Args) then + begin + Result := Method; + Break; + end + else + ErrMsg := rs_IncompatibleArguments; end; end; var - Args: array of TValue; + Args: TArray; ArgCount: Integer; meth: TRttiMethod; ReturnValue: TValue; @@ -2654,53 +2660,30 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; begin Result := nil; - // Ignore keyword arguments ob2 - // ob1 is a tuple with zero or more elements ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); SetLength(Args, ArgCount); - meth := FindMethod(MethName, ParentRtti, ob1, Args); + meth := FindMethod(MethName, ParentRtti, ob1, Args, ErrMsg); if not Assigned(meth) then begin - InvalidArguments(MethName, rs_IncompatibleArguments); + InvalidArguments(MethName, ErrMsg); Exit; end; - try - if ParentRtti is TRttiInstanceType then - if meth.IsClassMethod or meth.IsStatic then - if AParentAddrIsClass then - Addr := TValue.From(TClass(ParentAddress)) - else - Addr := TValue.From(TObject(ParentAddress).ClassType) - else - Addr := TValue.From(TObject(ParentAddress)) - else if ParentRtti is TRttiInterfaceType then - TValue.Make(@ParentAddress, ParentRtti.Handle, Addr) - else - Addr := TValue.From(ParentAddress); - ReturnValue := meth.Invoke(Addr, Args); - - Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg); - if Result = nil then - with DelphiWrapper.Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidRet, [MethName, ErrMsg]))); - except - on E: Exception do begin - Result := nil; - InvalidArguments(MethName, E.Message); - end; - end; + Result := RttiCall(ParentAddress, DelphiWrapper, meth, ob1, ob2, Args, + AParentAddrIsClass); end; +// This overload can be called either directly or from the overload above. +// When it is called from above Args are already setup and validated +// When it is called directly Args = [] function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; - Method: TRttiMethod; ob1, ob2: PPyObject; + Method: TRttiMethod; ob1, ob2: PPyObject; const Args: TArray; AParentAddrIsClass: Boolean = false): PPyObject; var ArgCount: Integer; - Args: array of TValue; + LArgs: TArray; Addr: TValue; ReturnValue: TValue; ErrMsg : string; @@ -2710,12 +2693,18 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; // ob1 is a tuple with zero or more elements ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); - SetLength(Args, ArgCount); - - if not PyArgsToValues(ob1, Method, Args) then + if Length(Args) = ArgCount then + // already validated + LArgs := Args + else begin - InvalidArguments(Method.Name, rs_IncompatibleArguments); - Exit; + SetLength(LArgs, ArgCount); + + if not PyArgsToValues(ob1, Method, LArgs) then + begin + InvalidArguments(Method.Name, rs_IncompatibleArguments); + Exit; + end; end; try @@ -2732,7 +2721,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; else Addr := TValue.From(ParentAddress); - ReturnValue := Method.Invoke(Addr, Args); + ReturnValue := Method.Invoke(Addr, LArgs); Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg); if Result = nil then @@ -4000,7 +3989,7 @@ function TPyDelphiObject.MpSubscript(obj: PPyObject) : PPyObject; PyArgs := PyDelphiWrapper.Engine.MakePyTuple([obj]); Result := RttiCall(DelphiObject, PyDelphiWrapper, Prop.ReadMethod, - PyArgs, nil); + PyArgs, nil, []); if not PyDelphiWrapper.Engine.PyTuple_Check(obj) then PyDelphiWrapper.Engine.Py_DECREF(PyArgs); // release created tuple @@ -4045,7 +4034,7 @@ function TPyDelphiObject.MpAssSubscript(obj1, obj2: PPyObject) : Integer; PyArgs := Engine.MakePyTuple([obj1, obj2]); TempPy := RttiCall(DelphiObject, PyDelphiWrapper, Prop.WriteMethod, - PyArgs, nil); + PyArgs, nil, []); Engine.Py_DECREF(PyArgs); // release created tuple From 02a783df8f8b083a2e528739757046d15a7cbc32 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 16 Oct 2023 01:18:50 +0300 Subject: [PATCH 088/174] Handle exposed methods with var/out parameters --- Source/WrapDelphi.pas | 115 +++++++++++++++++++++++++++++---------- Tests/WrapDelphiTest.pas | 33 +++++++++++ 2 files changed, 119 insertions(+), 29 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 83caf322..877f6652 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1049,6 +1049,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; ob1, ob2: PPyObject; const Args: TArray; + const VarParamIndices: TArray; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; @@ -1465,7 +1466,7 @@ function TPyIndexedProperty.MpSubscript(obj: PPyObject) : PPyObject; PyArgs := FPyWrapper.Engine.MakePyTuple([obj]); Result := RttiCall(PascalObject, FPyWrapper, FProperty.ReadMethod, - PyArgs, nil, []); + PyArgs, nil, [], []); if not FPyWrapper.Engine.PyTuple_Check(obj) then FPyWrapper.Engine.Py_DECREF(PyArgs); // release created tuple @@ -1514,7 +1515,7 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; PyArgs := Engine.MakePyTuple([obj1, obj2]); TempPy := RttiCall(PascalObject, FPyWrapper, FProperty.WriteMethod, - PyArgs, nil, []); + PyArgs, nil, [], []); Engine.Py_DECREF(PyArgs); // release created tuple @@ -1862,7 +1863,8 @@ function PyObjectToTValue(PyArg : PPyObject; ArgType: TRttiType; end; -function PyArgsToValues(PyArgs: PPyObject; Method: TRttiMethod; out Args: array of TValue): Boolean; +function PyArgsToValues(PyArgs: PPyObject; Method: TRttiMethod; + out Args: array of TValue; out VarParamIndices: TArray): Boolean; var Index: Integer; PyArg : PPyObject; @@ -1875,15 +1877,16 @@ function PyArgsToValues(PyArgs: PPyObject; Method: TRttiMethod; out Args: array if Length(Args) <> Length(Params) then Exit(False); + VarParamIndices := []; Engine := GetPythonEngine; for Index := 0 to Length(Params) - 1 do begin Param := Params[Index]; PyArg := Engine.PyTuple_GetItem(PyArgs, Index); - if (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) or - not PyObjectToTValue(PyArg, Param.ParamType, Args[Index], ErrMsg) - then + if not PyObjectToTValue(PyArg, Param.ParamType, Args[Index], ErrMsg) then Exit(False); + if (Param.Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> []) then + VarParamIndices := VarParamIndices + [Index]; end; Result := True; end; @@ -2616,20 +2619,9 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; MethName: string; ParentRtti: TRttiStructuredType; ob1, ob2: PPyObject; AParentAddrIsClass: Boolean): PPyObject; - { TODO: Handle methods with var parameters - procedures/functions with var parameters should return a tuple - e.g. - procedure Test(var Param: Integer) - use in python: - param = objref.Test(param) - - function Test(var Param: Integer): Integer - use in python: - res, param = objref.Test(param) } - function FindMethod(const MethName:string; RttiType : TRttiType; PyArgs: PPyObject; var Args: array of TValue; - out ErrMsg: string):TRttiMethod; + out VarParamIndices: TArray; out ErrMsg: string):TRttiMethod; // Deals with overloaded methods // Constructs the Arg Array // PyArgs is a Python tuple @@ -2640,7 +2632,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; ErrMsg := rs_UnknownAttribute; for Method in RttiType.GetMethods do if SameText(Method.Name, MethName) then begin - if PyArgsToValues(PyArgs, Method, Args) then + if PyArgsToValues(PyArgs, Method, Args, VarParamIndices) then begin Result := Method; Break; @@ -2652,11 +2644,10 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; var Args: TArray; + VarParamIndices: TArray; ArgCount: Integer; meth: TRttiMethod; - ReturnValue: TValue; ErrMsg : string; - Addr: TValue; begin Result := nil; @@ -2664,7 +2655,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); SetLength(Args, ArgCount); - meth := FindMethod(MethName, ParentRtti, ob1, Args, ErrMsg); + meth := FindMethod(MethName, ParentRtti, ob1, Args, VarParamIndices, ErrMsg); if not Assigned(meth) then begin InvalidArguments(MethName, ErrMsg); @@ -2672,7 +2663,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; end; Result := RttiCall(ParentAddress, DelphiWrapper, meth, ob1, ob2, Args, - AParentAddrIsClass); + VarParamIndices, AParentAddrIsClass); end; // This overload can be called either directly or from the overload above. @@ -2680,13 +2671,17 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; // When it is called directly Args = [] function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; Method: TRttiMethod; ob1, ob2: PPyObject; const Args: TArray; + const VarParamIndices: TArray; AParentAddrIsClass: Boolean = false): PPyObject; var ArgCount: Integer; LArgs: TArray; + LVarParamIndices: TArray; Addr: TValue; ReturnValue: TValue; - ErrMsg : string; + ErrMsg: string; + TempPy: PPyObject; + Index, Pos: Integer; begin Result := nil; // Ignore keyword arguments ob2 @@ -2694,13 +2689,16 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); if Length(Args) = ArgCount then + begin // already validated - LArgs := Args + LArgs := Args; + LVarParamIndices := VarParamIndices; + end else begin SetLength(LArgs, ArgCount); - if not PyArgsToValues(ob1, Method, LArgs) then + if not PyArgsToValues(ob1, Method, LArgs, LVarParamIndices) then begin InvalidArguments(Method.Name, rs_IncompatibleArguments); Exit; @@ -2723,7 +2721,66 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; ReturnValue := Method.Invoke(Addr, LArgs); - Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg); + { Deal with var/out arguments + e.g. + procedure Test(var I: Integer) + use in python: + ivalue = objref.Test(param) + + procedures/functions with var parameters should return a tuple + function Test(var I: Integer): Integer + use in python: + res, ivalue = objref.Test(ivalue) + + procedure Test(var I: Integer; var S: string); + use in python: + ivalue, svalue = objref.Test(ivalue, svalue) } + + + if Length(VarParamIndices) = 0 then + Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg) + else if (Method.ReturnType = nil) and (Length(VarParamIndices) = 1) then + Result := TValueToPyObject(LArgs[VarParamIndices[0]], DelphiWrapper, ErrMsg) + else + begin + // we return a tuple - start with the return value + if Method.ReturnType = nil then + Pos := 0 + else + Pos := 1; + + Result := DelphiWrapper.Engine.PyTuple_New(Length(VarParamIndices) + Pos); + if Method.ReturnType <> nil then + begin + TempPy := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg); + + if TempPy = nil then + begin + DelphiWrapper.Engine.Py_DECREF(Result); + Result := nil; + end + else + DelphiWrapper.Engine.PyTuple_SetItem(Result, 0, TempPy); + end; + + if Result <> nil then + for Index in VarParamIndices do + begin + TempPy := TValueToPyObject(LArgs[Index], DelphiWrapper, ErrMsg); + if TempPy = nil then + begin + DelphiWrapper.Engine.Py_DECREF(Result); + Result := nil; + Break; + end + else + begin + DelphiWrapper.Engine.PyTuple_SetItem(Result, Pos, TempPy); + Inc(Pos); + end; + end; + end; + if Result = nil then with DelphiWrapper.Engine do PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( @@ -3989,7 +4046,7 @@ function TPyDelphiObject.MpSubscript(obj: PPyObject) : PPyObject; PyArgs := PyDelphiWrapper.Engine.MakePyTuple([obj]); Result := RttiCall(DelphiObject, PyDelphiWrapper, Prop.ReadMethod, - PyArgs, nil, []); + PyArgs, nil, [], []); if not PyDelphiWrapper.Engine.PyTuple_Check(obj) then PyDelphiWrapper.Engine.Py_DECREF(PyArgs); // release created tuple @@ -4034,7 +4091,7 @@ function TPyDelphiObject.MpAssSubscript(obj1, obj2: PPyObject) : Integer; PyArgs := Engine.MakePyTuple([obj1, obj2]); TempPy := RttiCall(DelphiObject, PyDelphiWrapper, Prop.WriteMethod, - PyArgs, nil, []); + PyArgs, nil, [], []); Engine.Py_DECREF(PyArgs); // release created tuple diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 708093ba..6e9f8f63 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -68,6 +68,9 @@ TTestRttiAccess = class function SetStringField(const Value: string): string; overload; procedure PassVariantArray(const Value: Variant); function ClassRefParam(ClassRef: TPersistentClass): string; + procedure VarArgsProc1(var I: Integer); + function VarArgsFunc1(var I: Integer): Integer; + procedure VarArgsProc2(var I: Integer; var S: string); property Indexed[I: Integer]: Integer read GetIndexed write SetIndexed; property Indexed2[S1, S2: string]: string read GetIndexed2 write SetIndexed2; default; class var ClassField: string; @@ -152,6 +155,8 @@ TTestWrapDelphi = class(TObject) procedure TestStaticMethods; [Test] procedure TestIndexedProperties; + [Test] + procedure TestVarArgs; end; implementation @@ -489,6 +494,17 @@ procedure TTestWrapDelphi.TestStringField; Assert.AreEqual(TestRttiAccess.StringField, 'P4D'); end; +procedure TTestWrapDelphi.TestVarArgs; +begin + Assert.AreEqual(VarPythonEval('rtti_var.VarArgsProc1(2)'), 4); + PythonEngine.ExecString('a, b = rtti_var.VarArgsFunc1(2)'); + Assert.AreEqual(VarPythonEval('a'), 16); + Assert.AreEqual(VarPythonEval('b'), 4); + PythonEngine.ExecString('a, b = rtti_var.VarArgsProc2(2, "A")'); + Assert.AreEqual(VarPythonEval('a'), 4); + Assert.AreEqual(VarPythonEval('b'), 'AA'); +end; + procedure TTestWrapDelphi.TestDynArrayParameters; {var rc: TRttiContext; @@ -539,6 +555,23 @@ class function TTestRttiAccess.Square(I: Integer): Integer; Result := I * I; end; +function TTestRttiAccess.VarArgsFunc1(var I: Integer): Integer; +begin + I := 2 * I; + Result := I * I; +end; + +procedure TTestRttiAccess.VarArgsProc1(var I: Integer); +begin + I := 2 * I; +end; + +procedure TTestRttiAccess.VarArgsProc2(var I: Integer; var S: string); +begin + I := 2 * I; + S := S + S; +end; + function TTestRttiAccess.SetStringField(var Value: Integer): string; begin StringField := IntToStr(Value); From da8947e63f3b5c3872aad68dc19f0eb3952cf272 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 16 Oct 2023 12:32:49 +0300 Subject: [PATCH 089/174] Fix #436 --- Source/WrapDelphi.pas | 92 +++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 877f6652..1878f6e0 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1048,7 +1048,11 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; - Method: TRttiMethod; ob1, ob2: PPyObject; const Args: TArray; + Method: TRttiMethod; ob1, ob2: PPyObject; + AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; + + function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; + Method: TRttiMethod; const Args: TArray; const VarParamIndices: TArray; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; @@ -1466,7 +1470,7 @@ function TPyIndexedProperty.MpSubscript(obj: PPyObject) : PPyObject; PyArgs := FPyWrapper.Engine.MakePyTuple([obj]); Result := RttiCall(PascalObject, FPyWrapper, FProperty.ReadMethod, - PyArgs, nil, [], []); + PyArgs, nil); if not FPyWrapper.Engine.PyTuple_Check(obj) then FPyWrapper.Engine.Py_DECREF(PyArgs); // release created tuple @@ -1515,7 +1519,7 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; PyArgs := Engine.MakePyTuple([obj1, obj2]); TempPy := RttiCall(PascalObject, FPyWrapper, FProperty.WriteMethod, - PyArgs, nil, [], []); + PyArgs, nil); Engine.Py_DECREF(PyArgs); // release created tuple @@ -2643,68 +2647,64 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; end; var - Args: TArray; - VarParamIndices: TArray; - ArgCount: Integer; - meth: TRttiMethod; + LArgs: TArray; + LVarParamIndices: TArray; + LArgCount: Integer; + Method: TRttiMethod; ErrMsg : string; begin Result := nil; - ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); - SetLength(Args, ArgCount); + LArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); + SetLength(LArgs, LArgCount); - meth := FindMethod(MethName, ParentRtti, ob1, Args, VarParamIndices, ErrMsg); + Method := FindMethod(MethName, ParentRtti, ob1, LArgs, LVarParamIndices, ErrMsg); - if not Assigned(meth) then begin + if not Assigned(Method) then begin InvalidArguments(MethName, ErrMsg); Exit; end; - Result := RttiCall(ParentAddress, DelphiWrapper, meth, ob1, ob2, Args, - VarParamIndices, AParentAddrIsClass); + Result := RttiCall(ParentAddress, DelphiWrapper, Method, LArgs, + LVarParamIndices, AParentAddrIsClass); end; -// This overload can be called either directly or from the overload above. -// When it is called from above Args are already setup and validated -// When it is called directly Args = [] function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; - Method: TRttiMethod; ob1, ob2: PPyObject; const Args: TArray; - const VarParamIndices: TArray; + Method: TRttiMethod; ob1, ob2: PPyObject; AParentAddrIsClass: Boolean = false): PPyObject; var - ArgCount: Integer; LArgs: TArray; LVarParamIndices: TArray; - Addr: TValue; - ReturnValue: TValue; - ErrMsg: string; - TempPy: PPyObject; - Index, Pos: Integer; begin - Result := nil; + Result := nil; + // Ignore keyword arguments ob2 // ob1 is a tuple with zero or more elements - - ArgCount := DelphiWrapper.Engine.PyTuple_Size(ob1); - if Length(Args) = ArgCount then + SetLength(LArgs, DelphiWrapper.Engine.PyTuple_Size(ob1)); + if not PyArgsToValues(ob1, Method, LArgs, LVarParamIndices) then begin - // already validated - LArgs := Args; - LVarParamIndices := VarParamIndices; - end - else - begin - SetLength(LArgs, ArgCount); - - if not PyArgsToValues(ob1, Method, LArgs, LVarParamIndices) then - begin - InvalidArguments(Method.Name, rs_IncompatibleArguments); - Exit; - end; + InvalidArguments(Method.Name, rs_IncompatibleArguments); + Exit; end; + Result := RttiCall(ParentAddress, DelphiWrapper, Method, LArgs, + LVarParamIndices, AParentAddrIsClass); +end; + + +function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; + Method: TRttiMethod; const Args: TArray; + const VarParamIndices: TArray; + AParentAddrIsClass: Boolean = false): PPyObject; +var + Addr: TValue; + ReturnValue: TValue; + ErrMsg: string; + TempPy: PPyObject; + Index, Pos: Integer; +begin + // Args and VarParamIndices are already setup and validated try if Method.Parent is TRttiInstanceType then if Method.IsClassMethod or Method.IsStatic then @@ -2719,7 +2719,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; else Addr := TValue.From(ParentAddress); - ReturnValue := Method.Invoke(Addr, LArgs); + ReturnValue := Method.Invoke(Addr, Args); { Deal with var/out arguments e.g. @@ -2740,7 +2740,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; if Length(VarParamIndices) = 0 then Result := TValueToPyObject(ReturnValue, DelphiWrapper, ErrMsg) else if (Method.ReturnType = nil) and (Length(VarParamIndices) = 1) then - Result := TValueToPyObject(LArgs[VarParamIndices[0]], DelphiWrapper, ErrMsg) + Result := TValueToPyObject(Args[VarParamIndices[0]], DelphiWrapper, ErrMsg) else begin // we return a tuple - start with the return value @@ -2766,7 +2766,7 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; if Result <> nil then for Index in VarParamIndices do begin - TempPy := TValueToPyObject(LArgs[Index], DelphiWrapper, ErrMsg); + TempPy := TValueToPyObject(Args[Index], DelphiWrapper, ErrMsg); if TempPy = nil then begin DelphiWrapper.Engine.Py_DECREF(Result); @@ -4046,7 +4046,7 @@ function TPyDelphiObject.MpSubscript(obj: PPyObject) : PPyObject; PyArgs := PyDelphiWrapper.Engine.MakePyTuple([obj]); Result := RttiCall(DelphiObject, PyDelphiWrapper, Prop.ReadMethod, - PyArgs, nil, [], []); + PyArgs, nil); if not PyDelphiWrapper.Engine.PyTuple_Check(obj) then PyDelphiWrapper.Engine.Py_DECREF(PyArgs); // release created tuple @@ -4091,7 +4091,7 @@ function TPyDelphiObject.MpAssSubscript(obj1, obj2: PPyObject) : Integer; PyArgs := Engine.MakePyTuple([obj1, obj2]); TempPy := RttiCall(DelphiObject, PyDelphiWrapper, Prop.WriteMethod, - PyArgs, nil, [], []); + PyArgs, nil); Engine.Py_DECREF(PyArgs); // release created tuple From f01e820b1cfe071ec00b783eb3c54bbee68cfb2d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 16 Oct 2023 14:12:57 +0300 Subject: [PATCH 090/174] So that Demo31 unit tests run without errors. --- Source/WrapDelphiClasses.pas | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index 90d18d96..bfee8aa3 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -212,6 +212,9 @@ TPyDelphiStrings = class (TPyDelphiPersistent) function Set_Text( AValue : PPyObject; AContext : Pointer) : integer; cdecl; // Virtual Methods function Assign(ASource : PPyObject) : PPyObject; override; + {$IFDEF EXTENDED_RTTI} + class function ExcludedExposedMembers(APythonType: TPythonType): TArray; override; + {$ENDIF EXTENDED_RTTI} public function Repr : PPyObject; override; // Mapping services @@ -1520,6 +1523,15 @@ function TPyDelphiStrings.EndUpdate_Wrapper(args: PPyObject): PPyObject; Result := nil; end; +{$IFDEF EXTENDED_RTTI} +class function TPyDelphiStrings.ExcludedExposedMembers(APythonType: TPythonType): TArray; +begin + Result := inherited ExcludedExposedMembers(APythonType); + // so that TPyDelphiStrings.Assign is called from the inherited Assign + Result := Result + ['Assign']; +end; +{$ENDIF EXTENDED_RTTI} + class function TPyDelphiStrings.GetContainerAccessClass: TContainerAccessClass; begin Result := TStringsAccess; @@ -1689,7 +1701,7 @@ procedure TPyDelphiStrings.SetDelphiObject(const Value: TStrings); class procedure TPyDelphiStrings.SetupType(PythonType: TPythonType); begin inherited; - PythonType.Services.Mapping := PythonType.Services.Mapping + [msLength, msSubscript]; + PythonType.Services.Mapping := {PythonType.Services.Mapping +} [msLength, msSubscript]; end; { TPyDelphiBasicAction } From 9a28d92b9fcbcd1c7c3602b5264bcbdb0c936225 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 20 Oct 2023 02:47:20 +0300 Subject: [PATCH 091/174] Expose published event automatically including events with var parameters. Added AutoWrapEventHandlerTest.pas to test the new functionality. --- Source/WrapDelphi.pas | 420 +++++++++++++++++- Tests/AutoWrapEventHandlerTest.pas | 151 +++++++ Tests/P4DTests.dpr | 10 +- Tests/P4DTests.dproj | 5 +- Tests/WrapDelphiEventHandlerTest.pas | 638 ++++++++++++++------------- 5 files changed, 886 insertions(+), 338 deletions(-) create mode 100644 Tests/AutoWrapEventHandlerTest.pas diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 1878f6e0..843cea09 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -526,7 +526,8 @@ TPyInterfacedObject = class(TPyObject, IInterface) TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) private fDelphiObject: TObject; - fContainerAccess : TContainerAccess; + fContainerAccess: TContainerAccess; + fEventHandlers: TObjectList; function GetContainerAccess: TContainerAccess; procedure SetDelphiObject(const Value: TObject); protected @@ -720,7 +721,6 @@ TEventHandler = class public PyDelphiWrapper : TPyDelphiWrapper; PropertyInfo : PPropInfo; - EventType : PTypeInfo; Callable : PPyObject; // connects to the event on creation constructor Create(PyDelphiWrapper : TPyDelphiWrapper; Component : TObject; @@ -969,8 +969,8 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) AExpectedClass : TClass; out AValue : TObject) : Boolean; function CheckCallableAttribute(AAttribute : PPyObject; const AAttributeName : string) : Boolean; - function CheckEnum(const AEnumName : string; AValue, AMinValue, AMaxValue : Integer) : Boolean; - function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; const AValue : Variant) : PPyObject; overload; + function CheckEnum(const AEnumName : string; AValue, AMinValue, AMaxValue: Integer) : Boolean; + function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; const AValue: Variant) : PPyObject; overload; function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; AObject: TObject) : PPyObject; overload; function CreateVarParam(PyDelphiWrapper: TPyDelphiWrapper; AClass: TClass): PPyObject; overload; function SetToPython(ATypeInfo: PTypeInfo; AValue : Integer) : PPyObject; overload; @@ -985,6 +985,15 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; out ClassRef: TClass; out ErrMsg: string): Boolean; procedure InvalidArguments(const MethName, ErrMsg : string); +{$IFDEF EXTENDED_RTTI} + function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; + const AValue: TValue) : PPyObject; overload; + function TValueToPyObject(const Value: TValue; + DelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; + function PyObjectToTValue(PyArg : PPyObject; ArgType: TRttiType; + out Arg: TValue; out ErrMsg: string): Boolean; +{$ENDIF} + implementation @@ -1010,7 +1019,7 @@ implementation rs_ErrSequence = 'Wrapper %s does not support sequences'; rs_ErrInvalidArgs = '"%s" called with invalid arguments.'#$A'Error: %s'; rs_ErrInvalidRet = 'Call "%s" returned a value that could not be coverted to Python'#$A'Error: %s'; - rs_IncompatibleArguments = 'Could not find a method with compatible arguments'; + rs_IncompatibleArguments = 'Expected and actual arguements are incompatible'; rs_ErrAttrGet = 'Error in getting property "%s".'#$A'Error: %s'; rs_UnknownAttribute = 'Unknown attribute'; rs_ErrIterSupport = 'Wrapper %s does not support iterators'; @@ -1039,6 +1048,132 @@ implementation rs_ErrNoTypeInfo = 'TypeInfo is not available'; rs_ErrUnexpected = 'Unexpected error'; + +{$REGION 'TRttiInvokableTypeHelper - "Lifted" from Spring4D"'} +type + TRttiInvokableTypeHelper = class helper for TRttiInvokableType + public + function CreateImplementation(AUserData: Pointer; + const ACallback: TMethodImplementationCallback): TMethodImplementation; + end; + + // this is the class used to create a TMethodImplementation for a + // TRttiInvokableType by passing in an instance of TRttiInvokableType + // and "overriding" its private virtual methods + TRttiInvokableMethod = class(TRttiMethod) + private + FType: TRttiInvokableType; + constructor Create(AType: TRttiInvokableType); + end; + + // this classes is needed to access FParent + // it needs to have the exact same fields as System.Rtti.TRttiObject + TRttiObjectHack = class abstract + protected + FHandle: Pointer; + FRttiDataSize: Integer; + FPackage: TRttiPackage; + FParent: TRttiObject; + end; + + // this class is needed to "override" private virtual methods + // it needs to have the exact same virtual methods as System.Rtti.TRttiMethod + TRttiInvokableMethodHack = class(TRttiMember) + protected + FInvokeInfo: TObject; //TMethodImplementation.TInvokeInfo + FType: TRttiInvokableType; + function GetMethodKind: TMethodKind; virtual; abstract; + function GetCallingConvention: TCallConv; virtual; + function GetReturnType: TRttiType; virtual; + function GetDispatchKind: TDispatchKind; virtual; abstract; + function GetHasExtendedInfo: Boolean; virtual; abstract; + function GetVirtualIndex: SmallInt; virtual; abstract; + function GetCodeAddress: Pointer; virtual; abstract; + function GetIsClassMethod: Boolean; virtual; + function GetIsStatic: Boolean; virtual; + function DispatchInvoke(Instance: TValue; const Args: array of TValue): TValue; virtual; abstract; + public + function GetParameters: TArray; virtual; + end; + + // this class is needed to "override" the destructor of + // the TMethodImplementation instances that are created inside of + // TRttiMethod.CreateImplementation + TMethodImplementationHack = class(TMethodImplementation) + public + destructor Destroy; override; + end; + +function TRttiInvokableMethodHack.GetCallingConvention: TCallConv; +begin + Result := FType.CallingConvention; +end; + +function TRttiInvokableMethodHack.GetIsClassMethod: Boolean; +begin + Result := False; +end; + +function TRttiInvokableMethodHack.GetIsStatic: Boolean; +begin + Result := FType is TRttiProcedureType; +end; + +function TRttiInvokableMethodHack.GetParameters: TArray; +begin + Result := FType.GetParameters; +end; + +function TRttiInvokableMethodHack.GetReturnType: TRttiType; +begin + Result := FType.ReturnType; +end; + +destructor TMethodImplementationHack.Destroy; +begin + if FInvokeInfo <> nil then + FInvokeInfo.Free; + inherited Destroy; +end; + +constructor TRttiInvokableMethod.Create(AType: TRttiInvokableType); +var + ctx: TRttiContext; +begin + // GetInvokeInfo need the Parent property + TRttiObjectHack(Self).FParent := ctx.GetType(TObject); + FType := AType; + // change the type of this class to the class that has its private + // methods "overridden" + PPointer(Self)^ := TRttiInvokableMethodHack; +end; + +function TRttiInvokableTypeHelper.CreateImplementation(AUserData: Pointer; //FI:O804 + const ACallback: TMethodImplementationCallback): TMethodImplementation; +var + m: TRttiMethod; +begin + {$WARN CONSTRUCTING_ABSTRACT OFF} + m := TRttiInvokableMethod.Create(Self); + try + // there is no way to directly create a TMethodImplementation instance + // because it requires an instance of the private TInvokeInfo class to be + // passed which can only be produced by the private method GetInvokeInfo + + // since TRttiInvokableMethod has the necessary private virtual methods + // "overridden" it will create the correct TMethodImplementation instance + // for the given TRttiInvokableType + Result := m.CreateImplementation(AUserData, ACallback); + // "override" the destructor so FInvokeMethod which is not owned by the + // TRttiInvokableMethod is properly destroyed at the end + PPointer(Result)^ := TMethodImplementationHack; + finally + m.Free; + end; +end; +{$ENDREGION 'TRttiInvokableTypeHelper - "Lifted from Spring4D"'} + + var gRegisteredUnits : TRegisteredUnits; @@ -1108,8 +1243,8 @@ TExposedGetSet = class(TAbstractExposedMember) function GetSetterCallback: Pointer; public destructor Destroy; override; - function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; - function SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; + function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; virtual; cdecl; + function SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; virtual; cdecl; property GetterCallback: Pointer read GetGetterCallback; property SetterCallback: Pointer read GetSetterCallback; end; @@ -1124,6 +1259,14 @@ TExposedProperty = class(TExposedGetSet) function GetDefaultDocString(): string; override; end; + TExposedEvent = class(TExposedGetSet) + protected + function GetDefaultDocString(): string; override; + public + function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; override; cdecl; + function SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; override; cdecl; + end; + TPyIndexedProperty = class(TPyObject) private FPyObj: PPyObject; @@ -1150,6 +1293,23 @@ TExposedIndexedProperty = class(TAbstractExposedMember) property GetterCallback: Pointer read GetGetterCallback; end; + TRttiEventHandler = class + private + FMethodImplementation: TMethodImplementation; + public + DelphiWrapper: TPyDelphiWrapper; + PropInfo: PPropInfo; + MethodType: TRttiMethodType; + PyCallable: PPyObject; + function CodeAddress: Pointer; + constructor Create(ADelphiWrapper : TPyDelphiWrapper; + APropertyInfo: PPropInfo; ACallable: PPyObject; + AMethodType: TRttiMethodType); + destructor Destroy; override; + class procedure ImplCallback(UserData: Pointer; const Args: TArray; + out Result: TValue); static; + end; + { TAbstractExposedMember } constructor TAbstractExposedMember.Create(ARttiMember: TRttiMember; @@ -1165,7 +1325,6 @@ constructor TAbstractExposedMember.Create(ARttiMember: TRttiMember; FDocString := UTF8Encode(GetDefaultDocString); end; - { TExposedMethod } function TExposedMethod.GetCallback: Pointer; @@ -1327,9 +1486,9 @@ function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyO begin Result := nil; if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then - // TODO: Optimize out the property/field lookup, by passing FRttiMember - // directly to a GetRttiAttr/SetRtti overload - Result := GetRttiAttr(Obj, FParentRtti, FRttiMember.Name, FPyDelphiWrapper, LOutMsg); + // TODO: Optimize out the property/field lookup, by passing FRttiMember + // directly to a GetRttiAttr/SetRtti overload + Result := GetRttiAttr(Obj, FParentRtti, FRttiMember.Name, FPyDelphiWrapper, LOutMsg); if not Assigned(Result) then with GetPythonEngine do @@ -1380,6 +1539,100 @@ function TExposedProperty.GetDefaultDocString: string; FParentRtti.Name, FRttiMember.Name, PropertyType]); end; +{ TExposedEvent } + +function TExposedEvent.GetDefaultDocString(): string; +begin + Result := Format('', [FParentRtti.Name, FRttiMember.Name]) + + #10 +(FRttiMember as TRttiProperty).PropertyType.ToString; +end; + +function TExposedEvent.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; +var + Obj: TObject; + PyObject: TPyDelphiObject; + RttiProp: TRttiInstanceProperty; + LOutMsg: string; + EventHandler: TRttiEventHandler; + Index: Integer; +begin + Result := nil; + if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then + begin + PyObject := PythonToDelphi(AObj) as TPyDelphiObject; + RttiProp := FRttiMember as TRttiInstanceProperty; + // Search for and Event handler + if Assigned(PyObject.fEventHandlers) then + for Index := 0 to PyObject.fEventHandlers.Count - 1 do + begin + EventHandler := PyObject.fEventHandlers[Index] as TRttiEventHandler; + if EventHandler.PropInfo = RttiProp.PropInfo then + begin + Result := EventHandler.PyCallable; + FPyDelphiWrapper.Engine.Py_XINCREF(Result); + end; + end; + end; + + if not Assigned(Result) then + Result := FPyDelphiWrapper.Engine.ReturnNone; +end; + +function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; +var + Obj: TObject; + PyObject: TPyDelphiObject; + RttiProp: TRttiInstanceProperty; + ErrMsg: string; + EventHandler: TRttiEventHandler; + Index: Integer; + Method: TMethod; +begin + Result := -1; + if not CheckCallableAttribute(AValue, FRttiMember.Name) then + Exit; + + if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, ErrMsg) then + begin + try + PyObject := PythonToDelphi(AObj) as TPyDelphiObject; + RttiProp := FRttiMember as TRttiInstanceProperty; + + // Remove handler if it exists + if Assigned(PyObject.fEventHandlers) then + for Index := 0 to PyObject.fEventHandlers.Count - 1 do + begin + EventHandler := PyObject.fEventHandlers[Index] as TRttiEventHandler; + if EventHandler.PropInfo = RttiProp.PropInfo then + begin + PyObject.fEventHandlers.Delete(Index); + break; + end; + end; + + EventHandler := TRttiEventHandler.Create(FPyDelphiWrapper, + RttiProp.PropInfo, AValue, RttiProp.PropertyType as TRttiMethodType); + + Method.Code := EventHandler.CodeAddress; + Method.Data := EventHandler; + SetMethodProp(Obj, RttiProp.PropInfo, Method); + + if not Assigned(PyObject.fEventHandlers) then + PyObject.fEventHandlers := TObjectList.Create(True); + PyObject.fEventHandlers.Add(EventHandler); + + Result := 0; + except + ErrMsg := rs_ErrUnexpected; + end; + end; + + if Result <> 0 then + with GetPythonEngine do + PyErr_SetObject (PyExc_AttributeError^, + PyUnicodeFromString(Format(rs_ErrAttrSetr, [FRttiMember.Name, ErrMsg]))); +end; + { TExposedIndexedProperty } function TExposedIndexedProperty.GetGetterCallback: Pointer; var @@ -1530,6 +1783,102 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; end; end; +{ TRttiEventHandler } +constructor TRttiEventHandler.Create(ADelphiWrapper : TPyDelphiWrapper; + APropertyInfo: PPropInfo; ACallable: PPyObject; AMethodType: TRttiMethodType); +begin + PropInfo := APropertyInfo; + DelphiWrapper := ADelphiWrapper; + PyCallable := ACallable; + GetPythonEngine.Py_INCREF(PyCallable); + MethodType := AMethodType; + FMethodImplementation := AMethodType.CreateImplementation(nil, ImplCallback); +end; + +destructor TRttiEventHandler.Destroy; +begin + DelphiWrapper.Engine.Py_XDECREF(PyCallable); + FMethodImplementation.Free; +end; + +function TRttiEventHandler.CodeAddress: Pointer; +begin + if Assigned(FMethodImplementation) then + Result := FMethodImplementation.CodeAddress + else + Result := nil; +end; + +class procedure TRttiEventHandler.ImplCallback(UserData: Pointer; + const Args: TArray; out Result: TValue); +var + EventHandler: TRttiEventHandler; + Params: TArray; + PyArgs: PPyObject; + PyResult: PPyObject; + TempPy: PPyObject; + Index: Integer; + Engine: TPythonEngine; + ErrMsg: string; +begin + EventHandler := Args[0].AsObject as TRttiEventHandler; + Params := EventHandler.MethodType.GetParameters; + + if Length(Args) <> Length(Params) + 1 then // +1 for Self + begin + InvalidArguments(string(EventHandler.PropInfo.Name), rs_IncompatibleArguments); + Exit; + end; + + Engine := EventHandler.DelphiWrapper.Engine; + + // Set up the python arguments + PyArgs := Engine.PyTuple_New(Length(Args) - 1); //Ignore Self + try + for Index := 1 to Length(Args) - 1 do + begin + if Params[Index - 1].Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> [] then + TempPy := CreateVarParam(EventHandler.DelphiWrapper, Args[Index]) + else + TempPy := TValueToPyObject(Args[Index], EventHandler.DelphiWrapper, ErrMsg); + if TempPy <> nil then + Engine.PyTuple_SetItem(PyArgs, Index - 1, TempPy) + else + begin + InvalidArguments(string(EventHandler.PropInfo.Name), rs_IncompatibleArguments); + Engine.CheckError; // will raise an Exception + end; + end; + + // Make the call + PyResult := Engine.PyObject_CallObject(EventHandler.PyCallable, PyArgs); + + // deal with var/out parameters + for Index := 1 to Length(Args) - 1 do + if Params[Index - 1].Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> [] then + begin + TempPy := Engine.PyTuple_GetItem(PyArgs, Index - 1); + + if not PyObjectToTValue((PythonToDelphi(TempPy) as TPyDelphiVarParameter).Value, + Params[Index- 1].ParamType, Args[Index], ErrMsg) then + begin + InvalidArguments(string(EventHandler.PropInfo.Name), rs_IncompatibleArguments); + Engine.CheckError; // will raise an Exception + end; + end; + + if Assigned(PyResult) and (EventHandler.MethodType.ReturnType <> nil) and + not PyObjectToTValue(PyResult, EventHandler.MethodType.ReturnType, Result, ErrMsg) + then + Engine.PyErr_SetObject(Engine.PyExc_TypeError^, Engine.PyUnicodeFromString( + Format(rs_ErrInvalidRet, [string(EventHandler.PropInfo.Name), ErrMsg]))); + Engine.Py_XDECREF(PyResult); + finally + Engine.Py_XDECREF(PyArgs); + end; + Engine.CheckError; +end; + {$ENDIF EXTENDED_RTTI} function RegisteredUnits : TRegisteredUnits; @@ -1911,6 +2260,24 @@ function TValueToPyObject(const Value: TValue; Result := SimpleValueToPython(Value, ErrMsg); end; end; + +function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; + const AValue: TValue) : PPyObject; +var + tmp : PPyObject; + _varParam : TPyDelphiVarParameter; + ErrMsg: string; +begin + tmp := TValueToPyObject(AValue, PyDelphiWrapper, ErrMsg); + if tmp = nil then + Exit(nil); + + Result := PyDelphiWrapper.VarParamType.CreateInstance; + _varParam := PythonToDelphi(Result) as TPyDelphiVarParameter; + _varParam.Value := tmp; // refcount was incremented + GetPythonEngine.Py_DECREF(tmp); +end; + {$ENDIF} function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; @@ -2576,6 +2943,7 @@ class function TPyDelphiObject.DelphiObjectClass: TClass; destructor TPyDelphiObject.Destroy; begin DelphiObject := nil; // will free the object if owned + fEventHandlers.Free; fContainerAccess.Free; inherited; end; @@ -3573,6 +3941,7 @@ procedure TPyDelphiObject.SetDelphiObject(const Value: TObject); if Assigned(fDelphiObject)then begin UnSubscribeToFreeNotification; + FreeAndNil(fEventHandlers); if Owned then fDelphiObject.Free; end; @@ -3868,7 +4237,7 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; LRttiType: TRttiStructuredType; LRttiProperty: TRttiProperty; AddedProperties: TArray; - LExposedProperty: TExposedProperty; + LExposedProperty: TExposedGetSet; LClass: TClass; LSetter: Pointer; LDocStr: string; @@ -3906,15 +4275,24 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; if not LRttiProperty.IsReadable then Continue; - // Skip if the type cannot be handled (as with fields - tkMethod) - if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkProcedure] then - Continue; + if (LRttiProperty.PropertyType is TRttiMethodType) and + (LRttiProperty.Visibility = TMemberVisibility.mvPublished) and + (APyDelphiWrapper.EventHandlers.FindHandler(LRttiProperty.PropertyType.Handle) = nil) + then + LExposedProperty := TExposedEvent.Create(LRttiProperty, + APyDelphiWrapper, APythonType, LRttiType) + else + begin + // Skip if the type cannot be handled + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkMethod, tkProcedure] then + Continue; - AddedProperties := AddedProperties + [LRttiProperty.Name]; + // Create the exposed property + LExposedProperty := TExposedProperty.Create(LRttiProperty, + APyDelphiWrapper, APythonType, LRttiType); + end; - // Create the exposed method - LExposedProperty := TExposedProperty.Create(LRttiProperty, - APyDelphiWrapper, APythonType, LRttiType); + AddedProperties := AddedProperties + [LRttiProperty.Name]; //Try to load the method doc string from doc server if Assigned(PyDocServer) and PyDocServer.Initialized and @@ -3989,8 +4367,8 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; if not LRttiProperty.IsReadable then Continue; - // Skip if the type cannot be handled (as with fields - tkMethod) - if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkProcedure] then + // Skip if the type cannot be handled + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkMethod, tkProcedure] then Continue; AddedProperties := AddedProperties + [LRttiProperty.Name]; diff --git a/Tests/AutoWrapEventHandlerTest.pas b/Tests/AutoWrapEventHandlerTest.pas new file mode 100644 index 00000000..feb9656d --- /dev/null +++ b/Tests/AutoWrapEventHandlerTest.pas @@ -0,0 +1,151 @@ +unit AutoWrapEventHandlerTest; + +interface + +uses + Types, + DUnitX.TestFramework, + PythonEngine, + WrapDelphi, System.Classes; + +type + TTestGetObjectEvent = procedure(Sender: TObject; var AObject: TObject) of object; + TTestGetValueEvent = procedure(Sender: TObject; var AValue: Double) of object; + + TTestAuto = class(TComponent) + private + FObject: TObject; + FValue: Double; + FOnGetObject: TTestGetObjectEvent; + FOnGetValue: TTestGetValueEvent; + ProcessCalled: Boolean; + public + procedure Process; + published + property OnGetObject: TTestGetObjectEvent read FOnGetObject write FOnGetObject; + property OnGetValue: TTestGetValueEvent read FOnGetValue write FOnGetValue; + end; + + [TestFixture] + TTestAutoWrapEventHandlers = class(TObject) + private + PythonEngine: TPythonEngine; + DelphiModule: TPythonModule; + DelphiWrapper: TPyDelphiWrapper; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure TearDownFixture; + [Test] + procedure TestProcessWithValue; + [Test] + procedure TestProcessWithObject; + end; + +implementation + +uses + System.Diagnostics, + System.SysUtils, + TypInfo; + + +{ TTest } +procedure TTestAuto.Process; +begin + ProcessCalled := True; + if Assigned(FOnGetObject) then + FOnGetObject(Self, FObject); + if Assigned(FOnGetValue) then + FOnGetValue(Self, FValue); +end; + +{ TTestAutoWrapEventHandlers } +procedure TTestAutoWrapEventHandlers.SetupFixture; +begin + PythonEngine := TPythonEngine.Create(nil); + PythonEngine.Name := 'PythonEngine'; + PythonEngine.AutoLoad := False; + PythonEngine.FatalAbort := True; + PythonEngine.FatalMsgDlg := True; + PythonEngine.UseLastKnownVersion := True; + PythonEngine.AutoFinalize := True; + PythonEngine.InitThreads := True; + PythonEngine.PyFlags := [pfInteractive]; + DelphiModule := TPythonModule.Create(nil); + DelphiModule.Name := 'DelphiModule'; + DelphiModule.Engine := PythonEngine; + DelphiModule.ModuleName := 'delphi'; + DelphiWrapper := TPyDelphiWrapper.Create(nil); + DelphiWrapper.Name := 'PyDelphiWrapper'; + DelphiWrapper.Engine := PythonEngine; + DelphiWrapper.Module := DelphiModule; + DelphiWrapper.RegisterDelphiWrapper(TPyClassWrapper); + PythonEngine.LoadDll; +end; + +procedure TTestAutoWrapEventHandlers.TearDownFixture; +begin + PythonEngine.Free; + DelphiWrapper.Free; + DelphiModule.Free; +end; + +procedure TTestAutoWrapEventHandlers.TestProcessWithValue; +var + Test: TTestAuto; +begin + Test := TTestAuto.Create(nil); + try + DelphiWrapper.DefineVar('test', Test); + PythonEngine.ExecString( + 'import delphi' + LF + + '' + LF + + 'def MyOnGetValue(sender, value):' + LF + + ' value.Value = 3.14' + LF + + '' + LF + + 'delphi.test.OnGetValue = MyOnGetValue' + LF + + 'delphi.test.Process()' + LF + + '' + ); + Assert.IsTrue(Test.ProcessCalled); + Assert.AreEqual(Test.FValue, 3.14); + finally + Test.Free; + end; +end; + +procedure TTestAutoWrapEventHandlers.TestProcessWithObject; +var + Test: TTestAuto; +begin + Test := TTestAuto.Create(nil); + try + DelphiWrapper.DefineVar('test', Test); + PythonEngine.ExecString( + 'import delphi' + LF + + '' + LF + + 'def MyOnGetObject(sender, value):' + LF + + ' value.Value = sender' + LF + + '' + LF + + 'delphi.test.OnGetObject = MyOnGetObject' + LF + + 'delphi.test.Process()' + LF + + '' + ); + var StopWatch := TStopwatch.StartNew; + var Count := 100000; + for var I := 0 to Count do + Test.Process; + StopWatch.Stop; + WriteLn(Format('*********** Elaplsed time for %d event calls: %d', [Count, StopWatch.ElapsedMilliseconds])); + Assert.IsTrue(Test.ProcessCalled); + Assert.AreSame(Test, Test.FObject); + finally + Test.Free; + end; +end; + +initialization + TDUnitX.RegisterTestFixture(TTestAutoWrapEventHandlers); +end. diff --git a/Tests/P4DTests.dpr b/Tests/P4DTests.dpr index 408ffe93..981c7d4b 100644 --- a/Tests/P4DTests.dpr +++ b/Tests/P4DTests.dpr @@ -1,6 +1,3 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG ON -// JCL_DEBUG_EXPERT_INSERTJDBG ON -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program P4DTests; {$IFNDEF TESTINSIGHT} {$APPTYPE CONSOLE} @@ -8,11 +5,11 @@ program P4DTests; uses {$IFDEF FASTMM4} FastMM4, - {$ENDIF} + {$ENDIF } System.SysUtils, {$IFDEF TESTINSIGHT} TestInsight.DUnitX, - {$ENDIF} + {$ENDIF } DUnitX.Loggers.Console, DUnitX.Loggers.Xml.NUnit, DUnitX.StackTrace.Jcl, @@ -21,7 +18,8 @@ uses VarPythTest in 'VarPythTest.pas', WrapDelphiTest in 'WrapDelphiTest.pas', WrapDelphiEventHandlerTest in 'WrapDelphiEventHandlerTest.pas', - NumberServicesTest in 'NumberServicesTest.pas'; + NumberServicesTest in 'NumberServicesTest.pas', + AutoWrapEventHandlerTest in 'AutoWrapEventHandlerTest.pas'; var runner : ITestRunner; diff --git a/Tests/P4DTests.dproj b/Tests/P4DTests.dproj index 214c875f..cbf083c3 100644 --- a/Tests/P4DTests.dproj +++ b/Tests/P4DTests.dproj @@ -7,7 +7,7 @@ P4DTests.dpr Win64 {DEA420F5-972B-4628-A9B1-A789762EC148} - 19.1 + 19.5 3 @@ -77,7 +77,9 @@ + + Base @@ -100,6 +102,7 @@ + False True True diff --git a/Tests/WrapDelphiEventHandlerTest.pas b/Tests/WrapDelphiEventHandlerTest.pas index 9f3efdb5..ec39d3cf 100644 --- a/Tests/WrapDelphiEventHandlerTest.pas +++ b/Tests/WrapDelphiEventHandlerTest.pas @@ -1,310 +1,328 @@ -unit WrapDelphiEventHandlerTest; - -interface - -uses - Types, - DUnitX.TestFramework, - PythonEngine, - WrapDelphi, System.Classes; - -type - TTestGetObjectEvent = procedure(Sender: TObject; var AObject: TObject) of object; - TTestGetValueEvent = procedure(Sender: TObject; var AValue: Double) of object; - - TTest = class(TComponent) - private - FObject: TObject; - FValue: Double; - FOnGetObject: TTestGetObjectEvent; - FOnGetValue: TTestGetValueEvent; - - ProcessCalled: Boolean; - - public - procedure Process; - - published - property OnGetObject: TTestGetObjectEvent read FOnGetObject write FOnGetObject; - property OnGetValue: TTestGetValueEvent read FOnGetValue write FOnGetValue; - end; - - - [TestFixture] - TTestWrapDelphiEventHandlers = class(TObject) - private - PythonEngine: TPythonEngine; - DelphiModule: TPythonModule; - DelphiWrapper: TPyDelphiWrapper; - - public - [SetupFixture] - procedure SetupFixture; - - [TearDownFixture] - procedure TearDownFixture; - - [Test] - procedure TestProcessWithValue; - [Test] - procedure TestProcessWithObject; - end; - -implementation - -uses - TypInfo; - -type - TTestRegistration = class(TRegisteredUnit) - public - function Name: string; override; - procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; - end; - - TTestGetValueEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; var Value: Double); - public - constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; - PropertyInfo: PPropInfo; Callable: PPyObject); override; - class function GetTypeInfo: PTypeInfo; override; - end; - - TTestGetObjectEventHandler = class(TEventHandler) - protected - procedure DoEvent(Sender: TObject; var Obj: TObject); - - public - constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; - PropertyInfo: PPropInfo; Callable: PPyObject); override; - class function GetTypeInfo: PTypeInfo; override; - end; - - -{ TTestRegistration } - -function TTestRegistration.Name: string; -begin - Result := 'Test'; -end; - -procedure TTestRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); -begin - inherited; - APyDelphiWrapper.EventHandlers.RegisterHandler(TTestGetValueEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TTestGetObjectEventHandler); -end; - - -{ TTestGetValueEventHandler } - -constructor TTestGetValueEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; - PropertyInfo: PPropInfo; Callable: PPyObject); -var - Method: TMethod; -begin - inherited; - Method.Code := @TTestGetValueEventHandler.DoEvent; - Method.Data := Self; - SetMethodProp(Component, PropertyInfo, Method); -end; - -procedure TTestGetValueEventHandler.DoEvent(Sender: TObject; var Value: Double); -var - PySender: PPyObject; - PyValue: PPyObject; - PyArgs: PPyObject; - PyResult: PPyObject; - PyValueVarParam: TPyDelphiVarParameter; -begin - if not Assigned(PyDelphiWrapper) or not Assigned(Callable) or not PythonOk then - Exit; - with PyDelphiWrapper.Engine do - begin - PySender := PyDelphiWrapper.Wrap(Sender); - PyValue := CreateVarParam(PyDelphiWrapper, Value); - PyValueVarParam := PythonToDelphi(PyValue) as TPyDelphiVarParameter; - PyArgs := PyTuple_New(2); - PyTuple_SetItem(PyArgs, 0, PySender); - PyTuple_SetItem(PyArgs, 1, PyValue); - try - PyResult := PyObject_CallObject(Callable, PyArgs); - if Assigned(PyResult) then - begin - Py_XDECREF(PyResult); - Value := PyObjectAsVariant(PyValueVarParam.Value); - end; - finally - Py_DECREF(PyArgs) - end; - CheckError; - end; -end; - -class function TTestGetValueEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TTestGetValueEvent); -end; - - -{ TTestGetObjectEventHandler } - -constructor TTestGetObjectEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; - PropertyInfo: PPropInfo; Callable: PPyObject); -var - Method: TMethod; -begin - inherited; - Method.Code := @TTestGetObjectEventHandler.DoEvent; - Method.Data := Self; - SetMethodProp(Component, PropertyInfo, Method); -end; - -procedure TTestGetObjectEventHandler.DoEvent(Sender: TObject; var Obj: TObject); -var - PySender: PPyObject; - PyObj: PPyObject; - PyArgs: PPyObject; - PyResult: PPyObject; - PyObjVarParam: TPyDelphiVarParameter; -begin - if not Assigned(PyDelphiWrapper) or not Assigned(Callable) or not PythonOk then - Exit; - with PyDelphiWrapper.Engine do - begin - PySender := PyDelphiWrapper.Wrap(Sender); - PyObj := CreateVarParam(PyDelphiWrapper, Obj); - PyObjVarParam := PythonToDelphi(PyObj) as TPyDelphiVarParameter; - PyArgs := PyTuple_New(2); - PyTuple_SetItem(PyArgs, 0, PySender); - PyTuple_SetItem(PyArgs, 1, PyObj); - try - PyResult := PyObject_CallObject(Callable, PyArgs); - if Assigned(PyResult) then - begin - Py_XDECREF(PyResult); - Obj := (PythonToDelphi(PyObjVarParam.Value) as TPyDelphiObject).DelphiObject; - end; - finally - Py_DECREF(PyArgs) - end; - CheckError; - end; -end; - -class function TTestGetObjectEventHandler.GetTypeInfo: PTypeInfo; -begin - Result := System.TypeInfo(TTestGetObjectEvent); -end; - - -{ TTest } - -procedure TTest.Process; -begin - ProcessCalled := True; - if Assigned(FOnGetObject) then - FOnGetObject(Self, FObject); - if Assigned(FOnGetValue) then - FOnGetValue(Self, FValue); -end; - - -{ TTestWrapDelphiEventHandlers } - -procedure TTestWrapDelphiEventHandlers.SetupFixture; -begin - PythonEngine := TPythonEngine.Create(nil); - PythonEngine.Name := 'PythonEngine'; - PythonEngine.AutoLoad := False; - PythonEngine.FatalAbort := True; - PythonEngine.FatalMsgDlg := True; - PythonEngine.UseLastKnownVersion := True; - PythonEngine.AutoFinalize := True; - PythonEngine.InitThreads := True; - PythonEngine.PyFlags := [pfInteractive]; - DelphiModule := TPythonModule.Create(nil); - - DelphiModule.Name := 'DelphiModule'; - DelphiModule.Engine := PythonEngine; - DelphiModule.ModuleName := 'delphi'; - - DelphiWrapper := TPyDelphiWrapper.Create(nil); - - DelphiWrapper.Name := 'PyDelphiWrapper'; - DelphiWrapper.Engine := PythonEngine; - DelphiWrapper.Module := DelphiModule; - - PythonEngine.LoadDll; -end; - -procedure TTestWrapDelphiEventHandlers.TearDownFixture; -begin - PythonEngine.Free; - DelphiWrapper.Free; - DelphiModule.Free; -end; - -procedure TTestWrapDelphiEventHandlers.TestProcessWithValue; -var - Test: TTest; - pyTest: PPyObject; -begin - Test := TTest.Create(nil); - try - pyTest := DelphiWrapper.Wrap(Test); - DelphiModule.SetVar('test', pyTest); - PythonEngine.Py_DECREF(pyTest); - PythonEngine.ExecString( - 'import delphi' + LF + - '' + LF + - 'def MyOnGetValue(sender, value):' + LF + - ' value.Value = 3.14' + LF + - '' + LF + - 'delphi.test.OnGetValue = MyOnGetValue' + LF + - 'delphi.test.Process()' + LF + - '' - ); - Assert.IsTrue(Test.ProcessCalled); - Assert.AreEqual(Test.FValue, 3.14); - finally - Test.Free; - end; -end; - - -procedure TTestWrapDelphiEventHandlers.TestProcessWithObject; -var - Test: TTest; - pyTest: PPyObject; -begin - Test := TTest.Create(nil); - try - pyTest := DelphiWrapper.Wrap(Test); - DelphiModule.SetVar('test', pyTest); - PythonEngine.Py_DECREF(pyTest); - PythonEngine.ExecString( - 'import delphi' + LF + - '' + LF + - 'def MyOnGetObject(sender, value):' + LF + - ' value.Value = sender' + LF + - '' + LF + - 'delphi.test.OnGetObject = MyOnGetObject' + LF + - 'delphi.test.Process()' + LF + - '' - ); - Assert.IsTrue(Test.ProcessCalled); - Assert.AreSame(Test, Test.FObject); - finally - Test.Free; - end; -end; - -initialization - -RegisteredUnits.Add(TTestRegistration.Create); - -TDUnitX.RegisterTestFixture(TTestWrapDelphiEventHandlers); - -end. +unit WrapDelphiEventHandlerTest; + +interface + +uses + Types, + DUnitX.TestFramework, + PythonEngine, + WrapDelphi, System.Classes; + +type + TTestGetObjectEvent = procedure(Sender: TObject; var AObject: TObject) of object; + TTestGetValueEvent = procedure(Sender: TObject; var AValue: Double) of object; + + TTest = class(TComponent) + private + FObject: TObject; + FValue: Double; + FOnTest: TNotifyEvent; + FOnGetObject: TTestGetObjectEvent; + FOnGetValue: TTestGetValueEvent; + ProcessCalled: Boolean; + public + procedure Process; + published + property OnTest: TNotifyEvent read FOnTest write FOnTest; + property OnGetObject: TTestGetObjectEvent read FOnGetObject write FOnGetObject; + property OnGetValue: TTestGetValueEvent read FOnGetValue write FOnGetValue; + end; + + [TestFixture] + TTestWrapDelphiEventHandlers = class(TObject) + private + PythonEngine: TPythonEngine; + DelphiModule: TPythonModule; + DelphiWrapper: TPyDelphiWrapper; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure TearDownFixture; + [Test] + procedure TestNotify; + [Test] + procedure TestProcessWithValue; + [Test] + procedure TestProcessWithObject; + end; + +implementation + +uses + VarPyth, + System.Diagnostics, + System.SysUtils, + TypInfo; + +type + TTestRegistration = class(TRegisteredUnit) + public + function Name: string; override; + procedure RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); override; + end; + + TTestGetValueEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var Value: Double); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + class function GetTypeInfo: PTypeInfo; override; + end; + + TTestGetObjectEventHandler = class(TEventHandler) + protected + procedure DoEvent(Sender: TObject; var Obj: TObject); + public + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); override; + class function GetTypeInfo: PTypeInfo; override; + end; + +{ TTestRegistration } + +function TTestRegistration.Name: string; +begin + Result := 'Test'; +end; + +procedure TTestRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); +begin + inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TTestGetValueEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTestGetObjectEventHandler); +end; + +{ TTestGetValueEventHandler } + +constructor TTestGetValueEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + Method: TMethod; +begin + inherited; + Method.Code := @TTestGetValueEventHandler.DoEvent; + Method.Data := Self; + SetMethodProp(Component, PropertyInfo, Method); +end; + +procedure TTestGetValueEventHandler.DoEvent(Sender: TObject; var Value: Double); +var + PySender: PPyObject; + PyValue: PPyObject; + PyArgs: PPyObject; + PyResult: PPyObject; + PyValueVarParam: TPyDelphiVarParameter; +begin + if not Assigned(PyDelphiWrapper) or not Assigned(Callable) or not PythonOk then + Exit; + with PyDelphiWrapper.Engine do + begin + PySender := PyDelphiWrapper.Wrap(Sender); + PyValue := CreateVarParam(PyDelphiWrapper, Value); + PyValueVarParam := PythonToDelphi(PyValue) as TPyDelphiVarParameter; + PyArgs := PyTuple_New(2); + PyTuple_SetItem(PyArgs, 0, PySender); + PyTuple_SetItem(PyArgs, 1, PyValue); + try + PyResult := PyObject_CallObject(Callable, PyArgs); + if Assigned(PyResult) then + begin + Py_XDECREF(PyResult); + Value := PyObjectAsVariant(PyValueVarParam.Value); + end; + finally + Py_DECREF(PyArgs) + end; + CheckError; + end; +end; + +class function TTestGetValueEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTestGetValueEvent); +end; + +{ TTestGetObjectEventHandler } + +constructor TTestGetObjectEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject); +var + Method: TMethod; +begin + inherited; + Method.Code := @TTestGetObjectEventHandler.DoEvent; + Method.Data := Self; + SetMethodProp(Component, PropertyInfo, Method); +end; + +procedure TTestGetObjectEventHandler.DoEvent(Sender: TObject; var Obj: TObject); +var + PySender: PPyObject; + PyObj: PPyObject; + PyArgs: PPyObject; + PyResult: PPyObject; + PyObjVarParam: TPyDelphiVarParameter; +begin + if not Assigned(PyDelphiWrapper) or not Assigned(Callable) or not PythonOk then + Exit; + with PyDelphiWrapper.Engine do + begin + PySender := PyDelphiWrapper.Wrap(Sender); + PyObj := CreateVarParam(PyDelphiWrapper, Obj); + PyObjVarParam := PythonToDelphi(PyObj) as TPyDelphiVarParameter; + PyArgs := PyTuple_New(2); + PyTuple_SetItem(PyArgs, 0, PySender); + PyTuple_SetItem(PyArgs, 1, PyObj); + try + PyResult := PyObject_CallObject(Callable, PyArgs); + if Assigned(PyResult) then + begin + Py_XDECREF(PyResult); + Obj := (PythonToDelphi(PyObjVarParam.Value) as TPyDelphiObject).DelphiObject; + end; + finally + Py_DECREF(PyArgs) + end; + CheckError; + end; +end; + +class function TTestGetObjectEventHandler.GetTypeInfo: PTypeInfo; +begin + Result := System.TypeInfo(TTestGetObjectEvent); +end; + +{ TTest } +procedure TTest.Process; +begin + ProcessCalled := True; + if Assigned(fOnTest) then + fOnTest(Self); + if Assigned(FOnGetObject) then + FOnGetObject(Self, FObject); + if Assigned(FOnGetValue) then + FOnGetValue(Self, FValue); +end; + +{ TTestWrapDelphiEventHandlers } +procedure TTestWrapDelphiEventHandlers.SetupFixture; +begin + PythonEngine := TPythonEngine.Create(nil); + PythonEngine.Name := 'PythonEngine'; + PythonEngine.AutoLoad := False; + PythonEngine.FatalAbort := True; + PythonEngine.FatalMsgDlg := True; + PythonEngine.UseLastKnownVersion := True; + PythonEngine.AutoFinalize := True; + PythonEngine.InitThreads := True; + PythonEngine.PyFlags := [pfInteractive]; + DelphiModule := TPythonModule.Create(nil); + DelphiModule.Name := 'DelphiModule'; + DelphiModule.Engine := PythonEngine; + DelphiModule.ModuleName := 'delphi'; + DelphiWrapper := TPyDelphiWrapper.Create(nil); + DelphiWrapper.Name := 'PyDelphiWrapper'; + DelphiWrapper.Engine := PythonEngine; + DelphiWrapper.Module := DelphiModule; + PythonEngine.LoadDll; +end; + +procedure TTestWrapDelphiEventHandlers.TearDownFixture; +begin + PythonEngine.Free; + DelphiWrapper.Free; + DelphiModule.Free; +end; + +procedure TTestWrapDelphiEventHandlers.TestProcessWithValue; +var + Test: TTest; +begin + Test := TTest.Create(nil); + try + DelphiWrapper.DefineVar('test', Test); + PythonEngine.ExecString( + 'import delphi' + LF + + '' + LF + + 'def MyOnGetValue(sender, value):' + LF + + ' value.Value = 3.14' + LF + + '' + LF + + 'delphi.test.OnGetValue = MyOnGetValue' + LF + + 'delphi.test.Process()' + LF + + '' + ); + Assert.IsTrue(Test.ProcessCalled); + Assert.AreEqual(Test.FValue, 3.14); + finally + Test.Free; + end; +end; + +procedure TTestWrapDelphiEventHandlers.TestNotify; +var + Test: TTest; +begin + Test := TTest.Create(nil); + try + DelphiWrapper.DefineVar('test', Test); + PythonEngine.ExecString( + 'import delphi' + LF + + '' + LF + + 'def MyOnTest(sender):' + LF + + ' global on_test_sender' + LF + + ' on_test_sender = sender.ClassName' + LF + + '' + LF + + 'delphi.test.OnTest = MyOnTest' + LF + + 'delphi.test.Process()' + LF + + '' + ); + Assert.AreEqual(MainModule.on_test_sender, 'TTest'); + + var StopWatch := TStopwatch.StartNew; + var Count := 100000; + for var I := 0 to Count do + Test.Process; + StopWatch.Stop; + WriteLn(Format('*********** Elaplsed time for %d OnTest event calls: %d', [Count, StopWatch.ElapsedMilliseconds])); + finally + Test.Free; + end; +end; + +procedure TTestWrapDelphiEventHandlers.TestProcessWithObject; +var + Test: TTest; +begin + Test := TTest.Create(nil); + try + DelphiWrapper.DefineVar('test', Test); + PythonEngine.ExecString( + 'import delphi' + LF + + '' + LF + + 'def MyOnGetObject(sender, value):' + LF + + ' value.Value = sender' + LF + + '' + LF + + 'delphi.test.OnGetObject = MyOnGetObject' + LF + + 'delphi.test.Process()' + LF + + '' + ); + Assert.IsTrue(Test.ProcessCalled); + Assert.AreSame(Test, Test.FObject); + + var StopWatch := TStopwatch.StartNew; + var Count := 100000; + for var I := 0 to Count do + Test.Process; + StopWatch.Stop; + WriteLn(Format('*********** Elaplsed time for %d OnGetObject event calls: %d', [Count, StopWatch.ElapsedMilliseconds])); + finally + Test.Free; + end; +end; + +initialization + RegisteredUnits.Add(TTestRegistration.Create); + TDUnitX.RegisterTestFixture(TTestWrapDelphiEventHandlers); +end. From 983087259d233e48c2706b3f5ff5fc99c886ada8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 20 Oct 2023 04:00:44 +0300 Subject: [PATCH 092/174] Handle assignment of Py_None to an event property. --- Source/WrapDelphi.pas | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 843cea09..ccd28609 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1610,16 +1610,24 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) end; end; - EventHandler := TRttiEventHandler.Create(FPyDelphiWrapper, - RttiProp.PropInfo, AValue, RttiProp.PropertyType as TRttiMethodType); + if AValue = GetPythonEngine.Py_None then + begin + Method.Code := nil; + Method.Data := nil; + end + else + begin + EventHandler := TRttiEventHandler.Create(FPyDelphiWrapper, + RttiProp.PropInfo, AValue, RttiProp.PropertyType as TRttiMethodType); - Method.Code := EventHandler.CodeAddress; - Method.Data := EventHandler; - SetMethodProp(Obj, RttiProp.PropInfo, Method); + if not Assigned(PyObject.fEventHandlers) then + PyObject.fEventHandlers := TObjectList.Create(True); + PyObject.fEventHandlers.Add(EventHandler); - if not Assigned(PyObject.fEventHandlers) then - PyObject.fEventHandlers := TObjectList.Create(True); - PyObject.fEventHandlers.Add(EventHandler); + Method.Code := EventHandler.CodeAddress; + Method.Data := EventHandler; + end; + SetMethodProp(Obj, RttiProp.PropInfo, Method); Result := 0; except From ad0ac3348aca6b4bdd2a7e1c58412b1cb213ed4b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 20 Oct 2023 05:53:14 +0300 Subject: [PATCH 093/174] Unify TEventHandler and TRttiEventHandler. --- Source/WrapDelphi.pas | 113 +++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 74 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index ccd28609..f26ea1c0 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -527,7 +527,6 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) private fDelphiObject: TObject; fContainerAccess: TContainerAccess; - fEventHandlers: TObjectList; function GetContainerAccess: TContainerAccess; procedure SetDelphiObject(const Value: TObject); protected @@ -715,7 +714,7 @@ TPyPascalInterface = class(TPyRttiObject) end; {$ENDIF} - TEventHandler = class + TBaseEventHandler = class private fComponent: TObject; public @@ -729,11 +728,15 @@ TEventHandler = class destructor Destroy; override; // Disconnects from the free notification event now procedure Unsubscribe; - // returns the type info of the supported event - class function GetTypeInfo : PTypeInfo; virtual; abstract; // properties property Component : TObject read fComponent; end; + + TEventHandler = class(TBaseEventHandler) + public + // returns the type info of the supported event + class function GetTypeInfo : PTypeInfo; virtual; abstract; + end; TEventHandlerClass = class of TEventHandler; TEventHandlers = class @@ -742,7 +745,7 @@ TEventHandlers = class fRegisteredClasses : TClassList; fPyDelphiWrapper: TPyDelphiWrapper; function GetCount: Integer; - function GetItem(AIndex: Integer): TEventHandler; + function GetItem(AIndex: Integer): TBaseEventHandler; function GetRegisteredClass(AIndex: Integer): TEventHandlerClass; function GetRegisteredClassCount: Integer; protected @@ -753,7 +756,7 @@ TEventHandlers = class constructor Create(APyDelphiWrapper : TPyDelphiWrapper); destructor Destroy; override; - function Add(AEventHandler : TEventHandler) : Boolean; + function Add(AEventHandler : TBaseEventHandler) : Boolean; procedure Clear; procedure Delete(AIndex : Integer); function GetCallable(AComponent : TObject; APropInfo : PPropInfo) : PPyObject; overload; @@ -765,7 +768,7 @@ TEventHandlers = class function Unlink(AComponent : TObject; APropInfo : PPropInfo) : Boolean; property Count : Integer read GetCount; - property Items[AIndex : Integer] : TEventHandler read GetItem; default; + property Items[AIndex : Integer] : TBaseEventHandler read GetItem; default; property PyDelphiWrapper : TPyDelphiWrapper read fPyDelphiWrapper; end; @@ -1293,18 +1296,15 @@ TExposedIndexedProperty = class(TAbstractExposedMember) property GetterCallback: Pointer read GetGetterCallback; end; - TRttiEventHandler = class + TRttiEventHandler = class(TBaseEventHandler) private FMethodImplementation: TMethodImplementation; public - DelphiWrapper: TPyDelphiWrapper; - PropInfo: PPropInfo; MethodType: TRttiMethodType; - PyCallable: PPyObject; function CodeAddress: Pointer; - constructor Create(ADelphiWrapper : TPyDelphiWrapper; - APropertyInfo: PPropInfo; ACallable: PPyObject; - AMethodType: TRttiMethodType); + constructor Create(PyDelphiWrapper: TPyDelphiWrapper; Component: TObject; + PropertyInfo: PPropInfo; Callable: PPyObject; + AMethodType: TRttiMethodType); reintroduce; destructor Destroy; override; class procedure ImplCallback(UserData: Pointer; const Args: TArray; out Result: TValue); static; @@ -1550,38 +1550,19 @@ function TExposedEvent.GetDefaultDocString(): string; function TExposedEvent.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; var Obj: TObject; - PyObject: TPyDelphiObject; RttiProp: TRttiInstanceProperty; LOutMsg: string; - EventHandler: TRttiEventHandler; - Index: Integer; begin - Result := nil; + RttiProp := FRttiMember as TRttiInstanceProperty; if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then - begin - PyObject := PythonToDelphi(AObj) as TPyDelphiObject; - RttiProp := FRttiMember as TRttiInstanceProperty; - // Search for and Event handler - if Assigned(PyObject.fEventHandlers) then - for Index := 0 to PyObject.fEventHandlers.Count - 1 do - begin - EventHandler := PyObject.fEventHandlers[Index] as TRttiEventHandler; - if EventHandler.PropInfo = RttiProp.PropInfo then - begin - Result := EventHandler.PyCallable; - FPyDelphiWrapper.Engine.Py_XINCREF(Result); - end; - end; - end; - - if not Assigned(Result) then + Result := FPyDelphiWrapper.EventHandlers.GetCallable(Obj, RttiProp.PropInfo) + else Result := FPyDelphiWrapper.Engine.ReturnNone; end; function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; var Obj: TObject; - PyObject: TPyDelphiObject; RttiProp: TRttiInstanceProperty; ErrMsg: string; EventHandler: TRttiEventHandler; @@ -1595,20 +1576,10 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, ErrMsg) then begin try - PyObject := PythonToDelphi(AObj) as TPyDelphiObject; RttiProp := FRttiMember as TRttiInstanceProperty; // Remove handler if it exists - if Assigned(PyObject.fEventHandlers) then - for Index := 0 to PyObject.fEventHandlers.Count - 1 do - begin - EventHandler := PyObject.fEventHandlers[Index] as TRttiEventHandler; - if EventHandler.PropInfo = RttiProp.PropInfo then - begin - PyObject.fEventHandlers.Delete(Index); - break; - end; - end; + fPyDelphiWrapper.EventHandlers.Unlink(Obj, RttiProp.PropInfo); if AValue = GetPythonEngine.Py_None then begin @@ -1617,12 +1588,10 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) end else begin - EventHandler := TRttiEventHandler.Create(FPyDelphiWrapper, + EventHandler := TRttiEventHandler.Create(FPyDelphiWrapper, Obj, RttiProp.PropInfo, AValue, RttiProp.PropertyType as TRttiMethodType); - if not Assigned(PyObject.fEventHandlers) then - PyObject.fEventHandlers := TObjectList.Create(True); - PyObject.fEventHandlers.Add(EventHandler); + FPyDelphiWrapper.EventHandlers.Add(EventHandler); Method.Code := EventHandler.CodeAddress; Method.Data := EventHandler; @@ -1792,21 +1761,19 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; end; { TRttiEventHandler } -constructor TRttiEventHandler.Create(ADelphiWrapper : TPyDelphiWrapper; - APropertyInfo: PPropInfo; ACallable: PPyObject; AMethodType: TRttiMethodType); +constructor TRttiEventHandler.Create(PyDelphiWrapper: TPyDelphiWrapper; + Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject; + AMethodType: TRttiMethodType); begin - PropInfo := APropertyInfo; - DelphiWrapper := ADelphiWrapper; - PyCallable := ACallable; - GetPythonEngine.Py_INCREF(PyCallable); + inherited Create(PyDelphiWrapper, Component, PropertyInfo, Callable); MethodType := AMethodType; FMethodImplementation := AMethodType.CreateImplementation(nil, ImplCallback); end; destructor TRttiEventHandler.Destroy; begin - DelphiWrapper.Engine.Py_XDECREF(PyCallable); FMethodImplementation.Free; + inherited; end; function TRttiEventHandler.CodeAddress: Pointer; @@ -1834,11 +1801,11 @@ class procedure TRttiEventHandler.ImplCallback(UserData: Pointer; if Length(Args) <> Length(Params) + 1 then // +1 for Self begin - InvalidArguments(string(EventHandler.PropInfo.Name), rs_IncompatibleArguments); + InvalidArguments(string(EventHandler.PropertyInfo.Name), rs_IncompatibleArguments); Exit; end; - Engine := EventHandler.DelphiWrapper.Engine; + Engine := EventHandler.PyDelphiWrapper.Engine; // Set up the python arguments PyArgs := Engine.PyTuple_New(Length(Args) - 1); //Ignore Self @@ -1846,20 +1813,20 @@ class procedure TRttiEventHandler.ImplCallback(UserData: Pointer; for Index := 1 to Length(Args) - 1 do begin if Params[Index - 1].Flags * [TParamFlag.pfVar, TParamFlag.pfOut] <> [] then - TempPy := CreateVarParam(EventHandler.DelphiWrapper, Args[Index]) + TempPy := CreateVarParam(EventHandler.PyDelphiWrapper, Args[Index]) else - TempPy := TValueToPyObject(Args[Index], EventHandler.DelphiWrapper, ErrMsg); + TempPy := TValueToPyObject(Args[Index], EventHandler.PyDelphiWrapper, ErrMsg); if TempPy <> nil then Engine.PyTuple_SetItem(PyArgs, Index - 1, TempPy) else begin - InvalidArguments(string(EventHandler.PropInfo.Name), rs_IncompatibleArguments); + InvalidArguments(string(EventHandler.PropertyInfo.Name), rs_IncompatibleArguments); Engine.CheckError; // will raise an Exception end; end; // Make the call - PyResult := Engine.PyObject_CallObject(EventHandler.PyCallable, PyArgs); + PyResult := Engine.PyObject_CallObject(EventHandler.Callable, PyArgs); // deal with var/out parameters for Index := 1 to Length(Args) - 1 do @@ -1870,7 +1837,7 @@ class procedure TRttiEventHandler.ImplCallback(UserData: Pointer; if not PyObjectToTValue((PythonToDelphi(TempPy) as TPyDelphiVarParameter).Value, Params[Index- 1].ParamType, Args[Index], ErrMsg) then begin - InvalidArguments(string(EventHandler.PropInfo.Name), rs_IncompatibleArguments); + InvalidArguments(string(EventHandler.PropertyInfo.Name), rs_IncompatibleArguments); Engine.CheckError; // will raise an Exception end; end; @@ -1879,7 +1846,7 @@ class procedure TRttiEventHandler.ImplCallback(UserData: Pointer; not PyObjectToTValue(PyResult, EventHandler.MethodType.ReturnType, Result, ErrMsg) then Engine.PyErr_SetObject(Engine.PyExc_TypeError^, Engine.PyUnicodeFromString( - Format(rs_ErrInvalidRet, [string(EventHandler.PropInfo.Name), ErrMsg]))); + Format(rs_ErrInvalidRet, [string(EventHandler.PropertyInfo.Name), ErrMsg]))); Engine.Py_XDECREF(PyResult); finally Engine.Py_XDECREF(PyArgs); @@ -2951,7 +2918,6 @@ class function TPyDelphiObject.DelphiObjectClass: TClass; destructor TPyDelphiObject.Destroy; begin DelphiObject := nil; // will free the object if owned - fEventHandlers.Free; fContainerAccess.Free; inherited; end; @@ -3949,7 +3915,6 @@ procedure TPyDelphiObject.SetDelphiObject(const Value: TObject); if Assigned(fDelphiObject)then begin UnSubscribeToFreeNotification; - FreeAndNil(fEventHandlers); if Owned then fDelphiObject.Free; end; @@ -4831,7 +4796,7 @@ function TPyDelphiVarParameter.Set_Value(AValue: PPyObject; { TEventHandler } -constructor TEventHandler.Create(PyDelphiWrapper : TPyDelphiWrapper; +constructor TBaseEventHandler.Create(PyDelphiWrapper : TPyDelphiWrapper; Component: TObject; PropertyInfo: PPropInfo; Callable: PPyObject); var _FreeNotification : IFreeNotification; @@ -4851,7 +4816,7 @@ constructor TEventHandler.Create(PyDelphiWrapper : TPyDelphiWrapper; (Component as TComponent).FreeNotification(PyDelphiWrapper); end; -destructor TEventHandler.Destroy; +destructor TBaseEventHandler.Destroy; var Method : TMethod; begin @@ -4874,7 +4839,7 @@ destructor TEventHandler.Destroy; inherited; end; -procedure TEventHandler.Unsubscribe; +procedure TBaseEventHandler.Unsubscribe; var _FreeNotification : IFreeNotification; begin @@ -4907,7 +4872,7 @@ class function TNotifyEventHandler.GetTypeInfo: PTypeInfo; { TEventHandlers } -function TEventHandlers.Add(AEventHandler: TEventHandler) : Boolean; +function TEventHandlers.Add(AEventHandler: TBaseEventHandler) : Boolean; begin fItems.Add(AEventHandler); Result := True; @@ -4983,9 +4948,9 @@ function TEventHandlers.GetCount: Integer; Result := fItems.Count; end; -function TEventHandlers.GetItem(AIndex: Integer): TEventHandler; +function TEventHandlers.GetItem(AIndex: Integer): TBaseEventHandler; begin - Result := TEventHandler(fItems[AIndex]); + Result := TBaseEventHandler(fItems[AIndex]); end; function TEventHandlers.GetRegisteredClass( From d73dcacfb100803aa608e9501c89178152ecd1e4 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 20 Oct 2023 06:03:51 +0300 Subject: [PATCH 094/174] Removed hint about unused variable. --- Source/WrapDelphi.pas | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index f26ea1c0..7f7d79c5 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1566,7 +1566,6 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) RttiProp: TRttiInstanceProperty; ErrMsg: string; EventHandler: TRttiEventHandler; - Index: Integer; Method: TMethod; begin Result := -1; From a3c86bc5b4b3e79e220c4445cfe94889d2075aa2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 20 Oct 2023 14:20:04 +0300 Subject: [PATCH 095/174] Register event handlers before Delphi wrappers, so that manually wrapped events take precedence. --- Source/WrapActions.pas | 4 ++-- Source/fmx/WrapFmxControls.pas | 5 ++-- Source/fmx/WrapFmxForms.pas | 7 +++--- Source/fmx/WrapFmxListView.pas | 5 ++-- Source/fmx/WrapFmxMedia.pas | 5 ++-- Source/fmx/WrapFmxTypes.pas | 23 +++++++++--------- Source/vcl/WrapVclComCtrls.pas | 36 +++++++++++++--------------- Source/vcl/WrapVclControls.pas | 15 +++++------- Source/vcl/WrapVclForms.pas | 7 +++--- Source/vcl/WrapVclGrids.pas | 7 +++--- Source/vcl/WrapVclMedia.pas | 5 ++-- Tests/WrapDelphiEventHandlerTest.pas | 1 - 12 files changed, 53 insertions(+), 67 deletions(-) diff --git a/Source/WrapActions.pas b/Source/WrapActions.pas index 3e527f52..7ec230a4 100644 --- a/Source/WrapActions.pas +++ b/Source/WrapActions.pas @@ -91,10 +91,10 @@ function TActionsRegistration.Name: string; procedure TActionsRegistration.RegisterWrappers( APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TActionEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedAction); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiContainedActionList); - APyDelphiWrapper.EventHandlers.RegisterHandler(TActionEventHandler); end; { TPyDelphiContainedAction } diff --git a/Source/fmx/WrapFmxControls.pas b/Source/fmx/WrapFmxControls.pas index ac177c02..270c8d34 100644 --- a/Source/fmx/WrapFmxControls.pas +++ b/Source/fmx/WrapFmxControls.pas @@ -196,15 +196,14 @@ function TControlsRegistration.Name: string; procedure TControlsRegistration.RegisterWrappers( APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyledControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTextControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleBook); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopup); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControlAction); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); end; { TPyDelphiControl } diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index 0c63147e..f3a2b68e 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -192,7 +192,9 @@ function TFormsRegistration.Name: string; procedure TFormsRegistration.RegisterWrappers( APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseQueryEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiApplication); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCommonCustomForm); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomForm); @@ -200,9 +202,6 @@ procedure TFormsRegistration.RegisterWrappers( APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiForm); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFrame); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScreen); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseQueryEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseEventHandler); end; { TPyDelphiApplication } diff --git a/Source/fmx/WrapFmxListView.pas b/Source/fmx/WrapFmxListView.pas index 4994e411..0a825696 100644 --- a/Source/fmx/WrapFmxListView.pas +++ b/Source/fmx/WrapFmxListView.pas @@ -118,15 +118,14 @@ function TListViewRegistration.Name: string; procedure TListViewRegistration.RegisterWrappers( APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TItemEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAdapterListView); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListViewBase); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPresentedListView); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiAppearanceListView); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListView); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListView); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TItemEventHandler); end; { TPyDelphiAdapterListView } diff --git a/Source/fmx/WrapFmxMedia.pas b/Source/fmx/WrapFmxMedia.pas index 92f7b02a..f650835f 100644 --- a/Source/fmx/WrapFmxMedia.pas +++ b/Source/fmx/WrapFmxMedia.pas @@ -192,7 +192,8 @@ procedure TFMXMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); procedure TFMXMediaRegistration.RegisterWrappers(APyDelphiWrapper : TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TSampleBufferReadyEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCameraComponent); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMediaCodec); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerControl); @@ -205,8 +206,6 @@ procedure TFMXMediaRegistration.RegisterWrappers(APyDelphiWrapper APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerValue); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerCurrentTime); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayerVolume); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TSampleBufferReadyEventHandler); end; { TSampleBufferReadyEventHandler } diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 5975c513..53e36d9f 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -309,28 +309,27 @@ function TTypesRegistration.Name: string; procedure TTypesRegistration.RegisterWrappers( APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + // Event handlers + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseWheelEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TProcessTickEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TVirtualKeyboardEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTapEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TTouchEventHandler); + // Helper types APyDelphiWrapper.RegisterHelperType(TPyDelphiPointF); APyDelphiWrapper.RegisterHelperType(TPyDelphiSizeF); APyDelphiWrapper.RegisterHelperType(TPyDelphiRectF); APyDelphiWrapper.RegisterHelperType(TPyDelphiTouch); - + // Classes APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiFmxObject); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPosition); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomPopupMenu); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiBounds); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControlSize); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTimer); - - //Event handlers - APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseWheelEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TProcessTickEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TVirtualKeyboardEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TTapEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TTouchEventHandler); end; { TPyDelphiPointF } diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index 62f30629..18c161e8 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -874,24 +874,6 @@ function TComCtrlsRegistration.Name: string; procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimePicker); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPageControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabSheet); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolButton); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolbar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomTabControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTabControl); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStatusBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTreeNode); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTreeView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTreeView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListItem); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListView); - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListView); - APyDelphiWrapper.EventHandlers.RegisterHandler(TTabChangingEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTVChangingEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTVChangedEventHandler); @@ -911,7 +893,6 @@ procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCheckStateChangedEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTVCheckStateChangingEventHandler); {$ENDIF} - APyDelphiWrapper.EventHandlers.RegisterHandler(TLVDeletedEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TLVEditingEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TLVEditedEventHandler); @@ -937,6 +918,23 @@ procedure TComCtrlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.EventHandlers.RegisterHandler(TLVSubItemImageEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TLVInfoTipEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TLVCreateItemClassEventHandler); + + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDateTimePicker); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPageControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTabSheet); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTrackBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolButton); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiToolbar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomCustomTabControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTabControl); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomStatusBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStatusBar); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTreeNode); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomTreeView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiTreeView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListItem); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomListView); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiListView); end; diff --git a/Source/vcl/WrapVclControls.pas b/Source/vcl/WrapVclControls.pas index acc42e23..089addba 100644 --- a/Source/vcl/WrapVclControls.pas +++ b/Source/vcl/WrapVclControls.pas @@ -267,7 +267,12 @@ function TControlsRegistration.Name: string; procedure TControlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyPressEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TContextPopupEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiWinControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControl); @@ -275,14 +280,6 @@ procedure TControlsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrap APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomMultiListControl); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDragImageList); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiImageList); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyPressEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TMouseMoveEventHandler); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TContextPopupEventHandler); end; { TPyDelphiControl } diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index e7b8040d..0a373dfa 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -423,15 +423,14 @@ function TFormsRegistration.Name: string; procedure TFormsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseQueryEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomForm); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiForm); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiApplication); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiScreen); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMonitor); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseQueryEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TCloseEventHandler); end; { TPyDelphiCustomForm } diff --git a/Source/vcl/WrapVclGrids.pas b/Source/vcl/WrapVclGrids.pas index 0d74cf7e..145a2730 100644 --- a/Source/vcl/WrapVclGrids.pas +++ b/Source/vcl/WrapVclGrids.pas @@ -184,14 +184,13 @@ function TGridsRegistration.Name: string; procedure TGridsRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; + APyDelphiWrapper.EventHandlers.RegisterHandler(TDrawCellEventHandler); + APyDelphiWrapper.EventHandlers.RegisterHandler(TSelectCellEventHandler); + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomGrid); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomDrawGrid); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiDrawGrid); APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStringGrid); - - APyDelphiWrapper.EventHandlers.RegisterHandler(TDrawCellEventHandler); - APyDelphiWrapper.EventHandlers.RegisterHandler(TSelectCellEventHandler); end; { Helper functions } diff --git a/Source/vcl/WrapVclMedia.pas b/Source/vcl/WrapVclMedia.pas index 1ce34d8a..02167cee 100644 --- a/Source/vcl/WrapVclMedia.pas +++ b/Source/vcl/WrapVclMedia.pas @@ -76,11 +76,10 @@ procedure TMediaRegistration.DefineVars(APyDelphiWrapper: TPyDelphiWrapper); procedure TMediaRegistration.RegisterWrappers( APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; - APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); - APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPNotifyEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TEMPPostNotifyEventHandler); + + APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiMediaPlayer); end; { TPyDelphiMediaPlayer } diff --git a/Tests/WrapDelphiEventHandlerTest.pas b/Tests/WrapDelphiEventHandlerTest.pas index ec39d3cf..c6cda4ce 100644 --- a/Tests/WrapDelphiEventHandlerTest.pas +++ b/Tests/WrapDelphiEventHandlerTest.pas @@ -89,7 +89,6 @@ function TTestRegistration.Name: string; procedure TTestRegistration.RegisterWrappers(APyDelphiWrapper: TPyDelphiWrapper); begin - inherited; APyDelphiWrapper.EventHandlers.RegisterHandler(TTestGetValueEventHandler); APyDelphiWrapper.EventHandlers.RegisterHandler(TTestGetObjectEventHandler); end; From 4f8b9f27d22f9e98603fa67979313e807d0b2e55 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 22 Oct 2023 15:41:02 +0300 Subject: [PATCH 096/174] Minor refactoring of TExposedIndexedProperty --- Source/WrapDelphi.pas | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 7f7d79c5..be85ac81 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1284,16 +1284,11 @@ TPyIndexedProperty = class(TPyObject) function MpAssSubscript(obj1, obj2: PPyObject) : Integer; override; end; - TExposedIndexedProperty = class(TAbstractExposedMember) - private - FGetterCallback: Pointer; - function GetGetterCallback: Pointer; + TExposedIndexedProperty = class(TExposedGetSet) protected function GetDefaultDocString(): string; override; public - destructor Destroy; override; - function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; - property GetterCallback: Pointer read GetGetterCallback; + function GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; override; cdecl; end; TRttiEventHandler = class(TBaseEventHandler) @@ -1610,18 +1605,6 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) end; { TExposedIndexedProperty } -function TExposedIndexedProperty.GetGetterCallback: Pointer; -var - Method: function (AObj: PPyObject; AContext : Pointer): PPyObject of object; cdecl; -begin - if FGetterCallback = nil then - begin - Method := GetterWrapper; - FGetterCallback := GetOfObjectCallBack(TCallBack(Method), 2, DEFAULT_CALLBACK_TYPE); - end; - Result := FGetterCallback; -end; - function TExposedIndexedProperty.GetDefaultDocString(): string; var PropertyType: string; @@ -1633,13 +1616,7 @@ function TExposedIndexedProperty.GetDefaultDocString(): string; FParentRtti.Name, FRttiMember.Name, PropertyType]); end; -destructor TExposedIndexedProperty.Destroy; -begin - if FGetterCallback <> nil then - DeleteCallback(FGetterCallback); -end; - -function TExposedIndexedProperty.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; cdecl; +function TExposedIndexedProperty.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyObject; var HelperType: TPythonType; begin From f1a4945f9aa8670d57dc96294e9857833a75ceff Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 22 Oct 2023 17:45:51 +0300 Subject: [PATCH 097/174] Added the license header of Spring4D to the copied code. --- Source/WrapDelphi.pas | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index be85ac81..a57594ef 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1053,6 +1053,29 @@ implementation {$REGION 'TRttiInvokableTypeHelper - "Lifted" from Spring4D"'} +{***************************************************************************} +{ } +{ Spring Framework for Delphi } +{ } +{ Copyright (c) 2009-2018 Spring4D Team } +{ } +{ http://www.spring4d.org } +{ } +{***************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{***************************************************************************} type TRttiInvokableTypeHelper = class helper for TRttiInvokableType public From ac1ba0780292eb3ad4c1495ce3bba1b6f2179f1c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 30 Oct 2023 04:35:14 +0200 Subject: [PATCH 098/174] Fix #439 Added support for the buffer protocol. New Demo35 demonstrates how to access fast numpy arrays using the buffer protocol. --- Demos/Demo35/PyBufferDemo.dpr | 93 +++++++++++++++++++++++ Demos/readme.txt | 1 + Source/PythonEngine.pas | 137 ++++++++++++++++++++++++++++++++-- 3 files changed, 224 insertions(+), 7 deletions(-) create mode 100644 Demos/Demo35/PyBufferDemo.dpr diff --git a/Demos/Demo35/PyBufferDemo.dpr b/Demos/Demo35/PyBufferDemo.dpr new file mode 100644 index 00000000..a4d5e559 --- /dev/null +++ b/Demos/Demo35/PyBufferDemo.dpr @@ -0,0 +1,93 @@ +program PyBufferDemo; + +{$APPTYPE CONSOLE} + +{$R *.res} + +uses + System.SysUtils, + System.Diagnostics, + System.Variants, + PythonEngine, + VarPyth; + +var + PythonEngine: TPythonEngine; + +procedure CreatePyEngine; +begin + PythonEngine := TPythonEngine.Create(nil); + PythonEngine.Name := 'PythonEngine'; + PythonEngine.LoadDll; +end; + +procedure DestroyEngine; +begin + PythonEngine.Free; +end; + +const + N = 100000; + +type + PIntArray = ^TIntArray; + TIntArray = array[0..N - 1] of Integer; + +var + SW: TStopwatch; + Sum: Int64; + np: Variant; + arr: Variant; + np_arr: PPyObject; + PyBuffer: Py_buffer; + V: Variant; + I: Integer; +begin + try + CreatePyEngine; + try + // Import numpy and create an array + np := Import('numpy'); + arr := np.array(BuiltinModule.range(N)); + + // This is the slow way to iterate the array + WriteLn('Lazy but slow:'); + SW := TStopwatch.StartNew; + Sum := 0; + for V in VarPyIterate(arr) do + Sum := Sum + BuiltinModule.int(V); + SW.Stop; + WriteLn(Format('Sum from 0 to %d = %d', [N, Sum])); + WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); + WriteLn; + + WriteLn('Using Py_Buffer:'); + SW := TStopwatch.StartNew; + np_arr := ExtractPythonObjectFrom(arr); + PythonEngine.PyObject_GetBuffer(np_arr, @PyBuffer, PyBUF_CONTIG); + PythonEngine.CheckError; + try + Sum := 0; + for I := 0 to N - 1 do + Sum := Sum + PIntArray(PyBuffer.buf)^[I]; + SW.Stop; + WriteLn(Format('Sum from 0 to %d = %d', [N, Sum])); + finally + PythonEngine.PyBuffer_Release(@PyBuffer); + end; + WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); + WriteLn; + + // test write access + PIntArray(PyBuffer.buf)^[0] := 999; + if BuiltinModule.int(arr.GetItem(0)) = 999 then + WriteLn('Successfully modified the numpy array using Py_buffer'); + finally + DestroyEngine; + end; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; + ReadLn; +end. diff --git a/Demos/readme.txt b/Demos/readme.txt index 61c95c57..57056428 100644 --- a/Demos/readme.txt +++ b/Demos/readme.txt @@ -31,3 +31,4 @@ Demo31 Using WrapDelphi to access Delphi Form attributes Demo32 Demo08 revisited using WrapDelphi Demo33 Using Threads inside Python Demo34 Dynamically creating, destroying and recreating PythonEngine. Uses PythonVersions +Demo35 Fast access to numpy arrays using the buffer protocol diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index bc3d3afc..b40fa5ee 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -16,7 +16,6 @@ unit PythonEngine; -{ TODO -oMMM : implement tp_as_buffer slot } { TODO -oMMM : implement Attribute descriptor and subclassing stuff } {$IFNDEF FPC} @@ -189,6 +188,7 @@ TPythonVersionProp = record WCharTString = UnicodeString; {$ENDIF} + PPy_ssize_t = PNativeInt; Py_ssize_t = NativeInt; const @@ -307,7 +307,7 @@ TPythonVersionProp = record T_UINT = 11; T_ULONG = 12; -//* Added by Jack: strings contained in the structure */ +//* strings contained in the structure */ T_STRING_INPLACE= 13; T_OBJECT_EX = 16;{* Like T_OBJECT, but raises AttributeError @@ -326,6 +326,32 @@ TPythonVersionProp = record mtStringInplace, mtObjectEx); TPyMemberFlag = (mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted); +// Constants from pybuffer.h +const + PyBUF_MAX_NDIM = 64; // Maximum number of dimensions + // Flags for getting buffers. Keep these in sync with inspect.BufferFlags. + PyBUF_SIMPLE = 0; + PyBUF_WRITABLE = 1; + + PyBUF_FORMAT = $0004; + PyBUF_ND = $0008; + PyBUF_STRIDES = $0010 or PyBUF_ND; + PyBUF_C_CONTIGUOUS = $0020 or PyBUF_STRIDES; + PyBUF_F_CONTIGUOUS = $0040 or PyBUF_STRIDES; + PyBUF_ANY_CONTIGUOUS = $0080 or PyBUF_STRIDES; + PyBUF_INDIRECT = $0100 or PyBUF_STRIDES; + PyBUF_CONTIG = PyBUF_ND or PyBUF_WRITABLE; + PyBUF_CONTIG_RO = PyBUF_ND; + PyBUF_STRIDED = PyBUF_STRIDES or PyBUF_WRITABLE; + PyBUF_STRIDED_RO = PyBUF_STRIDES; + PyBUF_RECORDS = PyBUF_STRIDES or PyBUF_WRITABLE or PyBUF_FORMAT; + PyBUF_RECORDS_RO = PyBUF_STRIDES or PyBUF_FORMAT; + PyBUF_FULL = PyBUF_INDIRECT or PyBUF_WRITABLE or PyBUF_FORMAT; + PyBUF_FULL_RO = PyBUF_INDIRECT or PyBUF_FORMAT; + + PyBUF_READ = $100; + PyBUF_WRITE = $200; + //####################################################### //## ## //## Non-Python specific constants ## @@ -610,7 +636,35 @@ TPythonVersionProp = record m_free : inquiry; end; + // pybuffer.h + + PPy_buffer = ^Py_Buffer; + Py_buffer = record + buf: Pointer; + obj: PPyObject; (* owned reference *) + len: Py_ssize_t; + itemsize: Py_ssize_t; (* This is Py_ssize_t so it can be + pointed to by strides in simple case.*) + readonly: Integer; + ndim: Integer; + format: PAnsiChar; + shape: PPy_ssize_t ; + strides: PPy_ssize_t; + suboffsets: PPy_ssize_t; + internal: Pointer; + end; + + getbufferproc = function(exporter: PPyObject; view: PPy_buffer; flags: Integer): Integer; cdecl; + releasebufferproc = procedure(exporter: PPyObject; view: PPy_buffer); cdecl; + + PPyBufferProcs = ^PyBufferProcs; + PyBufferProcs = record + bf_getbuffer: getbufferproc; + bf_releasebuffer: releasebufferproc; + end; + // object.h + PyTypeObject = {$IFDEF CPUX86}packed{$ENDIF} record ob_refcnt: NativeInt; ob_type: PPyTypeObject; @@ -643,7 +697,7 @@ TPythonVersionProp = record tp_setattro: setattrofunc; // Functions to access object as input/output buffer - tp_as_buffer: Pointer; // PPyBufferProcs - not implemented + tp_as_buffer: PPyBufferProcs; // Flags to define presence of optional/expanded features tp_flags: C_ULong; @@ -1075,6 +1129,7 @@ FutureWarning = class (EPyWarning); EPySyntaxWarning = class (EPyWarning); EPyRuntimeWarning = class (EPyWarning); EPyReferenceError = class (EPyStandardError); + EPyBufferError = class (EPyException); {$IFDEF MSWINDOWS} EPyWindowsError = class (EPyOSError); {$ENDIF} @@ -1326,6 +1381,7 @@ TPythonInterface=class(TDynamicDll) PyExc_UnicodeDecodeError: PPPyObject; PyExc_UnicodeEncodeError: PPPyObject; PyExc_UnicodeTranslateError: PPPyObject; + PyExc_BufferError: PPPyObject; PyCode_Type: PPyTypeObject; PyType_Type: PPyTypeObject; @@ -1427,8 +1483,20 @@ TPythonInterface=class(TDynamicDll) PySys_SetArgv: procedure( argc: Integer; argv: PPWCharT); cdecl; PyCFunction_NewEx: function(md:PPyMethodDef;self, ob:PPyObject):PPyObject; cdecl; -// Removed. Use PyEval_CallObjectWithKeywords with third argument nil -// PyEval_CallObject: function(callable_obj, args:PPyObject):PPyObject; cdecl; + + PyBuffer_GetPointer: function(view: PPy_buffer; indices: PPy_ssize_t): Pointer; cdecl; + PyBuffer_SizeFromFormat: function(format: PAnsiChar): Py_ssize_t; cdecl; // New in Python 3.9 + PyBuffer_ToContiguous: function(buf: Pointer; view: PPy_buffer; len: Py_ssize_t; order: AnsiChar): Integer; cdecl; + PyBuffer_FromContiguous: function(view: PPy_buffer; buf: Pointer; len: Py_ssize_t; order: AnsiChar): Integer; cdecl; + PyBuffer_IsContiguous: function(view: PPy_buffer; fort: AnsiChar): Integer; cdecl; + PyBuffer_FillContiguousStrides: procedure(ndims: Integer; shape: Py_ssize_t; + strides: PPy_ssize_t; itemsize: Integer; fort: AnsiChar); cdecl; + PyBuffer_FillInfo: function(view: PPy_buffer; o: PPyObject; buf: Pointer; + len: Py_ssize_t; readonly: Integer; flags: Integer): Integer; cdecl; + PyBuffer_Release: procedure(view: PPy_buffer); cdecl; + + // Removed. Use PyEval_CallObjectWithKeywords with third argument nil + // PyEval_CallObject: function(callable_obj, args:PPyObject):PPyObject; cdecl; PyEval_CallObjectWithKeywords:function (callable_obj, args, kw:PPyObject):PPyObject; cdecl; PyEval_GetFrame:function :PPyObject; cdecl; PyEval_GetGlobals:function :PPyObject; cdecl; @@ -1546,6 +1614,9 @@ TPythonInterface=class(TDynamicDll) PyObject_GC_Del:procedure (ob:PPyObject); cdecl; PyObject_GC_Track:procedure (ob:PPyObject); cdecl; PyObject_GC_UnTrack:procedure (ob:PPyObject); cdecl; + PyObject_CheckBuffer: function(obj: PPyObject): Integer; cdecl; + PyObject_GetBuffer: function(obj: PPyObject; view: PPy_buffer; flags: Integer): Integer; cdecl; + PyObject_CopyData: function (dest: PPyObject; src: PPyObject): Integer; cdecl; PySequence_Check:function (ob:PPyObject):integer; cdecl; PySequence_Concat:function (ob1,ob2:PPyObject):PPyObject; cdecl; PySequence_Count:function (ob1,ob2:PPyObject):integer; cdecl; @@ -2427,6 +2498,8 @@ TPyObject = class function Iter : PPyObject; virtual; function IterNext : PPyObject; virtual; function Init( args, kwds : PPyObject ) : Integer; virtual; + function GetBuffer(view: PPy_buffer; flags: Integer): Integer; virtual; + procedure ReleaseBuffer(view: PPy_buffer); virtual; // Number services function NbAdd( obj : PPyObject) : PPyObject; virtual; @@ -2495,7 +2568,8 @@ TPyObjectClass = class of TPyObject; // since version 2.1 bsRichCompare, // since version 2.2 - bsIter, bsIterNext); + bsIter, bsIterNext, + bsBuffer); TNumberServices = set of (nsAdd, nsSubtract, nsMultiply, nsRemainder, nsDivmod, nsPower, nsNegative, nsPositive, @@ -2571,6 +2645,7 @@ TPythonType = class(TGetSetContainer) FTypeFlags : TPFlags; FCreateFunc : PPyObject; FCreateFuncDef : PyMethodDef; + FBufferProcs: PyBufferProcs; FGenerateCreateFunction: Boolean; procedure Notification( AComponent: TComponent; @@ -3550,6 +3625,8 @@ procedure TPythonInterface.MapDll; PyExc_UnicodeDecodeError := Import('PyExc_UnicodeDecodeError'); PyExc_UnicodeEncodeError := Import('PyExc_UnicodeEncodeError'); PyExc_UnicodeTranslateError:= Import('PyExc_UnicodeTranslateError'); + PyExc_BufferError := Import('PyExc_BufferError'); + PyType_Type := Import('PyType_Type'); PyCFunction_Type := Import('PyCFunction_Type'); PyCode_Type := Import('PyCode_Type'); @@ -3639,7 +3716,17 @@ procedure TPythonInterface.MapDll; PySys_SetArgv := Import('PySys_SetArgv'); Py_Exit := Import('Py_Exit'); - PyCFunction_NewEx := Import('PyCFunction_NewEx'); + PyCFunction_NewEx := Import('PyCFunction_NewEx'); + + PyBuffer_GetPointer := Import('PyBuffer_GetPointer'); + PyBuffer_ToContiguous := Import('PyBuffer_ToContiguous'); + PyBuffer_FromContiguous := Import('PyBuffer_FromContiguous'); + PyBuffer_IsContiguous := Import('PyBuffer_IsContiguous'); + PyBuffer_FillContiguousStrides := Import('PyBuffer_FillContiguousStrides'); + PyBuffer_FillInfo := Import('PyBuffer_FillInfo'); + PyBuffer_Release := Import('PyBuffer_Release'); + if (FMajorVersion > 3) or (FMinorVersion > 9) then + PyBuffer_SizeFromFormat := Import('PyBuffer_SizeFromFormat'); PyEval_CallObjectWithKeywords:= Import('PyEval_CallObjectWithKeywords'); PyEval_GetFrame := Import('PyEval_GetFrame'); @@ -3757,6 +3844,9 @@ procedure TPythonInterface.MapDll; PyObject_GC_Del := Import('PyObject_GC_Del'); PyObject_GC_Track := Import('PyObject_GC_Track'); PyObject_GC_UnTrack := Import('PyObject_GC_UnTrack'); + PyObject_CheckBuffer := Import('PyObject_CheckBuffer'); + PyObject_GetBuffer := Import('PyObject_GetBuffer'); + PyObject_CopyData := Import('PyObject_CopyData'); PySequence_Check := Import('PySequence_Check'); PySequence_Concat := Import('PySequence_Concat'); PySequence_Count := Import('PySequence_Count'); @@ -5263,6 +5353,8 @@ procedure TPythonEngine.RaiseError; raise Define( EPyValueError.Create(''), s_type, s_value ) else if (PyErr_GivenExceptionMatches(err_type, PyExc_ReferenceError^) <> 0) then raise Define( EPyReferenceError.Create(''), s_type, s_value ) + else if (PyErr_GivenExceptionMatches(err_type, PyExc_BufferError^) <> 0) then + raise Define( EPyBufferError.Create(''), s_type, s_value ) else if (PyErr_GivenExceptionMatches(err_type, PyExc_SystemError^) <> 0) then raise Define( EPySystemError.Create(''), s_type, s_value ) else if (PyErr_GivenExceptionMatches(err_type, PyExc_MemoryError^) <> 0) then @@ -7589,6 +7681,16 @@ function TPyObject.GetAttrO( key: PPyObject) : PPyObject; Result := GetPythonEngine.PyObject_GenericGetAttr(GetSelf, key); end; +function TPyObject.GetBuffer(view: PPy_buffer; flags: Integer): Integer; +// Default implementation that raises an exception +// Subclass implementing the buffer protocol will need to override this +begin + view^.obj := nil; + with GetPythonEngine do + PyErr_SetObject(PyExc_BufferError^, PyUnicodeFromString('')); + Result := -1; +end; + function TPyObject.SetAttrO( key, value: PPyObject) : Integer; begin Result := GetPythonEngine.PyObject_GenericSetAttr(GetSelf, key, value); @@ -7884,6 +7986,11 @@ class procedure TPyObject.RegisterMethods( APythonType : TPythonType ); begin end; +procedure TPyObject.ReleaseBuffer(view: PPy_buffer); +begin + // Do nothing. Subclasses may provide an implementation. +end; + class procedure TPyObject.RegisterMembers( APythonType : TPythonType ); begin end; @@ -8183,6 +8290,16 @@ function TPythonType_InitSubtype( pSelf, args, kwds : PPyObject) : Integer; cde Result := PythonToDelphi(pSelf).Init(args, kwds); end; +function TPythonType_GetBuffer(exporter: PPyObject; view: PPy_buffer; flags: Integer): Integer; cdecl; +begin + Result := PythonToDelphi(exporter).GetBuffer(view, flags); +end; + +procedure TPythonType_ReleaseBuffer(exporter: PPyObject; view: PPy_buffer); cdecl; +begin + PythonToDelphi(exporter).ReleaseBuffer(view); +end; + function TPythonType.NewSubtypeInst( aType: PPyTypeObject; args, kwds : PPyObject) : PPyObject; var obj : TPyObject; @@ -8483,6 +8600,12 @@ procedure TPythonType.InitServices; tp_iter := TPythonType_Iter; if bsIterNext in Services.Basic then tp_iternext := TPythonType_IterNext; + if bsBuffer in Services.Basic then + begin + FBufferProcs.bf_getbuffer := TPythonType_GetBuffer; + FBufferProcs.bf_releasebuffer := TPythonType_ReleaseBuffer; + tp_as_buffer := @FBufferProcs; + end; if tpfBaseType in TypeFlags then begin tp_init := TPythonType_InitSubtype; From 5bd8da54d69e7511eca96e56cbb3517d59b371a2 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 30 Oct 2023 22:00:32 +0200 Subject: [PATCH 099/174] Fix #441 True thread parallelism using the new emNewInterpreterOwnGIL thread execution mode in Python 12 --- Demos/Demo33/SortThds.pas | 9 +- Demos/Demo33/ThSort.pas | 5 +- Demos/Demo36/ParallelPython.dpr | 121 ++++++++++++++++++++ Demos/readme.txt | 1 + Source/PythonEngine.pas | 89 +++++++++++--- Tutorials/Webinar I/ModuleDemo/MainForm.dfm | 26 +++-- 6 files changed, 219 insertions(+), 32 deletions(-) create mode 100644 Demos/Demo36/ParallelPython.dpr diff --git a/Demos/Demo33/SortThds.pas b/Demos/Demo33/SortThds.pas index 39263e36..28a85d53 100644 --- a/Demos/Demo33/SortThds.pas +++ b/Demos/Demo33/SortThds.pas @@ -1,11 +1,10 @@ unit SortThds; - interface uses - Classes, + Types, Classes, Graphics, ExtCtrls, Forms, PythonEngine; @@ -125,11 +124,11 @@ procedure TSortThread.ExecuteWithPython; try with GetPythonEngine do begin - if Assigned(FModule) and (ThreadExecMode = emNewInterpreter) then + if Assigned(FModule) and (ThreadExecMode <> emNewState) then FModule.InitializeForNewInterpreter; if Assigned(fScript) then ExecStrings(fScript); - pyfunc := FindFunction( ExecModule, fpyfuncname); + pyfunc := FindFunction(ExecModule, utf8encode(fpyfuncname)); if Assigned(pyfunc) then try EvalFunction(pyfunc,[NativeInt(self),0,FSize]); @@ -159,7 +158,7 @@ procedure TSortThread.Stop; function TSortThread.getvalue(i: integer): integer; begin if Terminated then - raise EPythonError.Create( 'Pythonthread terminated'); + raise EPythonError.Create('Pythonthread terminated'); Result := FSortArray^[i]; end; diff --git a/Demos/Demo33/ThSort.pas b/Demos/Demo33/ThSort.pas index adf7156b..fdfb5f17 100644 --- a/Demos/Demo33/ThSort.pas +++ b/Demos/Demo33/ThSort.pas @@ -117,14 +117,17 @@ procedure TThreadSortForm.InitThreads(ThreadExecMode: TThreadExecMode; script: T Thread1 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc1', BubbleSortBox, BubbleSortArray); + Thread1.InterpreterConfig := _PyInterpreterConfig_INIT; Thread1.OnTerminate := ThreadDone; Thread2 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc2', SelectionSortBox, SelectionSortArray); + Thread2.InterpreterConfig := _PyInterpreterConfig_INIT; Thread2.OnTerminate := ThreadDone; Thread3 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc3', QuickSortBox, QuickSortArray); + Thread3.InterpreterConfig := _PyInterpreterConfig_INIT; Thread3.OnTerminate := ThreadDone; end; @@ -144,7 +147,7 @@ procedure TThreadSortForm.Start1BtnClick(Sender: TObject); procedure TThreadSortForm.Start3BtnClick(Sender: TObject); begin - InitThreads(emNewInterpreter, PythonMemo.Lines); + InitThreads(emNewInterpreterOwnGIL, PythonMemo.Lines); //PythonEngine1.ExecStrings(PythonMemo.Lines); end; diff --git a/Demos/Demo36/ParallelPython.dpr b/Demos/Demo36/ParallelPython.dpr new file mode 100644 index 00000000..63c9b8fc --- /dev/null +++ b/Demos/Demo36/ParallelPython.dpr @@ -0,0 +1,121 @@ +program ParallelPython; + +{$APPTYPE CONSOLE} + +{$R *.res} + +uses + System.SysUtils, + System.Diagnostics, + System.Variants, + System.SyncObjs, + PythonEngine, + VarPyth; + +var + PythonEngine: TPythonEngine; + +procedure CreatePyEngine; +begin + PythonEngine := TPythonEngine.Create(nil); + PythonEngine.Name := 'PythonEngine'; + PythonEngine.LoadDll; + TPythonThread.Py_Begin_Allow_Threads; +end; + +procedure DestroyEngine; +begin + TPythonThread.Py_End_Allow_Threads; + PythonEngine.Free; +end; + +const + N = 5; + Script = + 'import math'#10 + + ''#10 + + 'def is_prime(n):'#10 + + ' """ totally naive implementation """'#10 + + ' if n <= 1:'#10 + + ' return False'#10 + + ''#10 + + ' q = math.floor(math.sqrt(n))'#10 + + ' for i in range(2, q + 1):'#10 + + ' if (n % i == 0):'#10 + + ' return False'#10 + + ' return True'#10 + + ''#10 + + ''#10 + + 'def count_primes(max_n):'#10 + + ' res = 0'#10 + + ' for i in range(2, max_n + 1):'#10 + + ' if is_prime(i):'#10 + + ' res += 1'#10 + + ' return res'#10 + + ''#10 + + 'print("prime count", count_primes(1000000))'#10 + + ''#10; + +var + Event: TCountdownEvent; + +type + TPyThread = class(TPythonThread) + protected + procedure ExecuteWithPython; override; + public + constructor Create(ThreadMode: TThreadExecMode); + end; + +procedure TPyThread.ExecuteWithPython; +begin + GetPythonEngine.ExecString(Script); + Event.Signal; +end; + +constructor TPyThread.Create(ThreadMode: TThreadExecMode); +begin + inherited Create; + ThreadExecMode := ThreadMode; + FreeOnTerminate := True; + InterpreterConfig := _PyInterpreterConfig_INIT; +end; + +var + SW: TStopwatch; + I: Integer; +begin + try + CreatePyEngine; + try + Event := TCountdownEvent.Create(N); + WriteLn('Classic Subinterpreter:'); + SW := TStopwatch.StartNew; + for I := 1 to N do + TPyThread.Create(emNewState); + Event.WaitFor; + Event.Free; + SW.Stop; + WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); + WriteLn; + + Event := TCountdownEvent.Create(N); + WriteLn('Subinterpreter with own GIL:'); + SW := TStopwatch.StartNew; + for I := 1 to N do + TPyThread.Create(emNewInterpreterOwnGIL); + Event.WaitFor; + Event.Free; + SW.Stop; + WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); + WriteLn; + finally + DestroyEngine; + end; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; + ReadLn; +end. + diff --git a/Demos/readme.txt b/Demos/readme.txt index 57056428..906286d5 100644 --- a/Demos/readme.txt +++ b/Demos/readme.txt @@ -32,3 +32,4 @@ Demo32 Demo08 revisited using WrapDelphi Demo33 Using Threads inside Python Demo34 Dynamically creating, destroying and recreating PythonEngine. Uses PythonVersions Demo35 Fast access to numpy arrays using the buffer protocol +Demo36 True thread parallelism using the new emNewInterpreterOwnGIL thread execution mode in Python 12 diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index b40fa5ee..4cd3c997 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -956,28 +956,35 @@ PyBufferProcs = record //bytearrayobject.h - //typedef struct { - // PyObject_VAR_HEAD - // Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ - // char *ob_bytes; /* Physical backing buffer */ - // char *ob_start; /* Logical start inside ob_bytes */ - // Py_ssize_t ob_exports; /* How many buffer exports */ - //} PyByteArrayObject; - PyByteArrayObject = {$IFDEF CPUX86}packed{$ENDIF} record - // Start of PyObject_VAR_HEAD - // Start of the Head of an object - ob_base: PyObject; - ob_size: Py_ssize_t; - // End of the Head of an object + ob_refcnt: NativeInt; + ob_type: PPyTypeObject; + ob_alloc: Py_ssize_t; ob_bytes: PAnsiChar; ob_start: PAnsiChar; ob_exports: Py_ssize_t; end; + //initconfig.h + +const + _PyStatus_TYPE_OK = 0; + _PyStatus_TYPE_ERROR = 1; + _PyStatus_TYPE_EXIT = 2; + +type + TPyStatus_Type = Integer; + + PyStatus = {$IFDEF CPUX86}packed{$ENDIF} record + _type: TPyStatus_Type; + func: PAnsiChar; + err_msg: PAnsiChar; + exitcode: Integer; + end; + //####################################################### //## ## -//## GIL state ## +//## GIL related ## //## ## //####################################################### const @@ -986,12 +993,40 @@ PyBufferProcs = record type PyGILState_STATE = type Integer; // (PyGILState_LOCKED, PyGILState_UNLOCKED); + // Introduced in Python 12 +const + PyInterpreterConfig_DEFAULT_GIL = 0; + PyInterpreterConfig_SHARED_GIL = 1; + PyInterpreterConfig_OWN_GIL = 2; + + type + PPyInterpreterConfig = ^PyInterpreterConfig; + PyInterpreterConfig = {$IFDEF CPUX86}packed{$ENDIF} record + use_main_obmalloc: Integer; + allow_fork: Integer; + allow_exec: Integer; + allow_threads: Integer; + allow_daemon_threads: Integer; + check_multi_interp_extensions: Integer; + gil: Integer; + end; + +const + _PyInterpreterConfig_INIT: PyInterpreterConfig = + ( use_main_obmalloc: 0; + allow_fork: 0; + allow_exec: 0; + allow_threads: 1; + allow_daemon_threads: 0; + check_multi_interp_extensions: 1; + gil: PyInterpreterConfig_OWN_GIL); + //####################################################### //## ## //## New exception classes ## //## ## //####################################################### - +type // Components' exceptions EDLLLoadError = class(Exception); EDLLImportError = class(Exception) @@ -1709,6 +1744,7 @@ TPythonInterface=class(TDynamicDll) Py_IsInitialized : function : integer; cdecl; Py_GetProgramFullPath : function : PAnsiChar; cdecl; Py_NewInterpreter : function : PPyThreadState; cdecl; + Py_NewInterpreterFromConfig : function( tstate: PPyThreadState; config: PPyInterpreterConfig): PyStatus; cdecl; Py_EndInterpreter : procedure( tstate: PPyThreadState); cdecl; PyEval_AcquireLock : procedure; cdecl; PyEval_ReleaseLock : procedure; cdecl; @@ -2798,7 +2834,7 @@ TPyVar = class(TPyObject) //## Thread Object with Python interpreter lock ## //## ## //####################################################### - TThreadExecMode = (emNewState, emNewInterpreter); + TThreadExecMode = (emNewState, emNewInterpreter, emNewInterpreterOwnGIL); {$HINTS OFF} TPythonThread = class(TThread) @@ -2813,6 +2849,7 @@ TPythonThread = class(TThread) protected procedure ExecuteWithPython; virtual; abstract; public + InterpreterConfig: PyInterpreterConfig; class procedure Py_Begin_Allow_Threads; class procedure Py_End_Allow_Threads; // The following procedures are redundant and only for @@ -2863,6 +2900,7 @@ function SysVersionFromDLLName(const DLLFileName : string): string; procedure PythonVersionFromDLLName(LibName: string; out MajorVersion, MinorVersion: integer); function PythonVersionFromRegVersion(const ARegVersion: string; out AMajorVersion, AMinorVersion: integer): boolean; +function PyStatus_Exception(const APyStatus: PyStatus): Boolean; { Helper functions} (* @@ -3950,6 +3988,8 @@ procedure TPythonInterface.MapDll; Py_GetProgramFullPath := Import('Py_GetProgramFullPath'); Py_GetBuildInfo := Import('Py_GetBuildInfo'); Py_NewInterpreter := Import('Py_NewInterpreter'); + if (FMajorVersion > 3) or (FMinorVersion >= 12) then + Py_NewInterpreterFromConfig := Import('Py_NewInterpreterFromConfig'); Py_EndInterpreter := Import('Py_EndInterpreter'); PyEval_AcquireLock := Import('PyEval_AcquireLock'); PyEval_ReleaseLock := Import('PyEval_ReleaseLock'); @@ -9237,8 +9277,9 @@ procedure TPyVar.SetValueFromVariant( const value : Variant ); procedure TPythonThread.Execute; var - global_state : PPyThreadState; - gilstate : PyGILState_STATE; + global_state: PPyThreadState; + gilstate: PyGILState_STATE; + Status: PyStatus; begin with GetPythonEngine do begin @@ -9256,7 +9297,12 @@ procedure TPythonThread.Execute; gilstate := PyGILState_Ensure(); global_state := PyThreadState_Get; PyThreadState_Swap(nil); - fThreadState := Py_NewInterpreter; + + if (fThreadExecMode = emNewInterpreter) or + ((FMajorVersion = 3) and (FMinorVersion < 12)) or + PyStatus_Exception(Py_NewInterpreterFromConfig(@fThreadState, @InterpreterConfig)) + then + fThreadState := Py_NewInterpreter; if Assigned( fThreadState) then begin @@ -9705,5 +9751,10 @@ function PythonVersionFromRegVersion(const ARegVersion: string; Result := (AMajorVersion > 0) and (AMinorVersion > 0); end; +function PyStatus_Exception(const APyStatus: PyStatus): Boolean; +begin + Result := APyStatus._type <> _PyStatus_TYPE_OK; +end; + end. diff --git a/Tutorials/Webinar I/ModuleDemo/MainForm.dfm b/Tutorials/Webinar I/ModuleDemo/MainForm.dfm index d9ba6fe0..f73ad510 100644 --- a/Tutorials/Webinar I/ModuleDemo/MainForm.dfm +++ b/Tutorials/Webinar I/ModuleDemo/MainForm.dfm @@ -10,8 +10,6 @@ object Form1: TForm1 Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] - OldCreateOrder = False - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -21,8 +19,6 @@ object Form1: TForm1 Cursor = crVSplit Align = alTop ResizeStyle = rsUpdate - ExplicitTop = 201 - ExplicitWidth = 383 end object sePythonCode: TSynEdit Left = 0 @@ -43,6 +39,24 @@ object Form1: TForm1 Gutter.Font.Height = -11 Gutter.Font.Name = 'Consolas' Gutter.Font.Style = [] + Gutter.Bands = < + item + Kind = gbkMarks + Width = 13 + end + item + Kind = gbkLineNumbers + end + item + Kind = gbkFold + end + item + Kind = gbkTrackChanges + end + item + Kind = gbkMargin + Width = 3 + end> Highlighter = SynPythonSyn Lines.Strings = ( 'from timeit import Timer' @@ -78,6 +92,7 @@ object Form1: TForm1 '' 'if __name__ == '#39'__main__'#39':' ' main()') + SelectedColor.Alpha = 0.400000005960464500 end object HeaderControl1: THeaderControl Left = 0 @@ -177,9 +192,6 @@ object Form1: TForm1 end end object SynPythonSyn: TSynPythonSyn - Options.AutoDetectEnabled = False - Options.AutoDetectLineLimit = 0 - Options.Visible = False Left = 760 Top = 32 end From db29eb09f7133d22f10ae14ec2bb9053108d7b3b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 31 Oct 2023 16:39:17 +0200 Subject: [PATCH 100/174] Remove compiler hints --- Tests/MethodCallBackTest.pas | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Tests/MethodCallBackTest.pas b/Tests/MethodCallBackTest.pas index 0b869a59..d6c2c21a 100644 --- a/Tests/MethodCallBackTest.pas +++ b/Tests/MethodCallBackTest.pas @@ -155,13 +155,17 @@ procedure TMethodCallbackTest.TestBug01; Assert.AreEqual(0, CodeMemPageCount); for i:=1 to AllocCount do + begin ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgCdeclProcedure, 5, ctCdecl); + Assert.IsTrue(ptr <> nil); + end; // there should still be 1 page allocated Assert.AreEqual(1, CodeMemPageCount); // get one callback more and we should have 2 pages ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgCdeclProcedure, 5, ctCdecl); + Assert.IsTrue(ptr <> nil); // getting CodeMemPageCount would crash as the next page pointer was overwritten by the // last allocation Assert.AreEqual(2, CodeMemPageCount); @@ -271,7 +275,10 @@ procedure TMethodCallbackTest.TestMemoryMgmt; Assert.AreEqual(0, CodeMemPageCount); for i:=1 to AllocCount do + begin ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgCdeclProcedure, 3, ctCdecl); + Assert.IsTrue(ptr <> nil); + end; // there should still be 1 page allocated Assert.AreEqual(1, CodeMemPageCount); @@ -297,6 +304,7 @@ procedure TMethodCallbackTest.TestMemoryMgmt; // allocate one more and page count should go up to 2 again ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgCdeclProcedure, 3, ctCdecl); + Assert.IsTrue(ptr <> nil); Assert.AreEqual(2, CodeMemPageCount); end; From 14c5cae3e68ead7a48b7f386b2694d1c3b3ee402 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 31 Oct 2023 16:40:30 +0200 Subject: [PATCH 101/174] Minor improvements in WrapDelphiTest.pas --- Tests/WrapDelphiTest.pas | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 6e9f8f63..941d24bb 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -138,7 +138,7 @@ TTestWrapDelphi = class(TObject) [Test] procedure TestGetStaticArray; [Test] - procedure TestMethodWithVarAndOverload; + procedure TestMethodWithdOverloads; [Test] procedure TestFreeReturnedObject; [Test] @@ -528,10 +528,12 @@ procedure TTestWrapDelphi.TestDynArrayParameters; Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); end; -procedure TTestWrapDelphi.TestMethodWithVarAndOverload; +procedure TTestWrapDelphi.TestMethodWithdOverloads; begin Rtti_Var.SetStringField('test'); Assert.AreEqual('test', TestRttiAccess.StringField); + Rtti_Var.SetStringField(123); + Assert.AreEqual('123', TestRttiAccess.StringField); end; procedure TTestRttiAccess.SetIndexed(I: Integer; const Value: Integer); From ca030cc76b08a8152b2e6a4af4e727f3a9cd837b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 31 Oct 2023 16:42:58 +0200 Subject: [PATCH 102/174] Optimize calls to Get/SetRttiAttr for exposed Properties and Fields. The name lookups have been eliminated. --- Source/PythonEngine.pas | 1 - Source/WrapDelphi.pas | 191 ++++++++++++++++++++++++---------------- 2 files changed, 116 insertions(+), 76 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 4cd3c997..c4c0839f 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -9279,7 +9279,6 @@ procedure TPythonThread.Execute; var global_state: PPyThreadState; gilstate: PyGILState_STATE; - Status: PyStatus; begin with GetPythonEngine do begin diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index a57594ef..fe4b4608 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1217,12 +1217,18 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; const VarParamIndices: TArray; AParentAddrIsClass: Boolean = false): PPyObject; overload; forward; -function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; - const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; - out ErrMsg: string): PPyObject; forward; +function GetRttiProperty(ParentAddr: Pointer; Prop: TRttiProperty; + PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; forward; -function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType; - const AttrName: string; Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; +function GetRttiField(ParentAddr: Pointer; Field: TRttiField; + PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; forward; + +function SetRttiProperty(const ParentAddr: Pointer; Prop: TRttiProperty; + Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; + out ErrMsg: string): Boolean; forward; + +function SetRttiField(const ParentAddr: Pointer; Field: TRttiField; + Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): Boolean; forward; function ValidateClassProperty(PyValue: PPyObject; TypeInfo: PTypeInfo; @@ -1504,9 +1510,12 @@ function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyO begin Result := nil; if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then - // TODO: Optimize out the property/field lookup, by passing FRttiMember - // directly to a GetRttiAttr/SetRtti overload - Result := GetRttiAttr(Obj, FParentRtti, FRttiMember.Name, FPyDelphiWrapper, LOutMsg); + begin + if FRttiMember is TRttiProperty then + Result := GetRttiProperty(Obj, TRttiProperty(FRttiMember), FPyDelphiWrapper, LOutMsg) + else if FRttiMember is TRttiField then + Result := GetRttiField(Obj, TRttiField(FRttiMember), FPyDelphiWrapper, LOutMsg); + end; if not Assigned(Result) then with GetPythonEngine do @@ -1520,10 +1529,15 @@ function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer ErrMsg: string; begin Result := -1; - if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, ErrMsg) and - SetRttiAttr(Obj, FParentRtti, FRttiMember.Name, AValue, FPyDelphiWrapper, ErrMsg) - then - Result := 0; + if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, ErrMsg) then + begin + if ((FRttiMember is TRttiProperty) and SetRttiProperty(Obj, + TRttiProperty(FRttiMember), AValue, FPyDelphiWrapper, ErrMsg)) or + ((FRttiMember is TRttiField) and SetRttiField(Obj, + TRttiField(FRttiMember), AValue, FPyDelphiWrapper, ErrMsg)) + then + Result := 0 + end; if Result <> 0 then with GetPythonEngine do @@ -3134,6 +3148,46 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; end; end; +function GetRttiProperty(ParentAddr: Pointer; Prop: TRttiProperty; + PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; +begin + Result := nil; + if Ord(Prop.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if not Prop.IsReadable then + ErrMsg := rs_NotReadable + else if Prop.PropertyType = nil then + ErrMsg := rs_ErrNoTypeInfo + else if Prop.PropertyType.TypeKind = tkMethod then + begin + if (Prop is TRttiInstanceProperty) and (Prop.Visibility = mvPublished) then + Result := PyDelphiWrapper.fEventHandlerList.GetCallable(TObject(ParentAddr), + TRttiInstanceProperty(Prop).PropInfo); + end + else + Result := TValueToPyObject(Prop.GetValue(ParentAddr), PyDelphiWrapper, ErrMsg); +end; + +function GetRttiField(ParentAddr: Pointer; Field: TRttiField; + PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; +begin + Result := nil; + if Ord(Field.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if Field.FieldType = nil then + ErrMsg := rs_ErrNoTypeInfo + else if Field.FieldType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then + //Potentially dangerous as the returned value, which is a pointer into the object, + //could be stored on the python side, then the object freed, and the stored pointer later + //used to access no longer allocated memory + //But I can't see any good alternative if Python should be able to write directly into + //fields of a record that's part of an object. + Result := PyDelphiWrapper.WrapRecord(PByte(ParentAddr) + Field.Offset, TRttiStructuredType(Field.FieldType)) + else + Result := TValueToPyObject(Field.GetValue(ParentAddr), PyDelphiWrapper, ErrMsg); +end; + + function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; const AttrName: string; PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; @@ -3161,41 +3215,12 @@ function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; begin Prop := ParentType.GetProperty(AttrName); if Prop <> nil then - begin - if Ord(Prop.Visibility) < Ord(mvPublic) then - ErrMsg := rs_NoAccess - else if not Prop.IsReadable then - ErrMsg := rs_NotReadable - else if Prop.PropertyType = nil then - ErrMsg := rs_ErrNoTypeInfo - else if Prop.PropertyType.TypeKind = tkMethod then - begin - if (ParentType is TRttiInstanceType) and (Prop is TRttiInstanceProperty) then - Result := PyDelphiWrapper.fEventHandlerList.GetCallable(TObject(ParentAddr), - TRttiInstanceProperty(Prop).PropInfo); - end - else - Result := TValueToPyObject(Prop.GetValue(ParentAddr), PyDelphiWrapper, ErrMsg); - end + Result := GetRttiProperty(ParentAddr, Prop, PyDelphiWrapper, ErrMsg) else begin Field := ParentType.GetField(AttrName); if Field <> nil then - begin - if Ord(Field.Visibility) < Ord(mvPublic) then - ErrMsg := rs_NoAccess - else if Field.FieldType = nil then - ErrMsg := rs_ErrNoTypeInfo - else if Field.FieldType.TypeKind in [tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}] then - //Potentially dangerous as the returned value, which is a pointer into the object, - //could be stored on the python side, then the object freed, and the stored pointer later - //used to access no longer allocated memory - //But I can't see any good alternative if Python should be able to write directly into - //fields of a record that's part of an object. - Result := PyDelphiWrapper.WrapRecord(PByte(ParentAddr) + Field.Offset, TRttiStructuredType(Field.FieldType)) - else - Result := TValueToPyObject(Field.GetValue(ParentAddr), PyDelphiWrapper, ErrMsg); - end + Result := GetRttiField(ParentAddr, Field, PyDelphiWrapper, ErrMsg) else ErrMsg := rs_UnknownAttribute; end; @@ -3208,6 +3233,52 @@ function GetRttiAttr(ParentAddr: Pointer; ParentType: TRttiStructuredType; end; end; +function SetRttiProperty(const ParentAddr: Pointer; Prop: TRttiProperty; + Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; + out ErrMsg: string): Boolean; +var + AttrValue: TValue; +begin + Result := False; + if Ord(Prop.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if not Prop.IsWritable then + ErrMsg := rs_NotWritable + else if Prop.PropertyType = nil then + ErrMsg := rs_ErrNoTypeInfo + else if Prop.PropertyType.TypeKind = tkMethod then + begin + if (Prop is TRttiInstanceProperty) and (Prop.Visibility = mvPublished) then + Result := PyDelphiWrapper.EventHandlers.Link(TObject(ParentAddr), + (Prop as TRttiInstanceProperty).PropInfo, Value, ErrMsg) + else + ErrMsg := rs_NotPublished; + end + else if PyObjectToTValue(Value, Prop.PropertyType, AttrValue, ErrMsg) then + begin + Prop.SetValue(ParentAddr, AttrValue); + Result := True; + end; +end; + +function SetRttiField(const ParentAddr: Pointer; Field: TRttiField; + Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; + out ErrMsg: string): Boolean; +var + AttrValue: TValue; +begin + Result := False; + if Ord(Field.Visibility) < Ord(mvPublic) then + ErrMsg := rs_NoAccess + else if Field.FieldType = nil then + ErrMsg := rs_ErrNoTypeInfo + else if PyObjectToTValue(Value, Field.FieldType, AttrValue, ErrMsg) then + begin + Field.SetValue(ParentAddr, AttrValue); + Result := True; + end; +end; + function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType; const AttrName: string; Value: PPyObject; PyDelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): Boolean; @@ -3221,42 +3292,12 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType try Prop := ParentType.GetProperty(AttrName); if Prop <> nil then - begin - if Ord(Prop.Visibility) < Ord(mvPublic) then - ErrMsg := rs_NoAccess - else if not Prop.IsWritable then - ErrMsg := rs_NotWritable - else if Prop.PropertyType = nil then - ErrMsg := rs_ErrNoTypeInfo - else if Prop.PropertyType.TypeKind = tkMethod then - begin - if Prop.Visibility = mvPublished then - Result := PyDelphiWrapper.EventHandlers.Link(TObject(ParentAddr), - (Prop as TRttiInstanceProperty).PropInfo, Value, ErrMsg) - else - ErrMsg := rs_NotPublished; - end - else if PyObjectToTValue(Value, Prop.PropertyType, AttrValue, ErrMsg) then - begin - Prop.SetValue(ParentAddr, AttrValue); - Result := True; - end; - end + Result := SetRttiProperty(ParentAddr, Prop, Value, PyDelphiWrapper, ErrMsg) else begin Field := ParentType.GetField(AttrName); if Field <> nil then - begin - if Ord(Field.Visibility) < Ord(mvPublic) then - ErrMsg := rs_NoAccess - else if Field.FieldType = nil then - ErrMsg := rs_ErrNoTypeInfo - else if PyObjectToTValue(Value, Field.FieldType, AttrValue, ErrMsg) then - begin - Field.SetValue(ParentAddr, AttrValue); - Result := True; - end; - end + Result := SetRttiField(ParentAddr, Field, Value, PyDelphiWrapper, ErrMsg) else ErrMsg := rs_UnknownAttribute; end; From 84b232e6bfd6e48e3e24588e4d2d4b4eee5d02a8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 31 Oct 2023 20:20:44 +0200 Subject: [PATCH 103/174] Minor refactoring. There is no need to typecast type objects. --- Source/PythonEngine.pas | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index c4c0839f..2352893b 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4063,7 +4063,7 @@ function TPythonInterface.PyByteArray_Check(obj: PPyObject): Boolean; function TPythonInterface.PyByteArray_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyByteArray_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyByteArray_Type); end; function TPythonInterface.PyBytes_Check( obj : PPyObject ) : Boolean; @@ -4073,7 +4073,7 @@ function TPythonInterface.PyBytes_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyBytes_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyBytes_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyBytes_Type); end; function TPythonInterface.PyFloat_Check( obj : PPyObject ) : Boolean; @@ -4083,7 +4083,7 @@ function TPythonInterface.PyFloat_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyFloat_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyFloat_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyFloat_Type); end; function TPythonInterface.PyLong_Check( obj : PPyObject ) : Boolean; @@ -4093,7 +4093,7 @@ function TPythonInterface.PyLong_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyLong_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyLong_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyLong_Type); end; function TPythonInterface.PyTuple_Check( obj : PPyObject ) : Boolean; @@ -4103,7 +4103,7 @@ function TPythonInterface.PyTuple_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyTuple_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyTuple_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyTuple_Type); end; function TPythonInterface.PyClass_Check( obj : PPyObject ) : Boolean; @@ -4113,12 +4113,12 @@ function TPythonInterface.PyClass_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyType_CheckExact( obj : PPyObject ) : Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyType_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyType_Type); end; function TPythonInterface.PyMethod_Check( obj : PPyObject ) : Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyMethod_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyMethod_Type); end; function TPythonInterface.PyList_Check( obj : PPyObject ) : Boolean; @@ -4128,7 +4128,7 @@ function TPythonInterface.PyList_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyList_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyList_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyList_Type); end; function TPythonInterface.PyDict_Check( obj : PPyObject ) : Boolean; @@ -4138,7 +4138,7 @@ function TPythonInterface.PyDict_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyDict_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyDict_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyDict_Type); end; function TPythonInterface.PyModule_Check( obj : PPyObject ) : Boolean; @@ -4148,7 +4148,7 @@ function TPythonInterface.PyModule_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyModule_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyModule_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyModule_Type); end; function TPythonInterface.PySlice_Check( obj : PPyObject ) : Boolean; @@ -4159,8 +4159,7 @@ function TPythonInterface.PySlice_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyFunction_Check( obj : PPyObject ) : Boolean; begin Result := Assigned( obj ) and - ((obj^.ob_type = PPyTypeObject(PyCFunction_Type)) or - (obj^.ob_type = PPyTypeObject(PyFunction_Type))); + ((obj^.ob_type = PyCFunction_Type) or (obj^.ob_type = PyFunction_Type)); end; function TPythonInterface.PyIter_Check(obj: PPyObject): Boolean; @@ -4175,7 +4174,7 @@ function TPythonInterface.PyUnicode_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyUnicode_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyUnicode_Type)); + Result := Assigned( obj ) and (obj^.ob_type = PyUnicode_Type); end; function TPythonInterface.PyType_IS_GC(t : PPyTypeObject ) : Boolean; @@ -4216,10 +4215,12 @@ function TPythonInterface.PyEnum_Check( obj : PPyObject ) : Boolean; Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyEnum_Type)); end; -function TPythonInterface.PyObject_TypeCheck(obj : PPyObject; t : PPyTypeObject) : Boolean; +function TPythonInterface.PyObject_TypeCheck(obj: PPyObject; t: PPyTypeObject): Boolean; begin - Result := Assigned(obj) and (obj^.ob_type = t); - if not Result and Assigned(obj) and Assigned(t) then + if not Assigned(obj) or not Assigned(t) then Exit(False); + + Result := obj^.ob_type = t; + if not Result then Result := PyType_IsSubtype(obj^.ob_type, t) = 1; end; @@ -4949,7 +4950,7 @@ procedure TPythonEngine.SetProgramName(const ProgramName: UnicodeString); function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; begin - result := ob^.ob_type = obt; + result := Assigned(ob) and (ob^.ob_type = obt); end; function TPythonEngine.EvalPyFunction(pyfunc, pyargs:PPyObject): Variant; From 153d02371381aeeb9b939bc96073f9aebaa44b30 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 31 Oct 2023 21:55:56 +0200 Subject: [PATCH 104/174] Fix #438 Refactored the CheckExact functions to use the inline function IsType --- Source/PythonEngine.pas | 64 ++++++++++++++++++++++++++++------------- Source/WrapDelphi.pas | 1 - 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 2352893b..54b48431 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1452,6 +1452,8 @@ TPythonInterface=class(TDynamicDll) _PyWeakref_CallableProxyType: PPyTypeObject; PyBool_Type: PPyTypeObject; PyEnum_Type: PPyTypeObject; + PySet_Type: PPyTypeObject; + PyFrozenSet_Type: PPyTypeObject; Py_GetBuildInfo: function : PAnsiChar; cdecl; PyImport_ExecCodeModule: function ( const name : AnsiString; codeobject : PPyObject) : PPyObject; cdecl; @@ -1684,6 +1686,14 @@ TPythonInterface=class(TDynamicDll) PyByteArray_FromObject: function(ob:PPyObject): PPyObject; cdecl; PyByteArray_FromStringAndSize: function(s: PAnsiChar; i: Py_ssize_t): PPyObject; cdecl; PyByteArray_Size: function(ob: PPyObject): Py_ssize_t; cdecl; + PyFrozenSet_New: function(iterable: PPyObject): PPyObject; cdecl; + PySet_New: function(iterable: PPyObject): PPyObject; cdecl; + PySet_Add: function(aset, key: PPyObject): Integer; cdecl; + PySet_Clear: function(aset: PPyObject): Integer; cdecl; + PySet_Contains: function(anyset, key: PPyObject): Integer; cdecl; + PySet_Discard: function(aset, key: PPyObject): Integer; cdecl; + PySet_Pop: function(aset: PPyObject): PPyObject; cdecl; + PySet_Size: function(anyset: PPyObject): Py_ssize_t; cdecl; PySys_GetObject:function (s:PAnsiChar):PPyObject; cdecl; PySys_SetObject:function (s:PAnsiChar;ob:PPyObject):integer; cdecl; PySys_SetPath:procedure(path:PAnsiChar); cdecl; @@ -1841,9 +1851,13 @@ TPythonInterface=class(TDynamicDll) function PyWeakref_CheckProxy( obj : PPyObject ) : Boolean; function PyBool_Check( obj : PPyObject ) : Boolean; function PyEnum_Check( obj : PPyObject ) : Boolean; - function PyObject_TypeCheck(obj:PPyObject; t:PPyTypeObject) : Boolean; function Py_InitModule( const md : PyModuleDef) : PPyObject; + // The following are defined as non-exported inline functions in object.h + function Py_Type(ob: PPyObject): PPyTypeObject; inline; + function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; inline; + function PyObject_TypeCheck(obj:PPyObject; t:PPyTypeObject) : Boolean; inline; + // Constructors & Destructors constructor Create(AOwner: TComponent); override; @@ -1977,7 +1991,6 @@ TPythonEngine = class(TPythonInterface) // Public methods procedure SetPythonHome(const PythonHome: UnicodeString); procedure SetProgramName(const ProgramName: UnicodeString); - function IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; function Run_CommandAsString(const command: AnsiString; mode: Integer; const FileName: string = ''): string; function Run_CommandAsObject(const command: AnsiString; mode: Integer; const FileName: string = ''): PPyObject; function Run_CommandAsObjectWithDict(const command: AnsiString; mode: Integer; locals, globals: PPyObject; const FileName: string = ''): PPyObject; @@ -3699,6 +3712,8 @@ procedure TPythonInterface.MapDll; _PyWeakref_CallableProxyType:=Import('_PyWeakref_CallableProxyType'); PyBool_Type := Import('PyBool_Type'); PyEnum_Type := Import('PyEnum_Type'); + PySet_Type := Import('PySet_Type'); + PyFrozenSet_Type := Import('PyFrozenSet_Type'); PyComplex_FromCComplex := Import('PyComplex_FromCComplex'); PyComplex_FromDoubles := Import('PyComplex_FromDoubles'); @@ -3921,6 +3936,14 @@ procedure TPythonInterface.MapDll; PyByteArray_FromObject := Import('PyByteArray_FromObject'); PyByteArray_FromStringAndSize := Import('PyByteArray_FromStringAndSize'); PyByteArray_Size := Import('PyByteArray_Size'); + PyFrozenSet_New := Import('PyFrozenSet_New'); + PySet_New := Import('PySet_New'); + PySet_Add := Import('PySet_Add'); + PySet_Clear := Import('PySet_Clear'); + PySet_Contains := Import('PySet_Contains'); + PySet_Discard := Import('PySet_Discard'); + PySet_Pop := Import('PySet_Pop'); + PySet_Size := Import('PySet_Size'); PySys_GetObject := Import('PySys_GetObject'); PySys_SetObject := Import('PySys_SetObject'); PySys_SetPath := Import('PySys_SetPath'); @@ -4083,7 +4106,7 @@ function TPythonInterface.PyFloat_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyFloat_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyFloat_Type); + Result := IsType(obj, PyFloat_Type); end; function TPythonInterface.PyLong_Check( obj : PPyObject ) : Boolean; @@ -4093,7 +4116,7 @@ function TPythonInterface.PyLong_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyLong_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyLong_Type); + Result := IsType(obj, PyLong_Type); end; function TPythonInterface.PyTuple_Check( obj : PPyObject ) : Boolean; @@ -4103,7 +4126,7 @@ function TPythonInterface.PyTuple_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyTuple_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyTuple_Type); + Result := IsType(obj, PyTuple_Type); end; function TPythonInterface.PyClass_Check( obj : PPyObject ) : Boolean; @@ -4113,7 +4136,7 @@ function TPythonInterface.PyClass_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyType_CheckExact( obj : PPyObject ) : Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyType_Type); + Result := IsType(obj, PyType_Type); end; function TPythonInterface.PyMethod_Check( obj : PPyObject ) : Boolean; @@ -4128,7 +4151,7 @@ function TPythonInterface.PyList_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyList_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyList_Type); + Result := IsType(obj, PyList_Type); end; function TPythonInterface.PyDict_Check( obj : PPyObject ) : Boolean; @@ -4138,7 +4161,7 @@ function TPythonInterface.PyDict_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyDict_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyDict_Type); + Result := IsType(obj, PyDict_Type); end; function TPythonInterface.PyModule_Check( obj : PPyObject ) : Boolean; @@ -4148,7 +4171,7 @@ function TPythonInterface.PyModule_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyModule_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyModule_Type); + Result := IsType(obj, PyModule_Type); end; function TPythonInterface.PySlice_Check( obj : PPyObject ) : Boolean; @@ -4174,7 +4197,7 @@ function TPythonInterface.PyUnicode_Check( obj : PPyObject ) : Boolean; function TPythonInterface.PyUnicode_CheckExact(obj: PPyObject): Boolean; begin - Result := Assigned( obj ) and (obj^.ob_type = PyUnicode_Type); + Result := IsType(obj, PyUnicode_Type); end; function TPythonInterface.PyType_IS_GC(t : PPyTypeObject ) : Boolean; @@ -4215,13 +4238,19 @@ function TPythonInterface.PyEnum_Check( obj : PPyObject ) : Boolean; Result := Assigned( obj ) and (obj^.ob_type = PPyTypeObject(PyEnum_Type)); end; -function TPythonInterface.PyObject_TypeCheck(obj: PPyObject; t: PPyTypeObject): Boolean; +function TPythonInterface.Py_Type(ob: PPyObject): PPyTypeObject; begin - if not Assigned(obj) or not Assigned(t) then Exit(False); + Result := ob^.ob_type; +end; - Result := obj^.ob_type = t; - if not Result then - Result := PyType_IsSubtype(obj^.ob_type, t) = 1; +function TPythonInterface.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; +begin + Result := ob^.ob_type = obt; +end; + +function TPythonInterface.PyObject_TypeCheck(obj: PPyObject; t: PPyTypeObject): Boolean; +begin + Result := IsType(obj, t) or (PyType_IsSubtype(obj^.ob_type, t) = 1); end; function TPythonInterface.Py_InitModule(const md: PyModuleDef): PPyObject; @@ -4948,11 +4977,6 @@ procedure TPythonEngine.SetProgramName(const ProgramName: UnicodeString); {$ENDIF} end; -function TPythonEngine.IsType(ob: PPyObject; obt: PPyTypeObject): Boolean; -begin - result := Assigned(ob) and (ob^.ob_type = obt); -end; - function TPythonEngine.EvalPyFunction(pyfunc, pyargs:PPyObject): Variant; var presult :PPyObject; begin diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index fe4b4608..423f3431 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3285,7 +3285,6 @@ function SetRttiAttr(const ParentAddr: Pointer; ParentType: TRttiStructuredType var Prop: TRttiProperty; Field: TRttiField; - AttrValue: TValue; begin Result := False; From dfd53b5f476c02ba2ca26d8c688c26075643c49f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 1 Nov 2023 00:15:03 +0200 Subject: [PATCH 105/174] Minor improvement to TPythonThread related to emNewInterpreterOwnGil --- Demos/Demo33/ThSort.dfm | 402 ++++++++++++++++---------------- Demos/Demo33/ThSort.pas | 3 - Demos/Demo36/ParallelPython.dpr | 3 +- Source/PythonEngine.pas | 12 +- 4 files changed, 211 insertions(+), 209 deletions(-) diff --git a/Demos/Demo33/ThSort.dfm b/Demos/Demo33/ThSort.dfm index 857c809d..fa04fa71 100644 --- a/Demos/Demo33/ThSort.dfm +++ b/Demos/Demo33/ThSort.dfm @@ -1,202 +1,200 @@ -object ThreadSortForm: TThreadSortForm - Left = 171 - Top = 19 - BorderStyle = bsDialog - Caption = 'Thread Sorting Demo' - ClientHeight = 564 - ClientWidth = 566 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True - Position = poScreenCenter - OnCloseQuery = FormCloseQuery - OnCreate = FormCreate - PixelsPerInch = 96 - TextHeight = 13 - object Bevel1: TBevel - Left = 8 - Top = 24 - Width = 177 - Height = 355 - end - object Bevel3: TBevel - Left = 376 - Top = 24 - Width = 177 - Height = 355 - end - object Bevel2: TBevel - Left = 192 - Top = 24 - Width = 177 - Height = 355 - end - object BubbleSortBox: TPaintBox - Left = 8 - Top = 24 - Width = 177 - Height = 355 - OnPaint = BubbleSortBoxPaint - end - object SelectionSortBox: TPaintBox - Left = 192 - Top = 24 - Width = 177 - Height = 355 - OnPaint = SelectionSortBoxPaint - end - object QuickSortBox: TPaintBox - Left = 376 - Top = 24 - Width = 177 - Height = 355 - OnPaint = QuickSortBoxPaint - end - object Label1: TLabel - Left = 8 - Top = 8 - Width = 49 - Height = 13 - Caption = 'SortFunc1' - end - object Label2: TLabel - Left = 192 - Top = 8 - Width = 49 - Height = 13 - Caption = 'SortFunc2' - end - object Label3: TLabel - Left = 376 - Top = 8 - Width = 49 - Height = 13 - Caption = 'SortFunc3' - end - object Start3Btn: TButton - Left = 334 - Top = 385 - Width = 108 - Height = 25 - Caption = 'three interpreters' - TabOrder = 0 - OnClick = Start3BtnClick - end - object PythonMemo: TMemo - Left = 0 - Top = 419 - Width = 566 - Height = 145 - Align = alBottom - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - Lines.Strings = ( - 'from SortModule import getvalue,swap' - ' ' - 'def SortFunc1(handle, low, high):' - ' for i in range(low, high):' - ' for j in range(low+1,high):' - ' if getvalue(handle,j-1) > getvalue(handle,j):' - ' swap(handle,j-1,j)' - '' - 'def SortFunc2(handle,low,high):' - ' for i in range(low,high-1):' - ' for j in range(i+1,high):' - ' if getvalue(handle,i) > getvalue(handle,j):' - ' swap(handle,i,j)' - '' - 'def SortFunc3(handle,low,high):' - ' Lo = low' - ' Hi = high-1' - ' Mid = getvalue(handle,(Lo+Hi) // 2)' - ' while 1:' - ' while getvalue(handle,Lo) < Mid: ' - ' Lo = Lo + 1' - ' while getvalue(handle,Hi) > Mid:' - ' Hi = Hi - 1' - ' if Lo <= Hi:' - ' swap(handle,Lo,Hi)' - ' Lo = Lo + 1' - ' Hi = Hi - 1' - ' if Lo > Hi:' - ' break' - ' if Hi > low:' - ' SortFunc3(handle,low,Hi+1)' - ' if Lo < high-1:' - ' SortFunc3(handle,Lo,high)') - ParentFont = False - ScrollBars = ssBoth - TabOrder = 1 - WordWrap = False - end - object Start1Btn: TButton - Left = 224 - Top = 385 - Width = 104 - Height = 25 - Caption = 'one interpreter' - TabOrder = 2 - OnClick = Start1BtnClick - end - object LoadBtn: TButton - Left = 8 - Top = 384 - Width = 97 - Height = 25 - Caption = 'Load Script' - TabOrder = 3 - OnClick = LoadBtnClick - end - object SaveBtn: TButton - Left = 111 - Top = 385 - Width = 107 - Height = 25 - Caption = 'Save Script' - TabOrder = 4 - OnClick = SaveBtnClick - end - object StopBtn: TButton - Left = 448 - Top = 385 - Width = 105 - Height = 25 - Caption = 'stop interpreters' - TabOrder = 5 - OnClick = StopBtnClick - end - object PythonEngine1: TPythonEngine - InitThreads = True - PyFlags = [pfDebug, pfInteractive, pfVerbose] - RedirectIO = False - Left = 16 - Top = 88 - end - object SortModule: TPythonModule - Engine = PythonEngine1 - OnInitialization = SortModuleInitialization - ModuleName = 'SortModule' - Errors = <> - Left = 64 - Top = 88 - end - object PythonDialog: TOpenDialog - DefaultExt = 'py' - Filter = 'Python scripts|*.py|All files|*.*' - Left = 64 - Top = 40 - end - object SaveDialog: TSaveDialog - DefaultExt = 'py' - Filter = 'Python scripts|*.py|All files|*.*' - Left = 16 - Top = 40 - end -end +object ThreadSortForm: TThreadSortForm + Left = 171 + Top = 19 + BorderStyle = bsDialog + Caption = 'Thread Sorting Demo' + ClientHeight = 564 + ClientWidth = 566 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Position = poScreenCenter + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + TextHeight = 13 + object Bevel1: TBevel + Left = 8 + Top = 24 + Width = 177 + Height = 355 + end + object Bevel3: TBevel + Left = 376 + Top = 24 + Width = 177 + Height = 355 + end + object Bevel2: TBevel + Left = 192 + Top = 24 + Width = 177 + Height = 355 + end + object BubbleSortBox: TPaintBox + Left = 8 + Top = 24 + Width = 177 + Height = 355 + OnPaint = BubbleSortBoxPaint + end + object SelectionSortBox: TPaintBox + Left = 192 + Top = 24 + Width = 177 + Height = 355 + OnPaint = SelectionSortBoxPaint + end + object QuickSortBox: TPaintBox + Left = 376 + Top = 24 + Width = 177 + Height = 355 + OnPaint = QuickSortBoxPaint + end + object Label1: TLabel + Left = 8 + Top = 8 + Width = 49 + Height = 13 + Caption = 'SortFunc1' + end + object Label2: TLabel + Left = 192 + Top = 8 + Width = 49 + Height = 13 + Caption = 'SortFunc2' + end + object Label3: TLabel + Left = 376 + Top = 8 + Width = 49 + Height = 13 + Caption = 'SortFunc3' + end + object Start3Btn: TButton + Left = 334 + Top = 385 + Width = 108 + Height = 25 + Caption = 'three interpreters' + TabOrder = 0 + OnClick = Start3BtnClick + end + object PythonMemo: TMemo + Left = 0 + Top = 419 + Width = 566 + Height = 145 + Align = alBottom + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + Lines.Strings = ( + 'from SortModule import getvalue,swap' + ' ' + 'def SortFunc1(handle, low, high):' + ' for i in range(low, high):' + ' for j in range(low+1,high):' + ' if getvalue(handle,j-1) > getvalue(handle,j):' + ' swap(handle,j-1,j)' + '' + 'def SortFunc2(handle,low,high):' + ' for i in range(low,high-1):' + ' for j in range(i+1,high):' + ' if getvalue(handle,i) > getvalue(handle,j):' + ' swap(handle,i,j)' + '' + 'def SortFunc3(handle,low,high):' + ' Lo = low' + ' Hi = high-1' + ' Mid = getvalue(handle,(Lo+Hi) // 2)' + ' while 1:' + ' while getvalue(handle,Lo) < Mid: ' + ' Lo = Lo + 1' + ' while getvalue(handle,Hi) > Mid:' + ' Hi = Hi - 1' + ' if Lo <= Hi:' + ' swap(handle,Lo,Hi)' + ' Lo = Lo + 1' + ' Hi = Hi - 1' + ' if Lo > Hi:' + ' break' + ' if Hi > low:' + ' SortFunc3(handle,low,Hi+1)' + ' if Lo < high-1:' + ' SortFunc3(handle,Lo,high)') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 1 + WordWrap = False + end + object Start1Btn: TButton + Left = 224 + Top = 385 + Width = 104 + Height = 25 + Caption = 'one interpreter' + TabOrder = 2 + OnClick = Start1BtnClick + end + object LoadBtn: TButton + Left = 8 + Top = 384 + Width = 97 + Height = 25 + Caption = 'Load Script' + TabOrder = 3 + OnClick = LoadBtnClick + end + object SaveBtn: TButton + Left = 111 + Top = 385 + Width = 107 + Height = 25 + Caption = 'Save Script' + TabOrder = 4 + OnClick = SaveBtnClick + end + object StopBtn: TButton + Left = 448 + Top = 385 + Width = 105 + Height = 25 + Caption = 'stop interpreters' + TabOrder = 5 + OnClick = StopBtnClick + end + object PythonEngine1: TPythonEngine + InitThreads = True + PyFlags = [pfDebug, pfInteractive, pfVerbose] + RedirectIO = False + Left = 16 + Top = 88 + end + object SortModule: TPythonModule + Engine = PythonEngine1 + OnInitialization = SortModuleInitialization + ModuleName = 'SortModule' + Errors = <> + Left = 64 + Top = 88 + end + object PythonDialog: TOpenDialog + DefaultExt = 'py' + Filter = 'Python scripts|*.py|All files|*.*' + Left = 64 + Top = 40 + end + object SaveDialog: TSaveDialog + DefaultExt = 'py' + Filter = 'Python scripts|*.py|All files|*.*' + Left = 16 + Top = 40 + end +end diff --git a/Demos/Demo33/ThSort.pas b/Demos/Demo33/ThSort.pas index fdfb5f17..becbb9db 100644 --- a/Demos/Demo33/ThSort.pas +++ b/Demos/Demo33/ThSort.pas @@ -117,17 +117,14 @@ procedure TThreadSortForm.InitThreads(ThreadExecMode: TThreadExecMode; script: T Thread1 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc1', BubbleSortBox, BubbleSortArray); - Thread1.InterpreterConfig := _PyInterpreterConfig_INIT; Thread1.OnTerminate := ThreadDone; Thread2 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc2', SelectionSortBox, SelectionSortArray); - Thread2.InterpreterConfig := _PyInterpreterConfig_INIT; Thread2.OnTerminate := ThreadDone; Thread3 := TSortThread.Create( ThreadExecMode, script, SortModule, 'SortFunc3', QuickSortBox, QuickSortArray); - Thread3.InterpreterConfig := _PyInterpreterConfig_INIT; Thread3.OnTerminate := ThreadDone; end; diff --git a/Demos/Demo36/ParallelPython.dpr b/Demos/Demo36/ParallelPython.dpr index 63c9b8fc..00883f7a 100644 --- a/Demos/Demo36/ParallelPython.dpr +++ b/Demos/Demo36/ParallelPython.dpr @@ -78,7 +78,6 @@ begin inherited Create; ThreadExecMode := ThreadMode; FreeOnTerminate := True; - InterpreterConfig := _PyInterpreterConfig_INIT; end; var @@ -92,7 +91,7 @@ begin WriteLn('Classic Subinterpreter:'); SW := TStopwatch.StartNew; for I := 1 to N do - TPyThread.Create(emNewState); + TPyThread.Create(emNewInterpreter); Event.WaitFor; Event.Free; SW.Stop; diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 54b48431..f5c35548 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2861,8 +2861,8 @@ TPythonThread = class(TThread) procedure Execute; override; protected procedure ExecuteWithPython; virtual; abstract; + function InterpreterConfig: PyInterpreterConfig; virtual; public - InterpreterConfig: PyInterpreterConfig; class procedure Py_Begin_Allow_Threads; class procedure Py_End_Allow_Threads; // The following procedures are redundant and only for @@ -9304,6 +9304,7 @@ procedure TPythonThread.Execute; var global_state: PPyThreadState; gilstate: PyGILState_STATE; + Config: PyInterpreterConfig; begin with GetPythonEngine do begin @@ -9322,9 +9323,12 @@ procedure TPythonThread.Execute; global_state := PyThreadState_Get; PyThreadState_Swap(nil); + if (fThreadExecMode = emNewInterpreterOwnGIL) then + Config := InterpreterConfig; + if (fThreadExecMode = emNewInterpreter) or ((FMajorVersion = 3) and (FMinorVersion < 12)) or - PyStatus_Exception(Py_NewInterpreterFromConfig(@fThreadState, @InterpreterConfig)) + PyStatus_Exception(Py_NewInterpreterFromConfig(@fThreadState, @Config)) then fThreadState := Py_NewInterpreter; @@ -9341,6 +9345,10 @@ procedure TPythonThread.Execute; end; end; +function TPythonThread.InterpreterConfig: PyInterpreterConfig; +begin + Result := _PyInterpreterConfig_INIT; +end; class procedure TPythonThread.Py_Begin_Allow_Threads; begin From f9be5062c62e91aec0ba3118259a38054a98b2d8 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 1 Nov 2023 01:57:34 +0200 Subject: [PATCH 106/174] A new function SafePyEngine was added. It facilitates running python code in Delphi threads. --- Source/PythonEngine.pas | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index f5c35548..ccf86f29 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2915,7 +2915,27 @@ function PythonVersionFromRegVersion(const ARegVersion: string; out AMajorVersion, AMinorVersion: integer): boolean; function PyStatus_Exception(const APyStatus: PyStatus): Boolean; +//####################################################### +//## ## +//## Support routines for running python ## +//## code in threads ## +//## ## +//####################################################### + +type + IPyEngineAndGIL = interface + function GetPyEngine: TPythonEngine; + function GetThreadState: PPyThreadState; + property PythonEngine: TPythonEngine read GetPyEngine; + property ThreadState: PPyThreadState read GetThreadState; + end; + +// Access the PythonEngine with thread safety +function SafePyEngine: IPyEngineAndGIL; + + { Helper functions} + (* Checks whether the PythonVersion x.x is Registered *) @@ -2923,6 +2943,7 @@ function PyStatus_Exception(const APyStatus: PyStatus): Boolean; function IsPythonVersionRegistered(PythonVersion : string; out InstallPath: string; out AllUserInstall: Boolean) : Boolean; {$ENDIF} + (* Mask FPU Excptions - Useful for importing SciPy and other Python libs See http://bugs.python.org/issue9980 and @@ -2930,6 +2951,7 @@ function IsPythonVersionRegistered(PythonVersion : string; *) procedure MaskFPUExceptions(ExceptionsMasked : boolean; MatchPythonPrecision : Boolean = True); + (* Converts line breaks to LF and optionally adds a line break at the end *) @@ -9788,5 +9810,53 @@ function PyStatus_Exception(const APyStatus: PyStatus): Boolean; Result := APyStatus._type <> _PyStatus_TYPE_OK; end; +{ TPyEngineAndGIL - Internal class for SafePythonEngine } + +type + TPyEngineAndGIL = class(TInterfacedObject, IPyEngineAndGIL) + fPythonEngine: TPythonEngine; + fThreadState: PPyThreadState; + fGILState: PyGILstate_STATE; + private + function GetPyEngine: TPythonEngine; + function GetThreadState: PPyThreadState; + public + constructor Create; + destructor Destroy; override; + end; + + +constructor TPyEngineAndGIL.Create; +begin + inherited Create; + fPythonEngine := GetPythonEngine; + fGILState := fPythonEngine.PyGILState_Ensure; + fThreadState := fPythonEngine.PyThreadState_Get; +end; + +destructor TPyEngineAndGIL.Destroy; +begin + fPythonEngine.PyGILState_Release(fGILState); + inherited; +end; + +function TPyEngineAndGIL.GetPyEngine: TPythonEngine; +begin + Result := fPythonEngine; +end; + +function TPyEngineAndGIL.GetThreadState: PPyThreadState; +begin + Result := fThreadState; +end; + +{ SafePythonEngine } +function SafePyEngine: IPyEngineAndGIL; +begin + Result := TPyEngineAndGIL.Create +end; + + + end. From 9b65e34f2bebc6735af165f70425f0061282d0b7 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 1 Nov 2023 02:28:22 +0200 Subject: [PATCH 107/174] ThreadPythonExec wrapper around TPythonThread added. --- Source/PythonEngine.pas | 81 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ccf86f29..f070f31f 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2931,8 +2931,18 @@ function PyStatus_Exception(const APyStatus: PyStatus): Boolean; end; // Access the PythonEngine with thread safety + +// Gets the GIL and releases it automatically when the interface is cleared function SafePyEngine: IPyEngineAndGIL; +{$IFNDEF FPC} +{ + Executes Python code in a Delphi thread - Wrapper around TPythonThread + The TerminateProc is called using TThread.Queue +} +procedure ThreadPythonExec(ExecuteProc : TProc; TerminateProc : TProc = nil; + WaitToFinish: Boolean = False; ThreadExecMode : TThreadExecMode = emNewState); +{$ENDIF FPC} { Helper functions} @@ -9858,5 +9868,76 @@ function SafePyEngine: IPyEngineAndGIL; +{$IFNDEF FPC} + +{ TAnonymousPythonThread } + +type + TAnonymousPythonThread = class(TPythonThread) + private + fTerminateProc : TProc; + fExecuteProc : TProc; + procedure DoTerminate; override; + public + procedure ExecuteWithPython; override; + constructor Create(ExecuteProc : TProc; TerminateProc : TProc = nil; + Suspended: Boolean = False; AThreadExecMode : TThreadExecMode = emNewState); + end; + +constructor TAnonymousPythonThread.Create(ExecuteProc : TProc; TerminateProc : TProc; + Suspended: Boolean; AThreadExecMode : TThreadExecMode); +begin + inherited Create(Suspended); + fExecuteProc := ExecuteProc; + fTerminateProc := TerminateProc; + FreeOnTerminate := True; + ThreadExecMode := AThreadExecMode; +end; + +procedure TAnonymousPythonThread.ExecuteWithPython; +begin + if Assigned(fExecuteProc) then + try + fExecuteProc(); + except + end; +end; + +procedure TAnonymousPythonThread.DoTerminate; +// Use Thread.Queue to run the TerminateProc in the main thread +// Could use Synchronize instead, but such calls better be avoided +var + TerminateProc: TProc; +begin + TerminateProc := fTerminateProc; // to keep fTerminateProc alive at destruction + if Assigned(TerminateProc) then + TThread.Queue(nil, procedure + begin + TerminateProc(); + end); +end; + + +{ InternalThreadPythonExec } + +procedure ThreadPythonExec(ExecuteProc : TProc; TerminateProc : TProc; + WaitToFinish: Boolean; ThreadExecMode : TThreadExecMode); +var + Thread: TAnonymousPythonThread; +begin + if GetCurrentThreadId <> MainThreadID then + raise Exception.Create('ThreadPythonExec should only be called from the main thread'); + Thread := TAnonymousPythonThread.Create(ExecuteProc, TerminateProc, WaitToFinish, ThreadExecMode); + if WaitToFinish then + begin + Thread.FreeOnTerminate := False; + Thread.Start; + Thread.WaitFor; // Note that it calls CheckSyncrhonize + Thread.Free; + end; +end; + +{$ENDIF FPC} + end. From 2017fb95f968650471fe3cac6c498901cc6149d9 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 2 Nov 2023 00:35:15 +0200 Subject: [PATCH 108/174] Added a Keywords test to VarPythTest.pas --- Tests/VarPythTest.pas | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Tests/VarPythTest.pas b/Tests/VarPythTest.pas index c0916df8..34e68f0a 100644 --- a/Tests/VarPythTest.pas +++ b/Tests/VarPythTest.pas @@ -36,6 +36,8 @@ TTestVarPyth = class(TObject) procedure TestDates; [Test] procedure TestObjects; + [Test] + procedure Keywords; end; implementation @@ -46,6 +48,14 @@ implementation Classes, VarPyth; +procedure TTestVarPyth.Keywords; +var + D: Variant; +begin + D := BuiltinModule.dict(a := 1, b := 2); + Assert.AreEqual(D.GetItem('a'), 1); +end; + procedure TTestVarPyth.SetupFixture; begin PythonEngine := TPythonEngine.Create(nil); From 49699946c873c4d5599e7d2e55e04eb7a293e28a Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 2 Nov 2023 05:01:44 +0200 Subject: [PATCH 109/174] Small optimization with name parameters. --- Source/VarPyth.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index ae953b48..7dcc6376 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -130,7 +130,7 @@ implementation type TNamedParamDesc = record Index : Integer; - Name : AnsiString; + Name : PAnsiChar; end; TNamedParamArray = array of TNamedParamDesc; @@ -1278,7 +1278,7 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; for I := 0 to CallDesc^.NamedArgCount - 1 do begin LNamePtr := LNamePtr + Succ(Length(LNamePtr)); fNamedParams[I].Index := I+LNamedArgStart; - fNamedParams[I].Name := AnsiString(LNamePtr); + fNamedParams[I].Name := LNamePtr; end; end; @@ -1596,7 +1596,7 @@ function TPythonVariantType.EvalPython(const V: TVarData; for i := 0 to _ArgLen-1 do PyTuple_SetItem( _Args, i, ArgAsPythonObject(i) ); for i := 0 to Length(fNamedParams)-1 do - PyDict_SetItemString(_KW, PAnsiChar(fNamedParams[i].Name), ArgAsPythonObject(fNamedParams[i].Index)); + PyDict_SetItemString(_KW, fNamedParams[i].Name, ArgAsPythonObject(fNamedParams[i].Index)); // call the func or method, with or without named parameters (KW) if Assigned(_KW) then From a63eb17f19fd6900b9aecb6bc0c8e71b63f82311 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 2 Nov 2023 05:27:34 +0200 Subject: [PATCH 110/174] Minor refactoring. Delete unnecessary Lines. --- Source/VarPyth.pas | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index 7dcc6376..afa9dec2 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -1599,10 +1599,7 @@ function TPythonVariantType.EvalPython(const V: TVarData; PyDict_SetItemString(_KW, fNamedParams[i].Name, ArgAsPythonObject(fNamedParams[i].Index)); // call the func or method, with or without named parameters (KW) - if Assigned(_KW) then - Result := PyEval_CallObjectWithKeywords(_obj, _Args, _KW) - else - Result := PyEval_CallObjectWithKeywords(_obj, _Args, nil); + Result := PyEval_CallObjectWithKeywords(_obj, _Args, _KW); CheckError(True); finally Py_XDecRef(_Args); From 55bc997cded4661dbc0beac7c347ce387d7e87b0 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 2 Nov 2023 14:01:21 +0200 Subject: [PATCH 111/174] Fix #125 --- Source/VarPyth.pas | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index afa9dec2..63cf5c2b 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -1271,9 +1271,11 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; LNamedArgStart : Integer; //arg position of 1st named argument (if any) I : integer; begin + SetLength(fNamedParams, CallDesc^.NamedArgCount); + if CallDesc^.NamedArgCount = 0 then + Exit; LNamePtr := PAnsiChar(@CallDesc^.ArgTypes[CallDesc^.ArgCount]); LNamedArgStart := CallDesc^.ArgCount - CallDesc^.NamedArgCount; - SetLength(fNamedParams, CallDesc^.NamedArgCount); // Skip function Name for I := 0 to CallDesc^.NamedArgCount - 1 do begin LNamePtr := LNamePtr + Succ(Length(LNamePtr)); @@ -1285,25 +1287,25 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData; Var NewCallDesc : TCallDesc; begin - if CallDesc^.NamedArgCount > 0 then GetNamedParams; - try - if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then begin + if CallDesc^.CallType = CDoMethod then + GetNamedParams; // fNamedParams will be cleared in EvalPython + if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then + begin NewCallDesc := CallDesc^; NewCallDesc.CallType := CDoMethod; - {$IFDEF PATCHEDSYSTEMDISPINVOKE} + SetLength(fNamedParams, 0); + {$IFDEF PATCHEDSYSTEMDISPINVOKE} PatchedDispInvoke(Dest, Source, @NewCallDesc, Params); - {$ELSE PATCHEDSYSTEMDISPINVOKE} + {$ELSE PATCHEDSYSTEMDISPINVOKE} inherited DispInvoke(Dest, Source, @NewCallDesc, Params); - {$ENDIF PATCHEDSYSTEMDISPINVOKE} - end else + {$ENDIF PATCHEDSYSTEMDISPINVOKE} + end + else {$IFDEF PATCHEDSYSTEMDISPINVOKE} PatchedDispInvoke(Dest, Source, CallDesc, Params); {$ELSE PATCHEDSYSTEMDISPINVOKE} inherited; {$ENDIF PATCHEDSYSTEMDISPINVOKE} - finally - if CallDesc^.NamedArgCount > 0 then SetLength(fNamedParams, 0); - end; end; function TPythonVariantType.DoFunction(var Dest: TVarData; @@ -1519,8 +1521,14 @@ function TPythonVariantType.EvalPython(const V: TVarData; _Args : PPyObject; _ArgLen : Integer; _KW : PPyObject; + LNamedParams : TNamedParamArray; begin Result := nil; + + // Store global fNamedParams and clear it ASAP + LNamedParams := System.Copy(fNamedParams); + SetLength(fNamedParams, 0); + with GetPythonEngine do begin // extract the associated Python object @@ -1583,10 +1591,10 @@ function TPythonVariantType.EvalPython(const V: TVarData; _ArgLen := 0 else _ArgLen := Length(Arguments); - if Length(fNamedParams) > 0 then + if Length(LNamedParams) > 0 then begin _KW := PyDict_New; - _ArgLen := fNamedParams[0].Index; + _ArgLen := LNamedParams[0].Index; end else _KW := nil; @@ -1595,8 +1603,8 @@ function TPythonVariantType.EvalPython(const V: TVarData; try for i := 0 to _ArgLen-1 do PyTuple_SetItem( _Args, i, ArgAsPythonObject(i) ); - for i := 0 to Length(fNamedParams)-1 do - PyDict_SetItemString(_KW, fNamedParams[i].Name, ArgAsPythonObject(fNamedParams[i].Index)); + for i := 0 to Length(LNamedParams)-1 do + PyDict_SetItemString(_KW, LNamedParams[i].Name, ArgAsPythonObject(LNamedParams[i].Index)); // call the func or method, with or without named parameters (KW) Result := PyEval_CallObjectWithKeywords(_obj, _Args, _KW); From f86bda02ddb81eee50fbb38a817a6000b376fc4b Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 7 Nov 2023 13:04:30 +0200 Subject: [PATCH 112/174] PyObject_CheckBuffer is not exported in older python versions. --- Source/PythonEngine.pas | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index f070f31f..ad4df5fb 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1651,7 +1651,6 @@ TPythonInterface=class(TDynamicDll) PyObject_GC_Del:procedure (ob:PPyObject); cdecl; PyObject_GC_Track:procedure (ob:PPyObject); cdecl; PyObject_GC_UnTrack:procedure (ob:PPyObject); cdecl; - PyObject_CheckBuffer: function(obj: PPyObject): Integer; cdecl; PyObject_GetBuffer: function(obj: PPyObject; view: PPy_buffer; flags: Integer): Integer; cdecl; PyObject_CopyData: function (dest: PPyObject; src: PPyObject): Integer; cdecl; PySequence_Check:function (ob:PPyObject):integer; cdecl; @@ -1846,6 +1845,7 @@ TPythonInterface=class(TDynamicDll) function PyUnicode_CheckExact( obj : PPyObject ) : Boolean; function PyType_IS_GC(t : PPyTypeObject ) : Boolean; function PyObject_IS_GC( obj : PPyObject ) : Boolean; + function PyObject_CheckBuffer(obj: PPyObject): Boolean; function PyWeakref_Check( obj : PPyObject ) : Boolean; function PyWeakref_CheckRef( obj : PPyObject ) : Boolean; function PyWeakref_CheckProxy( obj : PPyObject ) : Boolean; @@ -3929,7 +3929,6 @@ procedure TPythonInterface.MapDll; PyObject_GC_Del := Import('PyObject_GC_Del'); PyObject_GC_Track := Import('PyObject_GC_Track'); PyObject_GC_UnTrack := Import('PyObject_GC_UnTrack'); - PyObject_CheckBuffer := Import('PyObject_CheckBuffer'); PyObject_GetBuffer := Import('PyObject_GetBuffer'); PyObject_CopyData := Import('PyObject_CopyData'); PySequence_Check := Import('PySequence_Check'); @@ -4243,6 +4242,12 @@ function TPythonInterface.PyObject_IS_GC( obj : PPyObject ) : Boolean; (not Assigned(obj^.ob_type^.tp_is_gc) or (obj^.ob_type^.tp_is_gc(obj) = 1)); end; +function TPythonInterface.PyObject_CheckBuffer(obj: PPyObject): Boolean; +begin + Result := Assigned(obj^.ob_type^.tp_as_buffer) and + Assigned(obj^.ob_type^.tp_as_buffer.bf_getbuffer); +end; + function TPythonInterface.PyWeakref_Check( obj : PPyObject ) : Boolean; begin Result := Assigned( obj ) and (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj)); From 24fc197a5e03059afcbaf6acd82d5e44d357949f Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 9 Nov 2023 14:14:38 +0200 Subject: [PATCH 113/174] Delphi 12 Support - Updated MultiInstaller.exe - 'TRttiInvokableTypeHelper not needed in Delphi 12 - Installed and tested --- Install/MultiInstaller.exe | Bin 2973184 -> 2882560 bytes Install/Setup.ini | 3 +++ Source/WrapDelphi.pas | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Install/MultiInstaller.exe b/Install/MultiInstaller.exe index 9297a9d38b3cb80a6ec792ab87840835205ee56b..4908eecb8c289edad176090648f6b9c5c8063746 100644 GIT binary patch literal 2882560 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 MS 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

HZK{ktb4u0=G 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 *@Q8H8NC;JTz{cQOL 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

#=1P zTbPS@N1KfAT8u5K!ye!DN3=v=Xh&4efgOXjVyol3Rz8Q72;*v+iSNo@$M@Lh@Wyvl zuSfD7*hqo@p4;=`u|EGi0O8{JNY*tq@Vu7Zd&!0-bqOk0tk1kZYn-gTeq5NVV|{)< z{67>(hY;&C-iyv)DAk_9EVV+ zAbnaB_i>&Vr_R7BK%X0t=djV|Fvoq&-|wO6s4qhBe;j!ZAO3bsY#sdFKfVIW{MLw! zvedDU4fKdM(rGT&%pt{0Kr!QbV6zYzRNQ*wEUuixnmGZ8bP&7d^xDG!9XH7$>LTBcbE^XyK%UEVEym4N6vr7aRUa10UZcf%^v0Wz&5`LE`JaGK^I+T9A)yP z3tH;~lf~{P4@H9TS;~{ zs~ljzL3j$a@L#c1vK?UVqg3wmjo8%tfBt;ql4AP5K#fE7f3cp+SkJ-uzhs0hPG`9e zI1cTP(f)i^Ga;PS-!JN@mc!LM&b~beKxWQ6}o!q_nleZl=*BIuCveORKXc^X$pOS z4I|FIIX|`Lo^@uj(aZzu1uctWJ7;}&$E@J_Tv}X>=HGGV#jV*Z-?90x3`N7V`X8|3 zaoJY$kvuf@@7V7d zKePJn_~aVRk)dZUhue9>d;Wp{yr|RjQ79VL^EFt@xOzSp*_@saKx8qe=?|I7)$?@p z$Ti@q=gRjT@S#;TVChucP+k5dyju&SPURnCZ^B*LSqt zTnOV_5A+7}U;6B()5)_@mD4~a;&+Mt->@bE_Bi1AC5P=|Aml>ca>Iq4E8Y018+Y8M zW-;xV8h6vior7nc{am(Ro;nR+UkzK@#{S#@_MdvN{}VQ&iTw#)?3V$h5bV{x>SN94 z@LKy3pU~$-kKcnNoD=N~sFwjB;Jl>XmLG@$&HEAG#QwdU?+bB+≺g3#q|#qGuMs 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 z¥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±I|G#z$kv6!l@0po8Jvi6>VkfWV981 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 z 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'z;!N zQ`DeRjZ~V2N(ddepg_F}BX%;|bAEt{$>n1OFw>qUu@fIbzr`4%eV|YOQ|dJAfedOG zYRaJRdQ%>V47w5JwG8r|Due7IgU&2}9?mr756NTp6mf}y^P87a{-|)j)5@7g@GXg0 z`!o&4i6v*o9u+y$+mthJyJfIDX#vKA5b@&Vt?4n7?s34SIGHg^Pr5lU$1QPE=v;d} ztO0ob9Qcd7fI{h5P)!Dy4sz@dD>oXOPTR`7v%)}gjC~$~P$RecW&ryXl}QLlXbxZ( z43eI5=rw#C!}RXW&A`ws-C@uy-?J8R)0b_99DsF$t0UFJb%-|xTkTTwymD28I4f=HOZe^FMI`|f$tMKZ z6#`5bzZ%6Y@l~=C=usezg2qNsI}z4iL?FfKj+C`>1qORH5})}ndo>@ul5@gluj(*l z>gDs$lcvxmm`nvN#hYIX!*&Ad(w!cW?%YzRy8}YtOlR%SQM9fGe4_ORGzOyeHv9#+ z_oCLEjKasbKeRcJnn^;JhZmT~ygHA;Ew!30uJ3HrUxO>c>eRQdBaS^+0_-IeQSs$7 zIa=cx2kn+Fwp@hIGwt=Tnt?RSt{;oJOFNrpKDHrCSX17mYgINuMh;a!EZ+Rru=*iil!Vyx<8ky}gD-DrdgBsHBaY;E@eryT zy?g_{5p3uBFz_lp>jzM~{7@-k?wgmltOD;GdJnkfH$&53or#$H|GWgqq!h0UmpjzA5U052kH_g%!p05OP7i$|=Gh`oWf zBZw6OJP~^yY9X0n#ngBnEi`g6iZ{O+R2 zVxo$5CMR}yoDUr1B7=rr+d@{v8RAG`ZfnEfZzd1GfzO)8C&EAj(I&2Y3FbF}N2~&P zu}VXkkkXpnl2ID*91#HEwx6!$xU@uSTNMzfq}lOf7SJ`I8IXaq8@#xoT7$JXFNC}O zCB-V!j7zM{cC0cHioS}DAyYkoj*_C&Zy-e@*&iXBw;EmoC5D3Y0{pVrI-gAo|ylvAG3hIVQ`XIWqf2X4BWI$3*KWmfpA$0~3wUtoStUvbsrENu(yOqMxdt z^ksE8kNFOi%9}_g-06mAEQr{%`7NXi!`+{Sl2I!gB69QvpWRV+uGdFjs<5`<=nF*5 zjGl-N8?);ugiv5rJ(4k?pQyHP9!JDx177KpsTD^ij?sLJgoHZTlGWjweK8yi!;VB} zjzm9V6j(DlbFZy$LKFUllb4u!>}q`J)JWg?rlrR|J5k4Hs_Qt1c&JM5&QouW!s}w9 zt6r2x*{FXKkLLEtTL_0Sw@)@>P{FF!TFASgC|9t?A2e^$Z&62Y=4cj_Ts1Pvcr9uo zJZ%zA^c4gb+Wrhe%=l3K9wTSy9W1Z|R&(%2PGo$?00hd({Q{~z;Bt^R7h#aC>%mRm zH&3GdQHZ2g6?2MB?kfirw2mid5pg8#PrAe(q{QVY0Zw6G3T08gdo(95p0NbYl4q=2 z*pnmd2XxIMsd@YY3%1b!J2|qV>4OMmx@bQsx&uXFP5MaPrI0*00D<=OI~|^5U_%rc zO}@>dq$1Kz#(_DVjfQK>cP}_McOcd=$irH784R$|*Lr^pwZkWgz(S^8X7&NRZrz^* zkP+SF_oJ*qFimmK9FyE^V+@YFFX3G$G&FGXl>3eI!EeyDuc8pw1GCE*8ZLsMZ&Hsy zX~f5L5ajtUKJmVDs|fnmjl#TT3Q9jglPxct-|T%obhB1VDXMck1<@CNlt-D>^+KZ5 zB_{j>s$Ae7aL1N63&*sCyJpx@gkR>Nw>ZBpN1D}_(B8-|55r!JdD7y#vDf;Kg}r+zsAZo`cc^Rh1$%gU^jO%G=h#>DZ)BK`ZQ)h^ z`IBr5;Turzy?s244bR>9zXUdZc|>&_%1Plrkx-hv86Cobmco+9@IYAuXMkG;&Wr9h zW-lW|&ma@B$6mg}>kLRD%Kt3`QJ~!-uc;+scJYk)9S|tyz6>v{&~_0Habi=G7q_Cs zJ<`@$Xbbx4g_84}&Y31TNs^<-WHvIgn-(Nd2jd}-AdJ^Fm7EN|EysQP6X&)0KS|+DSWFL!0zbx%dp1~H|b|p!k)s^aRCQ0r_rBFJP7whEpl6)hQ zfe!4G;mdeAj;Cvd{Gxl0o1A7_okbmn69D}M*d#RSqytG-$r)B=Ivx`7b#Bx zZFn+Mvv|KCu4_mG{Oi^~iB=!nrk?ocar%j}D+$EoEZ?!PE$$b_vpNsWRhRE5O&qu* zyK*0Mk;7lrmN`b%@JfyWeRcd*znqQK$oVmL>_OeJz3`g2)#5$~sA&#+dj|$(;$XVn zHWAuIJDNgRV|+heWm7|+hPHS=JQ4opgq~G7a#Re$fCtiKJJ)|AjB9UqK|OvPtiTYE zXV5d>J6iZ$iHq}a(PcT?#67~&W*fAb)qqN#>Bfi4X^yhBprX%hO6*#-?0*a4_##IgnEuZbo6)!g;v9N@3|5uqCNtLd{%x51es zvB8)NPw0W!31@~|-IozLe<)?mfiUV#*>iTkB#BLK7wRlC7W6;H{cuSefVrbl(jk=&DqBn zo-21ne2V-pcN!-3)bggfvX9^Y6=q42|AVmc9zM05EHY|iRUm+fNqq0e zo?X4L9b6k+js5^wp#j;|-m{o+4N~qW^zo@#*oCiyL%-qQpeHXQ#l)4bp`G)6qovyr zzU61%mxlYdmW(xhT#0z|ZKS?w^WYS=9CkzG_G);!LhYmPuZ!19v>c1P&ZWF^3kR0> zAaBt&e)Q14Eun3Z9e%R5oy#kA4NgqFy@a>6KLH+vF+Sq63Ge30g+MUY7*t-PYmfu* z#@oGg+@vj1VmnF%?m7LnT&#A=wOpq6Zuu4By+iQWPPV%>0e8BL&ZJC1x5whft_g^B z8i{D9Nq7gXuwWZ=CmHjnVmbI21e(>k2q&m8ZTWcgP8>Lpg zB!)tkf=ddxbr0nWO1LbX-E4!HOMi_$rU88P31sR{GEtlE&+s@oIZ|Q23{={Wv_F7g z0lyv|OV!bVuE=b_MGs_8$Zom+%JQ(oAD-qdG6pU>A!k}0i%ui~Wv`3t$G-QDGl*mu zpDSNG&Tmcir|I3I?uJUic#r$YnDCFLx40$LQgSK%4m94#tfc;(@uTlO?0@7u7n-Ka12f0JD7Kbq`m|0+(S7UMepVrWX<83edMP}tH1 zp-kF2_AMx7I>+Qn4|0ZVEL$IWJct5tR0uj(O6{jX1Fmnq;Lix{)0p_6>S=!jIt^T` z6Tm6#P806m8i)l?uhoc^!t`JOzQjz?hCX(E1PSV`C+*vvBMbKRnYUWJ z5JJ;y_M&N?kN)~qva7TF4QH<09@>e4;G?~1We4F%uy0Hq5D%Sz^ z3V!h&R)Pd1nS14Y0l#Cj60Snrm^ZLf%sqpJ1)L8D)bz`AZ@c8Nw?Ws_0oT5ut1RH! zS?Ai5h1)5NR;qmgKgznd&h<3sXPxU+P7Qtz_4NpJeh;{n`WM!Kfa`fY?Utt%b*}CG zG>mPMP+#XNBMg*SF9{WpyscD!3_e0t z_O>{KD*!DpZAl#YvKvY}MiRswfGA`|M zCa@&$!Q2Q2vOG7GwkEzy+^B#RgDy`?j$m&Jm~n&HKM&KVb%FW<`s(CRTl03J>WfZ< z&3#-QPqK6XEn{^p?sU`k4pdza{XP+Sxsmd6lf`?v zV5kGJ{gnG5;eTu~ehii>Ig(=TG)^nBV8guOEs-|Q*<3q-tLPW7!FUWKEC;q5Uq?O{ z8GQ>V#%`h(VB+Iwb_SOqe*-RiqnLQ*TX=84G?;z3x%R4ovhSbbcPU;eaz_(BB-o;o zu!CiqBzhx|&U5ZE--j5SP#WK~%JP}sLy>ls_anN9W53Rg0mP-j$~}Q3?+CvqzR+Fd zjG1#Y(M_@cu$3bA-^i$hf!ahFgZo+ANdG%gx7`L!%g+NN;blB2f)l(kcWNie1$?cn z%e7%o7ZvDh5}oD6To~?hIM*&rGYY$DN~zJrm|sz^$Ka|rKET^Dh8LL$tC>KdwX_NZ z{%)Rg`#0|~EAK(n$UwTDM2*YGx#VycV|Dc)v zjo+9|Pm#vuFXG_MG@?ee_NRA*KOG7K{psHv2#4uUr?ws4YnJT{d~D&k-YNnSdfs4> zL`Lu=9ZU}^bTBj0`rx?{5@h1rfn0kabn=fo*A!5~{^6q-{h&7>vm;Me>W=KYk{yu{ z8+^|9RGcCofLI?z$@&1qjKQXFGZsI5^uWL6E5vd*=JtgulxcRris2j+gDZp3WQ*lBu!-6T#aW>CZn=O#66$Y$Jn?q8bTMCSw3dzH5vCm z;~S39oi;pzd81~x#YTMt-0Yqkby+ib2cb(EDkRAa6m+ir*{FT@yEJ^m7e@C}6gZNv z){dneF^y}yt`NB+NxzFK^>BZ(8g&@wTHGRz2>7n}o9yX;zwL3&sALt_K~mwf%GwUw zWX_XKf&7|4epMiUYaoAnAirKOvz#fVH%6F5W{UW)xzvm8pn43!=$vi}-3t+~(dg;9 z4j-5(#up~$VuMuAHVzamH z$=%A_zG%a@ZXJdKX5VU3e^&y?R?w35z*Y_&j@doHt;f3<>X*zRQ~jaPsTI0ZK$kL+ zZ+1A#^yinGix&;GHQaR%F{M9{oV1yC@Uj6`->U1r}h+oH6>8Wzxa@p6w0Xg9n zY$fQb0nMCiJF1cJWrn>qL06SgutyD&w<-&n4P4Sx2%ck$7L9*G3hv7`Yui!YDA;6` zS9=l06}k_vhVUOv7;lW*!|bEB?RTjyaA~vbI$`6lVm`oa*2f0!p+AMfBN9E(Sk1JE zKNQ4Uw1qVV+*0K+p-Ib;Qsq?(p_r|PduDQ|JFE_XF}L*aD4e?QB8`Q$9pX9|a}r_| zPP9knY8luMeb-d^7q)JL_;RH_!XSj2jt~;g;Rl9;3cE~gvC^~;utqsFpEv3A-%Z%g zr3aRbedi2|v11jQDfINe!iiU{MqbTHr`pKwgr}Xq`2_A~TE(rO&`jJV2wkbx)zSfS z4h}S4dfC9>E$<8Hnp}F>>wD~6{B;p*ocD;_rKeVDT0Uqss*IE>O|W95$~~;I6jdTb zxErVV?h^0yFL@S2j-{c55i@`3n>MuC5W_?rd?Pn41`s8|?kAw7(S=Rahr*!;=09@0||WK73~SO*el{T z;DhII_eHLVGml5T0`y`+6Syr{kE-G1N;4+mr8+qqwcd(JXfw#VGs^N&=Nvr_AN9?q zk9ztMm>H&P+Frg7F5K3m?b-xS@OC$K@V758b@1_aJ9O~z_C#=H6Z(K9FI8WU1-jyN zK=i6CuKDoy+H!5z!}mKD{~Kw$3eQO6iTVck{(Aw)JI{&jzZE!{DIXvOZZEle1inGa zPxmagHzJQ?c9&y+7&j*O0wAs7Bb+X+4x4o-2lqVo1MIqZJ1IU8#Zh+@GJ$K4Sx^L5 zMPZY9U;HJ^YJtJRhG@&ur@GszTxpBXkqIncc5g1>T% zx0{hW6%Ou6ZsXdC#soK%1nU$xzAJ^;k2w9viuaJ1PJ^EpEhw3Ft0f~~kS=g!ucF&Q z2enP)WUqLZlbz9aa>MPSQq0^2xGl0vTS}9R(w6MQrHRG~P0egqix&{sS$rG=H%$nQ zwLC%Ru7I#X=Xz&vB%yHP;ZQ@*DmN4ne8ru^@b^(9S}0|I*ep@@1&AAv(#Sr6DM&ly zEhNI`{{8{j3Xrb-z#p$BFn(IC!J`@2gbNh-*#FIdttdGmkw`9i1zu#jR zs7{tcQKRU4Y!F1BdEdJD(2WX`^*W=1Y^&e{;GU_!W}nfJE!X2X%lrVHEw}94KR+O8 zCO6~sWrUB>l{Ju1pi&WN_~N2C8eSaB3J!{qw!Dg(ly#bgsdfljc^=2YEqjIJ10bagpsH z{yA=|%@IlGsGG|*8W?qvn zmED9ddNg6H-nj+`f1yn3_}|``yZSpbptE_jmTQvG_Dk@PWffuFi@1v;9^dX=pt)+l zW!#4bx|xZptb3$@+JyT&WNj7L5BwVJx6>n4PY=6q4D1;eY`wP(M>wz9HBun%ln*8` zg!vMX$F06^5r68*e)`I;+D}i#&Plx6UxMsv9Yh0GtDO`+m2KA`T8=P31HzcJt@A59Sc|+UO<_&9aGTMcxbP}Tx=5=a@3C+kG z0PEu%eDPVn>=eu!aPrRa3q2xHpV?^DjQZS~(I}T)aO$`nhaTY0b0WUG1+DZvBget5 zNt_Q)N#?bpe%0o#_Q`GJ$vHP=;0}BQafh)*zQIo4Ofx>ndyfN(X}S+uph`bWLMqz& zHunl=K+MEd4+%e0A4GRJ3#$}S&ytN$-33y>4=3L$#X}L(GoDkp|n}aOu0!? z{sY$2F=~hq7=R7)AyA>;jKYwENgZ{KOQgozr~w!P^(;ww4JklQ<)W`L-qF~MSGy&F!4PZgaf-HH>MiR)vHJ61*U#`a&LH z@Oe+GZe z?p6p2PYw8G{ik4qroh|*foDY~RjZ!p&7cJIrb0d%ZhkXdy08u_)+~o~;h7q%3w}PG z+=YeG)K1U{M39j*$NpBy_!${yzewK$=##KO7O3|c<~5euj9~65vuR>iz{9uLF&RSF zSbz}+3J%PMJ;B>G(urb@(DrDxMln_GA!#!zDoFx&(1vBWmU z7V5A&xfEc)n|k`4{2}B#qk4Z{dv&-b==VRTVmse z5D)dLOh8=hjCr>Jz2w0=gs)4G(FPQ5Jev!{F7%Cp(?bn~nu)12P85~AHxO{E=bJ$b zT;GueHi`o?mta1_Aet7I`PdJ{ISAl>d|SunE!n`s%b5RYB~z{?Q~yA{DOp=!V2#*~ zeh0u>klJ1;B4%YAk+P3+>r;3q634DqZ|f z*6hr*@*ljd(M9$pG&;7lCeQ2dofMxu`9e^WPS@El>Dr(wPzFr5!S3%p|CCgnn@GP|HbgV+et zL(LFlq-xYW)I<*k#MWXNbTkd6-a{!2Z<=zWTvqePVSMQBGuwsp<6wT=jMRGEKc1R3 z!JfTk;YG2)%uJ1m8L?L_ox0;4QYvz9jo2Jkzw(J)wc3Uvpw;hU0V0MXHx=WG=oa>) zkM73`lr%m|+L67bG}FYrwT1hmW?okP$47zb4qL(mocBvLwq{+6gMDUN_O{Y4m|D5^ zI2_;K9FODaWyp&t#idBbn=zIDO@`c!!j0cy-u;RU`7)g{Wa_~)$dF42hLP%~3^5-m zLp+cn8*mM*B|MB~Em6kFL}mLjEuu1HHmB)-nWZ;4WV-YUq!=klb%8ub<4=Gt(E0*e zoZR>|Sk4G6sjuFSum8V^jcu(=gz_NH9a$;h;9D>sQ?{u9>BS{!2EK!^yqgb#;m7?HDQ{*D#fI4aFCNnQG zMJ~i<>$MIeDQj!o3`xQaam3A#S2jjw$VvEppyzNGjo+-3@XO`0l_dDRq^Ix~fMnv= z$DG0sSyT93GcST)0=_Nczzl91i(Wb=a8ew0t)tk<-r}Mf4|D_|s*i3}t9c!h5n<{q zqpO5*T+TAOfP)1!m`Ae_P=mc0H3~pj=1s|2jhyQxXSEt`<~)iV;scdoEVo%iY46MZ z(U(x#hj3U}U#ew;zCM&aE1ETb@3PzESp;&aD{ zDUv&O+`)oJk@OEqdQ`m#z;NQY4o>E=r8$-@SgXd}ZRfV*L6zL)SQy6Q6yP<;^hv+bs8=oBVVkf%Wwmp zQ9cj(2)JS>Sh{q3;ecTN&Xv417iXomQ+&AgVs`|p70@e28|ro##5^HImi-G5*UjCA z=2#?`Me@XE#sXkzXP&;!H4_F&op`tgJ~_%{>_y_EFkX}O3rF^rJ3^ta?Z^ATS-6gewr@*@a-%e<^3smwRr#D))C&nt2CbXzrkn2 z$ot#Y(q0hW|45P^Rj(lFw7h@)T$A@(cQSc@-jlz|`{!bnh~fPYJI3?=QO;zGHSQ2b zUm%RWHsstNY*0t6xBh5h@)FhdOc--c$?tiMLt|F6JZv;XT1rN_9AVv*4( z!Z@sW_P;!i>-4mWT*<8Uv9vYB;VfsQ3fd#}s&!3L zuQF0|NGsMHl7jqyAilGaF?hcDmv{5_M=cVvK#wB{IVDo-@~*6Pc^BkAhFYPSzWGB_ zr3#6IIQ1L))^-P+V)JZf2EBee;K{RI`u&ZFeo3&;9_JnxAUDsi!0$xtW(`kmC8d8Z2{nBRkcV{!l52r zDG~>r<3Oka-E@23{g-#~I%-E>-gQ+%sHd4ZR5HD($n5G(L1vd#2~umk1~N{_T&FU0 zS4igM2)tqK32&Ga@Xj~OHEW(?xi0_#QwN}jISG1LdlU4*x3nHKQ{&zjxFafy#AUTV zOEpgi-~B_|c-z*F9@=(QLL>cmW($Y((6Q)zDe5ezKMcj&I?FrY302ylN{X)14bc1G zc4Phqm^$_&CDVGLfQD$Ux`i77L zuOi?LNg=!;tzszCBU-Ln%8@cdS`qY+6chCR6*6)bXs4b_>}q8M^x#B-9-I^d`g<^g zNxhN?=)p+@Js93)9KdS@D!hx}zuM8A6Z|zpwck{=!j@UYU)jSh{>rCVD%M|_sMGx? zr|(aa^1nSfeTPn;aB}+Zplv`>^z?%J2lc>g?8>LhyFd;g2$%ERHy`A{(~uNQytaHA z+6ME<$tRgF;gG~?W3IpsZyLDUw-6!(+XC#QZ{ZLJpGiyKLd;t{lMj3gF(L6x?(;2# zpy~*P@Bz%K?9sRfmfH(VhiG8>tY|tXf)K7&RiIf?EN1@;%SXW84M4Jz;)^nv|NYW&i6Zw zLYlFCWmnWdECj>9Lpi?r{cuncsa;}HFN)D6n3o=t*By4+) z5FbcLT@Pn_cmw~a?;%fNSmXPwC;fR(Ov~b8iiMvFg(=(Xsh*{;gHGa=CO!JU|EpkvkI1x{` zh6K_r<(qiAS+Q|Dl48co<)9quDsrecuN`EO2%!}FDFa5@8x6}>th>eL8*0Obrnv#s zE5bX8o;2$-Ki}QS>v+A954W1S3cta^jm1X2rpIP#D@C;`{TH$=@%8o?no+M z@XOPdIO;ok!0^%iJPssuGqvSjxbR-KQc&4WSs{Nq%bdpB0E9Z#sd^jfaQ@3MX35J||lJjrwspUJIWphCwU#Y|9 zz1<2CXceTrcYtU6TnE$#fX$eNWe-`#vB8VONxII?HTlQ%8!i(X8`+G1)+pkagHX8= zmHE5+7*3wTK$`7@fwa#uy-yrrLkCy3q78LLHxL<^jhPDMkN{y`IEM{C0ccjR#6h(( z3B}MwX`l6$OM+lh%{z_8t`y5PWkE~0*41RIb^VBcKjHaj++=KeHG-}^5zmI{etPx| ztPkEj!P4#A+YWo13|B*zs~*L68s6<$wRos!^xHu-01c{vaA+Y(8Krx(>hQ47n6@XY z+Fiu+LvHoVt{5Yc)L^|8M>P#f+DDB<1dCbs#z{1MlQGG`7(oQrB1TZJTy|h)X69hv zJo0=%{pF7&ErRQnF3rb%?QA#!0CXI|F*rPi(m2V9^d=GpcV0KC|NI$y>ybOV7S)W! zECOrbEXFf@3{2Y_n5HW7zX}u_fJc$!fA5JX`I``fAflW{2H|kzVlO8No7A6=;|m4Y z{QT3`jo}TcVDdio{-deRN2_^=M_$@HA9cNkh=_uH8*CX&T6C1Z_#$-vzO)VeI*%lQ z9la??vV}UL030>)#v@<(`w}+T09uNnpE1R7U`*Z|Qp^qs)EW4x^U!v{wZdPz!sdLg zI)smT;7!grH>v(DcH2Nuu*sMsK@$ADs%iqCVy3nBZDs@)aMRxhsBmp$L3Cb!N8){5 z4DlWMn`Fa&D|d%Gbs^t69%+iHyuqvta>>>%z6J`fA5LI`#b>_5Xs*zF6!Fcw6fw@s zv_~=tC^X$y`jwfJ6v+XdZ1|YEpe5Q=22OXkac$HPaQ@K*4?@{^KEWD0VBl%TMsUfu zE)p!LG_$$09CTHh&b|XGpROzTM!`$3t0gyKgz>*%`6O_P?4_Oi5?QlJ{pA?erKVtc z2{KT*BuT#9@|!(kaFrcFC;V?S&*m&UfES)g2)Y{FhOVHtywxn8Zj!Ai=&cNv`Zx)1 z#4w^CD=u_Zz}bsqd;wQ|(B)IvY_%!NyYu4{*jL+SOY)ZaN;d%Z!|3Y3u&?wr-bv#v z^Vd4fKy8&e#$m&>SnZzWRFxlN7l+Q{`o_U%5c532v_-l&t!!f(HNo#6UrP*=}c9Ge*FI|N3YPek(Nq@Gk`L2ILDaZ8a{9IA)F3V%X?` zBjh%C_#+ts7eb?6!Z9BPM*5rW&IhU2Blz*-M~ZCiDvNAI`1cb2CH|qv_AjJG@xCyE zw^7hw?k-|u0*H(k@FoEP-q0Tj%SlVXK^N;aX-;b7ISVtwRiET)FtCxZlp~fj(hedu z^7~YVt0K$QfIBh(I#R>Pv7^f|uW7Nbr@{`nDjL^ev`Fx&FJOzz)nM(|%E-h*ipA1w zhhq!&HG4wvIOhwmdjwlYf~zbvh0sqd|Gz_D0^aifJKBKI!)z>TPHMor1cx%X9&l;9 z@G-0eMHVaH`DQbg5nu3a&Ji*(Ilx)w#3Z+P#pkkkrH`_IgndZRnLJqOcRlL#yDA|W zghwdp52!86WCb;Ha-3_@cS07c5l}FZgA|do%4WV#$}xU6a&gv?(TRC!(CppnC4}2? zwNzd2Jqo<6nWbCUkOtYHuEKG9Wg9^!_;xI4n3z6**si|LKE@S}?GO~VAr7b!kH!cD z|8&fH!BuNshhG7tHK-<#*avM9BzXGZkPIB?2j8O1QJroS?FAqI65s_})u&!|iEUR( z+qa&s?J82j5=O0b+v<|TS}2vYg~)NM?Vn*4cPG#R{yBWHhHG!kAs}bj`(U})v;dAk zL455$gpObk_Ns0@>FIaXxJ%jq-UQ_VJnq3&qT)JHFLw=>{*kp-J%>HWs>B2yNtfZk zDr8f?$G4dDJ5SS_^fN~V2|0RT+A@%?UT3TO?qQX^k?t3xjZ;Yf?$VgG3_gfRyi^!tEl_zf9xdP2LY`n{G3TLC8VvKNm;HH z$T*;S35125bs7zcfF)B)!7)&5qcsq~i7?vpUIfd=tht|8#*A~fDNs_ZYfyd!HioN8 z8d`-?ZdHzks8*-L*b432fXj~1?(1p_xWi~64tX9F?p4DPl18z0nfxks5q>$e!xJ&IyJ5#sX-9`3mBiP>??t}}M=j<+FDPSMCJ9O5n1lqBVpRg;b9)A27q#1(Q=;D6^m306x?Q-XuG5yF9 zV@-Rp36^?so$C--1@TZnvUXq03tT>N5DDv%z#T!oQ|vCG|C_d3&i|wC{o|@Gvj6en za)B$LpyIDW#lkXww5C=jRw!IV1-%L=nwlse8Ul;=CT(KWRgU z-vP&ll+$e;Q`7UjAHl}b>M&e?Fzw><;}HOlvzt-_lKZ5_y6 zUGebv5gvdKF}xk|`IY({f=|^bsb>L2_z>Prt=UNmxgy;%+&THgt7v<0q_l0I9&9QgO_EWi;mqd|ozK+>?yF+|LFdywIG->TG939(DA2ZF{st@pithQsJHQguM8K%MI3 zb@+x|2h>(U{{@gqVb!Z%1NtWTAa%PMn7Y!V&_58wK}j0>jVGZ>t0wTH%%#aw&xMRl zaRGPg<_w3NI2ua!weI>jrJt^4uF#)edAl+N)=xo^Z$fda3B^-X<_x_aMLw+_e?yE!*DJTfDu8w`lw2 z-u$ZN&{4mlYB_d1+Q&=Z-o=}`y}LJg`(@tI7mab%_Riibws-UP+1|^0S-Vmqx5s+J zx5s%c+p*J4ni<(K`(C@%$hb%Y< z1Ml|lVQJ%gG(4mR8Dz{4svVeVJc`b$LnZAPcTac#1y?l6^hX&lER>{}f#g24fug0k4@D=E?YETjf@2T+=pTWp0G*8Ul| zXd12qH=Vf&W@@-8G%dfzz6pLUa@qZ4t~`x1TDAO_A|B>RENP}nxpXXTHN+7(2AcfC?T)J1&L(+5LpgCLt;;|?d3LxN`y;UKT!sl5Zp_Zyg($c|9{LPm(G=0MI->^p5_}rch8kLdBcSCG z%Y-)~p?a^E*0p5uq0gOW8;vcc02p=h&;L*dpMxLyJZKKigVxwZ=HLdzxo{4?==_RpC^f%Yo#Ec>?NMIG z_84!5npZDVvu1Gki0zTyq1!uo2VW3!+4c_J?%O+hy9DJHzTJlT6N+w}KP7HUYW*w>5KPa*PyEq84}Lc8Fo^zTMA_hxI#H^|SEgit! zy#|?G#(~adocb)lr{_Q@jdwQ6HIIPYkI(^w+s3 z+O!#U;vE*V&r3{atuhBL7qtc7f<~D)`Y66c*+-*&LAHotS#b29{4Ij%4V;3icIGFV zjbKe1S@I-g}+vfvb2;_ry&v_iy7H{0zwtJ_2D2$Q&1Km+)fj@fUxcx zgNoA98P51!F4cHeu%6@!9A*$tg2Pm7G8#hN0Sb7!E=O5*n|$sniU~PkfD-~sg}fmE zJqZD5qwG3CQQN8PO1)Hv-Bwe5A_R7^(ABuitadK5ibX|e+pI-8kR=4WrZl!eKF6}a zcb!C@-=|}pd%fB;exwQ$OmM;;Ovvq*zF;RBWJOT2S|ro5h5gaWhN05sxzvPl4b*HB zQKbRCoP2ZZc_4D*RPo1;(fE)w&ycO-)KsAqU{rh68$4%yz=)Ulv%hO`He59khzVb? z(H*nm8p;ze-69M)k1a8!QI9Y1a$rDku-qI3^N(Q&!V2Br)f%Z&P3Cc(4*QW55UQ9) z8zb<50-y37Z#2L9qf903LG$KSQlgfEqZP*S_~)Jpz(^kKC?4!tVeg8)F-%3@_~Hql zS$KSn{WuslvTQA~D}vcK2S6gT(t?C|JCQ4PgH;}1E@P3kIH*9Bb2J0xV9FCBY1~cx z5t`12;xi5ytwWinf3!uQQK>xt6}FX_p%2R#zcRk3))!W6*ajN> zI&A}ubeOh*z64WWx7HWtG{W=WVEFp^X82o1_%b7W)d*iC3=crTisIyOe>{yUMK7q43NqRv3;)f9RW#2Ga_=9D4@wiESb(QR z)>ElSUb~B-jLz=o$nf`lM`R7Eji|j*7~L@+Xe>B;ifHAJcpV~Y{6ih=I37Vv`6uI? z2)6gyk_A-}CE{!K2)B%LUN)rVISR#o3y@9ivhtfxY$j43ehTf3Q3ee!XYU;O2Ifg# z4BD8i3}*nChUB=A6Zf*RxuHdFANs zm`=a@P|YjDO?}9LnjX;xLSJQ3w(Nb>5**e5s6#?6G8t--$pN)Uj<1cx|G3TT;mG|> z5@y2qwi|DhxB0@JW_aZ0E%f~zeb;XJ%XAUf$uYUCpd@W!aY0Gm;)3b5@FO*=hubN_ znYUna+N9~cG(r9G(D(7!Wc6-|D$a72yXHHy7XGThBFZL@q56lgbSRo$l0SKANkKV0 zJ0}Y=6Yv~gvc#EJG9NKxyChSQLLh^(CC+jb?POef$I`pA@=kFrah5JN16e57-=n*}k|hgEOLTQcs{|_F)Ph0;T0}M)IGNrZirFZsdColco)BCY zT5QE-g(c~wrFZD`>GVS_vkMlN73Vn%CZWR-8(Cy9B(m(zsRc_4%I_@5*L8O&-~6R* zeYq^PM5ub$(atQ6_|?DorhM2k_4O|@+-$>j817ud%~fv2w&_S1_*-v$R~haqxa>aK z0GxY&vM9pS`uSKf>w#pk3{MrF6?iJ}3|*Nl((zak{xqI+Jp8i=o83{qumngUn16)- zlclGg8iP2|)8-dnYeZV26Y*E{d_Djl-#6`;E(XEPc|rUC9xi)ybdO{|eEERor{HVd zhcTsc55ezlAQ2JQ_(MSAD^t`EibzYzE4ecdXd;^DrmF!Io|aZx;-t?;pa@4#RGK4i zLBS-~;&~iADq<|WJEWPFG2(L6bTmDUvEeT}Jk3B*+)kLR+S^FKuw((!)3Y}mTiTd; zrR7fIg&2`BM)Xm6rsS37&0AOu+%F(tBPNa!eGw3rMBu-o(WGWF96^a=^#vm*ft_2G>Wqdig9?= zBCZzfzlhWV(5%wCE*Y)A==t(=5vCgKl92|8bVRa^Em*LyB(-$@CF5Nsjv`*Ty(Isq zVqGm_YXRA$f~7=>OJ;VpSbq@FrWO>I7c42dWVAAoirgZ{6*!IN(J^C1Slbp+1Up1T zjL|)WP9s^g(4&0eoeC*6r4Jk90P!a# z`yAan`X-~R+tGqf!ZPS@oDD6R+9}b_2JP(B&b!+AUOT;assv-TQ>Yz}c3#lVKef}M z9TaPfGGHXlZ>qm4{8ssV5yr41VMwUcgr{wca7`(UL3xoZqJu{%X@{eJy4a1UeLkgS z7{(+wn=V>Vn4&)%(xZ`>f9*2R!+AA`z|dDgF7dRD5H-1cVL=H<1Ew>=k=SstY$A!l z=>-cH6ge3w`J$0JFw*pe`OYGP7+$2_DkDuD8EFYJX*O>rUE* zm0{CuVsi_Y6)`)LdyfdA<;>Y&K7}~BOM}kd<9q&Y*et{|5fA^Sz~yxDzszYPRwWyA z8p#A}Z#7(&$Zt+o#vh`XF~a>sfvYkPOjbZB zU1u!e%)Ph=-oZNXYn=ROQ39vi--MKCoE2Bge+?b}8VE0QqUC4mHQJM7lON*M)2L1t zY(dJPrC}pv7;IpDf1tWS5W9$6axHw(T$(`wgPb2_9#{@QV0Hk4a#tVs-O<>2gE3E* zaF+_Dr5E{Ugwmj^*Rm~ySN@3X5|H)MFp~q%qhzUQ$XTp6;a4NAFM+P z+(qCAN|hTa9)&v({sV*`AvIYJ5w#emBSi}$v|}$Uwt9H_*$Xwbf?pkDfK7&D@P#l2 zChazAz(?JpACz4_teaJwTQQ{Jy=(?n;5aLd zsQ&X+O^aqSS#p9yzD>R4CCN!?@wia0LEbPKv6}+ja$L&@~NDC_}2X;EX zkAvTbGb9EMF3ReRd_8H2P`?R>Ob*BAJZXdR5$BL!K|vWG4*4!#XdZH~ab5RY2Ou)| za5*!NL1`#AAj?*FeGq04p$#vYL?~uwT3_AeDF@y7a`>~=a3&?caHQM|BF0J| z6pR|=1Q2-2Y43!2H)U6)Ck0t)1GK~?TK0kTQNP<{7yr9ehV$L`9!hpEPY|wdH90Mt zTWM;#cdC-m$Wz$A(J#U%8*9%n+h; z>SQL8;M_!=gw_|+Ql$}sFD-G${u#46j}7jIlz6D&^cIaNS^`#&!)ct><;ItQyw*g% zds2GJXTFp)V`VKW!@TK9K|g$(+Q| zC2Sw*Gj7^mdJH(}eBaRg>IBt)HIxdb48|n@m+PS&2kl~bp#7dw<11xA^^(D!C4-?9 z(Qlgk5}uxx>bnQ5^udtFu?e^_IAwsxL9+~#HS#n=^VyR^q7mhg9;oKAu@hBUUqhpy z(GIHt3R8R_k2KMQe+Wu(hb`}}yoGmHa(Cxl`a_=E(}RYF@!#uVeg$&J%K`!JTChOT zvgsrc#&z0j#RZqIx?vW?1#O#Hl_fPZvB{+JQx@RY1E-`11{AP~09BS8xjA(^22DXS z$C9MXG^eS-el!yKR_7dRuph_fVUto(kiF~BLC~5`iJieMmt+Wxt5aZ+vL+>wG{PZw zpYj1Y^~F+doYr>zQg3N02oPzJkSh_zv1qKUral(zh_X#5PLogY)8D3R#(RB>EZ8zh zQG^J#@m1RKD*H+t3`N(JF$G_yu9gpgi0W21mbeJ9T61vt;1G=Nzp$4S6v}9}} zkV|WRmoxzQ201r*MbH8F-B#i1>>)S546~|y1%!ka{!(BK+PI6F^!p({7Lkd}vAOrh zznB0Fl}~zs^%O40vG+#rCEEId__YF}Rn7%>$nwir{+FIQ;(ILc-9K089R+s<&R{Mb zemJKn6wAAO-?04ZD==O$fc^x-HGr^ZA#PEP$;U0K6nEo<4mY@(}0IlmWQF5*IL1IRZoLS=z+Ddzn-`=i@-O?b-*Y$lmj{O8g2XZXkAYy%0@jKhJDqRIo+^yZESX>dM1tYOmJa*XMkx5yUgFM{tM`^cMxPZC-oL zY#Ws8u80*eD?bL(nS=haxft|K2&&GFt)7j=a!%2`Dg|kTd~B$`Atq`s=4PCA{>tj@ zuov?VgWxfVB_ z&BnC?S%GYx)Y;&4Y0e=%+bz9`9el{sy*j71!CoI(J^Mg|{UBz#T0PSZ-^ZEmNN{PG zIAjwhAnHaX3D=V-JfU|`3o5VIjN!fF#On}f z=$z&Ded-lm?}(K<-v-$Y18(R*Y_pn)iVh*$8v7x2r;uD_Y~kL(j89-YQ%_!?k-q-3 z)E*9K*1h#dFhDh0ZQyJ5hNJ5D7=JZ>oqfZ^FXA|i|AQ4V`%_KaVfYP^AN)u4<_)sj zdN7(Tzj6+iQR?k(SMQn)%x`l&S%@n}a#-?PesvNYd6=vp1KtRjGx`sH%-O2SB!-$L znV7RkmsX6@+?CDZPF%8f+#}Gj-Z72#7D}(czdLGH9!CMVj|Htx6vM<7dRTi7e@$j> zhlEJQQ05*_%BuhfvOtTP5FBmFz!c_=Kjeg6U&U@!*lJd?wLCde zE`t=$qucK9P4rvIUuoZogrt# zzLd;h?#zpJNzwOIW5}32 zlGikzs!5B5B{~oO1@0qJ+`{P>rB7Wg4;qil^K9+Ik1!l~>Asm#Pw-S2*c80T8$q^z zPd_CNHSFN+(LC{dIN-B=vW^_`<1$&#tnOR~Bp50?Il>Dt} zREF3#ISV)2L&6$mjKvh;03Th&#MNaJ3+*ts3Y(a79 z(hfz=Nu^7R3d##?Mb613ry-npd zNJsjqE!FXej8xgB83l!mnq8_QsHR9MU7X@9FXlchs{Rj%8#|aVE(s-Y2(UZ`e_QA5 z?7VrVkkfuAN`;<4cvb-bD38dVJa19Kd}m11m||2w#VUvxTUuINkXNEb>)1>A7}=h!hBW%S($pXKNJ{1Q|ZqG0vN(_KG6LL#bdvL3tPJR5VvuHh+P+ zz;$%L*(jJvO<0b|4bKtHa0fq=BOK4?h#koH$j%(mGy>_m;T=zFOSWkJ zbB>6AHb<=eV~!Y&@3>JpA{Ec>)j6Wfnj_LtPSX$BVpA0S{{gr<0ltno;^fVM?Uo$j zEXxtGyYP;*2N52hoFk6m8T#8CaS-_&N4~9p0t`>VAMUzl5zz%XViTVH`ACbl*nKcZ)Wdxmb=iGajwpHn={6w@a9g*cuGKkW1mZls z2(bJiM{Ij5N36iJeoKzXM&1>nx#BdQ0b#jfO@!Vz5u%$`MB%l8L5e8E!5#4Gkd|KR z%r4KH51k^h@3*tXZn&{&3ad1|$XHmyFvpJBg4fVR=rBc@kVh@NBGWQm#mWzlyCU1ddX}w@$^LnzvvIZokGRGKa* zeD7cen2_*bV@z7sd<^yC$z^4vOazC7!2(t0%<+_bS0t6<6>lfMYMTcjcIE4w^hG^+%YOLT+c zV?9W23*4wQ!&B$;G$6wqhX$QoVo)(ennm&e-&pvX1VRmXgoy|-8Y7T1bU9oq&^!*8 z3NarVZa<7ze$O-92Ml)x_Iaml>$EL#+kkD8_Jwa7v~NIHi^ze|ufO=V`cC?yfl=wv zxuOiuV|bp%Bk?SY%oWM8xxyKhE3Eh)zz1=2iGg@7q_Z~&j@S#h1yanwhS>$&!qw0u z$-RhvPMc&FR84fs7163eCKsZk#yCSYWy8GQCa&@g5h1x~H=-A&w;5z1(nJMvh(*&H zT)_B}!cyk4jPvV%o68t6G6vuR0Cs$+AWmE=ahTD44n_hPAp~Q9n1u{%Q!!7Mx=Q?& z2x(ghi?|6EHgcg~qYxd%E#bTiB*ol)vFe7U78Fy75S1qFj<~RUNa9C6m<<$aGox|? z&|+&+Y}Pf}K{4Db1Sz?QR)wLu!r>o>2wOq0)NBs^g)X#T0Bn}Cv`jpW+|0kz?@t#+ z9|Eoqri)rU@8W62!*Tb&%qc@VUt~@h33`1S=zSMpZV*3xu{q@kFq-`I|EoErI4<}9 zY)%<54)cOBrwm5jIHy$2#=QA6bILNb(a+5(_1(~p#+(w+ZLEco;12YN@rT{Nr{TjX zB}z{RCOtAEMrvLalBHFHRElVg`5xHirYxNGV6dC8f+3;iAj7 zUfWheONKOWXm?ONJZpM@+V#v8RcNnGcr<%jR8Zi&K@d+apk(>T@Fyu5vGYPr!#2qP zq8bN*!Z=JgE{C@rmjlG6JF~^H5aDxzFEED~dnQIijV&z)->-D3Y*%E9jA(Eecq(qB zp;5htiUpgRS4OU#4Y~I1T1#eY@pY z7h%IRwSby`%xf8fALC<`M%cQF2zyB$^2)E;I7K)?2lByHmEkcRlj`dvIzF_n_Q1D}DLKAknmkX%KF*+NQks!bJ9cvdUUUbrt zI4HQ1J{UentU<&?Ac>h9GOOwh087hUWtjyfE@t*P;_O3aD}p+%kFc59FbW2;ZyTtG znGM~(A~Go7zfJkjFF5`KEW}r7U76dvCuhma5gNN2;A1(Ho^cFGY)bMS9yU!C4IH+GP#DC zkZc}H$rdA#0iWPf28x);C7GqJB?W3d4DG2EW3$B}RGUw5%t0c`h?!ctw1fqwBQHL| zu?CB1BUYeth?3kc+7N%Vi~_6xQUP5P%HtE9+qM2OGa;%WWXBMLPjIYXupv|(a>@u- z3&QyX#~CVYlS^JLuyR9AOxtfpDkX$(|i3EOS3m z{L?Dsgs#Cn0d2Jxv~xr|=e3h?RE3SzPM&t|)6N#{ys4e9wG;aL%+yY`cK)iJ z_q20PJAMAG5~OG+PdoQ&=l9yF)6PllbpA+}pq-i8S*D#QweyO0KG9C}F_mDLc4la& zN;`kl&g=t_xb#?7KB(o4e*zY znGW`&`1o{j63-R?nJ$*&84Rwu1q-WSeaZIn+F+SQbFT~e%e9wb#q(dvEH)zj|4aVz z{|_>Y`hK}>WEM}e{UEPc-6vP1;@NR^u9$U&?p-XyA%*=#x`;(bg)6?1OLDSIaqx*s z)51C8hT+{4-W}6$XaYwo?#LpyW(33|pi^2-Nk06+Ng7EwpCljzvW^m*RcMnP_(BhG zguLP_aLFr5xLidq`fR$GD$e_!hs*CM;FbmMOvH`f7Pf8dwh&9GB~FaocGI@4zB=E2 z-#*_S-&x;z-(#qm^-3%>`$Nig6}WcPHhKWo*YInF-vPA7)A0zy6Wbdt(>GV_MvI-s zdvtctAb{{4$aDb{$`SOFOej(KLMF6LGK;uRq_VuUg(dluI3J>YLshHuyhxk4HueS1 zi=?>9gPPPLI*cn#D=lA|SI*N#Y~^SXlTuVL|Be7BUj z`Cw_#OUwx?@iqX6)8FzimDN#RIv=XG6d;5^##&m6j<<-JqA4L)bkgFdKvkF%m*s79 zBA6i;LT(8F=wF>!#0?@FT@wKS1Fgf=ciSvUs-VDZER0xVMTa8VbR{Vj7wr?a330VliehM{9O)B(zl67%Y!U)=wBCmLNR(Y_=Ex_8os!Y|G9# z(^E3PsI+`ZMXz-6OT>5@T>IJ})((vQ*oCPJ$=F|t(e2uX(Pabn#cUaer9=?CSXkNA zaD*(5Q8pn;`_)Fb_N$FtEG-`ZP<+h1sQCsKp0g_OZAodl4RwQBrH_vpi52Xjmn0K` zzn5CI^!)i%ORt|@wOpoGEvyt4#=d+^1HoWiE^MY;)exNewzQ2>6)(coVq*#Os6`$p z!`kKn9^5ZiWt{zp6CK_*P9HEfJerG!S;{!&XpT)mt2DyY*JS$5E@i}vtvC|?w-raf z|7OJj=K8-|aa`GM#Q~wPFQHv+6Ghb2fRvckfY8@Bx?QaP81-$Wz>IjY1>6U0jGF$@?0$Bh>G|F`{MIm6WF#HfrWG&1Y_&* znCQYN167pCT)P|6Y2P*o@XaX93d}W1GR4)bQXJrEFJ&97B#@M{5#l3=k#1|7&k$9V zS`b}o$#v~TmRv1CYx-aKmt6Vaw^xG)-V%gz(B&0FMMu?a_TqxYSdyw!RJa($w>2mp zD|MadpyF}CO{N=yavz_didPLIU#=zRhS=QK(k{wyuDMhc&hM94=8b5-%qva@Swv2J zf(yJ}t>C~caG4i99*agq;1e9_1~U?ud6!x+-e|4`e`>)v(u~BMj2!?Ub^+QHcM}&d z9OS?OE-GzkOg_ONjba>qwDgWkEj*LVI6txQ9R0Hk&zpa4;du*-F&3W2_Jt2y7;V74 zmFvnj`x%K7vqd`EnNM)Vl0`=qGYhi_W%HL>sgC)tSE^(EtHz&Nsiydspg*}%P4!3n z$(5?zU*=D(RMXgUKeJLD7g(uonSf~>c)%yP$|Wva47`ku%N5;$s<};C_bQ zZ-BQ{d@ExXgV*I>+n7pxsrIQ5l<*C7I6C7zXXyf*L|-yCuUzT3s1#&;;}PDWY~GSd zrR9tBifwqamzS58)60xnJL_cF`_0RT zF_nV6#dY!UMn++BTe>*l+YVCDw(D z^PKED;s%wxtZ-F6JrP&E#{{CQtStU`mJUJoQ&{#%BaKRkpO!N)CGp*KF&^&ic<#Z& z{*AAn*+$OuQ#L&Y30nV%n~Q@$fR6RjAwvnme_{yj zBP5;D)C^!UdkCR5o{>n=5o!mVvi!z2XzgV*0%DASfLR`82qqaposA&an1Ll9y;@ca z^Hcs80t z#6h?eu5^d6Ck{#o0)mrRi|rO{Q=*w;;R-bSV|b5KT5ejAOL2^}f-_R}M7xn`v7JV) z0YM0N(0C9RXhkhBiUzJ0?BxqZA#D<(BE+YNi}T%=zeI#F1WE&G>VxL&~x z%Ll~;0n0NM+s5EnYV-$7hA@Cpsc?+kf^w*R@Q)IzpG-vBiHSW+3D4PopxFUf*}>Fi zx&(USoQ^uBR`vB5A)o#H3!k)XHf&D#&n!(q`|ATXROv73&=s2QDG9RUbFdgFx0mrW zsXj$y+XX%AIlN02%JRPh#xvSss1Epb%%>nL9vS+>Gg_hiZ@;B>IuA*iXD*x70UwwV zhq+GUfX`<^aI7Ah(3AjBb*X= z@+f{iXHB@j0KV&XV>{f}^E?c?-{Y~ajC*Fja32W4K^Pn~U^;s<&U4a08m;$DD;jOo zaO+=K!>OgJfydUYWEqZ{4J>4{jrIICoSOXnuKwE*{5Gs?!mog`KOEHgxoXr|CDZ4M z8*4VOycb!N9EF1p{(kuyphDpvfm-3eV2kdbZcm{NOna)p6@>s+1HNbl-wP!?)`jyT zxT;t8-LdM-qh=fY5#wC9L8JXRXZyBQd~GYMSc)uwL+C^pSI;@Rc`hs0ot3j6t#%!0 zus5L-kDx;TUd>KCCezNNooC~OlW`#KFDM09FKXDI!6Bnu99Ed|B>RuXGlK08^1e!* z>BV(~M+0582Bav^Rqu5-yDDCHmHPlLB|DBo$Wxx@F%;aPnt&6uHs8a!pe8tF!%DG_ ze|Q#lb>G@^Ga5+lUv!d{y2-3m&)ulhm@ri-M|I`F2K%AT{>mLxhlXCo?Xh0i6!W>o491u$LOt2U*?BK1giW2X8*7 z`k>n7Z+7>eRkPp1W}mo_&0g8I*1JQGN;mtLKk#VvagOsgU5s^1NR{UJh^mLTs!dFXd_o)~B8O`8@Eu93dgIXGmd z4icuPocHbN2Q0+Vcui*U1%lR|j!F#0cD+0cDBml({%tbMSkdtttKC8=kD* zeh5HS&q;vy+{>W`k=}zAHmbL8gE!7Oy(6Q(YUTOic&G|X_s6&)7J(#^)pOz+(_#lh zhV7}Vs`NogQ91xs(1{CLw3%H8Q0@hH;S1Zwb2{BU9oK`G@^s@~thVp^*A28E%R6A2 zf^kjLGMPv5#0{L&&gxH-&y+d_~RqJE>I#_EWtRm5ienrC2%GHQOo zg%mc2=O3U#b+T#GdEfMDF)zCz;}y6M;dUT93?|EsIJT+$A+3i0*K-X20oYCj;?STF z`A8aI*iF(b@5ZSzWs!9G%=5k%>!F&izBbOl@Tx0(slg|^twzm{-4j|{V|{fn#%0XT zbyT1BSl4={Tkm}xnOLIs!;@OpQPvF^ItrD#@s*3O>T%Ypy>a*!u84al|jV-THA_|@1!90STYMn!g z21HiOA+Wr@uAZ+%qlf2msH$l4{rfmUSE~arZD!6O5Szxp(kSggo)(2EJd4wq4ASa$C4ST4NEP@^@^2~4$ z_PuO9-7q{0ZT1z%PT>@eol$Gqq0Xq)%9T&%o%g}^&U7q!c;x|ZR0DzBI_RgDc zbJ8wmXIy!Jc2;E3wEN*vJw-zro^>4M^2x)XR1MXpw_TlFd}J0IUPaIe-|-4p{caX6b5` z4zVK|Rw)wYpQJuQ-ZY`p16&^Gr>oave)g0tIdmcCSx#QGRp4{V-}x$fQ8IWs10s@ zT)$tP$$c2QY-06O%mfw4L}~tJ_zZ<`Q4$M=kj?JKEDDw_&cFF1L%w}zI;2!M9 zX{ZX5)^UhCCl#(dT$#k15klqoO1AxJu!Rlw*3LX}4ErWI&6`*60HDbV&}I`*7Xe+1 z@(Qa}M!^410H+_cRVWFkoHb*62&^9At9pcNgyL#Jzd4>k^=z(gxI4BeT93P5Zsxe_ zG5-W{6Fi}REqAlc1bvjE+|KFfgMn3h*)Bpi=r*!^kNwc5K_7k}a7vWBTBR~bwySH^ z4;E)w)eoUAUS3xxN0Bdw-HzEot(%Gx*}5-)4J7pYA7<+sb}=xqN5?vBMG-|b&d;9Q`O!kHku39l*xslbC?$T#_USTjoFno>y=MpqxRD*LKp&% z|CXKcKpv*wI(dHv$s7Bvsb)LjfnOaW#O&%Gv+GVv%&x;RyWV=`8Yk7=2e9{Wv^wWNHB9>}dti$r&E9RaA0u!c#S$qK7|LA2eeg@>+5Hba z7}A_@^a=)+9FEb5*G+)L^M+o)gv?P3m<+J7xbo_Nk<~lA*8nEb58y6dwS<|i*Jt*F zSi043R;!%bVB*kYuUBiDnev*u$y^_m55tB+iZ8R(wE_jvzLdYcod6s63ur9=;&E_t zh<+bj;>#lsq1`{eJ+KZZ&gcstK;dAi#;|_GTZ#WYLz&LU%3RNUvLH$u$e)D+N_xc7 zAQG<{8{;P>95yqnM9e(RVGwXj#zT$3KJ@>4c*divI7 z2anzPDAS)9CfELTxz1J1$?_dQrtKEs9#Mea6`-@azkd+bJ%E}SM())x57?DgJUMug zo6vi-_q4Kh`L!S>%7jlwJgj+u1t*i?S*O?wWsLylcVs>d5V^@`$k%QIA~qur+_)jr zpFHn_)v7Mj@ID&vz|+}W0XidKX{j$c$@dV_P|X2d?Ou!Y=n2qiV_rxB6PjXmctVLh zts9yC2lhcqG-4^>gNZ3Ttn_sUJZ(c5frN?Qm_P!y(`Wf zD+bRZZ+h^&55z9S71J2rjgbsSrkUg7Ofp!+F!@WctBO~k9e!R^WE;{1y5x*acMTvL zyVWNrfkb;RZycwMsKM_qJ~;}003ZzY92d<>>Tz}&T!*GmV5gM5nU`^l)4(Oo!?7RK z=&I7At7W*4mjmm-_h{z|CbnopD`r=+RZhJsf*j-&HY^9A12}{4F$8UgPi|kPz!-+; z<~0Wzz9)3RHD)@+DeCIngCKA0IA3OqYZbY^I(hE{K@_+F0Q0h(p}*E6DtQf}e`$;; zHOK3F646{o*hg3eO!NF$gKIVafWJ9vjWPNraBce1L#`Qe-1P_aLd5+hFOBMH@{`k% zETLvu;!q~NeNOd=#Oh^Oiyf&+O&lO!?yv5)9aQa1jD|NY^c=vIa7Z6rosC5q9umEd zis;Rp1>}Qt+g(3WiK^8YQ01QBie-3hVRge#l{`AJy4YW`U6;HVrAEV>B~Q9!$;U82 zl3|i#R$|oqm>cD#8CE-k+)!C`=-nXiR zHzH=&^&@aD&(mPS4zVy$19wbSM<;r|k?%YXly3sV3}Ig+Dw`!2qexx_wN~yzn3A#$ zR;`eY0L_Q7%_S#$v`_+09;xwEjo1!(&vZ0Z6RdDlqM2=uEcp~XR-UQkYSxB}#H+1| z-blR1x+UN77ENC+k{cc$zJJhuVDGXq$<+-pyVzNcF}nsQdj1)+tM-*+u~CQEB_SC2 zS+a2^%0Z~|mpSmaDF5f+KgqSEsqHj+)~aRLVP~jkf1Rg_gc9_^l%Gr@i(%T0=r9ao zk}%M=TyLvy^I#qTOPi}~V~zWv)z`3!>y8k^TIgaV3=(nBS||do(dc)%*~rwhic1h6 zPw%8{)J29d!Nb*S`KCi)rYJH7_L*9*Ajf?Ur5hp#8!{k%C|tlgOs|R!IRVMKZynia zy;ei`>-Z2(Bb+R^ZyhVG!u6d}D-XlS-6K?~enh@d|BbKCeE|G9$2NG0Q^wsxuFy%Q?-?ba71h1g-}TS zn4j2+IRR@plbDx{z%W=o80J~KZN;GodGJm}`Z}m7XE>lG6-FKkUqFW`wgnTe?J&~1 z)mJ$1Xkd+!J7G>6<$j5MBAnNGROfJ#%m;bBLQ!NkzNd;2NG4$cs!S2)78$l7NEm(w z*^*ugaD1GSWA7)u)C>qM>{!UT}o!3+=S7!#=xd_}_)n47>fpkZ4(P_{fziyTc zgnkjrD(A2o^YaO;c4|Bd9ty9Xy=YbsBP)R5=QB7OUfXlt2O7tzM&rvyr@|L5NKYUa zGd|Hv)f9XU>2w4T@NbZ#8@$598-X6cln&&8<;h5+uEt%#W?H1HFc7@LHaY3X%0ZaQ z8bC1xrVtxmqD3}jCmkKz=hK>++CE$M78V?JkQky`J1D?!!OKH@fn-K^xEe8U$!qt2 zrDA_Pqq{n>>d`W2SHQ`F4 z))T)Ln98b?_oxU;%DL}WB?VaP-p$GhXNRiYYV5&Y;bE@@ww{wfHPDA9ZHU%{=MlLb zy#aq?EMYkUN-qcA2WkKwX=hb$NTNjYalTJlpIi2dhvX$w3+THqxUi2nJ1ZplBmDAe70x+p^Pn|3xRy*^k*8NhObH}C zgzXP`?G<1GF1ShTv_qblZ~~kQ(^WD4_e~Bgk>LM+2JXfTC^)VD*gZu8( ziU750z{PVIAYhp5mAI50iMCPvX!|b(-4c82};K_+sp%tx^<8n>*i%6zv(9TI|n| zCy*Z**?Dw|B3tIlQ_JG*WCjd2;GcWHf!WY%bz$YWOxNc+Kz2bf20t_WGe{7%S@V&| z&d(!YXf>l|u~_zL`^8s}(*g>K>tV6SP{rZkQ1to;JZ8#8pm-^hT}N4E^fl34!lW_@ z?{lCzsvZ1n2Imq|V1g-!0!Z=%%aBs11J+`_yDU<7a6S-#6wldD3AASSiXgWZ=iW`3 zI%ue;iZ9H8R;?$XLW-x!@qB^F@>w27i&@bdd8pKVk=oM&!Z5|XmqEgr?s-(neBAt$ zFOODh-r=5g`~;QwaS0M^=SR{m#=~USAQ!?GDB$;R51jZra$0%HxeOXT_kPPAIK1q} zRvZc%WfpXu=YD38qzZCf>3LNxE~k~K88gcBPZahr3IhhcgV$Aft@^tr-u)H9?<;?G zqqdUPzD6OgWxlnK3rkLgli1GZ#BO?&65zb5pngV2`@8# zgx#mcfoC<(0OH1#D9@rI-TJuh}gs zFg8VpCgs{(U0^J@)5;Ga-c*^w`tn5M?HxI6H#c^xDseMOhbn_n?p#%AgRou`#ATQ? zBa&vfxVFH6cmrAzD<)+_UC-4Rrh2pk3XGZIhA2_{y(8b*^^H&dH34MJ^mzq7z+HQ^ zFUO{2fA3JNjvUzoU}A}K;Ki=hrIS&=QVnQhX_Gt0WAfxwW)9c8P8LNYOKl8d5? zz?!%P8&kBXx>s*aMZ>Zr;%9*1d8ZCPr3r7FJO`M0u120F%M$JbefEafu_#YYl1?j% z`4BmUf>$I_mewf)&>3nuz5(aEvU=w?K1JIM9yHlz;tb_c9#?ct<>^2Cf!6cM?N-`U z&b)~iHgVTS&?N74Fc!+U&*Jl3`kJ=M^?sBhhTzS|>;RrU#d#5gW&{Wg3Z>jj?ZF^x zvOCE*JE_^7Y1nT;y!4Z;r6i04Cq9}RLV*=U(` z-W5Lll-GiO=S9+pL*czvh6DxLzD;0Nox=2w5?zv3K@_Yc^7E2b;K7x>BZ*|>? zhHI!wz-SL)+it~~PJ_LDhb+wVumg>;8|!|ZEo{;@Z(n>QJ;oMr(H!-3HWWscKZ3ud zwkY1u0%!;EcO)16 ze7W4M82xs5k%>dh8g`8q*L~qfi=8x=jD(NCm@?1;{h8ngF&oK<48H>tM*v?~>PH48 zFW_9h^J6t9C*bv2yfUkC%!(63PtJvMBNlwO)hQL1ht(_7at$ZR^Wlmoj!J7{%*%p| zmwHR4#EaS=R=7$u1~(Qw8OVE`ymb{MrmyXx>`_M8q0s{g`7$ne1_A)ABqI!-3qmfU zCh?Z?W%T;y@%b zSM+<#lly_gb#ggm)NT2?9ZofJwQikX4(<8Du)S>QZ?->hd|b2#7hENSAS+h*RcK{l zf{%$7U@A~^t`k!Mw-Dk2YYlh(Y5&sT*H-L4q+OC$ zaH)pUMyPq!+11!3cSX8i!$L>)I@OA07dN^T?Fr8JkN;J^M?tvIbWz;$LVo`OFYnLK zvzF8zGFqEwznu65Xg0;OoTCUlt|nMc;`nbE@lI;4?53#ni!?2M2)qdSXq9flEH!~Nrl}1#z^3>ouum;mL?#)$Ymu#TD3CIeWze?zvMW*) zBh@HBLU$XCnzO^oQ!Xrny|&D>iLQ^)C?-EYG@s z?eb1D@^)P`Z%FF>c`s{|_k%{>546b}W9#MJ(3*7LDx4X6tkA3jYZD@pR8b?kqkjzL%|8D7qpc9n4-wPfwn%TqZsU-VUl_K zl~4$w$UEdgbt5@_ru_c1vt&KwQh3zl9Ap03NGm@@y0=^I3Uwb6q4s0AJfiCERN)M7 zuzw%zjjg&nO}|HZt?-GA*_rcwO=dkRIMVm%LH0OQaVSTHWCD3#j=W``vnc40iY4dl z2cf+r$P%jh1YvFf1YAKe2v@=!tGe5+3yviaTU;?;Z7D{LLo<1 zkWPs|#Eg^dkdZek{Su@MX_I!K!lGknG=FwWN9o3xk48bK9%9GJG<?K7x}4v1(B-@VFQXh>M8i%w6ey{=I_EUh1X8BA=KlR#p80_IsM6+c#O;va_R^p>6z;(EgpTJgiu?tO z1Y;QiWUbrsSIXBlYhkhF!+>@SX4tp9Qq3}?@3><8sMc=$jXm@=9|A$0{HP5GBozF-1S@74K+|-mv2O_;Ru#hm;31CiNCcDM7T`p)!7u4zu^|Iu=YX1M1$EWBg+S`J*D;k}WsjaVAa@DAqd zLG{{?uVcV=%q{zGlyUPW$`)0X=b$nhJbpk4iOqC?&U1&U5u~(E)EW_Rzt1@k zoMy(iXCWZC_BzDSbJlho4%bbHZDm9lq$1pm2s%3~X}7-57Q)cUgg#j;y+N$kqF(-H z-h)g?mYKm9->`&zL-m$f1|$^T<4T+xEi^veTkpie2E!716;JZD`pF9QyNtiHTL~+* znAyQ!jWVG__K?kDwo=D*WX~KeID*GJ=yF4yw8 z0w2z|=}Gpc<^Aa+=#!kS^f+7OH#pYhNp|4&rAE6%i15Z>xoOAx6khz1HJSS;zrehU zV0Yy{5wm6}PglU_P52D9Ea}bnj@V^RYI0p&W8e28SDjd5O#%t`c4r{(*F<2rd+|Pt z*XmweZ-Fm_>q-ywG`f%YYpZeXtEt?|q0(UgR25Ln0z%5WIxBuW;I#jEAZ7(GbUjgr zA7=Zw&b9-hTTlE|dnV-$b#*~tRR!*qWJu_V^$5X><%GvbmuG+j&ko+Z5SfW$%tYWE zKDBx0;WxrNi^U8JMDOaIaIxrJyu%T_vv&xihX$f|@?L(i=pD%he2S?}aX?_s{QQ=4 z2zY}}Yci`egK`W2qd|?`+tYGIvt|kqEbDP=Epw=_QKg5cxa8TX3O&jT-7j0nSv!k7 z_fz!)BpF+~)#{!2_0$a}elc^xJQ-+^)D*M6)&UXg8=m{ENbY--n{R$>Zv;}ZJoFl_ zy<5wCDZ0tSLeKlT4v^9RY9$5k&}ctM)B4^Bya-SSPJ=b}HHyvKagO4a7P%J36b4($ z!|~kU1zUK~eIV9-02jj@tg&yEeOhr17n0!FDnsz$IWQ|6}%SEPB)5j8a&QrdSqd_61qtujL?9R>C@pV! ziGXtm;g?7Z=(>UlMq?8DxH)%%Dx`$!4ps!b${Lx6w@`a?s9g?fdD{n0^gR($xzS_a z2+wN!)9|mhZ>_O!l<9~#$bQn8EJN&@Sj_z>2J47Ed~d`%21*x1b}O;RwV2aRXq|!< zIUAv)Lt<8HodV#$iXF4^C50v%l?FJ*-4AG;6Mt5ITjf7_v_L_*7jL2VlYl1Fgfg^p zQ+4H*L6s+~D>o57oeG79P z`xCitQH`@LFaRd88D?Q`8gy)|qGO}!Gl9F+CLJ4yTou}mfUo?`y*MJ|fsO-kT+TZc z7$JvuVuUEo1GSR*75a@?^#Jukdvj#U>3Bzb$DmHSy#f50n1De@koH`^mp;* z@0ifat=|5KwhU7)qdnt~_8i`VuwtvnzKsXw!3);pR6TD2x#_0QAy*k1fPC+TXWOKRl@PI0pDO93$Rixy&^yCKV@E+R=)B zLZ>5I>vTM@!>`lPkP;W-u8$AMD_PcQZh`5{2Y``RD`;SlbFeC<&SR94triB2@~bZ} z^`nLEm;`ADB!V;KD<}Z6MN?J=77)7v%L8euj%^LN1#WP^TGL+CmcGZba8 z@z+6uM_nJtqY0SW(@5Z+26-fumDB`g72@p{@$|E!W4T;P(}Q?`BL2 zUJS3}FJh#KJ^YbJIZ+@tg(X2fH;5Wh1JRRyji}?soZ2FXp3oG7J7Hxna87NN$*2LO z;obN?f(>!Ns4@m#hJl*sDeOaN#Rf=kk-K~oFhD@u7e|jN{z?NiSmXl&V(o=J@(jvp z9vB3vi%-S=En~N+*xYmP*(P=$6?+z9oBD|o%}X`Lqq>yy-ur*039X8%ezS8UZei_5w_)EiNCF4Se&Zt>IwXbDOQ zf^C-0ClZyj*Q<_DO=}$8y%tb8n%96YCRbP|QZ30)h1T6Lr$b$>S&SIDRsiEYs~gdV(YIzbI@3LV6l+pQG!q2QE6pT8ySW z1WgFYt5H3L2Nh#-MNG%>=>^4Q+KhE+xwtwR7g()p-PY;$cRK(6MNvEXuD^_m&AMv| zE~C7b5pj`WA#D8ld_a=jOdqAws~9SE*3YF5*QsIuis_?+(hu7KpOBK_ucm+U%kb1q z51#FI?hmgWxuAI1qGa)6Ar{l^!0mB9=2SNp2iB9zJlpH zkJr~WvU1ZF7A!5$ZIJ(SwdkNT*%yEzGp_^&5Owmf52NphteZII@%pdh-`+5C&IK^Q zSgC@+kpd%RL4Os-cdp^iflGQ5|M?idt*qA1$BLh_F=s{i(|FSH@XsRR?5dMhC)q3J z7wGGGSXRVEg9ugXsWC`<0pL1A{)*_-0PK9v(xWMG1#rCv< z+c3Ep$&z3((JTgevVIZm^J2xd{lbeh70hRSfp9occI5ytqXrkd;Y^oh)W?UFV;eiE zxP-#2pb#UFUrgM1-YZ&Ol2^?71>@i9FV1Ep{N0}X;!Az6+|zmZtP5Z>$IwA{?a>oa zBe1H38)3Lz>0(0v|JZx~fU1i0e|&%oTonWrlgi3kD%-Rytz5Adg^Q@DHvz>~OA-hQ zh2&nvLc`FKP85}uwN|>-JGa_h+jYyVEm9V(+_G|8DtDuD*JDuO<{A~-{k~o^bIv{Y zUNqbNd_LdLAD^p-IcI)8^UO2P%seymJo^rQ_B?cR$hUsmthZD6*4%dRUn7~S?O?(A z%KiN)<-U4>{)WyAhA$tX+>#$D_oK6P_&Lh`cCb>H-gdCjetU#( z&3g|%HB80YdvLN2+k5aD`)wKCcHadY{T$EZc$VQ=iKhWiQg)#@5zmkCe2DJ@c)q~% z6`lZ|c=-PX?r-oshv#KHJMp}U=OTpt6whQlBk^EWBEma+KK#?*&tEt*sz4ae@bMSU z=$v8UT+|sB-ng5PCvYr(TS2vB@Q@Rdn~nm^TPDHM1LE+<_x5S13*6!y<@XI-w7BR5 z^PhifhA6{Rd>hPV;VBH@9nUJf*YLr6&T9CV!uWyAk)6$lk`mxjZQL;FEB|0UX@w+a zOAZ9Zbqjozi;>1$pqN8H-D`8pt9{x#1&Ie`OJ$tJCB=&7bujxzDuQ7Wv>Y~-Dz7Uq zL87Vw8InoHXWM!!El6O06kQ{`Tp4~FDB>q8rZ5t&w9y8ab~ZL>_e7nRIOciywa;gSf>6y@HB*bX&- zXG`=)Dwqt52Fu=TrI{ty0JkNJ6(VB^Rgeoa!qRAn;#9@}L7XFQU#1FE)DRE;RBco zhs}vJ?GuH=5Xgr!NBrve2a_hNmZA*V4H%w3Ve#UkW#hxwH0Me96yTgAUS`cZxf{mH zu(`;CV@I?YneSQTUs$rZ2xI5>Lq1%z+=$X?27rc%td1Pz_DSGuo#KQ!{)c7FYOC4q z$r^!^N?;zQd_nbjnXrqE!5tdSs|kGcK15aRujbXtXo;h3>R_@L#&&2^5}PdEP<)QP zTz${i{wv_Re;_`qZYY%aTo0Fuc%Mcd9P{6SOS}q{LA~q_{9?HHe*D66G;)j_e#c0d zZS;;5YY{CG{VdpcF@kNtP8k;YLP03w^D8BF!Xy@Gm5d@JS_XY#VH#3P_ABBj*nYomL7S*9#Gcgr7cQS^lDp(mk4kD+l zA>x-BPL$9|UIg3m)z)%HRG=L9Sm=zmh;@3Uue@}bX9=kA`zwf9Q(RsNhsyZ;8CPEm za_{S!4ADsVqEN)q(m~~-A>jp;FDRnFYy(z2Yv^=nS(Y3{Rwl;H*3o4|i@uB_OF(ll zuFf}Fj6tH53y!y4U?NF1%sMouY*`=DCykt}Df75!XH0Jx*Id!Y?{4OM;qk(i?^#&o zTbAu#w1CYS(V)j78(m^kekk9lDu6z(`O&$93g1B`g@ zM9pr3d;VxB;bW`iJJULeQ${ z*N}AD;-$E3X^(^m#0;9N-9Fj*%c`WsAb7IhlF;0eKENCj#HQ0>LjPusc4~3H_%qN#TKiVJW9F#uMcRD~ zE{D6<;ZDWy*YAo#k%{hqb#yy9c#9Y`%&=OS_M1_pjP@6{+yy z+PzA$K5g98wG*(|y25etWum(u>t#P9H`x9~kfq^7A;4$UJ!nGm{umnstLI68K4a{+~ ziYojx>qEO1>{XHTo{(hGB13kzSZRaDS|=zsSZTH5iJ4Y?4G5eo(&*rd6jt|8%rVo8 zJ<~JLLcOQIP-NXyC}JiQ7c1j9oJNI!C`VOTNRTyS#m0(!q;Mm}%%Vj!NXlPCGKml@ zwu1;6FUpQ1UEeBNS(M%Q_|*NhV|dHNw4M~mrVSFbryCULBsB*G(Te!8fs z>#f4yn_I6vC{2u6i7~`mw1Bc1NiGo``y$aC9w(d=n>%1r^Vo&bc~7&#WgqcOg0LZW^u zk%O9!hTOOb)})CN18lQ^vH2H4033}WYYVf2_;+#90-vf3Sy4n*$5WY$MHe!Q*O|o# zl~H&r&^MGH46BDIMW>p86?CuZ!g>ZIreZ$Qxv|4m=Hw$`ji8gE`(oO70r;Orf&9LZ zD98~N$j8M6yhU8S=i$csITVp@7^v1h(c(-|gM4DM%OTmb>JUMtX<`El%Pl%aoHNB9 zW|SFfoF;@MqQzNaA0owhYN{YbjFA&&E_B0UT_RkofFp`zi^>;KBntwF;I(0G%MmLL z$>L?zW|Ugw{e2BNO=KVym>e)Yqx8S*7~@10Gb5sYAQ)$h+X?*45}JIon=}G7X<{9s zx$-K5W_lvxTq0f!j}wjrP8A?251A?yi1yHA(qh~K$2>&NFhY}Q!nABm%TG6`!0M^f zMKWgB2@}f~6)j$7OJrqphLNjoPQ8*HrU<@oHZm%%^qyNJsH(pnBR5$YcNh+C z5;eUSkRswjsr387l?5b+6d=))U|Zylz}An&W)$Bye{uOjZoyYOb|b>N$c1v%5-AG` zi54OY8Y%W5?{HBQ7k<6;z>CF*T2LcRqso!u_;{N~$*= zbJBr5M$laR@y?&QFjNAtW3M;kMDz{Ca=rPGa{i#4eah)k&S@oTNecKz3fLfKJut5& zF?K>;+Jh%_ed^9Esw!Gg?pwwvSQ`e00Ry2?RA-=6WjB)Z7aH#3>Ud0 zg`-7>aM>BE({M%$R%8N=&>Qitd6;SocS2!8lKD8|I4<+ze3CqeW@T|6v#|7|#v%jM zpa;}zo;U>O`m>X*&%W|Ar4eO3cPY-_W%D>8PCv^sCWMwjU8(8}*yZLD1g)V;A0so_ zP-@1`^YFb37YkR9^DrLoZA@-N&Vb{S)~@-I$Tj=;gGCr&d1)BNw$-w6Fi?#9dn zGmf>&Ofm030J1P|ft&PfN?P5=RFYhVue$MRVg+vzKXIlR(7Ju(U7apqjS5GlAu^ou z<6+mPYplbr#+#_-mQ2+85nKxbXql-E(5jG`+~CJ0zQgs+E_2CFK$w@Rj=!bxJaG+l z3L3k%Z9p!-{l!mx%Cl$#03QsM;pQI`O+cbRW-5-_8t*7t=ze}P;+u6yYoC_AA3n_R zY^T4xwU$Y4T#eS&dQRj(Ma{SbvAeBL+D*X^2BCune z4u*b(^Xpdtv*$>UyB}j~;<6sE{anu0!Ld)i>a>p{Eh$Hx?JR&MXHPO45JyeZsNKz< z%%C8_Tuorz6ubz`d4^962NbP1jX z@2+niW)yUpqkoEu@p6b&>MWKDk1D(1;V77BY`(CWW% zOjv61rb6$GHJ&dzT!8aecB70ya^`k7a$}>sKZ=b4?O|U44NChGFqU@4jVJy3)Ipis z-W`8o_g7V`C9PTZuy%*tx*CE#cU41l{zP53cg(`etg1t8kCtN#-muuQb zL!D#SbxeI>al;uJ4@zm*jEn})zMY;f0E3go-9}+D4yLDjy3i6swxA_4T|l2Pv`M}k zmW_+1AAtK@jRm;U)lM>fumxo5=?YBS=YJ7iI7bajXBY6c!>BA8=i1Zi+1r;FZgEdF zaXjov0KD#rAmcg9pyF}^Fmv!ua08gO^q;=E86`jTJCw|fXtoJ|fM}4?u!H4@g|t$= z{lY&`Cz{EQ_?E2NsN#lUs&uJ+{b^Jvq;7;uRqV20_F;8P!KH%w<@<%Ng!ztf=iX2`) zkK~|`mbCgR@^GrOMt|}!2k5So9f}l-d`(s#`X->aVG6G?$nR9#&rp|(Or?$j#ERR5 zL{vu_FHt&TsZXi2A{fgCu1x}GnoCYnz?~<7vxC2q!R_X39h?*zd@9J2w_DpUQTHU; z;F99ak*K0&ED-%3w9Ny>Qg>!T4{0=M)g}0VvP9C`%!KFH6O_-EGhG(~`#E~) zPN}(2GN2PBwiE-BNKrcd7Dd$hk>8;AV;bUG2i7E;dLQdP9|eHU?7G+D8@G-^>prxx z0M;`0k!i>-gD+U01S?^m1V-*PpqK%GBQOOQC@$f}WvQtlmD(Q47!a5Qy)C}i^V4L8^qlU=NJa331w151Vo!pAsgG)_wf=Qt+$dR-jNl~b|Ko-8s zyl0H8teGdj+svub?J_f^d)Q2eOIogH5!B4c3(=9Ze7G#{Ncw9da-Mqor`vy8cZwlt z8{;SRyMT%ddi2=2rOF~?i@PR4HKe}NQ)&l>3>-ONu3fmIVUHQ?t^0qahK!+`IbMKc zrh*<*as8d2szEx*BM-BuW@HDZb@^W+6XQtQZ7znc9~+qqQ7ng$j|QunK5!0^DQ{3h z&w{){Gqhufk+{Y&o?NsT1ndP$>|9 z+Zk6Q<)x-aueY$H#$C+khT;Bo`^Ad!WTbH1^#hc>zYF%IC$9%6e?%#)EI5Fg>!?}B zVWTR=n(qAeX~o~56ijvTWj7GgZt}M+DA>Fg-yDMB1q6-)K5-l0`WzEB>v$3=Xu@l# z%%sOmflD%(JDk zh^tugvNWcG2RPa)^)j-hH` zSo(DA4|uSOX-`_6i#dXw=x!t;EMou*$$A7_Ch;-JKRC-&4581R6UrxF`9RLYgC6221sgr4 zDb828ZpJrp?PfuLQ!HfJquGCbaMqLA4S&Dw=_iUuP5mA`U$vxHJl}zZn}z2)erx0T z2*6kK{_n^0f=y054+f~fa|Mbcp5I>o!|?nulqTBf_%|C1c)mPYRliSK1fE%r`FFn) z&soHCn*+~xR{+nyLRvfHQluiD%aD+GUWW+?iKGzU#Pfz9eGi_oHn$iAZ1Q16h}Gvj zHz#OIaE8-fG4+M)0c`u63jkksuRQz6b%1REU_-d#8nrbUSSBv9xwY$wFmC-iv>~!1 zJ_Q$;UV{S36v}=sF@2gE*eu4K40Cka2aCoW=w1jJGM2LVyHVTB9KT_sXF0ND36o_> zJ>~?sL`%aNK#Ll|w!6sCdZ9sUzAbS=gjCj82;tCr-iQ!X?1x1{ke^(cbzBQr;s8q! z6{Vr5`1>3UQp9=|TV((O-0EGzLpUP8!D^Rxs2t@79vl;e;buerf$lR#_>; zdIx`4gh;IWy3>%&k$I?}Su_x6hQvx668LpL+~ZV+1irv1K20-d8eh%=sYtC28n{~vu##$V!57kxg6@X#O;FoPio|@{wZ`*h-SRI*(&`fD zeBc)VxqkU!;p+=c^N5LF)ziOIfL*RkA!@15U4YFUQP~g5xLtgeHF%?`8wuq#TzLq9%L<<6CR{XE!1; zlDRgMMtOl6agE)#zGkL^rmi47#z4*h+)|%oOLu8~%^8quZ(sGce+aH^V}$|zxKQ}M zjpxMDQ_^IRuiv)0khM2>Q|4R&t*6RWb4g508@!MQCNy}{%%_1sse2xs2F3JYK?zc} z%{r|<;vZn%3#~KIi;+3h{A3Xji8>BN9sh!N%!T`HZDui`SyPGH0ei_jQQ;{PX^bl%?vtR`X;MoDzzUND2|WQz+g9O11>=zh}ar?EW_B zZrsQggYM^so08G(c2gA1tJmjJx}=2pZAcU@%y;Bj6q@HOCVT_4*`4N{5Gv|C*7lNz zS}RzforD-li7K?=KoH-b`6$h)t){d-uWC3YG$+(hTBSx?p^q;oEa>C)E8JoQ#%@>< zGAF+dzAN9(#hdQ^ozU8)d;g(C)%%q_1qf@XuP*=vu~6LS>1y>H22<^#6jEB*kye_b z7knBxc*;H`sam5aPUk=r!Fd^eICxIrefWGz| zH+se_d|2<_$akrD0GB~s<~M&}TDAqTPdnh#Ad7ODt}=0BKOVEwGH2@Ex%e}F;I zIG}Jw8x(RfrA%u}CXKT-Lx7tc70Z`dG zC>a_!-m@_>18F(YtAs*GV&u6Ki4i+^kq-9i;B_(>9824xmSerNe*i1s01QwKmO}4) z&=s&uPJ^WM2I#f68CH(hn25FJn*`=v^UvrW9aVA&u(-dJNS=j*KdQPN)EmZ;#OQ8V zewY^HU^WR1>Rt1$7iFE~g3o2N!I<`+ZLmioypRxBqxk`=#~N>;2HE@0P^P-Uri zvt1|%NZbbgvCRc~f=DX3^J89hExf*KxG@1pv-X3!%*piKNw}anJ+<{;L5h10nQ{`5 zgc!tgJY3>=h6RbTf9Qba8wJe-9K2B|05n)73v)yyG;ft7R|pLLV(#Rd6QpP9A?3{G zt$%a?l!JT;&y##rgL=6FIs&AnU4^&8U_`T36>oSKw2?|CZ2nk#DD%6{+ zaJLHAU%ysgYRq~j*1Ymrj6O~531fe)#v$m?vCD8Hp8-(51GA)3f9-}}V9Jx^@OS|p zgaR6KIEFz`1eLo`q)Px35Kk(UK!gOdM8(t^#Gx2Pjd{?+(k*okYnk>-4_f1%tRk{* zfP#tfX&5%2i2-^2npW2G@$N-$miaPQXeD+Fh%c_wSt|PmI!9O9 zoGYlCL`I~(p|0strhZwkk7~QFA^93Z)AEeMp?S{y+mVO} zNB)qrkzDY>Yhn-; z2VNDNv%DKP5NKHH+BwOMQOKI2T!c8`Q5tJCR7D;BiYAJFu;^D zhC=^2=W`&ywaq{>;LhV#+Cc5E+7(p+bQtKR6%A;_1=6S+J^jNKuGL3w8r0}IH79-N zP5q!gDIV{z)Dde&-H$oQq$rFkL+ZbaS}`y$=F91`u=NB6IIY|K5GYea6oy;Jel;f( zh%wJy4{J-c!_o^9mSZV!(-7D~irJBqzWt^|l-oys$x?oPA3Dzm;BTH3PFItm8d`MJ z@Gq?W#LP>WioK|Gf7ea(jd@+?{_U-fn7$KQb|9pGxB_!kpIh+WYQ z<|Q$jQH)4yE)E29L2}}>W4t{_gCu-;DI`|euYwGO_`z;Ex z!ri|De9z%|1<&Jn(4Y~&-SFpi8U9A#y%5uteQ>Sc7JSpM3J-rv;HJX;Av!8}pH}?< z0T0jd(vH5Ksr-ME5spOM+nZUk;QNtC_~QTbW80U5CB$4?6wgH|;v{8-gW zYl2P}`2F#YLh&V@L3b94S_F>oH#y|K+@{NO1@Am2r02@J=kwd4A4cCj-|!)3>z_@5 zPOn_CwsVST8<#6KPs|lr_CF|Lcy>?E6;Dse6?>4^Zuqz0X~TOV(yv4Ke&jg@ z&saP)9~Fvj`14M?`ax$fk9+eI*Xeu}qp7Ninmw}MlaS4u`dYyU{Htb6z)5)CnX}Ye zh_QF%i(Gj1%brD2rG6%HZ_N#*N|Gi;BIAD|rHn-W70?vej*0+?Iigj0Majd0+;N z(927Jx=hB86{iFFxgtr-hRfS`E8tEMgT>=;UlS*Y59N1HU(_OYZ4_3{5~E~mj_;>++oqiiD7p|MvD%OCff}M$#LfxcdCI)!tql< zV(YK3W2^RrIt>1J_CKT?$vUD${4|`AhC($a#~C-&Gd>g}>;|lGoai@eLB)9rP1V@N zP!tA5ML|^%%o7KZCCO=e3xMWAR7J!ny)~KuHQ@w+UT3U2mx$Mt#2E7t%15)iIuuhE zE8-Mgp@IJmu%kuHROMW!oV%3sJL#};n$o|+tHn6$@LCrLXzdn8^TBgF5AcBS2sA)U z|9mPm@)Vc*@_frGN;JZ7r4)g2rPU1RTUrh3xw>*(_(#UH9S+@jZp&leHL+@P0a;eTXmugfstEba*_);D^WJ zi|apEd~tsl?hyY6d~rC^lP`)d(7_Lf@x_1PI`x;>P`7^3Y?6H7k6)_gHAhTnR1tjLku^=QFZxwt0)fIQayY3|c^puc@ z$zni6w_#j#i~t{JrUOKRv#03(5I~;@i8fFqhIEi*5uLqG-nUt#oI9iw^BHIa1LDB@ zq;rvSW+|suIUAL;LpcYO6Mw%}i}}obY*Iw7Xf>$XYscx)MIYW8KmBgIN(dWEr7-pQvI(iJS*R zap%+DUhU3;I~4K$JH59jdc0T-lvXZYI14u~F+|wPZ&_aa(Sr$|Qh@86JrQsTJ@`B# z#0-%0FoinR#U(MNAlhbx4=gRNoPjH!vlo~9O0c4Ut{Zyg`JgY08sSPf09E&g*Yrv? z4q+JOr?-5;b!yzIW`gX>#S2OpUuicQ46g|l71JvhoN`8Knp)L&f^3PLCIKHZVG#P6)~O3*3jGok=f7Em25pxQ2= zy4L~#l=mUbxd%JSkPBZu?+#aB6@^=lYPMs~yQP9KjGPZ5A5HF9qlGA@l2dOxB_g%3 z%u^j@I_6#Fi>^6Z;eA-RoVG=jp8D{yOAjU`j9G~7KG9J=JDzN_qZRG8aDB{{mJ>R* z@)O4Zhv9a1(P9r_apEGhjlUP5?(g{K*h`3tpC#EaMAat8iSxKlvpeIReKcrqF4I0<^h9D6u$7Mx>uP02yhFy%UD z3nC?Qo*j~u8V!iAIHe&rC<+OQ<*xc^4u;yeyh=ZY04}Q8W{`t8A!W1XW)hH4R-@4w z0J1}-YFOhq@T(CRKvOtlp;S4|Ch}Y&`Xv;L;!Wwq^W6zR4SWxr6l$t>~bu}9T+llFfWF6Re5p5v$0&HtPtWt^ndp|JUe zVmtEk{RRoRtrT*c7>X!Ks4G^7c~vC~w7$n~NK+^Y3yGdVUrXQP#i9-=gV**|0bwb^ zF5pKCk66o85!d!Z$_Y!=msy8i+n4x{534TQh&=!Vn zEYQOHFTitKutEjapvPs;WOdf#)%jchKZVloPujl&F8SyW)k&-J1YWqD<^(CI@^H;2 zQaPn2P6cC>bhuGCwbNz7WhYvwT}Y9drTw3T`@fs#{Q+gLx!SdxC{c}O)NWsa$#YnL0N*P{ z*He7YLOI*WZZT-s6;+55uAzkZX8VLi2CGBlAgfb(Mu$cVV_K5cF;xVs3&}hzRbOW9 zWOc-Od@ogG+Z->iOZ#Q89c%Eu;a7#?1GwX#E)-Yec@58QAm{t`=bXBsH^6_kG)JVw&JmB{QG2ER01Y`|hIX^GOWr=#UI`}|34WWnJ)DG+v&=Lzc zWoG;)g!CdZZ$_eZ2pYgdL1{Wxbx4;SpZ8Wgg_o)%7y z{Uh-A!2ZA|fsX?p1=<5W=p{p4b3_iFGCXVXY{9b^&tW_@iF3rh{&Pfa-#KC{p5%V$ zRmpS2*a34y+Q2!Y1s6|coj?GJc}sY;$mZ0Bvvb}eM5>5h_G>xtJ*=Epm2*fr1AimK z#wll>a#kznapkE z7Dxe2IRHb1#1QVrUa=Jg?vE%iWS<1I7U1K^3U!oXahvl|?A-?Pj)X~x#Wkx7xFSI6 zLu!}2PczEEd`DRrV@x>EA^cM_&p=gZJmAUNn9;1Xm!e>q zMDte7SbK>Bdm}ndH9-QK4cP-CuCQ$&cW*S)4d0IfD1B@$tXXgXY}i>X#K8uNgC}c- z9KKV8cww77nmq^BMP!&9&aXAI?qz$VpM!g|WU%gtU86uCa@R;R@`$Y{bPS$>fYjI) zZ8F=f$d-?T2vMPs4JM$o__rWb$FE&~Z-x63o>n}ZKkdeF@03%8@8kdPm_PM^^w$px z&YuY8VD!(A17lL=h`|mf8QiWV{PDd9v8v?Mp|Trhih+>7s^5j-LVvet_cgf0MFKMV zzXKOZQaBZ?J?y^#M%c}h#BJ|kvts)IbV|swY2Z=$F~w~5tnq04I7S>dKX!>weta}` z8;f~}W4%*-G%IX17OUr%+t^z3dd?N-K`NhfPiy&Mo_5U)DL> zJQ}wQZet&f$w9T{F_~N<|t>Sa(=0t-O4$voYddT1R2UHQ_gM5c~UuV zDCdZBPJ31+n4+8|%GoF#vW>@{3*{N9Th({B_Wus<|6ly`Fu0_1{Yf4-ID~How~z^U z2;U3_v5Lp!o11i7-=>Ig|>>US+K?bX+VAgyy=*^0y;29jk zHwXPczA5VdAK(0M_~y|jhXcg%Ob!SB0PZ^I__=FJD0dwMAtO32xNE6$?o!V4%K1n+ zu5B{P2<3Q{Q=^;>%Gs`*kChYmf=qCpa%L;%X60;B&R*pNq@(9%TVI6GGbukGdsb@6 zmR(VFjhxyhgR^Ww=s;hoXAx~s=HR5q;tC#d=2S2kbE3qeZ zqOTN(J1Uo|9I-vV0ILsqHei5^$}{26uP%>E42kfWUO5>VvskHxU1d1|M>+;sUM0m7 zm+6Hlio&s&^3rm(@j>V_%SskpS5l0kc-#V~K(1MgQ`i%W7N;toX+?{#_m}W^h!v3J zE6psbsJI%Jkn+o6qV6PLskgEkheCOnfq*Y5$*-JUzNolzX+K}-OkYJVEQI-eC-_Qv z{6ot7W)>BfS1O4Z(19vXEa9n+h2=Mt6eIgQxcQaxSoR{HQ`Ep_82=J>3zEaypgNYw zN3cuGMR?2*N4PpuuS%0`#dEiXh!yKwaP^Gq;_!D)Ni{#FSN6eQ)dFt3;l#`0Wqgsx zDZ&70AsnekDW^J$1puBX(TSHRC(W?ETmS*4I`I)*)KNPf&{kwGT8lb&h>>6U1X}u1C2;k`fw0{Kg-pe6|HQ;A2CE z+E@!mfdmxeSji%{1Siro#sd3L2`d@}#k5;fRHN}1cNpqD2HbIP_C7`WUHz7{TN_D=boAQHui4%(dv%czR8s1qctWQ5qa8A*fW zdz2F-L|>%nHzX-fkPx#G`_Lh=BKM)s6x~P#TOJVn2YW_HqG(tbV`C(7FHIfrmn3!6 z=-359t>TZ43z8W3xN*nEvB$0K&Z3b6o6!7L9|3moi`Q)|TN9!C!(!lqkRCpCdk0*A z*vf-0xPm4CT*SGhg;XE?v~*&=0<`EDC#tV>6^105OadU4Fd0=p2i=fpvH%W$R)Kg0 z2X|XkB!>S{^&Q5Ui}y9HIPU=W8SVcj+z|+?1!A1*k7J#+a`vg+sBCzj8U{aSpBga~ zMxO8l??bW&4I@bEhYn!*B-7%YHL=JkrzsxvjttrF2WERJN|xyJiP!sa?~YvxZTWXp zg1zK4RF1u)K)UP|gPpxX?scgiK@cN)#405Fo*r?rV1*+{Jv3#+VX53^5Qn$S_94 zJO|8yjz3aP;!a89z@-qI@b3I&?NZ0m?3no}`d}6j^pPQ9w+`0y$}t7&7k`Ybi4QhlC<7vfNXi&TkbXd9+w(RR zr$hWvy+p-j-VhGPZ<#^rtD*Q#eGPY);Wt_PUjvup)c?Y>H{L%T?d;7e6vi3W%Wyeb z9n>z*-h@+k$l05`gaD#T1;0m@ENZe7f?Xr&VrX)ds&B? zSfF#c*9`GVF8un->1yR7%^r}$`a_q?vtI*nV;L8r7b?*gr7JoxAIXw*ASG`)h>{ti zKay8k6-~)j!ZcNuUX~zJHu`)xeRQ~-6*CdBl4yH!Nr2d6QBD~GaHI@!HrCICPX&DX zWrx6O;nVWg>3LqlhuDq-W#k++@CsL)!HjF+-v^=^yPoVpbuzM}w*d-@L{>?EhvWtR zoOG>`{*Fl+{Mk~s!#^?G;cqn;+doz=r4f@AAt3}0rO}5Z;mR(UnX6-vGzMfl<&e6< zEhuOM0+VsFOrxGlR*7Z3$0t${rUj+AmgQUQU*NODH|w-ITwZJAx<#KukSEhrSQf6Y zEv{T|yU&~>vd)?#TzJy(6ysTi$HbF*HcqzTslanP9@md?`VD-g8Slx%gD2gBgUrQ( zd?R88Ng<6r`uBFyjod17(h!o2C*4?Z_z|`!cUZJ>61MPY(V@|LJ?TciYoBuqR*LMo zw{vc1i0CK&EGL<}l=G=_65f@bW0Z51a@HtkvvU5XoT$IZn8THmqnw4xxm!8EQ_g$J z=~2!ZZ8BYsauzA)Ugd02&R*sGQ#q%+ClgFkj$b*CDCc$MbSdYQ_hrmXrl2Koq{Em%`IGJzbdruaBwfQBuRk7n`#FnT)%6d@x9B0jC$3wNe^A`~+$uP|(kz$Vm@Ifh%elRzu(9!IhhGALLA{KW zjJ+Af^KpOxG$7xQaZ?YPfvpiSaV9Wq6lL6I#N!j1D|A>`w9H7m5P?r7<@uwrSvxX>Y+E#9uXZ1p5$1}3{8ac3C(bDuOss=u*swp=sK$M z`{W+s<^Gbz%d-887KpPmM1~0aITv72ps8p9-EJFuo`pF8QMa{&v3)1$@A?|3Zb;N0 z=B<~PLk>O`|J+migyKC~;TW7~Vptu03Ppy62gxk>P`O&OT=CgK+|O z22M1#o7bz?{yK(PJ|G@J*AAv$X_!*F?FeFaI=Vqm)#$=@>KhN&_z*k?#bk9b} zXe-JRM-*+h05Pr=v&^-3(iA~5R9M=2aH0Me##I63C-0X~ASG;fDMW`Fr>oQn9qa){$41RUlSvD-f=$3#2ZnVOtBt*s*wi zRv=!?E(p<)H@{CogpR!Ki3M^^b$e`qD2yu*U2sSIvOsvBDG*zb@7`w%MB5mo8;o~6 zJ>B`D=g9&w^r-^T^gjh+Jib%L6^JZ6Th|nbDp!HXK{;*TJRu53qHk9>Qc01OYqAMT4kMSgh3Oag3qc!~?e z2IP@4zd+Q@Lmly*Py#n~bFtLad4^!{2(hCfGwC3-Z z_rUV73k5Y9^@OY;dnibowuYqv+;?ECVB=jq0h$c#ss9qiRNwEiX5PWT2vq5Lg; zl}2pp+iz;fOpr0pu1}BmpHcr3a}>T4p=sL-t=ZmdcW$W5; z8Ta#5Uj`boE40msZp3sbPu4agE;mR0O66c=SAdVin%>o4!m>{;-cN&tj3&a+n4L>4 zI8Pr=1Bh;E#)olfzMQw&yT&^HDUcdxwf@#v~ zTdesJ99UYEW&;X|ZzCgT2Q)DcOdq_5W?zQX*JKIUKK5o=Ih;K%UOW?Jydv9Xwp8qV zW6tV;?vHk~$o+!<_dRrM}AVb>EfVLzSlPsm5Nx$%DKOJ4-c7vMvqA{Na+ z54*%346ik0=16_kQV(-GC|8<4=(aHT-jsL&?Z~wEb;9&GyzV!z&ZXN)E5P@EOf=94 z=X=Y)BVMLS4`n;ITXN!!Lt)0Ser(^`(>88}MW~fye=-)EO#?TMg%vLY#JrUV_m~~A zw4Gowj|=QP@&fNlBRW^inN!@5Ts9T~(kd!6Tbo{U1yUA5-~SuW9SC$Bu<&1&k60gk z{NBRv81`F+9kRn7Mi}kp_Cr-*eavevUV||OW;E`bN)MQK&V_wr+VF&_oOVgIn;$(O zODSVcJD>qtnP`)?SgwGD9H4TKkvTVz2TG)UmaA>Q;y~W~pY0g_N$B`9WEf&EQS7OK#~MJcUn25hLzFsoWU)6I@CS4#VXh zKooEF+F59gb>qZv6d19XABCC(7xOF&NAsNpaivaBBNy}`NvUbB*+jH3t)tQIkZ8TG z)P*2Ec~3VSXyU!M9U;j2eMkc5e&wJJJj$QYq1wqYzXM+En^Rl_4U3F|8M0mkCI3CN zoyY3$6z!e_m+ia;~0*Db^zXZ zgmwVj#!ebrX@KQlWvu923_p&+j1xq~i_Id0$N@XsWxj&MdXV}byy`*f07^h~$s_ln zWE#BP*HF+7dqCRe?Nku38W3o^1oo(Bx{bT*fKPMAD+dBEkgA{~erp+`nahU2URT%Z zBT1_+f&x&1?{T5J}eK`zI}0x*-*u~P85uIKJCIjq5QZVJq-oXUO+bgC!0>l=lr(zwc~$um z@Inc}J_W(8C#V|x+>Nf$IYw8hjI>dFFBjn=+h^u>Cr0zv17X4WzAp z9a`{hjy@9zMakPp%x1!i2c&75$6io8d&@K6*&m^yl{sUv*%ggG9gu6dS|mVA7GNIq z!OM%dWXN_K@6>&B+S2&?k8etP)LUEaHsXy%u0Ecs%=(?Kx^GYL??ap;b$gI9%Gb}h z(zWqLl-?(^N}8dAuc#BWXE6HJ%lYF>QBN1X{?wul)Eli`-<(B@0i+QM#?4P&0^qc0 zh(NbF54Z58eM3eye={7jDVpe&VUI&|wl)Kcu-_p}2lU8*9^(pEL+1R(%vvk|Cgxv{ z{8hZt`mNjH!+E8I1koCrD8}Dew+4SlfW_Gne;W~z!0xPLmRp?>pNxq3w2Zh3e}{s9 z**R{Di1?z6xD|ib+7XXrEO&>%w?#(UjK9NGvF2hJA3(0=IM9O1T~=f-qHqeaJPhBM zLt&2QUE}%ICY)7>!jy$>Og!qDkn@F`e*=m!>z02jd{dMuE;hli(~0y>ObFkn2{(y2 z^V~Gd#Z}qn@7yrH!Xn%%(8!pt@ZWIrDhZOF!3cm4t6hp(uY8`=de}U&RZ(jk%l-() zF}_s-7 zE0LO9sntwn4d7GpBZA**cE{VG)1(hAX6!L;X#v!M`xWn92AQ0nS4R5c;auv&;ElRg9Ykv{E`@6;tGz zwu)@8*%&GH(80!X8!%CEKl^Lzmb+yAiw!m%5O52;HJtcxS3^o>Ut5}vKHKQ zoLc|wbU&C=%E}t|6R_#+PrSB!mif(1X23lCGn(}QJEveLZF%@ z3zR})_rOnJ^f`I%Le?lY$b|^L#7H`_hNeO zMw#YC2$FLJnSpsX8!EfTybZ3NHhj=!8xY(K$dHzH79l*_X*NT=0Ym36eI78+`8g7{ z8MhJ)n#+Xb3l&rA)5}o+jK^WQX2e`7@!I#uq!m#~t3E~K`tIpTtJ|0gbi5r_{8qj) zAA?{0*YQcWz5?$+TH~ZI3dM(bUcz$?o~SPMJcIYg@Z68bsDg2JfK-Ixa8+~C>RXU> zXJ!I%Atz1%C@*2=wOF9tx&r3ZstGn0l8YY%70u(vX92T>A6|ZR2FyZ!WHQ_A)bv}| zARpgF4bo+Vj(~XyBb-44W4@ur_EuL~l(8Fq2!SwJdlCYZo^_?M&hG%M_kl!du&gQX zaz?d>t$|3y6<2)=>v~T!{xTg5lW|>*Xlg7=l zg_54j_zp;FHBY_kpq%>oQ_!mKnlt_Ys%tg9chVQOgE7l{>+5AP^>4A!-!)xZ4g~6V zL`zb%`7JoE;!~^sX;qdMjHKa4^A?cL9N=1dP(JKe9yD3VUJS!s-A0`xaD zjEaD3nfEjt43yT7o$E^klD4f!=H^^EO@Uoj_>Knuqi{*i{_4A9U|!fmi>=Y){C(A% zYp$<9EgFK4LdsGj(>lwO#uCQ|L3cDgot zmXVp`y;hi6Fz(bbWY%o+9t3vuhiISnW??!l$zxjbG7#g+mcwA+lGI<|1PcPUev;{= zeFZsQmW34G$od;|gzs#l#ak8&22@spf?1O3gFzv$`D>b;f7fU+3qZCViRc{n$m;(Z z{c2@P0+=5;XMGLwh&SXcc85_%#=gU7lEuF51E(~190>$=m~VC9ukL@yh%;Za1Q|)* zi?+Qy&$8`o&IHCdpL+YS)x02EUG_wDBv4RK$3F!VI#Sa}tR7Xz z2ahr`YUD&wtvxA=#H`FFbdcw_Q7cXd4{SBha7%OFDaPxQjd!=^{tF!>PkQ;IrZ(P6 z$gxb@COLMic@RquGG->|U!dpHaz zPW72JYM$D|sp`DL4bwUsu&9v}pnraCA=tbx`qMytcU)~&-K9lXlL=qCIb&Xofc@3J z8}~qbctk||hu2?PjIe+|X>0N~K+3~N^C*2*N`IU)5=r-XKIw3^dOi_#%RdoGt2VIG zH&(&U^?i8T*dlkq0((|BC#_lykJ9=VUV|h2HI3%3$$>7FkCAmeq+ z9=1YYWUl%GCfPjuI|fLvDo82J>y;O2<)25as&KskN#kdjj~r<`S;;o_D&WtkFT)D% zRP>Pu5o5>aM!h{3X!IBu2?_y`dHSsf0%lzlu@YO`*SuQ3Mf--Dg?P*HpJEnEA6M-l z9d<=+pPe3qX*=Tal8cv(8?}af$@$IitP_ z5zX=P>xG@3mxtk#BkzZ!n_t?6w8oy`YCW&EI@UO$Pr=I>^{uY)C-^_HnahHe{+DsA zN|@=wLgFd%jYu4Xw;cZ@^EBz>s=d@yVOP|SMj^wVRE5MZO{7TRSz`|%NP6@wRn&*F zs3`wmJK|TCyc`I8#l@U)&sqZgGxU5KQ1_p8#Pf>VKa6X8g^<&4Immd@K)dX_=29#J zrLlF$Iu4uDe$N)!DS2>k*g#{vX?{>BoAk|1nAsbdRp1!|>ZiS&(cpQ<$n@eX22C8c zg)&Ob+Oel)uAkh4O`}{RGq+)#+;uAGY-r+s5`4@@euF^IogHp-^+zP{I~%7Nlrrov zV9C)7xx5tA{G_qKKyUx18zk*%cKQ0OoLXCl>H+}^YHz~8f5h{0lrOG+YHd`9tA0W4 zcLphnq-C?luR;2#{x+}=Va~%A75QW02GIXONP#RtjWy;bAl3q`Ko-h%Nrf0KE)?fs z?o)w({GEpxy0w!zyGVU(qVeQ8y{_7BCXsbT(C7CzC-yyK%Dn#;Y^BJAM$WBJH z$9c`RNdjmw}DDKgw=o z45oHu^O3#iM=dUf)wpM@4%CjCH2MQMke&lFFtb3PMuBK>y)XT+h81S5_RD(Tl{v%z zjuhiL=H?r_C7?#L8Pjtppm1k3+G_A_hs^nkh690}lU&G8iJoNxK94w#29y%#CS~l_ zycgx~&|(FM0cX0Wq`#K5emk;{2|yaWJvc`h-2NzSn zc>&KK@w|!WJv^M_e2{$6{WmQ?*VEwlZ7Ll8PQL3qr9T=$Vk_uk6TU~_v3_My&^v?g zkG0=$obVfp!2isiDEKG$-pHsz_uk~Ogk*Rp!9pSIe3UFH37%MRi*YEG`)_`@+;@9Y zyWeQ{A~8q$S8I2VcKZN&#>Y`<$Cj78xKIs^$q0?urYnYLaGOr+%9#+{FT+llxJc|n zEVreSDJCXkPzH8=qTNjFwoIk=rK-XN5mQxK%tT%>CK~5|!*$E4#3>@?7>WB*6JN6E zQ&nAV>F$gc>B5ct!j#$_A1IfJbx0bimG1ab&l7E`BB6?&RN_?O`u>W*@?Ckf7{=Qj zDX5iYP=Z+ciAaF<&JfLZ#|IS#AwcC+x$?gTAP@ul0QHaCd!~wj*e#U((cZQS<=A8I zxvjn}l>e>5v}I{R>!jo;z1{XAB7`$PjI%Iq413-QrS;ox10Wn9wwJ#2kAQjN8VohD zTca{W-IepUy9Mo}2jkuyjQjV1`5ETKN00lUjGGMESV3~>OZx-nOCix=v7B<`VBWuw z@dp{xQgo6}0;Um?B$?;&kOo7;Ja^rV$-y)VaG*03AIqBJxlb(&e9g2d@8?mm2q4`#|Glqj&JIpe8$y#59#sFyi zLHO5L-;5U{FW*f6#Q{ti*f;B2)&eR@!PYiRTh}mcJ+_}{mA;@$p4cfU>jSOGY8Gw2 z@=vV$y5p9QX)IVz6YAKHTmdTatZ(paX!SfcpwY7dQY9ntFoa|vy{-p9dX0aDTIRiL z4+L60Uts%l9n(Rsg>6&5;+&58$lsaA;rbffepz)F78Iic1!XOLSn4Ik4cIS%Sn#kh zGuK>VMa;lubmmi-(O9qx)xExeYq4F}#Os!OD)VJ_I65|%u`;sE<|hsW?9f6Pns0^X zo4;^|Le2S4*s~T#;nc*MnW=rIWSQ}NJCBsnN9g0N8r^K{s{8u1rE&EiVYmFX>I7pK z-ujJcOv9=kJXJZ&-~uX+2wxWJThpDMRSA|2BVPn-D>p=fI?*raOt zcAl!`!=K1nZelILc6pA&Yu$f=8&_-(NDa5+$POOYN{sHLZp}V_QlB&AQbI#@=H`DZ=DG$9#;ZxGHVvXlR^q(3w zLi!akf@k1OsQ1OFyoL|Z~ruoHL`fS{+BA$)gZ{Cmwf!ed456#JQV&o?IJSN<0 zCwyHdlzsBckJMT>oiRG>7|Fm_qi3yNsGYQn``+u!Rzz;}tT&H5K)2g`R(|)Gzt))? z!SbnN7fSvD>`0#Au;c<~0YNv4F^~t0g+$n5wg&T1C3e1QZo=}i{U&3~>KclLc9`d4 zC8MJ1HScWDZf3rDHmj5A!>+9AL1T>WuXZB;I{#UXQ}c~HA2Wnd?`&jf2g#$G*cKcJ zPb4;W&UoROvZhXHAop!&dcPrA+^EQ-IMTC zwW&jGSmIcuvm5N^$ej%4NAM)6Tz3bW;&U#@A-b^7C17QrV-8<0hi;Au&jTZJ8*8%v zYYDT-W1;}|9B9ke5*1G;88-QFXMHn}gu_Fc(~Qw%+uRX7x*1!NtJ;xUBaR~=ir0s~ z5^IN+A5g3~KgW%{{nh7|Om+D6ZQXOU|C@7wpZ?@yhE^ibNh9h0(2lo-iE+sBI55=%i zTH(n?c^4vqj`u8?*?1%wFnF9p@3cBNf8MwY*eqOdaSM^Ib9T>fdEZ2i>Fs(Xtb_mJTtb>f(n+hgqqs&K)U|?!T0#Ds zP;HD`N(yQW9t+UT_U%%9LzID!nZNuixIClT%+5|d0sJ{wST27B5Les!B)?^BI)2re7vCk7e^yW5&|@r?RhbzY|{PafAX z-XnH_+tH{g3G@LNW6?btI4Fbp_&N)7DVS3o@qAV18%Xr%!4Al_{Qa5CV6h_u%ze7d zB1jxD*cWu0_23V7MV29+Jp8=zXNs5`u~h5$%nsjxa8~I`%)Ur(r|K$|G8zX;$&AS> zoovo)^O&E7u%C<@$bODwV$3_=e9ly3-kIj_@rE8d)X2>LErdQL2RT?nx|MIpJ$>^n z9<0ceJsT$x^7+aZR5C%(s=X_H1FUXXXzMW-e}H7Wwyl9D<=W?CYY4*4#6}$Lw~(1& zS9B#}v4WQ(5!-Av)-h_I4#becH4=W!@~_C2{o^qDhn(f=ez6oOiTdF%xuAgn*_?R~ zr>$Q_0X^i%N8Se>ot%HWW?-{$7`PJdc2OwVtYxT~Iq*+qg1(LNy$4+f z5wtv>8RnbaAX0|sBkn#Oj;m^zhZeKN-IRH&Z?FB`Yg=@@r`lo*6!Qn$;sMO=9Bpwe zB89ZY#-$D{SZ#p=DGl%sX^T{uy_W62fHK$?G4NztOueej7CEO80wo(p8`ih9V<~-6@m9<+dLGBGF+VMNYc328nA>x(%euq7vyIc?th5yG zwNcj!yd-8}O~8zabEHc!7vgMbB4$CO z5Mv~yRatm0#&eO}ZBbvN^c+d`JAKA)5EOVTJfm~h`B5Fy#J&m-_cmtMfW7w^dAZN0 zA(lA|AY0w9!sZjnMqUjmA1Av`UV;d?jH1zd5)u);kNriVw{x{bubO_KKdxC^`{!Tn zEt~XG^h5XEd*OTYHC*Tb?2LOO0sD~0MY}t$asalUfZd7$EWoPlelj))*v)=Ku)1n$ zXtx6B=rQvV1KFD0?>hSG2f6~Ez?1ZGuBrfAndk4q;SaX^Tr7bd?VbgVq2_DZvfb}T zUg7QjX2DU~eJom+Gv7?K=Y?p=k!a6symOX3M*2>~+XQ@1z&GEr(dtYy7O}HH8Drr$ zQMWtbvxG~HY^mT``>U%c_jB!>lu(RzX`PgcgG5qT^asRq2#XYb%YNI1a{%)2%rw3I zzZQy56(ObPCHR)4=Or&s=Z0yFId>78hsSJMJv|T;bYtwpQRt0pAjvTEIuSUn3oEYT zGjZ5&&Fkn(k5UYYgEN_~`Wm0`{rE^mxyzrH^juzY(sR`bNzc8V^xPY-e3abpEu3sC zE62PDH(|Zzw0s^v)U@|=K*K3lH0oo%fN37v@49*r;6XLjQgS&k#qfH}h5l8m9?7gn z!U|oFwF{3?52GWb9?h?z9v`5*hP>n-SdZ0tj(RKrG>cofn&M?J{e)4eIa zqSbHLx>w>>oe(Q7z+&B%){2cDu`?^pO+S1ji2Q4#jKuLuLPJ~ZW(N^|Ap!NKa8qls z52M16BNKt~0hprXq+DKhEigRG{CuXo^?T)xrg7d>9P@c?O-?Ek%=Ce;r(P={HZT$z z*I*rTd081!%rsv_3iAC~>0Y-ltpSH`L-NN;H^+VXwSh7iq(%O>Aoi8qFKa`wnJ%_@ z(!JY{ynpiBGs~{A+PDajbfE799G#r0lS=}~LSRSw_mRn2h{Y08ys~1*O(sr~-bv49 zrW&r*tc6$B!V2!X9MGvVpjIE6T#Xi&eaLtN6V9Dx>R%28aP7nFq)@%poYM|j?4;z@ zNhwjrBzJvtal@ok-K|QIG`w4Jyfq(Uo;=8tJydN2w_I*-10Q8l)-N>xQUbTwBX!9?i%k#_apAm{OJ?Z zlGZkdg+Gn(`pbl0ZBgHiYO1=0j8hLlL93n*V8Si0J&rIkHI^RsVgnl^%{L!%hC&?~ycqh6@ zQXK~foVGRpja~=vW03)KH;%_r5DoZOjtxT*&hZ#{pN0~t|6p0akI@f+bmth9~lLKm0MJ1RMuMS+A*vpV~vu$-}iIQy)$?C zq4s@!zMt>skI(SBoO{oC&ada3^PJ~A=Q+=*Lq~`}ogQIxfB;~IYKKa^G2sJt3;9gO zm^4;mSOF(v0Pil3kzAqT%SS_@^G~`|TBm9UCFW9p%z)3qM5?GVx>qB+7g~6z2vjyZ zHcdqF*s!kw3;AfOaT)}+jh1$zs!-fHQh=ETNP^xd_JVzg_$!hF@f9R-3)oJ=Mj9jt zP}&e%1MeYoUAM$UP4XJ>dA>f@+<-oo2s#LM9P?-_b+cI3id7Oi70I60Qb!~8fNYdD zQ?z41pNSKFri}NQ-_NE#Blt|u%2>&XCXGIA%8v#b`Ae*Ggi;onUjZ|sN?EMjD3;Kl zVM#+RK>0k1eDJREOX$;51fI#ZIKq7#TSMF77+ZX={2nMJxL3xJhG9L+MF<~5y|qO? z#*)?+6JT&s*B1W)i=?%Mji#~nTsqyoEo}K(TReh-`r2YLlJm92D6pN>76&VIZDB^{ zJ+y@nm)h7QWApRa+~i)yW(g0zo`R_zwQg2LQ?hRU&+kF+;dQ|1N+9NbBH=jOGy`}( zkKO}&pYi}L)AorD`N&r$LeOTSP2Pn+*9k!j;nV~aLaNN8RE-d_l*y`I;UWbJ6dEDd zPKWfG+MYHyWYaJ?Wt7)&iu=3_AJ#zpEBq2p8LV?$AAw4E&77&$=6syBkx$X#zfSts z!R|mTRSCEc>|Kd=hCL0eo+Hso|( zTx*#Nrcd94C|GZIg5ZE_L>aiQMjcgc84}U@KQI4(K2mix;?aLYytX)kNB^9g!i&pZ zM{!i8^%wjlg~+&*EkRn;$%(#Mm;iyg8)m;Mtw{)2dvY#x)z<%n0Gsw% z#Xs$h)--9;T0nZO`CwA4h4jzaWUav74|H1rZF~)>&Y=y4`-z-vvccA`F29>8zx!#k zP$gT#P(octB{{Ct2f;=>m{Vt{6_Bk7?Do+kt-K&0t)@wTo*JSA+8h3)>9|1rLycqx| zTGVd{AU4o9Db0Byr8Xzz?f)6Nr|=Vsnf&uk{z=${O&IhWBm}Yb?G*91@bs*T4jTEv zH1fvUC;{HBE9nC(>YM1J2((XjM6yOqg*4M32vg)J3QD05tOcX!!>ZN-a&l!UzHe-_ zoQ8bvwCW9o0S0gPs?(Blq*}4ofs}dFhBqi3XbCg{z}JHdfhU^FAG}vk%->_tjk(;? z!Dp&BA~k)3Xo!ihu$JUx$N+JeZ&==br~_0WDQG3csC)AFHk4yDfhb}fQ$?>_PFm$! zORLXamun5m-ug)Fd)`v@7(rn{BWI!7>v)uPqQ= zEGC2xz8%Cij9xKHy;cMDe@L@l+d>->dS%#rXs8bDlNxElxz#BHTo}k+Ycv2)s(|4u zBDg~9tR$h$3fO248|FId*-KmGk`vmv^ukDw!)uN8?4?~P?oBW3S?)cGYwq`jvOe3u zJz`Fq^Mj$(0V!D2gEWYTwO%BfE97R+H=)=fG_2czB9L!*)Gl)cUcfh}!Q1cxd5moN)Y&W7X+l$?##c`3OhO0KYLa!EY7LIivE(*8X!CcUt;;N85|DV~)%Jl!1j zE%z{aR%URI40eQjB+4rja0CYD`fNsTYTUXH?ur2OTk{jz);b15K{mw^Ta7sbrIfi2 zvmboC3VtUCpLp6_V8Q`wuFUKy2hRYrES%_=;&}W?-bHD(<>-)JD|RY7+5QOHVr*v- zefX9mb)v_7orrccs*+FA0pLbfGxA3WO|jv3Ms~G%x4Th8epK})OabNumQMLY7$=ws0C1dQ-h+7@H(3ph{4&-r8jifp|A8M3Jy zO+S;iVfT|=Om6N(Zq~Ff4*n1(X?SUkJF)xDulezE;{V?RIFhz>ay6uzvO&xmfhAND z)4AYXwUYU~I zVP?i*8_@|U)gwF>(R|{gkmgq$e9&BA;cddhF%EDP|2dz90)E3GF2%IotpibtCwT;# zRkU)n1eh6%cGrFdVM>rQoK3p7Q)#_O!`x~EH|yh5Q{nc@XswyIAL>xXC4ADXCSg&f z8>#c{`BNaEi|XaXg!uQtioY%-!qsx3t;@GP;9KCD7Y=f@l3oVT2|76g%WAt5dZF7_#*@4gymW(^bG zY7KrlX!85c7)UgZuCe9ciF9Nu#7oDgVl3fkqcwj4WFYajLgyv&+up=N>}o;)G8nQC zB8qdD1?4*tWggoPcpqfgD03~wo3G3z^L7KZ(jH#s*|%zCj<;2aJSw{8 zA*p#R;CaZEM3?la^2zRTHj0z~bjte5Dn1t=_sP24Ilw$jPCWPKTX^p3nhdxWCm~3$ z&v|u~hb9fg{~6o2qVz)qz&vh5P9#w!l2Ffi(|JfDAfKuX_CK%ICf3)Yk(kztwls&) z@u0AK--F66&GB*y&YDv;oS`+yZSh|K$zOO@8YE|{8on3dtzURnfu)VZ_(TT~=M2G; zmRp_(?nmXD3OTExefQOsQd7lC-fgQ;MCH$!+1Wl+1J5!fTtBDdn3peYWtn zF3R-T!mG{9odFA!t2b+lqwcyN(P-RJUj9~^hRbkTX=0K!?|qXH9VRrMK90f zw(#manbJua>3C5`)fQfURi^YLaHHA6OS(Oi+rr!NJCt2#3(r)6y7poVuVr7RR68|O zO0*!IXMpoNGNm?Krc?-=7NX8>JR9)jqx@4|gdd(M*QQJ5^E0KzwJ6`inbNjbGo=pH zTl_HNZ@e{CVrba#WL)BxwUpn#79`zA%`YvM@+4T^7XjR|9#5~2nH$QUox6gTS1_*! zh3geEHp^`3ze}fDaEyn|ff)TZ>>}K(B;A z=@Yy*Z`f?w8#h!5!Oo~?ochK3Gzs&=8$OGdrZkM)aKAs+SAI3ve=YCUY^^ zeX(J_9Jr1Zs575H*jnPwn?bXT%EL6_s>{QlkV4?{aN!#US_8<{|^nGEpz15G?@|8xb~lvI+&Q7 zc_7zU!y>faNBhL-ru^VoOn>rtGRoFLX+`?d!fFY6cL<@KI!FE)UkzbdDAdzxkjZcl zTTe5@J0Wj*UJnMnKWhfl^ZAX$Ok(q<9~+2j`>Gg>q;|l(*;@Sbr7#~Uu*Yu@u^S5z`+K=xGc3zN7{Dd4rLSNWRfS}IQSL$%!mAsS zaLTiqVtq$EnUJw?oUR8>X_Knjo4nqee2fmOCNpnxo2KO2E*g32^%|b5lH2x-1cLKw zuYuhOObF1wKrXv80Kq;dHlv=67zrzh9dt5jz9xtI7*Y{=aLGE1&T(m6Habahb#Q^s zJ_Nx64V&~Cgi@}PRmqHtF!O3-B{m5eC@w~FKpLFP0G1H~tF4fvAcjfuPrWEjt=5wHoxkMoXQ5ZfLX|fMlt|YdP3xY1YCIHCkFk z_>o4-QKYtEH_2LRHxP=JK-bgPM2YaJvaA>K=1HYAcODZTWBJEPRu3*4n_FxzcU8%B ze*{vC?nkF-eNCHPwYin(OFu5*6&61qEH%FQk;1`B3vy=s!EZIn*Fdz&ksjxG<1gVt5`h!0m z@}CE2C;ac$`BPdmV8f+|$H>K(KMs{~s(PAID-Z1C@G{x~-!;sLFi|Ics6RcTNr}9~ zC3y4uQ`yYOrx@6v5)hpxi6c8hf^wLv*lAM61(ilPhn_v)y!7k=*VS_U9@9khi?=aK zZ->fZ{hl29-0S;XOP^cCrw^BXk#;hyVoaAZrTHlRJk(?cp6R->P@mIaEP$8??9bDM zQysN%ifctU{ZQt68=UAML>fNxK1HwIr?@ERDH7#)7rL<rR)4%Tu<`o`3gG z-rUGMZ}O>12k2?LoNR>hTBJOfOnx)cry@eSaEeAnNCw31HTMDi${^CEpAbry@-X`6}^F#&Ey@GBtz7<~&E-6r;f3C?^c`}e;)l*R{+qQ3?~fx3weosNYs z?OvX;LT>Sz9RW=b*zms=+z7n)B3_k)vFjj@U1pFMvXo^;_V(2@u^d|l(b`EHzW4C& zqst5_%Oco|{Nsok7{Q+6-z^k)J*(y)hng&#fox^MXZsT%GLq}3M6EDlxs@07jOA36 zXC2B86#>gykUwsaVs$W66w7Axv3Seoia{WOkUq-Eo8_1X*-j9T)(A3?6~@92q9Zo3 z>kOSrzgTo*kkGZZW$2q7Y%gSRFml6MZwr&yDImed+ONapZCT6GIH4=&T#5;nFbOj1o|Lm((> z!mgNz=4)biQ2wRJA1uwncK@8)#O@A3sck4V$Tv<^@UojzXpN$P+}l!F0?O;PY=m$| zf&TJ%LL5==22SzoXxm=4>L%3D5nA`pgygRX$&OQHK_)Y5 z=3=z3Z~)vxwCp$(^-^qrs-cOk7{ip17DytR z*po=1)fAA%>fgYB2h!k!!XJcBe-aas#DcL@h6VmIu&19!F`M828TN5Lz0C*4pWGu2DF^cbjGO%1whVl9MYT2_M#6xUqkHKLc+TDJb1fQza-LN$=+M8?X zCOh_iJ(Gef7RsI$q{Rl0_(`!jR5@Ng)IZW?F3y$*lfj5I=6K*Ii2ga~H^YCzF)}s* zLRgG>o(+iyKnQR)8@jaorB4xLi&vzA=L`Y6W>cd!A?gD5uN9PlKc;)lok6ZE(96&e zc$!%A0km`TSjVxkjvaFHQ9uq;9wj+d>o6Y_ydB5n4J2s;46a^#_h~7KavOdIe%xkG7kyN9?Tyr>! z7LC$g3iz>>+Og&|3bw3AEvju)YzKg~lApGmGCIQ=Ew6;MM&mu0zr!>Fe1eh27fqDL z0kyk$E&Ej3)@a!-ar8u>!))K)_v)5bL)6ZN+q)7wMx~_w!1>4O&wv8UR{00d@ilVH z-<*7qZ>9AObqoZkJwrzgX)1Dn6jmdc#l4Si7+dui&1LTO&HD@Bu_HAP};d zQg&?h-q#6QKY3xaD+X9a@UE{2ty@vC$5O%&@Cw;!+S=$Q2^9bi0Y%L~QC&##(U9a8 z*|CobHC}m~?>|`%g;)*-S@yZlM8MdJWvjO~4n4HV9gF{)F`t~ZYZ+X5D8M5g>sG9ko78T6Y>>hv{o3|60|5-Dj&JUct1}$r3P) zzyADb=VfXpkA#54s2`-T|lx@ z!UNbNpyC%WJea3e`N&Vjc+H~Em45R*HMfG0{bSFG?&f>yaR}ryC=%YTS^aSi^U>}S zW_vzZVtxM>OoG3gqjp(-f$?_S1%dvI$7mxTW&<`chi=-3JTN16Vm3$fz>pNoRK=jT zv|i!^-|3*{`US$X`Lq?D91X)BF1*pAkl!JpwLSHZbJ-(7ur%y8zl<#d@8eDBQZd|J zc;3YG4?JW}rxO=`>Fq#wy>FuYL6c9$_FsF4A2R1xvb9lh#SbKtSW@!oW2HNL=x8{) z7g@b-hi8PlJ|Dv|FU4&LpZguzyFN+l|jogdJMiXXbtO>RT*5P+rbVX5ZyZ& zM;{;MMFlKBA z03yfQ;|ybeeqRB^$5Kd#xX)!irf8n30X(&*VG_4{g0V{+CzrWnsX}CD3EE4jw1AiN zl$Yb2Z4C-aAGN&mxCUcj$%FZlWuQDShh^u1Vn9(Bd;IP4BLu^2@FJSr@;rn$zrBof zUz`g`4mFymPI4${mSSyWDz~ZZk6cZZi7e5AU56pOSWPm3{k8N||Nh!_NCE2_I=P8s z{vS_A26^c^QBMKFDeHyE8f9Wt*gT?1;Hmj2r6zv&R#RiJ$NmL{8sNawa7Zlh79R30 zZ0Tt^SDE}HRDXy#2dw5cLcxcSb~r&pn#Rmc+m3}2Sx>Daa(Cni){5d-T#XOZy()&b zqoKKhy9gdcQJS#-ir<9Knk+|XD&Eg%*43|e#+7077>DN)*ms|TXmuz!Nk*$2Rxyyz z>x}00Cg%7UruK$b5ubeo2d_uJMr>yb0;V8f^1@**EH&}93}12>^h{~t;;|f|#f$5= zP#!Tj!G4{rvL%8S`4JoSoOx~84+LIRo2+2*5krcnrD2&oRbpE5}PH^&HtTioKJqp2CP(cZd)G*jQjk zw#4yk8e*}OHkzY})X_Z8U7LaAq!&;=A35 zgD|b1AV%KRsRg5$*`M^cw^BfA?j2zoY1X>b}g;*_nJ_ zW+U29zb_;1(xrLWG&F^8%e_$E?Hhx%7|*952&_P#Y!4S}6!FR}cvo9EffkUCvq#O1*x zhl+$sBNURLPa8x!nVyEtq>g~C$|-zFHP>ked$r>WlAatN33&$27nm@YnL^qy-zAYA zJo}D;OxxpVxhLaWV#p28!XUAufY&NmXePDYN;%sAaR1C^6o`wwUXyX2lM4WpK z7KdDEE}w~lk*lBi>6_}k7_d<>{8~1Sx7)8@7&ks{Mv*h`0`Fx*8V5af?8GjlMwYGE ziH~+d1jOHd@V$lZ`dT^oJo4I(=T$tL@K9@a{T+b+Fx4{y@Aet#QVU%A(R(wVrFgdC zq2Erpv2cH_ttx+iYxvY}9SaGe6{&L&Uu&SPKU9l$@uKlfcPTC}aq?@g;jKmN@9$uA zpB-V9eqE3{HQPBaH=CC~yvHD_UGJubFb|`TN9*bi;#dZ97`}6sVj|weq)K9ind6e^+2G-Bwo*~k+QkW`R1}4HA#fq} zuhX&(kE@-qN`$1j{Yt=BYQ#cD?JHQidZRig81{m^;3mjk)7HU+^RZlUBig z>=@D1@-7cXNd^X@@>B9 zNm~842YJ@SfYsZ8W|gN$)7nW@sveK7$tFP^!qY&yhv3)m~+&WJjUgs94$+OUG>2et7%# zCFKJ%>TGqdHMFCe1w(SWFQS&+`84(zb|OR2RK&4%cx}-$R{!|#7GrCl=Eagtk&xLH zUq=gm^t;Gc49x2P2w}ItwuuOVSdCrw+8Kr2bCkGK&Ul;9h@|Sxcf_^Dx7dN;srh?9 zr7f2@|TV? z*5`k~DmzraJD_pHZ{$ADb0{Jz6CoN@kn-$BlkuYjTF6>BanwvqR}uw z5Vig(5OtH+azI{%5gyG2>K$?-kiLnNjxTX?15*{?ZIME`fJC!ZjygG<-9kqV@Ycv) zc=ZhJkBI${zYI`OwP_oTk0S_whu-dYBc`0(B232C)|??>Y9ssMkH`V(^E~+|yZ2A< zpnG&Z8MY6uIc*6m1g>oja$~{k$F&Jn@u&dw+ z5&1kh)gF?XG1k$RHkJ~*)*nA=JH(l08}>ESx_l8Wr0Vs|L{OxTr6GTqitRyM=$s@jrRv>;;&~O$ao>*YGjL^{zY-r(w-vw5ZhzvI7J?kk`eL- zTE}B)FhJ*7Nj?y@t^^VsM{N{=Z4CrFq!#gd7LOvzZE73$XXEgR{TWerU2zAf#m%8~ zu&XUDt2;<=9P?ZN8`ano=Bph0HjSb)SDRnPn1s-?p6vl+)8rvmig*Gpl3w}uUlf>2 zf_zkI*O}pa3ycfVKr=5BsuL<+hGmvMIun&^gl4P0aQXa|ZTuL?!x1iD6d~ zDKE-EyIqSkX`GFwD8nfV##v*0{c2n|An3p&Z029J{-{I0f2g)nM?w;`sm%_PbX6Uy zf9kIv;v_yubmdLZy0+WcsbIiX*l4hl0W0d;&`uc#e|2_x@kTy7jq!y=Qy7d_)bDvqV=JYT1og%1yVTkGXb&QV03wqYpul)vB+YASR&+kV)w5AVpzTsj}=~hPgCj z)e7Z}`TT>iT^q^M$X7LdlS=o2shC*7R1WVy5 zuIy|mppn+t5^2l=aOwWU9c869RR`_ACI_s4P{;6It4G-E>E=Mf5_TgHH|px%P;;%n z+`n>V!PgbHqvMLz#Hzn&>xw`4-d@Dp!5{~Wg5nvB=O>hfXh_#zEW)&PMGauK;(I(E z?H7&aBfn2ozoT&D5cq4?6(T)gh0sNdh`^?%WrVJ=1@r}>PF+7xIm3TN1gcZ-s|x5g zbNi9f;}={%ZoISClM9D{RPkoN6V%SU@qBge889;roJji^QLy1XyVB$ zxtU~A6H!u@36Uta-ykrnava>mb^~M>k980{Z|AB(C*Cl@c1!G}@jF_5X|UOhH;v*ImH4 z_JF5=gdP?rt4L8({ zLvh=PZbZ6}G>ym&*wEDyRjJH!buZ-MTLVVqOFTx4;7n*AnD$RDf;C6~h`b#Lp%FQs zV){p9*YW6S*p@#o16BK7f2KS`_j2ba(q|=o9>V9cAaO5ALRJLwY4Wd7FFLpV<5n?HH{_=IYhhm@BA4Yd) z6#L`%5xH;n?% zW6LMbtJbgxt@K4Sj%y1~;`M6Bk>^`}PlCio`Y!n7d2XR5fhlijy3?DD+0l}y$Gzw2o=UoostP7oYX~8*~^)>1IyvzDfhwr@07QD03*x$gj<6?)@ zG7;$wc1VZtbavRKq!9QABhP4uGzH%=lO6oL%aNb$-Ojt%B2cdWj==LSmpY`Qx1gMe zyZJVUG|Gf;JSAZce%{4Bz#-KPMB2aDB{$rCfN80J4*}8E|D_&*{OvUTc=%{W8D-zN(!A?Sg^Ec!_2AZGm;YdlU*7E9O35j4esO78NzzoQ0uZBsseC*H0f_=s7edX&g~g>EmjM&_c205Vb8ruo`kIT2%ABQy zfU-2C@*tq-QRjL$cp_zx6p>Jxwbbk?Eh{cHqA-5|06iKItQPmPK+QtD$XE^(D4=N7pr$0q=@4~ebS6?>Fq)RH-AvP=5_atK{m zD-s)cI^2ww!cz;%3V!i9UItRACC4mw(zsFR(F0wk0nNE9xAf3-yJSRG^yq=&q&{Cr=uq5CR0WJ2+ZB0^On(xOKXbroHQ!J#a`Ybk-5078!*>}nraQf}5=xd|v; z3-Y5!4>s19XL9jfyktiKL60749MzNO=_sKLTaXz&dYEgdH*gxZWhRIQLg~>%TuXVS zII~Kfg!c^KJsJ@7=%KFjLjm)bO2KbJVK-O`i353qlOUWt;oL8rt-^UcH^rrzh~iGLxf(EpsddE#abe>l;S@X=g# zZnhO<(@;huWHii`jsk&wX}&HkURufpY?AX`7}$aLAb49b_e?L%D#CJ3)xVvmj;U`&LD5px??3SCXGJMXic6gZ#YI_#6c8+#&HjW}mSfM_X@{s1>{M9yLh8FPQAcdt50|-w96u zAuKJvn|KAFKngMjM58kCej2XkMSYkUl!<{1%H{tB3<@C_>hwx=7nWdvWSr`97N->4 z!&w3}i{gCFCuwj~2?wI~yq$VuVg_9h6BBbGOpMB*oQsJWa(*UesE>(J`;~&er6;N2 zQU-SKXaw97A2PfvAEFKqWqlx~+#{rLb-Y|Cr-F{E90*JWw}(aQdoGo#Cx+%CKSM(x z7-Y)EE-8UwQAb^GEYHO{mInh&+14e6SgEgW#8EyyF-Di1mod8Zyo}Lh7s?pLT?k`z zxyJLHi!r)F13DLDbfw1hoP#kMqrqT$R_UPvnyBw_?yIDM-3erGT-4PUz(tL{U@mH$ zkE1yk7j=z~Jvt{Bb*&HVoLm&=SvY@mE-q@kj*C*~7X@=n0OEc_t)xvjy)jbP`&p!O zFj5ozP-v+uq~NQIIrs4%uuEoUl7MAnDs)e&#I9~`Sq>x7#Bb+4RlnCc3;k+)KR^bd-&Ld0` zPNs0y3Fmp?yeph`?$A_3OjZddKl)+*q@SA}Ka*txx&JLEU_3`twN<@6x7+H^y&?RM9>xVBXvzBHp&qZqX z;*z9-qTERGcRGug(?Sj zkt)IHZRQ!Kn|UInkT1~!po~GK+__9RGlWwroJWN7H{pCFoc{=CXc@($P9Yt|tNv$n zVIRtwF5QP`Bc2*O8335lcg8tor+Qt3hL<3C{&ptp+az(>Y0Km!X&dCC3HaUzS1&u= zIx|UXhP+h2K64`eM%WS(KLd<5fWa~0tB(~*yt$=!@pS_oT1tRtKkIy~Zy<@vD#{V3 znMfXi0Fq$Z3zqv9GB)m~iqWX@!P0Z69gT?3;nKom0D4B7lJGJuGkDY+B`Qp}5n=$A z&biDW6m(x^1Vjs#2-g@#JR@ocTCRi!jw38lP;8J>pR9j+!{Z%3SQDGqK=D(#hYDQ2-laxX+3ReMr3xv;C1 zjkv%??Lmjs0CzL$Vh4`&_M{A3v6ldQQrl3!&C488^s{(>7xl%nVT(gLvO{Yp?5?yA zOO$HSC=pgJE2pJ9H70r!ZE!|gwdEyAxWo#*?k>AT>ePL$oU+d-684_Rd#~Snj!TFJ z>Q+En>-U~tkmDpFLJgqn;6_@f6_-LCNb^tl!y>6c=dVpvRG>GxztvS(I4`$E+j4+^ zBmBdyNhn}0okt|lCb%)`DaC2fEm~Sy>?+Dh$<^w1fG0)t+MHEFA_jc74NsKbf;-Tf znhUW*c2;2kMuMf!(SL~w3_`!2C%vUOAQOn+HgH??w(GY|hX8-lwzrh6XtxGD&3HQT z*tX-W2cD$ekTs!wBh?$ZY*|IQg*QsnJ-bnjM5KQXsxgr#6f->++W19~PZXB<${E6& zlOz=ZX`oUx7GZnK>?#8%#xtkUy5Vs<>Jz|p5d#qH2DD1}fy{B}YY+mT1yV_b=O(hE zDA7W=@5ioWxJT<(0Kl(srT9)$-9>O|{BH%x_}}sW|9|{DFnjT?ptcp}7|}D(j?{lr z1AE5w^YUscEm2J9=-M2F_QpnAA72;kZ8L6wZ!?a@Z%?wWfqq$628haGEHn@7^KSu> zYA<%$I8CzTEX^%b>6BvAl?E^vr~-%+u5zRV23YCPr9?o3r9M0*5@o5BO)1nRMAaIi zCd5gdO6QbH9T4GQs0zdhTscV0oftfuA;zoL?QRW|jMEAd3TS6fC5*~uT{={t;Zk26 zrBunJQr87)ga*awrtwm27Gtxm22Z)V6Gmx`l)_cA*VD!)5UGqh&&KCP-FWL!APyTa zY1ZPw&rQ#0q~a``kU%Xu8sU*I`kRYzbFtLlQI<X-crgD^`eQR`bWJ>C4Z55<-LjvrH?vIta(|v$;-AblnjqA3R9E*ZCqs_F!lY5O1 zO6w_?0BQ=R8$HyuQjC~x0^68M+0*{?br-TfJzlG`wruN7>ie56`_o_^lta3KM+Joh zOUF%6xt;);yRH!@_}7RNvB@6;Mr{Kgt)|cwP$o)7d)AUU#1l~}G01DH4ulYUgA@*s z6lZZsZwtvA)rF+W(kKj^pq2?yuA8I*-FO_zt*1rjB;TSl2iv@r=w4fNormnh-7NLv z@m~9Bww`L&M6UtAe`Gqm>LG?s#d?oFYD1%qS`Y8#XOB zuedaK8=%VpNsk_S3JFm;v}SoBIthFwFi(#j@)nXEVzY5xZW;DUXq^*_64Ikr0JzmB z=RSaR4j>JB^y%D2<@4!${Kqx28knqcjOEx9{_+J zJnLg)t~TJ$fKB2Re`9K>`PY5cOR0b&CdcF8R7ulbxgNy(u0{*IUL?l3uKATxmKhke-(o8a=D6hCT z9S5-a7pUWqd_mIr**>wmzm8})Q2j@dI3tP=#dymyF>;2q5pE0~ z`)@O(#dz8PpHrD3?E~BfJhVi91^Fgn{T~I(3w+VUXST%R;yWhsxZM`@CwYN2Vfmzo z?CA5xsp<+|thK3bu)`3T93jA7zW|wbS*DBgN9Eo?{KQp3#Qz}VJ~D0s!gC7GF<^Yu z4XFY6>8jJJm$^-;gT16KGPjs|;0rRhad6Kkb9?f&-eqn(knaC0nVa*|)L$)gt3Vu0 z=5`G4By&rnI{shE+$J7`Os)r+TRYM&X-t>a1Gj~6#SgkVE!QP-L734x&4pdEBGS5P zTb#&+U}4r7&fMkXLuMEbz>VNOGjMf)0{dC#A?0F~2ZaZu z(T4RxHZ~b9NyxL{&XZnIYPkE0@-^IGoF_~p$@RAW+d>ici_-CCx-}c4>4~*UZLn7#f0bAiPlVKzoevo9CS6mE{ zWUzFzv;kF*Kr$-2L!`QAQUTw!4AekDQmEPkf+ZU7;oVV2WTD}v)b7H)5GnW`L_waL zgwr4#DvSZ`7Vd9u(b`IRgMaNnq*_rT_03P60^LYy)`0;EU`DN9shvte$I=sffJArg zWm4ip+Ss5(u;2Sz@x4WL{|cArSu84ep)$n(rDy*=^ehe9M*dMN+Adu0MU6{?;?}^q z?7H&`7JCyK`Zf4_ldM5OP7`VLCJh^SPH7k&1HjfVSBIyL40@|<#RQ>oE#$@^1wnvm zH1s41!_Kcy5{BIn#dtI|AcY~)0QGcrBB*w5sZ~|cuK{dVN!QQ|m2?fe5J}hY^Gmu$ zoL|xfiQ;+A9gGq(ED~|mqEg5Hkt%KeGL?q7o1TlL2!G89&zS8Lro%JIMn+40XhP(~ zPn{!`!a%wM9sW>0Y4)ZS0F^l3^4(cR?Ny2vuF;7qs6`=7RJS)&u`B^<@-ThVUwUEk zFp6@SPtrw4N+`it)Um5PEY1gYE_vAHzfK+oRXI@|tzY$|CwZk-=kv+Kpf4A2UIRQq zw^;&8{at5?R{_?BX4j(+nsSsIR~aIVJb||8Dl{8=excd8^9#+O&3_)D*|q1JBf0GChIwuK1n1IRrwJG?;S;gl;~sKxp#$1VT82<~z*Nn{;D}Uv6;@=?0e`ih~{~@^wWAw@V9!l@BXlW=O4f$Kannd{CnXaitimr z``73yB_8NmSE>BH^b68e+6wlb^iZ}Uohk3ahTq#*2a=2U!X6*hmL%t-t3)oTCXt&D zSN#o!3vywCW3)~!Dp-!QSHPea3%V2ng>=|X^`}(&Y5w*CC)a!;q$cSDIL@gpka{v4 zEHlga$u+J}@#Ob&Nwo;N8aTp8cAsZtbA^e;Q*9CsMoFR8ge+$kq7z^m_fR2hI~H=S zFeqdpN>V`?6^pi676S@aq_tCj@Fkt69QcM=HC-&N@}X9>KExJaqlrp~)U-t~mAM4I zMyskDhs20tmcuU!s$D8hcy-huHwRab`l)`E@T0Ra+L=9g)3LT{ct^sU%TY=H8vbkkm4he3Vj{#=TS7(>$+&K;HU*3vt8>=16!Qc=^_goBn7|xBoUe5 z4~6rKa7I1FJ*Nq$Ksb*GXSZ-#gwr9MQBU&-CgCg*jx3xPh4X=MI)pRok0J-*py28N zRYqZeYn%>wV`;6nKI!2Z5gM(7AU!-qiBcgnbv$(hC|lp^nwEivggWk(qo5;!S@qRn znV>)glxDP7AXKCZ#mNF6TmV_D1B=EvC`IY-16!V3>~gBaLjeKlvYOY@Y#wCc1cH5 zrB!K#0(zmZ4^qKVU$yF-co3i)K=kMk2|#RJ`5-_?6nX+7bccae>Y;#wbOF*1%W9iC zHGrTeFe(40j!K{CP*@ijEhQpYD*d5d+b&Q@N$qg_j#W=X3vR|;Xq0d7l+8vMx0KBW zGX59>Q`oXOk_>#pl&OvXH^F3D0$Wo;1{~X9f)VzAV04H;kMdZso(Y@iFhLG`rns#d z;jq`*Axx%>S5ixON@NZRzLe4pNJ&X<ZYRCksA(O7D!3t=Juym@~ zarGv*!;UGHA9W$yZVAFn;x%_tX<_;e`QpEE-Dj&u%yO_`EG*OE<9SQ*ysfa`JwexJ ztT|3FunI^2jdX$a8%A6|i%XAJ^eZ5ijrx$$G#;%!jmLbt=Uvdz#VO?2)x7YD$Ipl1+*1r_v7Pw0Tst z^BQ?OLCDqw*z&xL@NZ4TTe=f(<}}#Y%;0xj!M-HWT!HJFKc(J->)YwFXT0JP9sGyY zTh(TczfNy_b6lZoI$G#PA69-XD%H6Ol`=1e$()Vv;h1R0OUMKljZ+HVMKMj*=%YAq z=3Nwr3vu?miMtrtaomp{>s>UCJQ@^M#y!ReMAWm2MH*7-*%Z9X^|%WO_o1^tB5NI5 z>KD#P%^8h8 zB3!f7p3jYc^4lqK)96h|+-EQ5Iwa4pW3#bv_><|FkN;X_5i__K6I?R3)#(=c)thi*+1)HZD}Ijvb1;0L5nf<2ditK|i2Lap#iO8OTDhJecPi@zrs{ zR9_6g?61+CTUsw6dt)2P4xkm*vtdXZ1>~lrZ<`EL(vKr4U;kN-e8?1-w^QWv#3`On zJ?}h|tBFiF`&DvRZf5g=`g*xe?T}=exqfmrQ9^JhTTjr(q9aGi zw~)Vlo7|{;Txn5gN^#8rme8-`_{2{Q5Ccq2Rz2l58efgXEo`*;O)x&p2gbZ{h;xN! z)k$ehtY=l5v}Obtfp|;%nt@;j;w>F(A~uZ&9x;!%inkw|FEKAh3ZK9PH0ph^d#@PJ zLpTD|F~{R@NHrL99!=KN|1dCVFk)cx_h!6b7}k#htsx&0){hce6ZBZe1akz1I`#nt zAEDq_UvIqv<%exNdGMIii4wQ+$My{rX6KIn8y#0QiAyYl2@j`zCy2Ie4?1lH`5!F{ z*5R4myyZ;l=T`Cgo2Z@E)J>+T8NEyGhmYSr^ zy_ecYawe%gGc6JZGH(NVM8jr&!5j8k^56|STX3 z`OnGKG*3ADS8|t{n3}b|dU7?TO8(^f{rR}91*SnqiHq-)xAEzfRtO#7PFZ#iO|g;k zAoX@6vw>d0#2%i;YQtQ~GI*0b!>!1?;=}~Z*+>kRs068r8Q4E~eDZs12~P=cmr+V)b$QgEK#^MT z8;JSNl#z(LCcs_dJuz(tzrOdi2g&l} zF}4OgQu>Kxq$J~xWm*+>^c06v|5~a8Tc^gfP)zT_cHGUZ#_+IUT|S-@!8|923O|_V z^iL!qz|+9>a!g~6{*uCc-a)%5BeVf#)g~V6MIH;6Cd^BlCu&4_$p;9ggTbOb#nuNW zs)6n7ehO?YcHr6vjtbGbh_#%@q8rjwURBI+$TNjUnWC15=R|2|%#)iZyhRyaFEXTv zX~;<**v@!8`Q#5C$WL?rdPGNaUVQMB(rC2>HCatGd#C0bw?VI9>CRJF^d+bZ+>a2U z3weQ^PaAo#&HXhz$yhxTCuFFMn>wgZWYo4iQ?mk?vj*0 zC9ZzLy=Mmj+pgP)J)4G7_}H_&{cQ?6f>n?@RzFm(T&;6;A%WdrP+0Xt+jc&suLSP+wYB@Bg5 z&hxCCDLE%BlTuZPC-*>}hVA~z6C)lzbWZ`tnc(7&434dYp4KLF~ z*U3(S9V3oD7=f+d@#QeuWwOoYG*;SdEE`NRa1w7bIgMVMiKU2d&}7^@;-yRKqBLl9G~md%Y6cLZ&{4$o(WJ7|Mg`Ox~t_)e9u{XQ0dQ-vC;HsTyk==MdStxNoQpVe()*{{Q&FWzF8y z#d~&BD>t%PvoRlCCEm;M-grOM0Hol?`{~GKFmAwYWEC(aA^LM8!$qZ-(HamY?TI3K z)5!W|P^>rMMK_K&vTuJD*Ir<9SuB<%JvVhHcHpq-xmYgppJ?n9W%CUMO^63LNU*OCUk6{`ck?aHEiN?`)`N zfvV-j;i?^)D>y&EhI~zu4Q-~RzN@`+7@n^$^=K{8aM0H{T$#a3Gzdu`Np~%sY?WN$ zP17QYxcK9X^y}aU#E(AhsYGzFb1>5A7)FaUS45MQN1?HU35wl-%X+nORx8U+g_ujocy3Yf`kQ^|kB$hL0&>)@;t|1!ysq+$UIT<8sY-1usjmtpd+eoM| z{6Co1SSE%fhmFAvNdmSF!;zzZKm z?9M}cVTSbtTQ-z0nQ;Xp5gHSF7b7wq*Hz(WG~8Lmc_@Ad5$;~9^*Z)>aRUr*k1KJy zNYFIcaYw@7F`crx0z6ZbrIV)LCQG|I%cfk9A&84J)L|$tYEpYd)Y=EoLRHBPG`zq( z{jQEaakWg9qv2&5LbIpvOLL>{U3C&AyVx1VIW9&qLb}H=AjYU3V{~eXh63cL_?{AN z#}K0~few3_gRLXs2VJEj`U?uwEPJ*gSWfO>6Ti`xHbhs#PMen)T%*Ae0+{-m9+O8CJAY%-MpNI*8Rq-OQX%G}!j0kuX3wIje?xcUit@7sY5r4zl$wW8A4OPF_b~6HMA{HGzNawinFx#N z5;nQI0RhgwmE2`hUqq=UR}*QaH5Ix3vVl#e!a_dno11>~5Q@lqz3AIO;Az}lKB3M} zUwNrQ-tbdk)kALn@l*M2`3n@P9#KI3IlUp;FSsbIJj#pEz54R*)u~?1PSV>ua9mK8 z-j*3WjY(CjPCknt$Zph5)AF+ioQv_e@btlR=?U5kN0_HPO^RA4(}$ydEUoQ2nZpXP z;7T>nRSM>KEP92;e1Zp^Y3Cm{TpxuwLA^()bq0@-A-U*AFx)OhN!?0Gjn@JoUhNo* zeJQ~|^Au;=$6_@HIU9POFDY>g`WJ_AnVFZm$XJar%r8YH0Vt}?<)<4UbZb2+Vr)eW zwKtJ0l`jBW+*7`;f9Fee z*iZnALYo(<13IZufG!iB%IdfDeL=GArM-OrFaOnaY0Ew+b>sOI&v$r8^?%}~3qRKp zx4-+j4zg8#p|(^e-8jEjTPpvr&UNI(%$I7BFWD+T2wN+ft@88PQkgg%XH`^ND(i82 zfX;QWN%PNpuA}zuo^7f0cCMoVWgCz5#SbHi_Wy|%7-54*(>alXr88)+1Soghf_5Zj zk5ri58SrYYvQx=Gt7IUBlW-&L{J?|I!Jj5=1aN<@3;+|TxN!;UK3I6+N9O`^5a`$T zAhqgXDZ;OQO{WU3l&HzOt9%4R4VI{H!8V94YwCS;{$OgLqBdoXs!7D_rq0(E2;O(G zK=>X@gbup56?*~ha@;$1e;xJbkJ+pt-z(hrzGRRxKK)c+8PY^tI}r{Zc6ttGr(JPC zU(*Az_+Rq|#^zxG#8-(;7*SDd1#;5y^i4G4cv;wsR0a$@*=ms8lrz@6huOb}f3Iy7 zj=KMhwx+xau!z`YO-XVXiYU2CI8~r`zSHwMP$+n@s9j}Yd06j-<$2DA;_h`&8O((c zm1UsFm?k3x>G;<@zxbHX*5M}}YzbI?Dk)fgzDw(BqCGrER0I2+v`z+P1{OaA4u^sM z;AOfgZ~sn(MZ9wy7c0aYDeL%HR}B39`MN^$n$Rr>8I%S`0}&W6ngM7VEL*{jwD79+ z;fpx?w|p@Gx;8h@8yP1io2XrQt7nN=C;;9& z^7#a7a;+QOcTm57d|>!5%BD#;faB%+#|Ot?y_?X8{b4?tVFf%akM8)$|DNwC(;Vqt zG_lD#z6CAc`~kgMBB_X%d@YhW1}FIJ@*X! zaF6I_ynptmua)_!Yy-Sf0bYTN>c!+Qn~btds0evI@rfUQqUDo0&BG%2J1wZjS~h!F zC}+xQ(24_R5${+dVFR3F?JC@AZaMkHkEvhj;Ng}cZzYn znL9&W2RI`gjq)5Y;TlQHv9Tm4KDI0d3{6N5R&O-z(9V%pvq5KE@%qsAnTwlqivb zG{1kNhk6`_2U`P%Uwjc;dc!v$e|1ihGCahgg{)%q?PjHDw%bYt?AIf>de_#m9T_+~6k_ft`kK@9CdQ~B5p z$N;qR8whd;HDsAc{3ch^nM+y^kV{+7lHkibRJzh3h{`uO8L1H!UMlJxm^X1hEmpE> zH{(ODA|J!8bHeGWV3=_qfkAKqnJM1 z^@Y|Sk;0-8sGF}G{_!(pWLJNv22meIoF$0k-b>3piI15Dz&W4qNSums!lz6PUo((7 z+L-ebqyRxOV{KAgj!8u*Re@w)OgiLTX9UwxJzH3IN~zt4If?yq3noUhz0sT`?IE2@ z1m+m&F4#?cxA4h-Vb{@|rhQiNPizUmqp}QxG>M@{w0X;NMGlea)@5@J z`gcGl4%@v3iLg(1mauCmPX=7lUSuI#?Xtx`xsgqT%$pZ3&Aqw=G=eiNBT>HAo8TSf`i)lRaQH!-#5We|p!~p6 zZw9B}-&mM43>yo724;9R5wbN0v}ivrRQKU>Im$*G4PHpe35`!Q)7bOzp>j)nN(Mxl zr@Unu)L&eea7~L@HaVpbIQ#8?LL?}eK`)MwSI=glO)&!0abeB}>z%NHVeiA4P{qFn zVu;Hr`P8s=YPWf27j>I_eZ%)r8y-mmaB<`rB;AH?gQTlvQx2GI?lJ>vBHC2Y=tU-H zV&x(eN8N4m>I^6@jRcPY%z`6X9nF!cB4PJ&g(Jl^)Q@{tU)+C<_U4422uI3u5Ohf&+|^uvH@(R?%S|zAiG2Nja!Qa|Ltk$fY_x)4)U-8&H>=coWrhZ zMJ=4;PIQ2vG)?7#`4ge=^4x6zr+5awqGjvZHSj(04Lszj#wTtG!^@fpkkG&ll|X~| z4(dDj!Vc=_chaRYJX`U6hbIPV`|}RMrX!wP`cTY^qSn3-B7RLcKBCrsjn~AewJ@(H zov6gW&|kn5VV^MSzUe%CCIuAZACyLMJdmQ$nGW_H%{Og!_U<3h#|&{cIUx?h?02y^ z@zBytd6ZUhCvFrGAEAiO>)37{DX;Gh45hNOM-Vp^5e*bO5~Pb_Z{V@3@xRfW9CU(| zP}seJ@fIMSdu1|Ieo(0Uc-jLg>RKMvEuvC^|3qO?YquedZut3w_c6S(0e53Wk}jwp`?_z4wr-CLyypwW0ZR(h#Rd$>)EX+UOFu{QK@n7q>8*HE9wiP)F3SK393cc4 ziHY&%!qxpi45xv!0Kb^n%Im{lkzl+?P@{)wSWpvFiRx%?^=xP$Oah7%{aa2m$5xr? z>kG&YPPQe8*q0Y)bwAdM&L8=TKu zwu|p?T)W8ttx4ML9Zfn!VjJ%-wR{m82_N>SGqikise)drCwp%{w#m872D;?!T#=Ov zx5iMyeD1-lewBRi6-ZU&F^VI{PMjeyx!*wwf{ko4WXZ(Pr?YC%WKTmRUxpCh3j}Ee za`gfBc^8Y3R~j*?iL&(Z=pp$JxsMc6&Zd^W~@p z`T#}N8L>`BpwS77nPhk-+?i`G#2MHKxW&tt6yq|7NM|li_T}PIoI7$$!<@O6oC0S* zIOQccz@A$=Evpo{(@ZP+ons*HT0v&jj3AU%V6v+Hr>;KZZ>p#l@7g`erXEp%hB9 zvXKOjhl6*si=72|cXR*T+`CXO@0L z1ai&7elzlj=9ta`D%2EE$?2s9IdJHt7to+plMb=xI@RJQWi81qMBHQ>F4{ta2n#~U z$X>j3X<=^4iUM5OH4wPT%__~#$Dt`$wRRSlmPOD7n!HbtaiRPV`T1MXM?@ODi~I&% zBnM&9&LzS(0p&I0@~%kDgUr_qbS|;E%JK!o?BdepS%p!0uf$^KApN(EZXV0ciP8Jv zsxW?O<=_C%+`KGTp))sUbdSE`=n{?rk8&>IVsB9bM^QE*IX6cXWq8klDAYwghp5Fv zo;@Y16?8;EFmF~Z$Dut1A-|D5`K!4FRzXcp%L`TDKIk)DDmSEu5afiyb&H^8ghF%+ z((*yUwJ`2#6+%mO@kbuRx_PQO=t`@mqNR_<)zV2WDA!U)_X+St+PZ3SKs9Au`M9^1 zuC6FEmY3l6&H|@sdtHWF08-Z#Q1ewY(BVxB=^+nGd3K>IM=QQA4=o@t56!oG9$JW& z2Zov0f+;Q+i@JF;qobNdVGHaKmIy0gMO;b^!<~5fhL2Mpa>lO;;Bm zZUeo6zM)+~)o!FqLe#oj62dz$3E}7KiM~<@f4a0vB%{mKAB3bv`b*>YSCbp%t7H#V zBisoL1Oy^U!g&uNy(KEL6{YN!=>K8wZQ!iBs=MLMWnhM3fB^=WB$H&4kT8i53Hc%h zlK}=YBz#Q5#2`$Rfw?eahM93@_)^m1YgBBLiW)82^eNU@)0(!}Vv8--w5Am`eTo{} zwBlo`=!-Qfwy3m4dH?^t);?$NbI!eUFOZt|_j?Y%%bK(H-fOSD_S$QIt-X%~W)YPT zB^oHm?yo~XraJxbhAvh!u=HbgAqE7}3(li)jnfGxS#B}RF|!d4IEc2wh%585JUbYt&lz z?nnc{OEXvX^1c>sA!l5eJD+|YPJcNR7`&Y<$ zyxI@W<*kHgLc+@tf>|SRPPCZl@|7~h1e1TpBIO!@B5b8cZ%&q&a=HkP6-<&HO2y_y za*fE#Y2nZiItt8lnTnH6C>K=EeacDdc9M?*E0}l3QC!YbeWd0cM0B|a8A$$+LL0t> zy&X5?Huz*7=o#+z73HGrK(KUKc8Fu{((GVm^I|E!%So0%r06rUf{@=OS$HLfB2bzk zImZc#5C^vUSxwIfK~4d4nm{uOn9!iid|p>D9}P+7qv))BG|1%>vKM3&$gVZcDP%j$ zDv+H^IQEi%{4pdppRzrL&a>6;ZUsGq64In z3=x5)&}uWF_Znn}eL@CJ(?^2Bv=F0-$(v-?*3%a?z!-&uXlwDiCPPKUIAVljZSezHuCOVYiW6u{6SOVKQnPJFlhBL|!fJ;%3Dz~B z8i!!hndn|bZKt@`Mg3hm!kg}+mTVd5?&SAjx~4j`U11f;)djfKGQpn_AY%g40=%;m z5d-mp&EzN|)^J*Jk=)=UhiU2A)`Po%qe94Pb5vr|SU8yPtatH=kb(-sF>g_T%^)FS z)BQbfT)^nIjb>CzCLVD|EYp~CcK z1;Z`#7sbI5%OWa|nAfxd)Ml>~SR@veb^_L5#)<&Uvr zIK54vg?1QKY1a;Kjy6gb;(F2TlRN}RNYKhCf_$V3tVfs?*s|zpVHcXfSz1BUd+{aD zwn@XaEe{9$%rS)34tERIwY?gLVC$RWUgAZPNj?fioa(c z89rHWLQ|K*gGhY}sZ=g<0jv85hplka!Yv z{crOkLMDP6;9UJz%d6O48zQ+(5WHSi7|?I|5$L-$BQCvh=hEiEyFr=}I%U`{z!C5A znHZy(SFOCpdNv_Opgc-|!OjYKDAzJCj?=hU*ip6P_-Szv$hpw*g0+L28u_~=Kit`a z{Z7j;wM7t!iH>)8Cnu| zie@*pgbnP4UpYcJNI=R~I#O0Upob`vC`5$plUP^WOA7}f;mpFJae-%*5(&f_)A7P0 zhtjp>2_t|=SU`+;@~q?ffV9IRdRROc;0hmdlnh1kuxQB$u?Viq%->}b#{8v^MI*sw*$EtEhfu`ay;)1@a)QBJ&Dp|yDD3WwdWa|f7 zyUa_%?ms}T^P90*6U_VetIZfh_)0`k%b0~CnDo(Ok$h@Yi!K(r#yR)vdWeL z?fp@NSi{>F?HE+k()B$g_TK&}_THMqJ~)!}!OtPg;HIB=^f^Pew*ETMpNo)*!&``R zcD`C(#m3u^*v3zhFyE?Aj!`Z7E&b@L9X;Jqm>>}_H)k@9&TSSAA2+;ZvFz=QA4Xp> z&^btNl#8NN@%qNXjl(_L@|R?UEbHsEVN;{9nCIF62h|EAN&QRo>pR&3O$!kq|KZ`}~D z;kd+#bOnNBR_`1_p0>G5IZ%Th&cy@)!LI1s(X$1Uc!`XP4bkcNJ-A6fBfg?t{3us^ z@)cUE$0Z8kz%Qj{cx!E)R`FpwWaB)@EeQ=+h$iO3p&M9dId zzdgP1+;aqhW|9)ugDgSS^m~c!KJ*rEG0rGcHAX#jg7!}kqct;MUz7kig4*|-u#5Qmp5Ns z-u&Coo9{u|Sm>5-zPhyh+fU2)AT0t_*ivQ@wG=59w3OKsv+|q|dCq%0=My~VL!N0K zyz=tZ@yx${p84*0wv61D--t1Vq=t$NY!C#}Tj9!^Qh=Jda7V)yZpoYAl;+i!eFp`b zfqhW|mZU|v^a&L+Pn?C0IbRznxq5I%J=#8mPaE#jkU>mno&B90U}=G;4C6ZsaJBaQ zt9_#W;zy6(_4f~Kau(S%~D^H+L8{MrG^D*mv=hW$CDIaU0VLF z8N(+-!dzO5kcC*+JP<<=NDm(o_ofu4#F&6a3!FBG)t*gY96>l5^5)YJjH6-8&jn)F z#6f|tt_=L!F9Y9$v~B%C`T6S7@^3#a-(6Z;{>7br8}qsqV|f>Z<6Yi--UZ`mSRv^* ze}sKo8pVK$m6^UO892=J!3x>$1UWj>iNo-;cc=Z*aDGUL*{D7m6lWx(D%tuZ-qE%R zgzbPhd~*8W%FFUA9@H(B0IB3JO2u~cgJ!v_0&UXy%J5K%ZHbf75_ceE;_v`*t}Rx} zD;pvHykGl=O8yB}#uIApHT>IUh!-wti-^X_3*t|ZzcdB1VkDOauOvG77N=zTigc4) zkfyA4?=CG6Bo(LDoQOdB$#Jk!m=a?gjX+3{#*}K#b6*z(A{c&Nc^WfEr`Xw-?~PfWk-)kEvmg6)`9W=ier#f0>^hH1 zN42BnFn83@G--1iN;wY{!gx; zD2uzd_B{mQSV-L1;Q{O|^g^8oh#`@!y+e8KBw);jy5o0(^o^N%fs7CFdJ%|00Wsu_ zT{6|qLr5VSp9&p@TfxOiJZXs9U6K`~$wGNOTj}YCJ<1g|q-PK`X?V~goutO=JH<3^ zcn}i=&NU`Pf02c;!#H`?2iN*ROcv?%Ey{0un%LYS4<898Q5qi;7v0A?7Lk!dzb132g7X^02NwD2lmCiQ+7T6E6!QQdtn0&O*{|v!z&#wOgEx zv@L02Z_nmFaH2T2IE#XK71iE95XVGGVssSw(g@qy*}G{`KTbz)iPJP>ghoj(4g!O` zE=mSPi9$eMLHSA`+x2QOok~(gGnS(T!X+C+Z&3!zQ_4rGQFw z7)K*1r^Z^y$*n=eXThzsu0f~RfN<3CKpfeu$9B!g87&;BgA@t5I zL#Wi?-FAZw$1r=TF~WNA!7L!ew~#B`c#bbheUZ zrfPA73I;AOl+;r_7^M}RxE26*Om)EyU`2P_PHoWC_Dn@Pb3V9o&4O)XJm~fa!XOpF zy5RXVLF{hYUwT^S4JvJlWRdEsl6NZO@a=DDNZ_Hwn z{VU$9tcl(slgZJGtCJYxs-!lGqct)kLeNSt>DsKzLUk!Ta=0jkbUCF%T#ogrG@5f9 zV7r_+>uFJnC;)k1oW{D$GlE?1F<%j_RKd~jb;r5K1$X$M;122Xjx%r}F6+2_E<|&l zf|B$Ppnl_eWW7cxJJN0d6OR#tZ^2pKkH;a$d=fsTPovQjD| zL0D7)(z+?0h?6J`tX!HI;CRUnb<6~uMntp3;_5`03B=-pl45aq$4Zcy3v`?WMR$S9 z$k^dwng#&6=c7q3%n$ZI(DN3qJc`6cmu`{a$QL!{-&9j z02oi@ah1Xl5=u!Y%8M&QnAaZW<<@-My)v-{L@3m4g9~uELU|*c`61uQEv88ixCzYyqI%2Ho?7@e_hlU5Y!h;B(AP0WD zL*tv`5LFkChT}v6gS=OMaUA9C63;T6N03-VdACw95gA#HojM-)l#Cr2TwcTokbv$? zAsV@e5f2P@a-E0?B%^*hw32as^>?%=hX8FSTu`GBtNs3ENxUnGXg{n+n9K!RqL&v6 zRpQX8F3iVzHt}*Hl!#oT;=7hY-}>Ms#$x;LJhK9$9fe0j+PF-48<-ztRLaAxoEXBxwSKLXAkvQwW8x)3xdH`yioc9(_{Kfm+3d#&5&utcNOx0J!Uhoc{7L@CW=3; zg!rV;iF6Mk?(k*M6?f-_e~Xr_u4=>>Kn!y22f7-g^n5%k4GKGCSFSKsbDd3$fp~2q zE~X)ZD?Y1B66xwThQ1DgBv3^6=2B1*>{_4X!78w?h;4~+Y037WOD^fD54br5TOvt-S z8!}th2wtN;P;PCrEZzndYY_<1Y|z`>T&+Mf4y9c~;!Ym)ZCiN-p2$jHlpj=|A{;{y zr()Du4HXz70y--pP#~cG8fn#VcYbg+PWAx{McUxzT)ugSSxMj#8SO2BR30(fP6Rk! z(@B(P48#&iG$1n{Ed%x*Q9#RG2VYCP^M}9oVKc(hHRvuZZG&W6J z*~Y-%kM8q~!KxqRszP|DSiNjqAo8IgGD5U0=xwt?U6~3b*0MEbCyr~UKyoeXmD$Pt zGP8w5eXf+$j?O}yioZ7xWlJX$qz%rHUBdn$?YZ`H?7;+KJePG_WTdv~Lyo2(5~ z-O5Pj=~hOlD_gpSTC!Ra>Q+YLxSR!&d%Bg8+%I!rte?3$VXJYkrnS{GV5<)!5SobD zZhtTEo~?E$?L09i!fr1nfsv|47!F;aDbc$f^++^mYlvoCsQEAs$@RM}V|1$e&QK&8-^pK1PB~;XE_@&=JzV;hCNRL^vUvyS|%$tDAraIAa60%2Y`SY zhXHa{m(JOV06XJi64-V>3Au^FpybIgN05^ASYQE2jhsF(n8&r6B3TSE^&Q1PU#Kry zjz9rW&Ckw)4n%Wjy;0RF0liS4K`7g_9qM3k@3esS$l<647(~iDGM7KtK5f6wag8tr z@osQK9!r2h%2xEQYYptfZCuxI>KsC*vO!}MG)hNkM+GMe#G_<Q~1nOGIFg6r8h6j5)-3yYf6 z-$$;4{zhvO(KWzUgE@KJjd0}C2W{0Gf}IYdo;@tJ80N-0x{9+C!+D2hy!4XH+q^1h zJ96u=&6&4iok7m1@b*E$yKJFM4#hlC+IT$`E9QKG5D|-ix%Do6bs~c1`l0Tu0XWv= zE*(lF{foVi(!FtWBj1HKy9nM!8@nN6x9BCK|J zyI@^;YaD{5oix0CapwRRA>;trS0`Zuxn%4_9@Z8S&VY=Tv{>15^$6EctizyXpm1u72?P>jOs{(Nj;|Mivz7Nz=CixqR>TS2_ibOl3x%M2?dM<0V0$n zHWErQz-0j*Tl2lasYlrQ7zMIH6d?$;jH5VGC>wH#@xm%n2Urn8fQp0=U>#Xz4__Al zK09(4p_IeuJ?1b%IZ{x4rn6&5;SP;5!hnz;LFhm`q6m%*IO2#V!BLD7j^g)-qZs8# zAwwcVjv|b36um|qMHok>YIwVB=|GdTlak$__B<|b$7#d{*NUVQ4+GKLMD{xjxlEH4 z2u5Rz?Rc2-azCZ*hQjbmf?g&JYxL8K!4D%;YT{skgK^9YH(@1JeH?h)=OA!%@Ee%i zY)0{$9Js9b4CCmY1>@lOQcK%17qjifwNXrCnr^mZCjGhx4yg9aw&2B}ITK+M@_MAz z293{eq)WN`o6EWO@7nxEZuc+m+1xFNIzhAo5hEuHa&>oSSO0dKZmM8f9`bOL1Q+Eq zCC|f_&hy-57hTCkj&DHz0b*Vfabps3Qxb7AO6qZelHS#;T!L?wRIa|X3@FBnPjbAy zJ`%|che+^_;zdQ{{X8J$5mwB?jT^B!WwRm%X(GCOhuC;;3-(WMi10CPUW7wByP@N% zDWOa=Z$;hLv}@h70_|{_3-*l&nvl=m*V%(>k(cq#Uc9ZwIfFcQLFG-t@c9-m%)X7y zqZ8XQP?gUwfvXS(^NtSw5E2PKoI1kClFgKg~@$u}s_|GMM zUC4uprX`U!@r(c~?V7RcGw_bh6+K;Dy?JCyzcH}Aux$07&FTiqi_A|WunMy`yZt^6cO%GtH2)IA8Rpe`o3A5C zB|1V%EeINyAHwLXXUozW9QOum$X3Ttq zPn;Zwud*}3p+<0MA2yCU#Nm@0!xG>tI0MTU;*-%pjElGzB)?3S8}F4OXP&5SHk^Xz zss&9JB{H`sbK|{I<;={+g@!k}D@#ziNP7CNorj zyDcPqTk*%lX}V_@#vy0+;rax-6F#|0jU*Y{l2-7Ww$ZfQx6_c@2P!jgnK>pX>w{o{n8p0kA4E*yG(bF)hORY$0cj>9Al2*|F1b7_yJz`Y1#i zH?)xs!*EVTnEvIM1M9@lzqE2_qb(BTXQ3Cx?rEVj0B5>~>gNc~5?Evk!d!16VbrRu z&4kU>9CLXPXCiysyUHx~_h#;A2#k8SK zY807)o5drhhn3Wq5+|SWimP1iRzr4;g+nFzZWm(;x~Y@hKqR z87ZWYyC{WsWTqp8_YFZ0e3?=Z9$KY3Im9AEa^c03+!BdZw#-S}0~ZEe?J=^4_Hy#D znv;i-oDwu$p+J+ZDp4lz>R~mb+5m}sP}yFrs6Zah2q>q(~^f8f$e56-=IyNS=f*$&4A?jlyqCV0QMGe~~>oX6E5iXLZy@<-E;7KzT zCeloy3lnqfpbk8TG@q&ZREP={nw&_2+|l+ENXa`*Me7j>R=Y7EvvuYUN*v&Y4A>Mm z{YXwu8l+=Crx=Au3gF=~OUklL>f%Gq13Y*~mH{ftQn8LTM*;#!gopqVNFjszCKJ|= z%n=|D4yQt$=%GLj8WF`1I%q@e(K3|LMwh>?;!?2y+i!Prsz<7IuD`Z+q~@cqz~X8bRZ14O=aU`WV8C1EXK z5II+|vU3XtjSRG-%CQT#4tMtt3PuLcf>{FB#a=<%!Sgsl-+$k7L6UT?5{pJd*uQaO z;WbNToX%|d?0!Jrci$y&;xddTfnPAA*{pw8v+2gK>(`o12Y$Qo+l}8N`0c=N?mL=I zD}Fb|b4;g&*PB1I@YUu&Eu3qXv@!e!^Ii+*nQvHlqq+88;%_orExg(M zwS~8s3HK3yt9iYJ^UcRByv_XB!q=GBu4ee{=G_)9FkiFqwdRU;;_on9EWFcv+QMct z=6>QAntLr=WPaPi#pZh!wwRk=$M7ZQZGc}gOU-BP`(0)Vbp4B_)vUB|nYr6cZ(q0p z{_C9^hwTJ>b$)PL5043&BZxBjuKaK~6C7%d9C!CwReBVOmvX(chQVEneDCnAV}PXz_4* zVOr0WMT_Up3)4DM7A+o7EllfZS+pK0O6!HPXz>hbVZL50ixv-S7N&KgELuFFSD4nx zvS{(NU13_M%c8}jV1;R!*OxQ?;@PFbw5rOYMc?|uv}((uMHlVDwCc;EMQ7QMBz zMfcajw3^DIMaR-YwC*r-L2Kgj{?4wYgZ*2$E!w$dv}x?+x`XW3VY^l)R#nG7&`LrQ ziLND&P-S`h`pZW_bu)p#O@JE zE-=j?S+lxxTfV*Du_H8d;XE(R&TP}lv~o?R-CrDX{EQ0Ik^!!@R2GY;s8!>eg&?t#JTGsuflWYNyHf2I0C()Q6vP-7-gE)hUjG4G}RiCvEi@Q7fHe+!YK4#`$Q8UZ&ukyjQW|28{_Ev>&Q}`u?H@!i^|6Ji~ z-YD-+E4*yIyg#P!(oT8*Lxr#1An(sAynCa(e?{S{E_pww@YcM%A5l1Klf1uA;e^fd z{y~LbQ8>9<@GBL5LE+jS!T+wp?*iUqR+yP@T8kC9yUcbASDHTsq#VAbaMD9-&0@UY zqwvFke_*DWuUa_WtTJ_3&Ey(e73ygb8)Nn_QNNNibIk!%SgpN6*{hj?@$WXzA%3;> zylC&g@2*9o&2jW6>~;dm*6n4K8Dk@&o=?H`Bxfqs+l1ZC-RAjop;RktiawS))(S!;U$q$b*^1Py+YfXKo~bPK zpn37a=4gdmV+!ZkZ)#6!P4kYH^DLlsz^yT3?e!w8YWjIqnKAgbXMP6@xYslzyE=*# zu2Ya`e0Hl))&o|R$I6BrNK&U2w)+)Yoyb$8`T# z+sXwHMqw^$Z$ckZV=C3_G9`_N%?sdTTD(~mbO9V8d|W<5Z#2DNs5Tb-efiDU<}X$9*7oI$ z^3b@WjS?R#G-wGQGEWpHe@^;TFsrwkBgkrEToQW!o>SG*`MTDO*QymK;<@u1*oG_Q zEz!Zg+ngzs^?6lk*^DeOt(ZehfDG&u(rW%_JC?+nNZ5$1zi&Lk%$Yk)8`5&K+NPyL zXwmd^5*=kK7>_mmTC)bpDSr8^U(vK|nSS1HHS3jcn!qJHc-PyxRGsY=YE1>HuoH(F zj>ltada8xIw3?iGuX(&c*5y^5&AKkgI_?3o2glhAwVIc}(2Um3Ayq)@@rV!0^w85# zq>`%5lu69t?yRGrGZl2a(F#4w)!vmt;|@C)t#ONNI9!7kmAS-bi$BU#F^V`IagmKP z-0VfRV761vA{!^h)w0MY>|i9+j1y3Up} zlA3x^)&j?3+;Td^W@r_(sV`jrtJ{tBzy7tRVL>@{F=shnA!Ms zU)Ny<@H=sNhgoxNhj{|O1+VHbhw!VP+F_mo{t$jg@Ox=Whj|vb9r*jHI^gj;g5UD# zh&!#rw9e=-FECyW=mI_i_$2Z;I01i8>VVE5|H&O@59sVe_yGQHtVf)y5Oz_AX$EY+ zqQg{yhZENz9^xFF*@XEqcbL;n9i|SyTEuO*q{Ga;80qo%8ib!h+#|s4L0M=W zj|1+Q4Zbi#=lb7an1XQqkEf#W&gvyU4uW!i&wvEWE`0*un<$+98HtYTj+(W#(%ZUT&@!Cce>Z zvG5A>X$!A3W4021mATi#tIcm)IMaO3!dd3#Z47TRZ?o_k^Y<2BYcASO{Bo1o)53Y?Z!NshOnwXTH<<@5yxIJ|g}0cW zSa_>h_*RC`H;-9(oB3x8Ut_M`Mf~mN%@!^&pRw?@X57QX-(l{z@J{m)3!BXkEL>=A z`xS;SGVic(vH7xvE#}f+C4PzN0lWvkiXXS{t>)VnF2gG4g!cP)*qXEk<{GPMspZXD zG<$D(bCzKn#zYIwjr}{NH)27|!D4=nL4pzd9NCmhr&Zj~ktU&ZTE+bwXPn|o+|Q9FvvgX;{Tyj}OQ%)b&ygm)bXvvz9N86=POG?|BfFH+ zX%+W#WVcj0t>V6k?B+_RRorKi-DK&siu)$AyDgnoao9mUbIdZ5~I<4YS);9MYCftGJ&dhsLGTD(>gVA$IAsiu*Zos9rj);(m@C@|RAl zxSu1Z4yDs7?&ruUNa?hS`#EwdQ#!5UevX_Hl}@X;pChMMrPC_z=g28q>9mUbIdZC3 zI<4YS);oKlxgtGJ&dr{<;8D(>gV zDSqj+iu*Zoso-4w92eLHh5}BB!K5t9DUk~k1)LItw3za9y{IyrVsc4ImU)APK5<2C zLHwzDS4?Yv|3h{)s{M0zHEKP=Mo(+!g^E30JuCXV@-01sa?su`cJaRs#F;p>VGC~n zf+Gzt$KtE~qrIP4FH`VW^|o+*tKsd~3mx}iumrE+mN0B|2AkDu3a=B#G|07OJ zO91b~`!0PytnkMc{|hYs@$(zMINSW&9p*W(gPUD;y6<+}YMDz+@pDz=DVpM2cHmgF z&@q!Uvkc3Xp7RIkxV_MeXw&F(!QGZcJuSAT?3VXv-5*P4#*J@m`{=fK4o5l3_YAB> zdG!{3KgKPfj|y4NnPzhUSvO{8eV^RjMK=w{MJoNxrVH6l3$xXP1v8yx}7qCsh2Lyadz&{E2nSlCt*mSoFxL?3d0ly{S zGXlOPpz@tI!K($lPQWe!9~bZi0WS%teV0uDZJ}aU{g!CDZGu1%jpb-+I#pxehqHpm zir!P{k7q`xkqDxG+BVLjeI%B($4Ue)iw{4M$_P!sZuzw%o0G_<7S$WFi93*X_U0LW zhHRw5E0^rBF{q&j(;1+kV;<<~8t!IzS7t%Rw&rPs7-4s2gbErZ2JgwFKN^>xaWQwn zhf>8u?&GkHCwE#gPHScc{$|Dg%seVz*E7_EeJuK5RAkbqh7%d~Ub#8SNJlftREyUX zBaxd!nH*05$3lz_dMx+znel2QQY^ifGNX-`Xtoll1x;!8p#`<-rf+)_ZbP!hPoWTv z=^B5akDssF$d2R$%n6@RXR2K9L*^Hx^JBGWe#=@Yt$|F=aTggpB8RNBa1|TclzWci z@0Lf`nr{RC{=3(jAK^Fp*JLfeoPKEde|4DoPj;B+e;<1dzlZ&e-{~+n0X9E{VtovI z5`WZTo<{f{{Qbhy9p*TGPeCAO@ZNxU%Mp(syb=LWx^o?iSmKv1i`|;vWkIg&*d{Ec z4Edoe+$c_mWSRnYZ{wH79TCv1hgyqXHMm(N&z=vGWv@GR>8fq{LEP|@x5p|LJ+!&6 zON05LDEK{VusyJ$A=8;Y3|R@!R7;d!vX~HsX>ZKj>Jcz$X-ofBG=oK3H*Lxf=3Pz~ zA!rIZY8(k!)fezVcZCLoR@;8vdNv@R!ymcVGy*$z>7v1{L*1J5Okk?CZ+Dch2Chbj z04{acqIO)Vz_MAx<8A3MwJ!oM`^m!b#>OK)OzM{<^@gDy+pNbCb+FP*tb?09#e~ zbwFh%aI9gOXP&oOl}e2^nxWstM;p}M^k^eUm&1k)m9=_V-!|^A<2EpKz_w_ksuD40 zTa~VfW3F6WFzzg?`jz+PHx1^8x(i0zY92w0n#A#jws%ThqSI?E;Gk;eU*8KuGInt% zc*X8o%28TAo%L#BZ)P~FMPs8ubKrN;les~T`xuA}YErpc|J9Rqw zUBCtbj|ljE0bdsIUjnZD4Vz%OfFS|<1w1R@xPXfH*qB!dSR!Chz&-(BnjJwSRDn;} zS5zuj z_^O>bTZ{G+l9><~9yN|tZ^}E!5Iym#aaHsXj5FY*lN>=wt+*K?L_2pq-8BD<19y<1F4dT&!`&sjG7!{ zExwxNv&U2E?WmaiHX$fo&u$jM7*LfA=aeZjEMD}`T^OaXN6L3GGCGp8{DsAbhZS|t zmWe&X`gEo+`gVkD4nvuzP6^tb9W2p?v9maaaNNQRCD zq6{}geJqpA)O2|!&x(S;Z+A`C(?!|cLRlaY^l0ICgo7WR>@`8_? zL|-tq#pZu4NI7MwPpz?TPv^U44B;b980WJ;y1#D_o~%Q-G&A27E(Msn_r_x|@^SF} z@;+1XYXQl2Ib$&Y?y577L+?JwiXUsXfYz7r*HH^cnM>ct{rQ~PW#MS^4M3hwS^^#j zE6kL%KsK5a2*!xoJMM>yfI`665ybg8_p;=9)yb#2T999*o)U!M_y74a6tB7^zbP7s zyGd845SCesa=6%f@)A&Rr7 zHp7(E_=9&4ZN|tvXEIc$(@J;h{e3T22Hob^`{BY9k@to$>jy*5D4iKm_(2}V$(kg1p zbO3=!*Z4SW$W?M|bwy_%&ZZ7(leV$YTsIE(3=H=Vaz;RbQh0m_sn3LLfYA&8&W*E< zyK)Jgi{oNEQIbysHb>Mrq; zR%bcDe`i>>i<0qeRw+Aq1aWOTZ5ZUjTFHP5He)f8D2nGwC`R(^n7OmN%+~5dO#mkb zCw}+r=gjjT2<=zbetCEJZ+-CG?3XcDn3G6LJ9P7J3f!mgZxot+g1=YchZKHO;iVsv z@J@vvS9n(8mJdt#Unu;k!ngdE;D4d8`3ZU7rtl9Hen;WV-;Dq``xO42 z!hcsd_je?Ghr-VRUV-v{A8-`l9LSOo)5oBamzd|U7(UtFz{^HX=SeOwKz(ifvAOV3 zGpzo{)eEDDtj>+*;A+g9UQRoHovClP6D4?yW2$6NK!7bcZCUnW2H|724>3z|S7lv+$=oD&;m;2ECjw%lswLN?Qv4S7f4BbUYkQm*QKh?g@|E!3WaGG1z0L8mV8 zrbSoRxwThM6u=ca6h#&l2p$phbqQ74}8o$b7qZcT#H$xD~Gd+j*moD+1&uhGhWZJrNhZ8m(aQP z_u;~df^>0ACX{fgbWN=_{84UVyg4{&>_BZ?n8C>ca}$V7h&p!;7)1`Ly0u3Fuwh|4 z4T|#-v+qGvY>?Kra3O#LA7Q~&IsBeWB^vfy7Ky{tPRvqp+ihW_7WP?>m}B7o!t-E- zUm_2S%z{;RfV8E5TRy4c6hTUqDha)mHfL@zhdZ&@uv$+W6{vt@Dr^|7A30U3+UA=x zC1hsXCRT35JhQs*G`o;)GMGH4GGd?Vjb$WHvHdo4dIL;A`{2%W`<20eLfy)0XQ`?l zCAP^c|9$4*M(!yN?)2)(c6SNG5!RFK5_1>~clU2!GB}7YB%v$nhhuootTQj=p*TV@ zCDijGeUmvNI*D(Tgp?zTnd$>)n;qTU;>L$}O6V_}-h@>^Z?ImDHoW2(UMv;-ZQDi>%(<}`-om|iWEST;}AMU$zy7mdjs_;UxlM%l_l_w8)` zB6Hv#7#tT5ven`HXwx7)qNb2@NRq6LL8J8Iha1d(P~ag`sTiFSMmbuA!SeRPmd?S4 z$QrJ~#W;-XgOst(AvnA(FjX0CDlWqkhcna_m*ZuUO&fEI`Dr8269N`&A3F0R;dr{^ zDS2;G{2u|H%X+}>-VXC9e*5ry62Is1JA&Vf_`QVRY5Xd-Krr}W$He?C^0^0p4g4?<@;!J^OJ-X=3guvW7d9*?_fl8g zb>T%B@##ptP9i)Lt}X=bl>B2>lIdGB8f?v!!EJrOEqL;|)kSjN9a8Liix1c;wQ`HE zw`hdKEV5-g}Xd&_}I~dCT|gA}&~E+9odd zEu8xm10S80CH!9Znwv^qrjb>j(fPI(Zb<7`$%WR{=d1dZPgH^dbU~J+ZgNe#(q3aCZ zZ|zut+XF6iUHT{gaT^Q=;rt#!q8U7C&1&W~056y9%08z5X>0a*OrINxc3Dd&rx&`t z`X}LG>)eGTG;p=ayPC9d1n1)u!hNIds|uefPtE)iV_HitY#-Pc)b@d@gkK-}UfgXM zoO5*D75nJ|0|479U($YCo2Yr@52PQj|9yei1F|1~4r7Z_&#-b`pPgjIj<_GM#ovYd zaU7&ZKJ35$*}@9+zn8kRcU&P~*||-=tmXFnAG6e7A${A&42$;)x6#JdZDnz>QXSS< zmGJg|s2fzY`cH&ozWIMB?=6bo0C=vta>&yaj``;9jK_Qp2#d#jqs`lp561N7>Ze6# z{=~vD(3#7e&bZH&g-Y|JA*olkoqNns6t57)-fipQm)Ec3` zPpQXz_8$ku&sE+HSkvOVS6#pKC3^s~ z*S$uYw;~_*B~_my9Bn>fA@#k^$)8{EbdrC}koYU6*I)@>;k^ch|4YJ{#S((6b3 zs-y-M*3iSMkIo+K{d3XJ6N>*S;JNB&(*CX~Vh_e6U$F;KA^3%7r;oc06aNzBOS#1I z^;x3?3(L3RP}u&T__Vfv#lHdYeC0d)SEc>$2Fz~%IWvrW*zRW_f06Svr!02N=mh;y zLu#+^w#I_~5_N%fSeY$8R(C;VX!?s#7tCMEd%NN{0G_WdxIK^)Z!e?^qs&g^BRVkM z=>Wboi|t3J1iKBB{}Lq(YXsR~jY{oV$R6cbP{>HSSLNz#+9Q7@az3p1ZvmdKoKFmO znBMK^d-3zz+#`6Gy`~Ct2Klhf{mx;+3e)l#k^8e2jziyjQB**zQQ9y1x+?gnVGgh8 zcK9(XfLHh`)^1xvzdTj`w4p})|8N-^jfd@~vapJ>nH6k?b)SuGT^s&h^SQNVBj8V- zS!-_p>$PSGKOVO#$N#(goj8E~E}X;rHQeWi-%I$N#P1Y-O}~!z_#W){VwlhlxE{Zg zh~KrR!yHEV0-K{Gme(@In=jXdA%9y;ChYnLwW?Cn*TH=fSp zawj&TCIA#T`NqtvaJFsZ)}iP$+$7*?1Sg**0vR5d06&Rya3sz{e92R9Jh?Xo7ZB#V zh8#CM$)N1;^j?u;e>}jKee91X_zE5SD}02HPKcChbYgDD_vG{*&*gzDISUBhxMw#L z5hwe292FmgKOOy=eg(?09PrNod6w=QfOli-_tL*1tTuOBINp5L!W#2)3n!RaP_nyG z&65zf=D?H#a-OadlxmRb)NjBI1!}Pzs#C zel%~~1-^gtAnZ`YbC5bC+le?iJ8Y%X-m`^YbhAd2-N2-!R&vYSaU%_y zgP@5nXyxLC`2HM2a^?XPj~3!RfV2=ezzFnyQ-Q48@Vlf)P0Y82NHy$3AT>h6rhw87 zJ4i_OSQnMWIAG<8VtSQ|ge(M}Ge|#iRy%Cw-~urY*Du5AG#v4mt*;$eqirl z7iAx&rS0I88+}h6=aTi9q{)rJmDyWyMq`Q@xC)me>}rOOg(QUY+cO6`aFiCJ9nRat zCYK|fiiMU&jzq>TR05X4C;ko}cf6;4;oxBBPRHO~d3>S|_Un4MT=c@-0d50B*Oyp? zs0?TEoJQftN-_B-GhF}qP}fiCd$+=EfGkZpV+sE(8PAY@9yE9?8=q5ZU(&Y~+S!T2 zGZ&BuJAIza_gn{lW4#XH=BKcJh;>k8f@Sn1Z4eu4)AXB z8rKtU8Mq+zG|Mpabo)MyEF;6fJL~r%8b|c8o{ToEOWxX>h&<00q_Vx=HkQ$5ADRw( zzaUyOvCfYZSy7I$9$cv6v9?Ol1F=H8zX%(2V|z=FZOWa4QA00miLP&7hH*@AiZ!xF zRk*37dogaA%2^x5j?c4ERFcR>i48Pgf{mGf4*6R_J0@sQcA+H2G@s!xmB_E^+V#dTNyO2 zEe$KpkCD9=9Hd!IN**H+YsE<%5g1qL=FE=g!uHqu_iN2=;6ADN&jWHQvG1MBN*)8y zE*^XazBl;EgIwEQltXpnm&W=4w2V|aXL8<>C_@F9XhB206HpB5f--9n-A>%HZZ}84 zNvgB%2KA^-R+GP+8Nblyj=tA*f1PP}gTyEY0&;&&GEA@34;d`~$uj0Ni7W{{$el{aNH*>NxM%*Or@`knx_Vj*)#< z9mA3G3d}p95`0FR6UdBpdli^q-L?UWF+KUfUXfuu=e%nGJ4 z4k+YsV?Ik98{@VWGSdp8H4_^fW6JwnbR#YuYw-A^l}(M^njd5n_|IJY_xM+W#r^`@GBy- zmlR)(_i|-+9Oj8*o!Y;VvCg%i!Ld#oAZ7P3pfs9AyeAHtHF#Y`5k5UadtWtEAs8;ICx3*a&4d= z)nCD0uIbs#_7fyV0dYYX$W@*vr>qZYnIraeUqE(o`#Pw?4y{?#)3tmptmlD$M2`yG zR>i*`kp0}F(4SK4nT?_q**+1~bBX=jSCAR&cLJDT{k{fJ8sa%gFYXI&H*Hz<+za|6 z)$<(lD3T@{FDsdiH=w|tj%7|a-XL1gcq#95(~Y=vtV6LPBkIO?kX_uPGtuYfU$BA5#1u1JVXmVGdTRZqNqoLBn|hKY7Zu0Y5;d)R87IBR1f*W!eC) z@AxL*NwAVO0U$q;YBZS>1x$dS7&i#vwetM9WL3zr#fVjW1i48Sb1`AP$~mm!sQH_g ze~#<89e=lDNZ$`Q?_UIe5|Hbe`!S0xwT_?vOYF}c!gs1Zi}gsroA8r8AezH7nD=p* zbmWm`*0SJFKIp_<2IP4B>8Nl68T+L)OD&oYYaKYW)-aUvL z@A`XrL*dMKEVI`l*5K>%nBU0c68K)s`xKif&c{LyvyHDXq6dqSN?*B;mjSAnQ z@N){sd{e?-t8gbEjp!%z{RO}r=-1fE8*gQrQ&t1I#wR|RcRHD{26Os=uZ$cmttv9%(Rz&; z_;jj_3GS=8mXx#KyVr$RvcJMK{Y4^Wii@n2nQYu*j;Dzw*qAP>wPP1*o5`7FrUMNy zs32T&844nqDl_|8hAlZgybVOkn*?ePcbL%&yZ8x7JUDI`W@eYQM;Tcgx63Ly<5tFV z=0-D&J_#MhaZ5UIL-uxHDX9UJpQ@nQQ!0nJ_JG-C2L0jy72^8liDxw)7uM#;P| zmc=qN|F1CEfGAfD!Y{}XDqpCJ%zh9W3x1?pMr0*bE%S|m`L^elv4=baW9Uj$ylxhl znMgN*+i*sz5j?RK~IrL-o zpMpN4hS*lz*FTd?u``L36{^<3G^h+oBbrjIQd5$&eQITSMwZ>OtW_89@5h5=Y@c}{U&z*EWio zLDygoBacZ}FLTYhSUzS}GX$G>>XZAl>e@9l3Y80WYxph%JukVfqMHqc|b9} zb4rmzrt$x_*8C-Yd~SP5Cgjh-0G3*B6<>f~ z>gVCJioBl#Y{7fHHbHAh%X0`y-(d5w|Dl6$A;s1vcvCRfO2;kb9e480dTS%?BAL|* z>{-{Cr>=-L_nt#brhjSW(r5vq>C%;U$%6i`c7+3#;`j+xJ?hbv8*O&0`l8h4)n*;U zLj8K1!oN^>O5t@sknZYUK)T7l7m(MYei@MZIQoYIZ&$co;h!q}nZmXoNxTm$JfZNG zlY(EX@I4BjRapCD316acuflIAociw)eviWUEBv}b^B)pEQ{gg&{R)3i;W35Ro|5<* z75 zGBQYb{rqjF;Ycc0E{s)8ok*^MVBKQmgd6~*)-7%^2a_plU{nIerb|bw18cV9S%&Q? zJ#Gn-1BmNOmd=RIhM?yiOx3_Uxc~DNNbBQ|#c?5; zm@tq?my$xOsr}!uBUnA`_U%Zb5;Pf_FAf>p0Q<+Pf(Y#UJXS%gX#kxH`m#FZ%BE2T zH_=d#RV(w`6~krECeRtPv}bTADnm+3XPP!f?eN%cnufjIt>z$NVKqip3{gIme&i~-#XOH>m9}WBHpS;RLLQQa9p8dLDi}FP zdex@$Y#6UGjsE~*6jYgP%rXm*5?^P+x4(v>D$S^gRz#~<-5(qERGeE)Z!%6oEA3DL zw`T`i9QT{OVKUrr7B+&6WU8313$d@bZVCIx;m|nB+FkubL)I12Wjk4os0h0@gW5pIRy?UY zEn{h2XVxS8%lWX%6K~olp-s&y4IOog%DM>V$*a?5+1x29>`| zR#_>ftVv@f>WAQ!11n=#rFe?$A#|S!>-zDZ%lm-he*>`Gx;~1QKp)gIfZRi<22JiE z+yKZre*>WGAw&Z896SG~>VB3XpXvGiUMqp9>gSkKh?eYZs2}WX5|QWGGRJ+{9<*|f z_JU~5#JYV6$~)GpUxFB@0Hx>^%pX;$cs!myHxcv?mCF>~C z4kXPu0vaS{4N=CG|5GJm1)oIam2hn7gE^Lq9NGr0wHFTj+>S}@=umIEE7qBM;1(+W zjey*r=pHUzZ;owVW%j*@J3sJ~2YF}dP4djr=aCupB?l&`FRuoa4(;WYa%=}~H~YbK zN^iQrNVM!+ovk->%rPWQc4$-@c4z?wdM!~nafeocnq`L;L~AD2b!e;uaPczhTPz7G z#-6Pu>D$;bPTx2s->bDA>YGe;ppl3>c}Xeb^AYVarw)8L+@|r=;Wq!wnG?vze|C(O z_mhhM1z@@3ujE*J8EA@GySwDE_K2lwGEaOv)BFtE5=7%C6pm%8yntC#W~B^SFckhz zWGyC!;>J^CC~Sr+!@3x#lJ{MT|1e;=b7uWmw z7mM{%O1$9tRommdt!-{`DAjcYe!E~v6>}*@Jk9U}6{NyQftnqVX%D!Vh zn2|==^YV=~?B<<6+Gqvasa|6}SQ)9;Xflr?X~t+HNSrg2apnJ9iCD#AaEgt&t$#+v zc;6J%YyE}R-;Fkm*^Su#^Fj@}8Q?yt_AlVCZNC(2gQ@NGeNY_&aiG? zcAbkQLDdkeH=@q%nBa7dBaSCo_jp2`lM%;B#PpxqN$bpM;I5r0_&WhfN^i#a4B{e6}iibgc?pr_`+mVi`%@n#^(}%`jC#Vwi2pxblCj zM66+1Rvb}n{uqqK3wY0tV5-dQ+E{lM;O}nC7ast;c(UMM0OUEhS}gUHsyp+K;m)lW za0enr$-4pf;TQXoy@W*!4r}Y*yfSgl&4m>6C3C3)k1sY5DtP*w+b}ZW<$=j_ZhNqV z(r8lzKI-g`F#&0^A<1)Yv?8++QsA814O2wnA5geg;TIH6n=0X}6h5KwD+({ElhNHG zKsK1SDLkm~X9^ppN%&HQk16~|h4s@VyiMVwfHe4jrSIPd%z^&pc4dI>S!-UdhIx%S zfT~Y4M9dSBbJP%dvhAgGEKC#qSa!S2dUXXy;%5GHihLqrH5Df54z}EMBoor-W~3Y~ zt>j+mYs~XWT6U7_b6?Fh+?1Qm3iIf{B-l@Jk(Dx&jay9X*Hgq2vY0NrG{KR$XOgLS zBrXs{GF4{wvkV)3de#t7;*q#vL<^6^g;BVg<4zelXI(oIrA@ohyny79#}AYUqku#q z?Z%m-kb?u~86_`ZOei)_qS3%FkZ z8gc6QToufGJ$~UBw(8|LKDPkb@Cmc>j?b~1Z_ZrBv&ZMy*RRhER;N}ShZOTj(6Pq| z$LDk;Qo`{$^9V#cabDoRFoa8b`!>%G4%zG+iY|GT^K@Kyq9Eu>Y#%P0yBFODJM^AX z{1hII$JI*7ek0ah%}FAjpTbQSV;%H$rL2ScehMWO$@(GehCH}1N~jB?{F9|K6_>>0 zTE0K2?==c91}t|yF1a?k4K!qGv##W|(eg_QKZ6sQQj7D3?*x=( zkVs%7E;5#1ce4!nNDqq+*%C%oH^&@6wB#ZO>z7?qBJw=LGQ~aLT(mNFO+mC~V%=gY zKU@3Z`i>u2ogB{Ddxu~S3AMf)!n`Spj=>E%jAfKFfy(jG)BY1X>x|H1S ze-S)QUYs!zDubtJKfe{kXqX6#b+inJwd%MWHF$G@{ruvl9i!OHBa~Cx;Rg_Q10`+H z(}Ht@{>Na++EIuqd5Y3@74#5Bgy0nAj>fPZ@3>-}*$vz$75{laPScNlzpdo81iKFP zGn_{|?X5#q++6zp{3I~Jb*Q@m#aQ2U?zNoQe_sx!60_S})i5%OX1CR3HEaKUFOp^~ zGX;rR0hD3oh2oeMwD+YpkS(T_94zF1ihN}mi4EvE)BvAwIOSHn2d)h3{i&my^ly^}Ps?_1zCBhW`Ad7_Z^pZo0u# zs@|VOMkCex9P=cSCJj9+orXT3z}0LPJ~s3NID$e$A4F>=)){)_PuZWRzQiSE#Wwx0 zBz?JNrqdT1;Wb)op}x5N@#Tm+`Rc5DAd)sKxC+9KF2%ixe`5a|bo^({)$)E)@xK5p zcifO1<6R4yVm7Yx$9To9a+5juUzyFj-EtW9`(U0tSC&DVWiF+wMHBusNNW>@xbPGi zf|;AH31wM3OWqeKel1|RvRwb4G6s7TkYliSfCk54PXkh>{|qQiGZFv?C>u%aCk( zNL6DQjzl}hJc4M+mPYxrr6nTIGh{JtX{}aqa$&S)VxyKu`NZ`$GTW4IDfOm9B=fAw zpY_J)*`{^oIpBV-_^EhjU%D4emAWoZ-ER5s4zmV7dCFbdh>-=#* z*7;upN~1krNyh!m?dCbKma6+x$ZDjz#~s2bQL>%0;@Qpv3hYr?{B%1HqJ{08vOjN~ ziA&0=72`9a&g^)V(;2qK!w?XkP-k@i7cu?kG0Rd=5}-MeDiS3eLQJSCrY{Dy1$j+2U#sP;lTqfTS6wB1nv)Qihcm zjN_B24Oy-kvD*9RxN7IZ$*~bkg?S0l-E#(iS7E*}GRdq*YrZ(T^S{acr+#Qod3m?~!N->$*@v=L0; zb8-G1W2iWej+<;qa{rdCyvY9Tmmw)C?9UX=oh$D>3O}XrM+z6*AmM`w{}Pa+n{NS9 z;jfq{uwCJADm<+4y9(#rDDk!_Jf!fX!r3>8!F>ZD>Ha!k4)C)ID@@jBNlIF_xW=47 z)g~I!s48{~k=^C~?93mgV&%eE1@>n$TN)ErRa z{_G({3-@QkC|nJQc2{K@7Vk;kXd3*MEK#9-`Ckkmd3?d5HpKV5xaDSF!;Qnmk zoZCcFZhv;csr3GAm>B!B^*<@FKbweomzjx}+559$R9_aOlCoH4xD|2m9p_=H(``>*V# zt1?%K?EWkJ>ZZ(K-G9|_M6vx>9XpJ$|EeR2Qubfh+!~LySh(Z!;V%c=yA=O1zy-iR zj#@sKvDQ-IMm%UV82K^+8jq#9IV^`76^YuVTHLv zzyB3~d&(V*E@?=x!c_e{)lZGCdJ*)aA%W!!-DSX(EEt4$maj1F=R_>C3tMmYCyDU} zrqVd8;RO_t>sTgzsZV@!LcX7Nj`E|9h(Rgd!reO0n%l4!cBAa+KY;5&270as=<44- zbbadsD_aWg>_-RjF>b*pl~ygp|IsE_^P{C~=C}MJs%V=SmkyAQyL5m=yv=+>sdx?6 zZ67FkKfkQvMCIYWSv!QH8~Xf{C43%v`_J(0@_tP5{{~p@`ebsg_b$+sscMJ6)?4&M zt=$tYucYuXHVN%L}pyq1G3)M0m{-;B(%~tyUVM;SvVY?HJ09M zix^ek98(8AlPgoKV~%GMk>}Y$#lt0I)ftEXeVWb0Mk~ z9k6A0`l~!;2{zu?w~A9}L*Lpc#Lx|Wnkgz$VnhD`c$wUCp1edG`ecZPsS#9**>#5F z1K@YAGn1}aw&cxQJA3iUaQpn_dYNqzwo zI`{g=HH$f>K$3m|wqmmU0u~@q)!YL77TWD8coo5fz_p{_};oueN<=7Wer6 z4w6m2MEkug`Eogo4^@^@(7ua*vhUivFtmlI^nIVg-vcby7AE_y&x3~aU5$R^M9{`16Qc|WT79|D#ux7LXd z+CF3$kQFuwG`VVb3n1mU5m5S&sNgiLS#rclSrAFDsqC|CMqjx;8xSk5JOKFx;Ph!hkT0+^kEW!C#;2u`|`vJM9FdyY8 zb*@95on8B&X~s_;w2o)jllD*kY89&bOI z=A~iX@3?E7X$9`hihmCv_a6tKQKi;Bo66HLJ0_}oWS>>{$^FL{kQwWIDwtrMHv>uo zJhbR7>&zp-eM<3P0%X700gg(woz&yzsSlcV{NyRK-<%F6XhZJ>lm>A3dCZJbjyoOT zD`h=*A+M-X3-+A*ku;;{3=*TTI7I+*xDUizl`FIFOmNM5l4d-jB^9aAp6cIpjf5WKU>W+utarH{g>ExPDkdp-T_(fzXB)?_Piw- z_bIoVBj7Dn{|AuQNcBI*RG>)7md?s&OAjcp_hk9gEj@@9v~^%=bKzu@-aqh6@03!R(fi~IIck=4m)l9?sk6HkR+!t)xm&x&97WwG8q%mL&a0w^LEv|?Jw5qvIp5egrbY-I4 zDK4^7X0maM>8?ryXYBybNDopryO_+Q{V*)4b=}O9C#=OI`9-u*Cvv34m^*8MDm*%VPZJ&42*v; z`=bDfn0J|7h?(uc6GruAF-|6;u`|;$a~Na_Iq(!FloIM9GqVOlO z;3-Uo7c4x5bcGyvf|Qo)(1C~DM?BneJ5oWaU`J|>*^d;-(H#3_j^=`Nbl`a+2l9~v z52c@K)^et0%EwcS&2ZkEJ z-KF?EApLjRQOV~r*4l@W>5*u>4apVu-}xA_;$Y?972XL}_+DY|O#7ddHF8~HPAA9K z?DX~{gJ?)lh67K_v{a{80v@KAe_0|i^3mFFuzDv21B;w@ZP zeCi*>p7*V#`R^?5?&amGKAD$^B68i8Q0l$;iT`(V>RFR@Gal5<@ndx3A|70njcth9*o8Kt!Pb&UT0Lxvc zOs?}z1x=Z)+#; zqQN?ik`^=j49}UGji|_*O7Le%Ws8nDab3q0`>Bh`?a8Pm`L$3!^lSMYFeIWuGpb_6 zYA!iryMXM^X_%(2uuad-uQPLj>s0)9Kz32(?(x^mdeAiDCl44qwWIVs{%4UXM?z-- z#fUF2XL%$k$2(H{{7v92v0{>|YC_SY;ZZgD&D!VhMbeC=#~?9^OF33vP_9{1CGPeA zF*1+$`cGezHA0VeE5PffPzSmo_P@!(6KA*SS7e>~{#Q>VCYGKa3sZ0vQG!DvK4ek)5S%i@;O z@pAtkl%+B#Dm+C8Xs1+ePL@aCByv2X_>1vgt{mH%WPG*@kmIu!(BSy&AwbG=AD}eP zNC3&r^psp@8B$FTw4MX4sPWMUU>MPo?ToT#J4-~KXUJjP&T6dA zUmpbg|A_kR2b)< z0bRm3OgY<2b?x@-KaOOvJ(fpy%+b0roLbTzVIKl;|7{vVbMob+t8MFS*$_{l%_QhCBgrI(>sY4c{P|DDD#7c+cd`%tVUK@}P z(xOD?u+&)(yKSnF?a1n(LL8Z64e~MJo28mfrCdH8ia_q2mI%=ClBnCkDFU|oFpdJ+ z`qkmO1yhrgi1!w%^fjy1`hZsWAUZ1p#svk&(0caO-s3%dhUQ*YV>zuF>)NMe6w+9dAcW z>*o++3VzqSRD8LP*XekNj$hGn&$|`ed>#K-$A8mt540$i@Fc{1g2(mM1@yQPcp_Bapy-NbCGej@`O9q2$Z;UagBh3cy}(( z;s+b-+0nMO0~6N>j0c!=jerv*@)fE$keq7-wj+Dg8iBSk@Wt&>WN~itApg<_4skjysL2)H1xF-8N@dyRk-G?EuR)TA|XjlgE0X={x@+lZo= zI?-qWqNp_jr-300TS>OHMxbppTqCd!`Py0|;K(UdJJ$$s2nm~CmWSJs%i-b1ybd|s z)*Z)ZT6d0o6x40!0=>OPfZXS@5+_(>1Ldj)QX(_SIL_=*%LUrb9@Q*3{}u``;p-`2 z4&ln@-@a{tH3Pp{E4D$6ijJ!&{T@lYT1B_0=zbOLRME>S!YC58W?*060^=xx)4)jl z-&ixyjAHn678S8(fMfS)Pp^`!8Q=gu%k%L!y=Fk07oAu$Fzw#3{l&V~t($M;Bkf+D z{zJrEGvG%fe--Tht*Xf?f?TkNPGiP;6#*|}je3+H`P+1#x;J(D z3B;%C>va2!=K-gh-rgGNGw%4^^H-@Yj`$eiIdNStHM5<~s5I-E@P9xOdE6O?C;VaO zm&o`8;@CX+wdbhb2H?ow?)%mKPMy9V@#(hRrs2v@{Q_e8sRsflXKK?BvkliGR&Fkv zah-dy{#Dv?ut9R7jqqJkQM)OJ8M^@HHiX#TG=yBh*a@CE?T_3NMZja7VA)Ky9o*z= zSWf=;s>}B5jGS1G@u?3$=lLQhv|oYA;nf6|{-eVJEwA>i=5;$qfKZ)L#2l*%>Oofz z$5&BbnJ#-(!DQg10%P3XfWYU}-HS@m`r|vXu0Rg<@EQ^@V0*4FIA>N{Svs}OfE?pG zgM{^pP%_xP&Ok;Q@BK42BU|Ke>ju1$MA{LZ{w`wrF;Dkgkh*O6udcRiCvb4<4?Dlk zU^s}N6}1$xQuGcV_*ZIu*Ny_?L7T&%qEBKA%CilsBvS0P(x3!cJsg>i%oG`eymb1r zzdq$`uTCBl()YWT?x*3g4-LYfa{^#HGq(ab@>jDFyCNg)h)(|iG2exp?l~d3D0ZhV zS_=1)1NT~kF({nveJib$WFMnY~xNI88UB^B|CfnKx9a<$I=%w&>DnP~8*&+NDAjUlqzxIl?x0QThZsjE zd8+^+(6%E;cf#qTXZ1TXY{R@W9<-W?ti!K8^UhcY=*ZtK0d>D#r~ef3>GE~aL}lM? zM$A#Z1~_QnokC3h4nY~J>)MQPztC@!&w~wOk2crxg>IY8!;DP;i|UEsB733>c%(r} z!#!~wWS6Sn0hY~F+gvlqr*J!VntZamGwo=ZUq<>v&i2VHpKoL$El;O^8!^Y?qoA&{ z{tU|fvdQ@76hZw?b1dG6LaB>SB32zH_iI~-Q7aR+gSsd!oPp|hq=knV4an*-8apym zrvO>PH%>WQY>RaI_H0Owd$GR)0cyz*yXsWk98QgDkH&^E!rARxR3um+6c&nZKC zR9>>#DL<>ekB{V$wnL}Ch?u%$6DFpel^^PoTYLqEA3^<2Qe5|8{}oeH%&PkOu3Xg6oV5eUx@*oI_bJKoMK?9 zl2tzl%RvdQw_#HABg8j7qSDj1s5J_c;VbC09E>Y4=8nM{;;RabTM(~72(MA7!;G0z ze(N+5B`Gv4tS9ZQQLu7#au0*H&LFu3)AbCL9KA+?Cif6|;$EY`uHViYg?w;|!ux=Z zf2ZT)I?jGnJ-G)n9 zzlfO1xKZDqEz{QHp*$V)v&D$5dA`D=X^^oME$r%4*d7rD*qw@t4QisHusdQTR2!=l zlE+4&cV(1a!J}6xOm=7FYmtsh^xR?m3S*xe7tKNkt|YqtJXR^ZkmVvjiVClso@9(M zc3&Qa%tgl8%G2&xrLgJ>S1ztna1ig#J49w8ibf#FxLT0Onk!-~@?0sX^XR zI9DmuAbZp*g|;zpm4Y$ey-I;>;4A00^W`c|S*sLMCq%DOaAw9Tg(d(c%_>~F+_z@o z;?=9^x8zAFQR04$(E>>CRSHg|k-X@krnr%-6lPrsqvh&Fi*6{y+iYy>~Kb8x2<}WFuc&s}vkLrA+541r8!%GtBayJ90U^=fjLF z55Eh?Xpcs^%2+cJ=&$GKAz61Z~ABwZD4e`N?{xL+G9+|zA?USowRJh>eZ7M zuU=TVbd`T)p}c5Khs5$d1!Mi9m6tR_jcMD$wjJ+}>ibzbz7_H5`g7cVvL}E;nd;*@ z=_m853AVMq#?!VwETr15994&euTvD6@vJ}5|yk`}Fjr{F= zLfu#D^uHrMU0%1qa_2YJnNujxU5s;qlfJX75tHXD5UXjn&5#b9PhPwqY_Oc@F@3w# zz-Ik0BOPS8XU}XO>Qxu;NTE5bwzopcX)ZayvYBdm(a5iGyMBdgumL*LuG*WH_7n8G zD`!nxy4vsD^whbm!HZ$T7ZesQSiADJS)3n7_P_Q7%IcI4q1=?queHw=Xvd-KRrcu} zIS>P3p(fZ4?oT=Wcaxq3wDFd5fcq__N9InwuOy@RzVby7En1AC@A@v9Fl~Gn-Gppu zSADg1&9xgAjfAqZcA%}sU8@f-{R%QUdT=(Vcm1@M)@`$mWn_OfdT05Tukx>*QnX?r z#Uk5PPP_Wek_=ZIm*wfP_ zl7~6S)rz=SxBzZJCJ%3qBU`LNekFW;8rckLtZPq+h@-d$B`WU@yFn`W%%9UDvb;N3 z*0VF*zPI2y3-!Dg@x@Q6^k4i;IW=y9`s{T3URPi=Of4{)W)&F65⋘_U}-u)4#I` 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ʆ|78)7Ik$`lE*5Ga*qv? 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�pT@ID$0K!k_!X#?le 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 z zhAG-A^n~-|MB=cxOKPy4c%xlv1~SqaWTd}ldqkpGh|27c*+I7BA>1X&>?UdKC6e1^ z&m$IvlM(bxu(OOd$#Bv|Bboc6IFm7&HoOCVzPsW2AB%!+Hr{{f`aYqa&j&b(i=*wXLvmybSn4o+9cRNfZh@zkw=oSiET4B_ zwsEsVwemh^Zwg%XVoqHmT=kD6Cp^(yz;d|HB@wU#t<@t?Hq4~Ed?Qoe_cWNND(+H% z-9qvsW$Kf6QrZdTlirbl#`iRO%m==?IEAI~Ir*V!Xv^F;6o1Mz^q1>E@b|$Tq|m6C z!NC&}7TV9e$YrreWjMsx^^l`Am(QFvocpZpTHP$(6UlVZXzUF__GciEJ4w*vJ!j4KH%nJtNhrFt?ot(_C|q`9WaZk{b98 z=Xk$rckfENm%$L}WO&Xy=Zt<=(wppx7(wI2Eg?NI2XPQz0(*Z!Q z&+d?fFW@HJR1Pwx?W%{y-kr%I9mH9h%A2^Aw(DECn?x^O&vAl=!!<7FJv>O(OFD01 z5nSi~pgx0r$1q(j;@&#M8~6kjOmXm^#&|yap>LQ?8o?IM$yIbg1(}%Yfb(>N36DS@ zw2BS%ux_7{KVar|3n8;sbe9|9V2<+wKF2*!4rZ(wIPJiI$zU_9aV?!eP4F;6G7Ux7{3Ee5hrIM5(WbBiuVFF znTCfmmR^8VJV=swUXPonD|e2h3C$-H@OzYSY0M#_ge#{RZsJ}W%%?jK>}(^sfRb9C z8(hOo_D5&hekQ^Pt^>c2o}U+RDi)ou2f$B>8|^3vtmHuErP-$>eg${<A+=ZcTCGbW$&9H0rl4;1w5ehYNOB4kdsj4FtmnN_*XOca3Ygzq*qejAWw%K*cHu3nOTt@g)KSC8WSNRfU_CB@ z6cW7Bn75yx4v~IuCvEut@0{>=QSVM7=WB)L5}f0fNn^V#>2SeG($@&p?`{IYI7`ac z@61ren6>R1Jn8rerJ?y%{oO=dac{y158!RROWM$%=zQ~OwuuJ{g05hzpMdnP#WRqs zj^e`jEj_q-I&t%iK+U!YUFLq;DpK(bI3{d^A;!rNulr<%4y$bDPMJOGm*Hd|hvRjH zx-qYV^}U6Dvx=!6FKKUb`t2`i1aIk^u)crqn|EnUDQ&J~u0?W6!xcjbbms2_6 z8=19F;ZJ_Rq+Jf>xQ#h`08W+}q}puZjr@^xjhC&lp|kb z9*IM1&iDI~va^Bqc|YZ5pfDrrw!t1s!1~KjxN-)(n;3 z@GRxY z$DXh|n^W+OaShD&PF_&SL%6`Mc$b&-Pr7T1nQFs9bcNlVX!?Sw={wCu{S6O7akCF9 zp$_OjN3$O;re$|Kew9>|97W+W13X%LbYxE)%}l-)*V9ptOCCR?sByKFr?V*tHFBsn zyUKL5i`Vo9Q?`LF?HaUaHzBoW2)O?Y=Aw9Xwhb@f zMedL1o<+ReQHnR@YpTQN9-1Yh zbIyDP?a43bJzs!k7Vs#>n^Tq3VD<1vdDqIL0~k+VP2L{sF$rvQ4zJJ(6oy+lAqQ!c zKc{%YpB{zS)BMqZcR>X{4vpMahbQilB|n`HRxP(B`SoFb5I3EYV>2YYzVsE*C&FrF<%vLr@)Nvqs=SJ{UPrEFiynROhxia+ya3tL^4XC zB1IqSMzt2?@idIhU%U+5Vg@jePm^Ok=_TDj`uD*1pLH1LL%+~-PDlYxh&^%XO{XIk#nB0MB)OuW3ubdV#J2vz?22N|2j%y8 zcBF533-*)EpT?(JnHi%MoXbef&ykHgnw@)LW_C`TB_1XC-))5#a4h9e)tw~l4F}8l6LHQd!5Kz?zSq>?oSA=iY^VD&b;lN=DZZ z_U*4x0k7vJIZMvcb524fIJ~CZ4q@!sD`54HFdaWci&&Wyk!DN^LqQDJfk7uRAv}e( zD^FTTGxUMs^oOs&S#*&t+Kri@ji%tt23Jl%OMHhdDL0>gJu))efe?n1lPRrit2qNn zD88?=Gw0;(cO`eLJV}yum|uO-Gz|tLTuig-O|nAl*q|K|uC6b@VD5t*4%{a>8}`}7 zREoP_GPgpMi<^rtKv10vis%?{zm{iX7K|_ye0RBdn>m=*U-sg&Xa^s7l;t~Ik6pMY zE<{0CjyckBZlm%ypkt~5n$n+Fe>u8@H1djTpzIIhTf2jIK0~AAjt}1GNcIbIFuB2a zfifn5*V){es8UzsZ#~DI|CDcaew0h4NzAFmOdvZ_7rxz}c+Ww@CtVB2*^wThopj|> zwfVHb?J|H*HQFbJE%+o{!%zCD3L@-5`dTo)#DO?M=4#isY{NITg(DBWNLAQ~8;}Is zo_vqxFlP2Vtt5D}tP{1|Rpr#3biT{zR8m0z?`gZ)6Pv3ei_NH6Y(f9wI-1Dqu!2)^ z9{$V~#ko5@jz;tk9oVMFpmkUpun`>j5DjKm=y3d#DMH+fo!O{ALeKCO3~mBx>5t`( zFyu2_=8nh%Kh_f+u6K~ip^*?eX!2xcr>$rNxC>EAej(!>cYudD;j%T8+$%AOr& z9>tb@6|CRj(7u&qg3Nw??5=%cAK_t4#0~T_DtI?XGqm7#me-Pg{?-+Qa;Hc-_6(-V zm$dJ?>$c*pxbvI0mD%j;qLeZ^5a?jd=E_KS{x`=PjZQNjz0})qUBQ`}g78=L1T#n_ zh^8Zb;cFe#`^eQU=^el+?CscVBDJkN>J6D)r|@AkGKxYV0BQRP9#fBMPs`IZtQnk zVOshsYP*aN?^$zpoG$+FvgdqA%F%eZ-`S2N!A-nz-{G7*g$m)iV?(bTP#sR>ZLn@H zIJ3ZjhG5?BfO@yreJD)xZKO^5Fo{&cjmR5lLYdH3J0?e|GGR5S_dar{uhB7SaLuQ9 zQ4UlIG6#FXk8~tgPWY}Uyix1%Q=TLZ_BV3B^O)T5;##=#y5irS#>5-L+>?wSBExg* z&nqWdzR_$)>%a$-n00dD_4g$CNW9p?bgEhDAqeydGzj;&3G?vonc!{vG4W1^o!!n> z{gY}9iaWTGj_g05;F}b0UV=8(T|w0%?a*Z%C$k$F?h8n8UqheBcGSoRnS9SM`(Ec= z%YpN$Du{AxrkkOhyMs8M@}rIK?AW45YC7B$)SGWQZHKhI^jG!J74#|2)Kg8}Q2o&K zMX@PM!^}ZaBksb&8eqzV-|z!l?x)#;N7sA;@5%XjbUuZ5$ctbEh-vh z`OPOP>-#ddEkhq#(pD85I)ntvUToFVIB$}Zv`e#2PxFGN*`9HSmZ#OIDZ5vH6o2C# zT*|kcusiT5_B=UJx%AYuq=~Sx^Vz3&2kcW-*ds^NV@6s)|Nn<=kMJ(;`P3Kgj2F_6 zdHnCqYaV>-M&;&islK2L3Ydnxw!>gsSD@=Uh)O;M&qOV=iI+Bzmo^xu-9nUGcR-|{ za-&K^(;DH=6aDcBoU4m{x3Hs~ z0lk(N`#w2P!g>^?cc3y}JrCtR-r?=;=GO@++7?oX_LCKLhF$I^ zOz-_HvQ2v1hTA@)sdSCvl{esg#RvK}>E9j6$(iK;6*{YfFnK9>_#V-kQ~|YVkfYV) zOW58Wc$hBHM({kKxN;v2L2y1`o}Ym)VJGP0kM?drV?IL--srsK=~v+-wPu?C2n;7$ zxA*OA?iXge2qKINJw>gO^S=H0Gm4p3KkAM~PANOKde z|M}XEeLpJpA1|ne0;a6uIGI z7Nz<>lbTzy>xbyJKLNF}%<)@E3p+?&^EvLeV)S6zP?z+A{TPQxF1qV>9)v z2Vi}Vz0yUQ%Be~Be*z-tO$t^oGy-G51I6_j#}4pI!0&iIyQ@ld3%SgUazXhF7S73F z5T4;+JfZ>k2B!BG*(K%J_&-HUw2ZRMaM2k;AoQlR#`Uk8t%oLa+0j4YotB>2HN}*-BKat zTdP~&wt86utxe%wJ6U_N^?$&|ATQ-Cu)-zQRWL4+Q}KgxXLgkNF-SmO+*u`Xj`aiy zn8?YJuAHN^Ek9-lEa_DbM&(^j)F+&$4dehG_But5*6&_Us7Gpo9=6sVglTa7qO=pP z>?Jz8vYes-+`;{D#ZSRW8K>11veU`LRIW)p~S`BVh`c0*U zZ5S%{X!<(Va<3c#AxI^2AP1;nO_GoT6*(LkFddv=BfQ2Lc#Q{m&Wfu-PNt+@fgdY= zxCDIoyTJ1}pZ-8Mluz?_4aS1JQdaoXjwG~48fR+0fHXRuASLw|ba1&85%f_d+yp%1 z8&Cr!(A;;B_G~4=$qHPe2RU6ofk27�PC= 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 HJOlp^d)h55 literal 2973184 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 z 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%0A4w$ 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𝔏0GGLRTmOk%dmUi4Mb4<4Hxw?}9g~sKVe{_-cbMMmk`hR$(#()xi-a;>DBb zaU799f=f-A*yJLmDKpt{>kRiz!~NE9^Rb^heMg@iX*<$)T)#JNN53|$E zv@v#)ba0^{UpQG2Cn8!jifWyVjHn8kwh#?9(G{aP8OHGlSmhffqGqAqNM0DuW>aKv z2oEqMqiT&&|C)-0mBiA8an<@$u}l;&>o4Mw0XBS$AWfVua;(vOP68ntQOriVC;Lf23Y<;aVKSPPoI-oTP*Gv`Pl*o`;)Aep;}&X7No*F_7MWG`(k*RW8@e zklwrCo#e=coLo*>S!pJcp>ouT2RqDNtkekU)nIrL0bW71#ULXx#s}b%F*-$@=(pp{ z9qUDkVsTm1io`5Do1K`hO)nDlsHPowwDeh4TI#w&kStDOTn#|@ql}BhcrxRPh{i0E z?&CwLv0Jboj*9Gu>0 z>p4;~#L(g@O69E42hlaRw?gItE(5~TSMi#&1VL#vdXH&zVB$vZ-#v za-EA-$czfjWtpk7z$1#QF-weW3xeN_ga=IvB~0+M1ytV%&dMav!vLD!18A`5qk-5f zI8)x9cayjafZISQVKw0yf(%wxxvQp@R=A1mA;63WG7BCSfX_L?YN8i~>5sw5&XEKwqZsD#jHP~bTtTF=0MMOfrnOa*Q z#sC4I@Ki1qwrLepE8R7vYQ77tsHQs$L@SETCmb?EBpQ%8mCGxbU@ma+35UuQNd{D? zZ~)2b0X94cHl-92|GEtYq7CWs3CDIxFwLo0ieb(U1A2=EC9xr}v1n%@ixNk)eGgaeFZZm@V$?PAMbETZ?Gt>mRol@lYu z;Gu=qXMl1>XlJ%|R%z!^?Yyj=kF;YMs3KgXovGR>*Ur7#*`=L-XeZ$e6=9Ti3bk{q zb{^Bt%i8(7b^_WNI!MLK)y`7w+^d~k+G*3y_u3h9riw5@J7wCrTRVT$&LQnYpQRu# z(9Sj5S)v?{eTIw>*dED}p)Qk1tzScEU>83Ee#*b_dJhDGYbgksKRC#3732!YAG?PX zi81FCi3&V_#*+pq*#$v2To1D6dTjWbgqV4Mu6*wL! zL&*-}IXo9sb|YLoZ76Zp9L#3s;T^T{d_Lasq!wVlJPUBBu|s%I$_pdB&m}< z=0~MYlI+P+XGFAU45@ic&#}0o%wAob0Dnn7%eJhIbo_% z9h<{uUd+=_Q;;{Clz^w2MWp_3vxswl$}9o`^G};aoZn*>frZ^bdXLhkiNqP9m0lJD z3%7xs9#F&3wcEl-4tlpZ z-P~JMo4verDW;j~#1k%X2|O7F$NITU^ipt~L{pH)Vt0T~SXc6lq^zx1zm28u0G7Wa zKt^#Mr9d!-pKj_ly64nwJ0@J|z{Dp!!OPXG3|xy-w<&jHA_xFJ;XqfIK%BarZW4H< zIlud{N#Gb0h?tC3{6JTa}#pHbg{rf5y3D#GXV+eSyeD!TE$2EKBrOkQ_z0zJ9vd=fs~p z`TYfME`Ixh1%$08ET657(^P(Qk%5XuAR7Z zmFGp;nWmj;?fgnR4chrkJ8|c!2D? zXlIXhKGsgmg(|`@?KrfvL^~U`vsXKxYbPmPMHr=>BJFszvrRiK+WAU5{V!q!>=6kI zZL-8tR>ee#V(EzaSk}iA-pZQfyR=nA(t1GMNuSEg>pj?nMhFUBlfF0AW1`gN*zQ>d* z$~s78DtPq&CWX1Lj)wi);u07>DJ@>A_Y;#aL5hfAowGRyDaL6aRMOzfIIsSE!Uc~ z)PPp-{vg74+=O+Br{{@Pcyb?~CpG~7FkpA%u{<+RG~j8%Giy6=loyFXrBHmm*~}}B zx3O_EkuhvfL4m^18$yZZBcmhW-^Zaw08`jQ2rcJ~Mo4d{4sgf{TE?JdmN5vh837>^ zI+*8WiSY>PYXrd_46N?xsj`}UXCbhk5y*WCCws5jC!=^d5uyE!P^DQB89XU0vdS&A z(}08Rg2>rnk&RGOI|I$#goc>{^6rMq-L-*G97us80o2e$a`fnBkfBk{v;FLy*lL_tVT@uy6g zlvn;AY(YiN+wrZ48O{z1Mp686zFm#Itc5-NT-X7_4wt~$y)MIMInUX_M)v(*9)sF* z)Y%_qulo=;UI#jOcy)FW&&S~oPv84E=O%HTW#!)EJdHIRuXpV}9-tX(&lnzTLaey& z-aG$0e{|w^ghOBfLzf^_nKl%8mzlJP4B)SIWRZ~Yi-*gba zKaO~K_9Gqr2X@0{mQ;MH4dfs(a2U7@#l2Sa69vlcFMP^9Qw+l}fX)dfi&;g@FqN&? zY^Xa{>(wY8u|5FUAgx7<%T>N%rl7nuWF{s$5=!;{@MWPaRj4@h+|p{OZt#!GQxT|p zMk4RTz&?}YtlAGeJCs*8Fg21+L!PF6h}5qp3K@6+_8~4=VAzKUo;|u1^{vs2}{yI|{4{&gfze(KXegJDoYUV&?Bsr3FhD4t+XLmgn0c>-xIQ1R%`TgC~6 zPl~B!&cjantPbqPYdf3D#3-#2<1orV(2tpZL7CM^{_#IDd8bZ(IFHrvwC@g{(%H!? zEA3si?#^cWQBjxQ3H|(-Yk44`TP7OW>K~r1AxI%;C}ES4H#_sz5jrd5#KMdaYnv=Q z8j|bA!N_iJlX0B$k;5ND+y9Y6`1J)Xz@7yf*ZF2Wyq$U+hUIVbS=N_LD-+)RQ8>_o z0|Sg_@5DJwEY%?oIL1;o-Y8+i^DJS-WvYTF)vae5&bm!ZWb0s-^NrW2kSHiu(wpYMqex;MfEYdQ6;; zI^dO{G`|R1Q3PNy@|UXe_vQ#5&%(J6+|#Ms?r`nYL*^l?cY}3+O8`0AM;7t#J6S{@ zP=JQeh%oY=e`u?Vh5IMWU&EMbt@~iJy$y|c5Cxi$%SJpb9mi46b8%A1IN0`gX5W5D z=lyTS35NAIvi*E8bP;Yll6PYA{4K6LJQQlGyDo8Ytz3&l3>gW~w!eCcXbkUaK!2McwTS*UcL4L?&C%2~VmK(oEI zZ?JF&)Zw35a_(eZz*3$V0m7wF8V{DT5t$5@^6N6)LXXX3DTC*5g6&`y(da|-z$_(2)3(9;c3rYh zaO*iMrUO!1u!NJ5$zTa@UZmULY*oTw8-T)iSirX?b;Dz==uS9}(>OW`ec!nx5j50+ zE7foodpOR(|C_g3_J_>`9%Da%-ho$n3)17s7M}OTd3MvT#7EbE9@vnNLtyHl-<&DO z123Hm>ci>3u3mWm6Js~Z)P&+4FJsr5o~#EPVC|Pdo42k4)9h zONICD`A}KdJd{>0YIi;fZ=6GVM+UmOdA@fH)OcmhxAC|JvUcYV6(^;|kvtk})4oQ} z>Hw}7lUtChu+tB;Dl@kcSy>CIArQOKu({g=iQYGW`=(pBHO>+8mF2YQ%R6Q|<+H%R z>Z-eg>GwRx(=Zt)itbPurbxs`@WNen2ZQSyLz$6uj zD}!;^crgMEyBN2lCJnn7Z%q9hCJT~T_Z%11MHro)Jy=-ArY}#H-aGd=c-_qDxRW<( zp?CMcR6sx90RXr9yhrgFxUUnxv^Wka4P)AlDBuF}Ivccc>+v9=40^6%ztlbKyEIk(@9gI`U%{W%6{ILoR|EZ>bI<`VVI5g@*`H)5s zc9Z4GCvfUZS&Xe%a6IthfpKVz_kicFo6u7l7rydZK+e4uB|m&yOhcXJH4plmZP$HN zZT4B}eT9~_e+H81#C`Cj26Uoj(-sXvg=>6m$5-uSi)Rm3p>fnIe(f|1HGMpL)PU(y z-w5&Sp*lCLBY3A-0IZm`tM|9rgOhcXQ~^u*dstRfHgRA==-IPfeJ3a|#>_I?gC9}8 z$!Xrh-QNAy+R16`Gh(K=1^Zliq8Ju-vPGq+fMi__w;bwlBY_!q8))QyH7dfl^LgOL z!T(`6vg~;yUMPbGUV6&ee~A}P*ujV)b8M7rE;t@A^X5*#8*5&ZL?Rl)hYJINslhdZ zWI$r&`8BKWK5CvTGP(yF0S1`-Du)Aat%`#z8+I$ek3lBK6y71QvM}AYYpQiRGW%!Z z?1q2fKCA=_e;=Oj_pq-pkvtyWSMALamt;fVs)8lt0k>^G4l&@Rbh1KkV@JTVhmFds zcO8~!Bn|qUIlVR|4GBk6*mU*JGZVDnJ8&N)V$c9d*&O>5b%hKAW~Y27okPFwD{{$r zFzh|7JzX(8t8BIv`%Xa-`_9;UHmECcgL36o+|Hox1$!Ua@ABcoHZaJ|Hy#goeu#4S z9rps!8CNQxo)ud(ZEyHgOVO}}?>_c&Ir|H6s^(hL+pbO)-aCaAuK;ueIhJ4w2%PSj zLpaE+n|vWCAgsxKX~zSoBAy90sbGcns#o=%3%&n&nGY)~%7thf#JES7wgF%^x6 z+ZOl&duL|p$x~d{Vj#TO^NONR*SRz;kU}A_1BT7e888^_7=bOJc|J@~>QEY7EV*%? zIx~AuIvRMxqeOxNOh;WRjkS!S*l zj=PUt+;#oJ^>42phg(j4F>?CPSocRE?ls%H`|?CE?2Y7iZrxIZjAp5fcA6Re<`>9l zJJMTNs}Otp}m>U@yO=}70Y1R?*5)* z(XLp}u^2Zm$7_^hDR1MBx6-iMoq`luyKxXeS-S(7do`6iW!)YRW)O8tChsZ>tK0uv z{UdeTzMFXt*6pTRy}Ajwf-!G zHs*WY%wVmvU-;TQdsC@!IeKcDTi@;Qj&rbO! z>}KO*c|O@2+pVo`C-Vcpz;BKtlLKupEQ_|i@V4!RH~;iWa^hPvFo(Vf&FPf)>8Kmf z0nwbACUMV%vd3_!Hh+IDE?ZEhINaH0>$cbrGjl#A5-AfE%ACRN@XO-a`VW2R(xI6N zEG--XaxTs1YBtLI(z1DKLEZB?_E z8)%Qv-lXO#Me@0^l#>rh+BnD#Ozn2BLqfFi6s+%6$Tn_#&{RHQ4kS5%zk7qO_s^%J z-aol9G{0tl)VFJZ!@-h_VU37a9#0yqt~0=lTaSG5#s2!zf|4AwVrZa@P+Fx4V zu;vml6J=tj>#tgDr;y>hPl*@GS^&)B$PyX|@>0%_!_VQ8A8_Dy6S;2N@c=AG^((;p z3cQ0(hjM1;iih>11(X;m0gk?A-b z*;u}PJ60NLIDwQtK!IGB8YT}+*hJ}4zJpGJ9+a#GQiueEz7%si-B%2mMc#7%@c@`z zl-t%4hl7Ud4k`*Vo$MFiWrUybXNGm7MENrx^RYfV>|p+JAP- zWNpX{e%k}`cK9I!G(0jniG|et>?r%0;{Fh))G||xBS=eHhGRRZ-sRD~t7}w%cMt2p z_h@$tCa-AI%JxE*MNS&iixT8?RxCSU7H9_F6PdN00r|rOm5q@AH?N-1`TJA{Tx7;m zlApw!~I;U!HiXpH<4jjQIYFr=^nKaGbv@Q&RFk23DKvNTzC+1 z-^VPVz;~h!*LMCIfAiEF!#N33o4!<$a|Ya-vtLg{yno@PRD(=;vJlZy>sFLyiJ2tOD)CBY60d`<#2BlZkXaO!OUto=2&`erN(__KPKVv){-7?M)9tI&9nYKcb9LO)wjBPZOcImDz$i-++Fy1U$bENk zDgq)JGHwU;iDB69?b>?2=@6I``V7_nsV#*q+@A-W6qsL6(nwuPK61^3n&GMh%<^ zF0vr48)E~;Gn1*Wx*FYKO(smG4zNPGRVH1f*hDWi^o&CCh7KvJl3#O++sI z2d)cJk6M4i*f!St3fo4wF7v5I;$T?x+d3&R$>$K+#}$;xZv zO?oc7Q)QrAzA-~*;KN*laR=vSZ9X%N0yB-Nk!eiusr9-#ALr9`_o?-OuvFy>pTvuC z3dGf4jjX+mOuZuy;$l?N8piQ)Dx&M6TIFhF;Gs((#d-GV77xYSjCh8Oz$W%GWf1gM zOkZ3h>&(x0F`KCKsr>LF$={t4)pVVOpuE9(=p*}%2f*t%_b}v>n1+ku)XLf* z{6@p1Riiv#0jSl^ZMkYSpx(Qig%hq`p53bN!LH!j{%F`#9tW<0HZgfal4d;j${MtW zp7SevtPr%(kM92kxB+CPU7jJphA#Uv_NvX(g1yS#tz@{jFAsH9|D2A*?9T&+rF!&f zxj8mL$Z1%;^-n}Gt|p3)BT+!)`(-$aGduQAia;@&D3XAJ0|#yF>UlIeJx2#1{H4>( z)3*-P%5>i=EI&*WU!aT{HhA|7ip9@if52Hb3d1?ptWqB0fW2=3u3=QG7wufF$#@#H z5?a03ax3WPuXaqfALYOjWC!;nJ)C*U!XovrgI=E9dW8g}&pjBN zBn4^O)~$o9WG-a-DwVg%{U9SvNlU^t<`8GU`{4hu_x|xw71!VRB-tdJkdOcYQBhE% zfPkW)QiC;+>=H16KoWxdP$Ef8FeWM4l~4ml14??0MQbhgs}-$QYN^H6R#d782&lB8 zP(`JR3V1_;MvWRJ^?u*)nYp`ncf$|+`99D0`QzDFZsy+kJ!j6GIdf*_9EO^I`2 z)(ihYJK&d|58e~I6G->)2s9i%@NgSD?lH>{xg|G!;GfS&<*=ySZ@&x8kj2S5sR4FRlc`J@I4Dyf}&}=~ens%u7Y?jQ$q&)v8D!@Dw z#b|zJ#34u$-&;n4-H5URJOYMR2mDMh%Sx~C&`C;AVg4Onpa>ie`I26*gU4)hAt+wf zH2*#}8GTK3H}7i&A>CsB2{cE-A;4zjVJ;yBW;M;)YOIyP6VxN6N;eVdzy>F(4lV=& zkmC8yl7cPIhy-$LX-yj_TL%p_8u`K;s9_p}1BFSR=`beCKk!Of%JMUihfE!h)J7Kw z!}O--86I8r-`5D;~u&89b^20pP&*i+=>K$;YY?ZjEBi?n^_5+ov6QDG;;CR z`gi2C;)t&SCw4wR%AGj848xWj3cB1b=py3|W{@EZ@}Fb8EEk#gjg~WJFXLY*Y&r@9 z2JObH7q5+fSH$~VN$>}ohtHHIq6bt&p-eegUpA-S%VD@Y6{s#V=Ijay#~;4wwwh(* zQH8VZDx4Zpgo9m_cryJ1G9FxmSATEm+ZV5(^is1q*Z3+! zC8yW*e9Qd2vfYw2OY@eQZW|{lZ!-KzElWEedyE?D$;B>p%bY7f(x}igo+@#R!7xbQ z0XO}J913xey1~_clO%HFxvy`xntvmC&TZyg5D*kfxt82xLDpnrhT*=TTCmK-ehLW9 zeynvdkCJ!!3Y#_@7_Z0iy&^~-1B}Uq$bpQ>IbOw>j2TbHL~>1m5r#~bBNMr0 zjRjXju#ee9(i+HA$42Ep6(w7Bfb4Kr#y5W8x?FF6gYk~OP%BQ^JWQT%nOzHkfJ7kn zk0Z~$(-oaDUc2XR^H(x6(4-L=lKuh-l}zm}j7H#On#`dOa?tX@o8ZsP^!PO1g_r_M z4$v-wGQ-pDzX<@^*2oLLP@7#;(SVD!deOI=EXe23w~V2f+VmaM!~!!H8e|25STBjKx1T8!>TzYPggF&)X+ z=@)4$Po9fH@7@ye`jVOAvU138zO4`9JIXNx?la<_a{D##!0?qQgX#p94@$0#057MJQc|E7V|GKhk&hE$`H+m9&MG9?glPc zu0sW|5{%b86NFXlVd5v{#K4F3mbpxV&wq-U5dVp+Z5eXQH=lP)k@&^sO}Drb{390j zF{dLO8%awCFHAK(>OJMb&A?rp0f4MIlrNjVRE|(}_AMY!HonucuQzdlTfrarJt@h6 zv8YTCUdhV-8>gl)!GTgrmvR+PSNRLCTITR!j)mG8t=Ex(J2Bp6`|_I#1@jOUB;CNq(C+RPYCCPiISIKF1*qKa;4VYc!*{jU+O+s%7E z>$cjGS$00ewdOelI|ew16;`Gi8ZV>b%%CMxwe>-WNdj$E^8^sio5aeZFG;bm|DsqE zWDS1K`k>oVV+8YXyYWTK`1Hpf!=!Pf@p)X_Mr#*hKspDby%f3tYj}GQp7t=e5gV?= zqzR}s^qaIWO4E2jUDX}a{GUP!GX#@O736>bQGZGA&!JGzR5PnDddv}S1fbJNyN zN%lz8yvdN`dyh#cxXeN<(m*t?pWf;ACpNu;dByz4SKU}LakEO&9cR8XPb%O2AX><` z7q_jD-`(Ag{EStk^ef)#c(*BY{|BE0YU0jat zK&>QUtXJ>$+|EYF?x*05(~t0HfI3{JIE##0_tKFvqxnQIZ1Odn5e(@oLl)UZoTak0 z>w{bip1}GTJT{iYnCrHfr{nYvq$f!--Mcsng&J-5%1tx8NgfF-QWqA08O9x4R%KMU zmyQNPp2sq%zr5k>EXgcwH;;n((9D=GVZ{+YmauK^JnvQh4*?XrU+p#PY3Hd$ro@E5 z4#tOCna+lP*vb_BCV5wm*mp6c%x#q6-ZQkUlZQfJx3;_Sq>>bB{WBG6VHg6_^C*YZg zC(GW}_yAdifgbxAr=F`aHoRjo3P4K6&sYfS6c@)~W#}De-uM0yd(HoG4wjK>&3`Ad zQureWvDbZTz55-^n*LLPbGs+FM26SpPj0$-tU4g}3Q!r*p`*QiEREjeyT86o%4dAB z<|PQD43k_k$HiGwVCp_@6i>4GPh}3+Fv@akd5#oTa>yVzq=69~gkObStn^a7oi-DN z=bQI_k4AMg*Np{T8d+e(7@39n=9qsU!M64|BWo-hI60P^+~e_O6pWKiz7jsj_e6VN zxVy6pb;0PPAkxONPXxPJ2mQ&)O0vjX0bXfi_tQRyO2fG*3oJ`(X^H4QPf_DlsFE+RvkY%XG@!9{m*`pc%zg-)Mw3_)I_!6C^Ph~7N=CAD6>1Ek`W=TfjMhUur} z$ruQiz*F2?iK7|Nu4>-!*|%g#%qDoW6zymJg-C0@h;(msEs1H`C1O1LVZ5R7=1k#> z+vfQusV%kf=85XPSDOnyi79_8`lcmsD;hY?`W4S^^Qa9)o{%^o@1e-syeA4J?vk<0 z)BXe^e9S6u-A-8UH^&F7022@+V3K8jT-mFOL;1O$qam3X8Al}L6} z;+KF0DuHv3KqHVyP|oZCZ95a-XVr60Q&cS*lDz<9q3AKN98xt(i*S_P11y706kx)u z99fPtBY_Y*&iH)uu5TfZ%t}JasF1XGAuT~?M@4q;!Eh3RaV3C)PTj?hHP6O}v181e zV>X!|>{N)C0EUb-9@f?=oZ3YOH-T-1qUfGnvltfUE!k|wa-QY0RL+MxfS zB#(Pr=22nusj%fW19Zx=xE{p(M{;KP-A&uNHO%8Ayk|3|1K!ftz<!db;X zpYh|+bP&;PnSrXPz+VE|Mx1#$*BGicI71%Tm*rgzh>w=Ko3_IOBaQ`maV#h@sz_{(Qa^!HK?yxe2?`sgl|urTw` zNDaVi)xtxK85`FoVsI%8L{^cYg;Nx-CCi%Wh~{YEp1%c-pbX1OcT* zUi05az9j)|TG}nJ<1g1|=7azF)@nPW#k1Bqth&EK1$S|TFGDa1ZXRwTYko%+i;Wf# z!~6hAC`1Hi?C%$r*FbbRNeFCZA}_iF1}Li0`+QK1*U&8D^|jaNvq*9c)>R-SF55gu zql}mJr9eTKxY z=R2J9z;*6A`Yi+no4-UHHAfk^#H~Pv?O{atlZ@~NBFGFgv9ukHr6k&)Z{*>8SSr0i zoL8YS0kGbKOaL?1!K{`U&dIwk;NSU?ZzkBqK6gYRCvXYBP4ZSm}o_d>AB%EIK=Hh_V{RbX7xjXR>-TunFb ziiR(w*YY?g4u@tEP2Da29W6^Ya71kLd?E{Y1x1dGTGY>1|NRc1=ldNg%V`_6bqoG6 z+cy!6G7}Kp)%v9J%$POO-xq<6^~12mjgXkudl7<{=vG6g`?X33PT-S-wk3$nL@9P6 zdb``M!~giUxh&>}VDx@%Q+kTtw`~lf_h}o&=;MRYd$*n5Q}krc_Mcz|>t@%02Me%O zzENNSK55B&K=C2_QDFd7Z@zY!eZB=Mf&oFWdH?S?_jeohZl1{DWi0cj{Uu^7DsOu6 zJGt<$Fz#537fhu<&t~~fI&ou-jakf`bzX_1{~3E>geo60*4KXTkYwJY8nOH$gmj=~3W;+#Z)~`F}Lb?*hyL0OFtd z1l|FFlornhElNTwGXpd6CS&P_5pUbQ^Y(~c#&<1w_o_7K$TasdO|CP|))7S;?G!~DV>W|ZCl}dL z^uSZmK=y{mV$d32Z=@r&DB5p+{r0yOOuCvl^S(-Dy@UJFo>lqJE(aZhSdR6kjmFl) zx@T`j+2dnUR{U8u;!c(79;Pa~lNI`Z4j#J^F`JF9mb{fJ%{4O3N~XEPnI^Om#Kn+C zJcFJJZNx>vMl4rZ$H+!3&wsXon<1(Zm!T1D!&>qhRh0c~o~IE^*M|IxbJ5+T2Qnu4 ze;BXTa+7l~f3$cSp94M%^XDTE$qDJov(fXx`^A`vATvCmWb2w3HQnNl@{bRo6prTY zlxG}k+PI6hAyR0GS}P9!JU|}fdC6Gg2Vt4x2w$`p#aDNZCMo9C`jCw1&N?P zRT4q4tq*MljWTF+R>_Qcx!*o`(`CN=C0T)I+Q+#J&d8Dzz$HP1;G9gvN5pp$CxEDW){jIsoXLIu;)n~ljn5Re!&p# z7r-YTWo7II!w1nZF_+gja#S>U61j{i&_{Fs}Z zvK&1(f~SSfM^6S$3mphdSo6P7go-CV%!lNJWe!3MAZhN;)}#^;JA&Aot66RI6wkWL zO@By7k-Pa1)Byt6!ML6)<;g(&g%%JH>ld7ZyO83NCq9Mb!jiEcV(cy%o7;}iyzYoS zK*nxBZ2Rn<3Gnm0fkQ?Wdl@i}CG8jiL0r~ok@DiyL@Zt?h5w2~wqRt&W?vG_MWX>* z%qi$2AezE+NEp91ZVuw)hshEr;|zHN(%43ni3{#~ZH4?}5IfVvd!WorcW72qt4J zW6+w$#pqO?<~bW&>8)GY53C5vk_X;VjvRClM@g}Zcn1Al7i2pJsYdiRa5#P&&Jpj~ z1+v6V{_Ue&=ujWUf*bLQ>f*?Ju|6`t3{ak}+RG(R=vaLvDKJ)ffLx7Lxkz@D`>2YP zh>Ck&mOz$Z(^prgphVc&MJW=dC<8)9T(M&lAX{kKh(_G(#-{S10Gm{xGVF!k#U9O8 zwBl^ON{R-nu@w|cqAeXGnez)rfF-zJ%O(&%)SU`>w*kO`=d=0OP%kVD?(^Gc#inUX{&;z6!IC-{ zM!bL#VN|aiy6Y?p7_f=yd#Us?hD=>>qSSFJHR}0Oq)&3Bzjz~ZjH({HADp zCIs2InU!UW%M=VsPt=M8mC4p%9r8-5q1aC)k9{xchQuvbO}KyS=Y!t(<+y7i>HsC2 zvJSIu4%GqGsK4iHw;V2MN&Wr_0Uc0{Z%h=&)19_**F-T4adyJxFIuE|WGBl`^3*RV zQ>J8CR(y{^tks%B6OcBd;wnS_7ikT_y7PTKp7Zd`)c&P#q3z}e>j%Uo4g5$o8vtES zXX=MOvpwRys;}UsH1yG$oAR2R&AyEiK9rsft?xMgRv7HusZgbTsTlM?geJjg_c~c^ ztw}JEB|#COT@3SN`{KhhW5bnRz8*jYwNPIm98SNbN(W@12|ZcgQibUTSy<(T=>LSl z1iOWRDe_B6n@k&*i>gbi*gz-#tvvi~?vTHGGM{~6@Hx-*88bJcZuS`3*|ce2YYntB z(7i#si|Jyr-q(8L5|ASKW(3|I3S z`|!RCkN752lr}=)_XE%=DRbn=Xh2CxaH$S$i1g(@EJN*pWUnMZ(8spGSF;F73V*F= zLoYpQb1Un7+B*$N`+22~$Lt`LKN^c zz%(XChPP4~DeEhGqp2hcW8qTc;T*U$8S%JwztirF+m!zb?Y^zu)0>okqjvwT-4V-` z|4+5MPrIoAHS?dW-9_46t6gY@lf+4nUFbLkT*EXeM!63lwnMw!Pzn7=y@_Gbaz*Zg z=%g8C*8{d?ixePXC<53)y>=n7CAovyh3c}!Dqgh6VMN=oVS(825RysTQ2;0zaHSnD zB$sG{JqotH5ap_}C5vI$45Ux#$V;+2LK&EghS{g_zr|Q%mQ({+R_|ksW92*^TFFsA z9g{TvSow~D9aiWZj9YzE7&Lv%R&$+-Z)fe{id%0xEua8bi1QUUW}Pa-sx#C&M4 zwb5RK#BGBbV`C@MCDDlSjW?E5qc=n$1`8~8WS1y|lJmq4Ruq<3pk>#GD0RByRFM&g z@`Ji~su=hLZg&!{Qjf9S_%P(td7cQS(?sJRXfzYK6+rppf{OoHcGn4WUC*6PEx|qE zbyx-Cl<^LY1a1+5;bVpCNi-k2)j@zT0%Ih7q!q@%Bar=4(T#{S>SCkG$<-@$J!Z!lz|WF8n49UjR;16s zVw+82z3}6F1A8khPSZKgLayPN2#a7$$gV~Yy@54~l0$iWsO4^AG@VpO50+J9r&q7qD=C$9N0vEwO}PWAS* zwquXvD0hRbTtHVg>m2{XvSzatw|lw<;G{B`J*iw!cR?0xHe+^&rtUgcKKcNnDg;oB zwUEX*9DUOWbFwfZL;Ht9%wHJ_&&+1^U7`JNhxQllCs$5V)f7u6Y_}&Hi zBEgUpMK&hJ&EC;vM2kemktLuz7+2>TEyg2J+C?YZFEIV1I%W;JQ}%2F(x;4?tTFSX za3>YZgNUD|iUIiUVZIliY`qFSH`e-=c>UE2*qssC9}jJGiL37nr5p7vkX*p;HSPZ) z+*H(h14hou+cL!}JoegV57sk#@z`sdoJO^_$-fmR&z^@JJUr?Lka596w2t*U)*_@x zaWGC-T2@b}MvML^p6iP#a24qubMmkVkoZf)qbNFT833zh$TYAFNMwbgVPQ;FhqlK} zBpaPVtsUIfDfo1u!cYDd+CC5<4RjM5? z!D|yHc-A8E5Ts0i@oGgq2-K0H2-RfY->luIwfiYtPCNbYrh&N_Q3N*&@qP)HII>;4 zmUc7lQT~gy`@DA3exdxY(e66!ey80t?^WRi+FhyLJ=#t9r3x?9?!(%BTe~UusqkX$ zKBV2P+BLPC{3{i2jCL1lca3(BXm{vp6>q9`7istR+Wo=~zhA|xhs){s3H|*x+-Sfj zSt5F;2gA)x$!%#uIjN}}`YL+R{HC9?@u~}{92CJ_Y4KaCj*8}^wsEZCR>OkU9%yH9; zjd^6%drp6`82eY4l9^Cis?4U45eccHoR^?Ge`ZOQ9}<{on7+tH3O7>BD5<77O8z2} z4d8T!^{PyUT?9;HV%ABdORUGN5)}^2@uKu((y}8W(q@ZVq>a$^AJWJ$UH`JpAh>}x zUo9GuM=xbBz|rhfEFX`Tk%R(8%LE>vpe5L`(u@y*GDSSlW5!8fKYmEY(PFCD&|^+q z)*mk?3GfK)ohmB+)>DH|m|KryAzh?DgDEw?WC6t+5?vyO=p|xZc${!d+$B*XesY~; zB?!Jt#P|*9+ZkmyVgYor2%IZsAyJ}AM3&A@7zU^?%oiI@nSde_vMU#(7; z`o!@79*vpdUL@+J5;?HxSip^&V6z=ubOW70qWsm6p+;k}S;MR#L0wd`z^59+kr$EG z$u#Ctu@9NW>&#+=$|$@S)W8mojd3FBSx6&vstH(w_Lwegh(YKma*@uBJ*o;P9SQ3M zoeaYljMqha1OWu{`(lD1N6bP#E-ry>gEttWdKhAt(_o&J#NjDb7=03qf3rWI4H142yM{=s+wtrJ5y` z)s$)i0U~H^Sl>pAOGWB)=t$YLY2`M0pQt1A#7Lw9kprZsmH!V1#^quzGb5mWU^Rw{ zdRBf$8I6Gjx-0&vexe98623#WITqf3r#|Z}lCw&N;Lni&nVkeR%O{}agS+pb| zf0U39!z>MXy=)tzhG)?F@LbW|b4C<9hII9DGm@N%JFJrDi?QH$6AKqr-pFmoLU>2Rfbt_lf3(u7TWHCAB3BDt${B1I^R4p0Ee!BJWRh0BXFi zAdNWTlo$_7c4HqWt;J-y95Ha)TD}u>KFO5*%j-R*NhAtC z2yDAt2jlkpg-y!<+2PXTo=4f6xG=@r7}ME1I5x;vo%Uv=CFZEJfkn`k>q%t?;;3Re zHD~!#*_B(+m3MDfUFlkFWXi4_2DMoq$fK@O#|f_Y2m69I)$}cvyRnn1dSjdCGaSC} z5b~&W)21OtQHR;jg@*Cqv|Z{#UD&u48e)bo#lPFaoQ%xxiZ^J!0> z*)Qw4x5i)G^-b*xiEFkkp`AcCUWTz-*z}0qLMV7iM&;SI-R8I$yJ^(NlyVpLPpRKg z4#J9ly!o(y3{>UKm8q#JPs2eePMVh4?Af>7(}Bw1$ZnT0D-{QuGdvyWiTG{ki7Xeu zXAD{;Upi&yqU-xK&)eHlwAb+LCz{^=5zy4rVdd@fZ-f`l;lfJPMK}O#ZgBHx@vd#2 zJ&C;Zh`Xf870}s_>IsgPpNxe1z*T@u>(44AS){0Fix#eY)%#3In2mb(Qpwf`m zO2k51sY3j(b$)dpicd6)zAg2@3zjKz&Blg)=d0Nkse!UOQ~dmt{)L6d;| zlcx^idA$_0WK$l(2EybiX$VBG`3KSMBY z81CxE>;a750hbuRm(grPYZ&*yZ5~>sJ|`YQ$D9KY55i#uO+(dny;*6zK3LmDEZhcE zxNVCZl}3TfNc*!f!)0ES$%~JjXzH^gk=V?`H&D%h9g??s_38dN@kx^!0T z1Guc%mClMq(nmQ4rOg7+`>oCMb~Mk!NZdZavQ^aNeMNLcFMauG3 z7(6(}uZAN4qlRNDw0hb#`iM1(LXD6t%HOw$i05fHvv}vQb-GO6O&m>Gei=TXh>rL+ zBk5W9?@*POe+;ezR5xXLFUKfNspTk@1ZahXmLfnBC`zwdbwsOw{t`w%*bvuhkS5vH z``GqzC;)gCXnP^P4Sa{ReNao$4%`qT(U3z1U$EQe-sadZRXlCxZg5}_1lZJ6SzF{IlmqQF|OSVBXj5jj_2)7n3M0V!;@2L^+)@K|j zc3kLN!7a`}(j)u~B>fCYQK*?A3*TWjeapeL(;Okc_nPNOx5GSLx}9b}xWwf;7QwUh zyp$S=%bgVkUuV2JGUpF(Ub*?o#xo3w+n7J0e*;)t)UD^vA&=XLY*W`_D4o=ILf%C0 z+Cx-MplagC0deiX5&yuP!O^Kn)~6(Sym?)mcX3-yUW!RsYXd;dyWriLB_7hZAt>0q z5#OAG;ROJW20U>i+Ws6H#&rxp3YtmkgoZPcymq)mliVY0ZU9XpctUmO13WT#|6NE! z9v`?O^@e}0bY(0}!eRKtmaHL&^740R*Yb5xGU@q+!fwmpg8Z) zUis$tcCV1%!(CDl(mQ9fitL?K5MRjw0{o6ez=WYgSX2%5Pp7!^^JOhG~_A^qP zZ9h`_dA0_MB5YT~7yP073F2qBdG%Du8R9CBRM`Pm@Dt9qO2volDLE&nf@|u9nns!T zvM(+PVCZYeylH6{)MoP9tDTUY_A4xX+74K--I%vOWkoJ{gg~P2k%)Dn{(1JZ3oetC zGRYxwnTjAJ{Cq;?S%~=35v%HevWN zv>0;WWBU6J5a@w06oW9dhZBb9pSKAEt6MZqg0L3FfiRc@@+1gBC(Iz7Fi9smY&y~I z|C6K>M0|4!6bc4F5yebA9cJZQicXYZ<)-Nbv;`dCIAS^Gxh#|4l9$XR>F_y7N8htB zUSk2iK*kG^3K^Kx%hm$!r~_OPE591wgmqUd3VL6WkR`wM{`=Q6pYS#x{Mow4OGjUI z0yw|6&W2nFoU5^Lv*G+!MF7s%1!5CBY=my;5zYnAIpKT+denfbdyxU*{Nz}t{+{Dn2{^)>nB4iIB+X-KTFnD{U*}Yk}DAWz% zifS~}XJVOnQ-E4`ZV02+zlDlG4#Xy^3f%ErCkiA{$cAZVQ0l>IVzUW%DolQ9A1oSk za4|k)%J})2DE>CIHY>+(1i;gZELp-?vZQYFRJa7ol1~5@HG^&D2@25z4%+;-gb4xi z-jg;!K>o}#KMw&#H>|$dtY8f5@->PGf}%VW6s^yMfnqiEW3!_5Z~+PvMG+J~g2iSv zX>pDxD010wXJPl9fx?S#UYm0F z+N*wf$Mb9J<+ziw8tO%qhBxe4{B0c1w5gSI(souPnH3RiwVc=Wq+KaR1Q{ys8b+egZLyUldCZ2R(q zY9;RA-1NwfT$5gT~z-=iMDS&{4j4y;D&qKDW><4fK2SuSwsM)@| zW!UJ_<{@qUhz|&nVl8yb8`vFEUNcb~#=UxhqjRM`*JJA(y;oTgLH$rF=B{v)J5sYuIxqCm2$Vlc|Pu$_f zSj07U-tnqg2t=99`WSsVGrMIzTf54e>d%I}dGqo&{ionME;xVa6ooSE=XgdaBQ0G9 z`FcG!A2RUf{IsiQLtCVBm0SP}V{<;_bV<$m>E=2xI%NL}fXpZ+fdwTge$=T8Iulu| z@!XO%2rWDnisGAY9whu=Bf1~n@giXKDJ1`ZIKs`N7vdT)_}2|vS%s{DZ8V;iH89W# zlaL!Ho#zpc-F5m$suQ5J%Gd$K$-EQ!O+kLRmn>WBOSUc9W~D>daEMGiZjVAwsgi7) zc{;gGr4=$8Ar4_W1>L;oYzx!>u^S14^7!(99JC&0Z$sB^^DU_uN~6Rrl&1&_#H zzGOdpS&g(!G#hN};i&lAKZxc0o=$^_x#=!*68dm9^jYV)F$!kl!+!rxzRSzwxb){T z{|TBmo4OXJQ_Uys9p^zF#*ik2+4^Ff z5K*lsoq`%T>IemCNoC-;K%i8$Lz)3;1|&c&d0lEd=SQfN7Z74lDzqrP6M)E-NK3rm zqIF}O0~wz~ws(yVepCm$Wbn0EpkZLBu?t1Cs4uIEilJ8hC5`pet(HydvPrL$3J$>W6xG}|C|2USs;|-2ytI=Rv0xSk#ON)v zY`<)iTy!ZS{I5W(&Omy(rjkThG98i#d)`Ou?CBGIq@|I{M$T^ng#v*}H)FgXdIcy6 zu~2aL#r(?%pxF1#HzxsT_MS|K`5=4=Y3P+MZ~rQYZ;v5MPUB?^2bAZ*CEor0-?|s7e^+KinP#8z|DQ?X`W z*l9#sjDo$dtN8{&%G_$$|#0T%KQ&}qA?>a|U`qi{EK2t`-rwca)`c&GvP~f-A%2lDV?xTTn67EKh%XkCZma$ETT}EF} z{8{dTDVWsnHva($vEB;P^m&LzB$wF2J%dB+2h(5t{ab)D!dxtiGHJB!Zf)7|;@zgM7e5MgO7D z92#f90lIEec-h5$Qrj!MYqwYk!EBQ0%E))8Jg|v6N9=k3U$2GC`_(TWw3-*Ywoh_n zX0WIEgq@Mo{HlmNjd!KC8XO0}$u#Kx_|+po5o+oF?mQ}0ft-)*#cQA|t6m0Ok!EQ0 zF@sKQneRa?1#>xG1{fePnS-F~nLHSf>E2BU#kdAE55#^UyJL^oQ&HKfJAM^dR=A|7O^Ez(HF#H`OzI@};m@ipw+IsFJVRM>0dJtrB?__Cg z%QaDLy{BSho}Ydy%Z)1C^y_~}wk1E;GAR{=#eXhl55=`z z{%T}*lCOq%C&=$AnKbRWOO1#yUX$T*r?m71+CpqP!jr@;)2mo*NL-Uv$ro6i!HX2I zv&Zf_2q@|R*D9_*pkf^2O$?8DNzG~ZE1zc9&ssM!;=CmE+#6<$2fL2lKy0vVZBbbg zFsmuOK*j_NwoVSWMM=d<1enABmctoeHk_I9CG0?Z95tc4ur}c1FfL_tJg^QWT6-nB|MQ%x*9T&3<>==^6f{WmthF<ATc};3 zv-NI>2i4o30&g$jZKoe~x&==&o=QCE#E9R$@K4gdJXii?!&zUSiBvJ78tHjyVvTl9xUV84N{rCJJDE#k7mKdvaW+if3X75VJ8*Im z`S7Q2?&YZCf9jT9ju^NR2U&60vd*{2zW|3o8H$s%Dv6yYQAjx9xWCm5>B?#5p|5#m0MPhgS__1wi%VzSIBd{t+zaLkO#O3+xQ>S zY<7;iZhK5LVRHzFdy#j_k1miGE#_Zz0Z(VoxoBSc=yWRn`7d$vcn9n3i(|mgj@ApY z^+Js7X#ENzH1*aGQbhH3F5Y(b0lRxTo^$ae;OPlBN5h|YzW7^(_H4v=CLa4YaEtQW zqy656ORW+=6gO3Vr~wa6axmy_RQ^B83_VEDEN@~Pk ziSokxeDwdWKA+QN_jwdVhpMLs2i`8i+s;@lEK=~CiswJ5YfpWijxf8=mm|)4e2>M$ zAK%l#L~MrpZ|(On-2bM}gLlYy@xZ2l@<^ub5xk2aOBZ213CNx-A|O5M9gYh>AO|-6 z2jPN=^6Xzb8Lw@##rJSegUjD&xDsxlcPnoTy-#^8T`{EN8~*ORe@AL*_m(=&sy*EH zMLVJt1P9GoK>-tmfk19QaFLvln8 zzPG~Nb3u;Si)X{g9IJg&feE7w~k6K3HC6Ge}oL*k= z48_%@`HO0JYLVVma8kVL7C7#JL3hdmW|G=BQ`90TAy6jc$BGF6ey&Ini{bJ%=x^Xo z5&gx>a9%yDZo;(1P}V@q9xB+ekrxp|k}(?l373D$7WjR#Z3wrMU!pQuyPImXLBJ*^d(OdAQdA zMSD!Ha6CQ~A{+*6aGdBhb3xSw3QTp_c~lr?Wja)ZFi%__kSM3|%>vGas1S)!3XL=Z zYQ(XCJkD5+E)lOWNu!Z9KP*P9h*Nll4n70$iWV_9pqJnn%6UpTyQRa%X-w}yafa4< zVr*)?;g6Ch%teMVy$h-7%2QhDEATC;D$@WHA_swS<#h~5EUyFhTvs!(rrrr1mL^sq zTJK(k)4W5q-AGL+)3!EUvyvkGA%f62HL3*VI$(%zd`@Noc8)`F%@n!+#z@}@$5r{Tp*5f zPCFi5oI6a>#YfMd^Iy@$y+ajU+=P6RE(oQIsTa->V@F|F$VyYg954GeYWGg@@bBltm3n~#ReIQS`7O4whZR5O!l|D&*8IkptWR(g!a8VEu z?PesfCS^)dm~6@eGBrI}VWRUI`1F?10_ctq4!yMq=}QU@K0zws$dXqHb?AD8f@)WL zYpS5dBP3`8f|3zbxTLl$5HPU)Iy%3O95|}EwP=y`v?hS7T4zmzIco#wvZ3ug) z8iHCq_P{q4kWm^Nix-vDDkTG0OXdOtIXT=0my^Tq;ZDJ%Fc6c$5v$#5vkqIW)~?}m zL^qy6z`5~wI>yWq7%8=7fvJF46)_bYKxW6C3W&>*Q$a{FUV0~5M$-6@Xg$(+Io{%( z73F{=Y3~<8p_3&h0xc{)l6VP;^`PX5dWHa=5J^^Ibd1NSaYl*Lkl zN=;l`eRm-b;CP@Q=9PecmJuYvGn;gjvM#KoM3ET8Z#|+cjH*CZE=*p%FdwKPrZK_- zRs>?8EKtn^9m7-4qE;cCkF!z9B36zWjfU2y(D26IA~A@U#Qyb&z{inEV~XeHv639FrDB@<@?B!pyh zB=CYiXJai3SAao$G+DLQgknUaW%Y8<*^#@0^9^%4pug|b?yuo;zA42p_&;I3NgJ!? z8@Bm(sGFiZy$TCTZYopU)8&G3A_xC|*&acUOlVbZNsQ)DXq@=JUbdHy=g!(bQa!E6H_De%ZzREG4bw#>7j0(|_0#rVfO zr`F6UD=D2;UA1IJna{tdTKN^0)yej#w9GcAva~F3MiHRDpsbFO=#gJpU0qhH{Md-8 zHQ8m0%F6LzNtIh!eS>UmHtxGazepiUT7U&a003O6A(zs!>NKR)^TgB|D2T1ZYOjnL zNb+PO)#BibS)+0{LAZHwO;$n8m&%(97G8QypSKAiHSM!MZqM5!%Nmtk8+kL)MC@G4GvY1Bu~|S_!cakpsVX!HK>H zc^};6c=&q+?hv^9bF)L{tK;dQH!)vOZd8b8*d=qsop>7G_los+*78Ak>A$@W9nxfh zl28g=QcCs1xU&P2yxEm?km4-S3j<18QV}cF>0b;gihj2=^OHc2Kuy&A~xQNJuRA#wpZ>99K}|#|$9X)a*0JL7Y`(x2~SbnuL-X4NnWe4q?@> z$Z-HzL(oE3IAft$$z~IJE)o4cibeVEeRN{#n<$hZhSRv5gU=Cr(KMw`iycXY8JlFqHS5IX z)d56FL0hprET}D8p!I;xJ#@8{goQ-Uq_3?9^iq*?Dex+wYC{ze9a?}~xkD+1UdTra zkC@9;5vn#q$_Y!A$gD$EZ3x0YKCHRyBMt!|ltTc=UZZR#7Kjp1j3H*dAMDQtyt_Y` zE$)K*2krkXTvCG{LVHGouGq9^7h37MER^y&VpyBw1LUjiiqwLCt zk6#qxwkr$8Zex(CmbPt_H9)xjZQPIjPxu|t{=M)`LOTAG%#)_?+|yA%0EWwHGDtyH zm}@^GmQ!rvRDj2g{9!1JTRIEia`3chR|w3vVGykgD$dOir39|xB!gse15yWp%Tht@ zu!Uo5cO?YQ7i*C;5d%aEtzrcGgo7|7IaO#rjhH>C&FzF3wVNow zJcoDRIbtM+o}zm;$k|7M9)sp(F%D6}wF(j5?4Pj6Aa#fwBy}p!=+J0kL`#x7rivhS zA(@AzN@UhfQb(A__s~T4&B@Zb?2m)}xEk-9KAA1PgFELC?33VW#j}&ZIl=xM?Qq!p zbE~fSpY6{Hr04$J`g)B0$#X>KkMVt_Eqm^T+K?1xYL_&f-#Ks}z#Nndm-4tm?LSMq zRd9!4)4&IJ4cvO|-vF2KH^EiEQ-cM7R#a7DWjD!RNkauJhvoI*)|-|QmsNAIt^-+# z-gcl`R*)9yYQ=*q6ke;>ro1n$i%$iL?|Ui88KS(ZiP_k_z}b_AXf*;RR9h4HNx7Urn`L+)6AT zY7ycT*4t1`^cGZvr=434`N(BNNHXr+ zcA{e861ymOShUOKU=NQL9U84?sXkB~H3i=i-Y$|kwc+gKTcBfEMBi`9iSGsFv?`}h ztMt5BIkT0sR5_0+=Vj%zDyPq3l|VVOmD8Y{HOhHeIR}-K&?XaHq@3BxS)rUiDCceE zM7PVB=l~AOOssus(T9$i890;}BvYD3MQj;cR%$rWV$|gx;6g-x$vUdSTTQ=uP}CNu z&_+`;t1~ns$e@!$$Qy^nY81FNG#(ldvQGj^7rvK`C{ipQAbk{jZvcMt=YR!@RAO;W z>#PHzMIk(a=q`z$rj*uv$9j@^>9PW(Q&Y&E+OLiWXnJXZW`-W%)zs6f4ULCN z*&8#OmiAB-Ox9@Pswry^abSo>$EjnLKxaetfCwwVNABKes%teyR3#xmhBXbgK!=^p zLUpl$;vmYJB8Tr3Azs)fkEYKSXmnVHso?}$Q)_EYMATjm^39S#yCZguAS{X4HPVzk zVk-&*192%j4v03HE$Dj029srlY%l?w%P}}Zen-^zUiiO{=MbKqh|rGte&ub!vuWY` z`2Q>Tr+pyt4S7NSiS_J{!SbP%Hg%5Z?;w)F{aS(g$M+n>rjk^L%5In`W9(sc z{Qp$J;(+!)441GNiH!cwfJKTFPB~gH>kNB}61fAL*lbugDxDUxZ0dVVdQ3T6fNeY$ zJ&qA4O^;n7lpY_8+{S_tajbXhjzw0!K%K20|13F}aE0wcQIrk~&CFziCZ2dfxevbP>eGk;`nQ%!n{{Nt#dq5?f z>rYez^wUWkgIma~cL?1K2C<39rJFl+TbVz90IX&3^xvZi>eLOE>=~bn{ruVIOfa%wgXjKwbNtJatVArLO%% zObG@qsO#;@c}h9&C?~2@hNUYfS2?xHS*@H+%K1n+(O<~~=P75ZauzG+5#{VqPN#AP zf6WA%H`|Mkn3Tdo>{+QLo42audO7)~g0k#EXkTBsr<%q|bFf9UsES7%di%dJB| z7t~beL9Ksk@Y7pUgFT^BedRdZQL|X(i0$zOSbfN|0exgto(YH50C`;Eln9@xHItDs zi)EaEU#2MAFO>=McINI%1Tibk6Yjr$n}eG3VUM7 zqJhdMuVm3r{AD~IVh5!7%CkzUs;42gR#;P9SzTJQ zxR$_Tl_L8BxP>+HSa!9~ zDQaLh%@OFpfQ6lPOSEW2 zxbyeGceBNv@Qa7b-x+X+z`b+w$?tpS<35MIPsY0)>KBKNh2D@`;VWKCWKlyd-`(&^ z_Uf+29%UKDwA}kiLVybalzZ}7gPch(Vn|(-56L(`fYRs^o4+Thi&wRVO@afw(7>{t=A6OBWDUn-~1QTcVDa%Mj_v(twzwSb6L|RB3pX9^580a?RuDWFG8gY@g`s=1JJ3bkn_Z8vop?I&xQp!l z2!f025F(uVVU*e)xI0!N&+wu0?0sUP1A}=ffQab!D$+~j-IqNj9vLJw}ile(}1K*`02L z?hT893qpGO&>e1dIbtv`Pz8+vxQO$+?}_};JEaqIigJFWoH;5CNi?2V14CEQpv}D; zh(oLyhr;-CR2s3|HX4Z>D>$Ya@V-{e5qH7erTssJI}+(10AN<$7F>TE@2r(`Ol`$j z2_I8w@NOw!1hSxeN3CL$f=}#DU1#ri-*(K>!~WcNgq%A zi67VQIHb^(F0_fG_gjjR@8-VnjTOWG5IAmkPEw0@XuPMjW}g zP`3WqSR9fZO=2Hmy&2@^f`gge$uSao*G%E>5FiU52PyzKDPaKB(6s8&A5rmm#J~Jv zTwugw({zrKb5R~~C0U&20I-AeQwYK=A`oQ0th+to_ee4Y+ZTVFtO*ZxU?>41gcQ6U zMfyIGeJ@SwXgE^!&Dhh5LMRx&Wd`G7Lg78mHAm2|Qv2TlmlM_hhi7kU<1u9-%gD1g zkD@SgSRcUUbd`Y0(B;{iaO@5_dvhmxEdu;wkvcd&S!z#bZ+0PR$k`i0n`b*hlJo4% zKE&+d>`hoa6iFE3?9Fj%Ob8$2?9I(ctX68Q2y4fmW8{HcJI>y8$wtaJVn{5ue$mW} z;jX~*8lK&FNUyta-tA=Rbr%Y?`R)^)Hw@C~HNZsjB@tYLZu^~y2T+hge*;RoWhCG+AY@Zue7@r?hNsr^(EYB;LdQ_@10g6 zVECPtef1n11d8aHp@MCWo_dH5+NX6-!1BqaXg98*LO5zmumWurHoj2H(-^mDR@ z<a2T&HT95rEUD1ZDaW{u zz!{Mt57Q#Hm3W~VEr@>Q^ zI9t)4|5l&F2J|-1iz&LqX@;y~j&|p2w^X~e+FhmHd$o%_X_@W;xaxN{)@)!}GVv9! z2^SzhRUiRC$$d;1|q$%S8U$*$H^Yw~~`8pjmMvtNC1V;L8rZ&Z>m3RiSs zA(Ex&KnmV;5Ct>XtLuSQvb}6)npervR9V5LC;NOp!V`433+y@ag3ZsVj4+b$ILaJTBpbx8pz=DMvlL!u4h_;|BOAKvENECkIfY zjO-X}s0Ae=%cZ|V@B)AGTq~u&gGYlud+JX3Cwm?Kc6Y5pK&)I!BPJU{JP002qYp8{ z_#t78x|`gomUNZsHAC}<4=Q*p9PgPu!P31z*-hpw5XuS7#SsPuLP!q@AxT8=7j zwQ=3Tv>On{lW8g}8@JaM)hr35+=NhG16SQ1@ZJIMe((;6awUNa1n)vHPr*$sxv5gB ztc?m&nMkTcLV3#f~_KX?&+M{*&=#-iexfPeIOXa+%oHpg8 zrm2|9S)iPIl=HN5(21IMhv-&;H+bndHApojw+5jTLb(N-mm?L(!E%|8BL10<(j~ zC$ts)dYCTsT+zenGMK=o5$Li~W{8=?$_=d{8l7ZEA!XF_h_%uY%`IUQD<>8`t5|y- z;Rr@HiNR@xW!1t@U_^&jUPod{ddBIY&RQvro_{RNL17^1?PN}*23E6EW{p7&dY;_5@A zq3$k1h+xDFXKjcGR>uJuj`=RUE=V4O36P8^f*w`5Iu~F{JtlO!J)8=IjD~33&?fNnouSqaG zvi>mtQk)>R=ntcDCF(}q&CtzjbQI1sqoy6Q?7;k4P;kAL?k__oRzSURK6D}H&nyVUG4G#3+bq9j41=~N zsPtIu7!X`j5t0o9!L;C+h36VP<#;xN+j74+Gen*feumWjw_;)6!C8KLu}J-{SZw-j zvD5{%?wexq^pavR`oUtccV%&ij=cF-6-VgEOIuMa*Hoi(ip2wX=HqdFUMw<^=gO~( z#jKl(Av-M=g?QFx6pI~)i-n0N^$^_4i^Zy&Q8u2{uNI56NvIdfSbjyZ7?M{khNaFD zY5Dk`S}ZDVDHf07*@HH2MZO1+c0IxyZY>tMw-rOD2GTYZ4#UdT)HkT<1-4H3`oZAD z?R=GnrkeKO(wvnfV-9V~i1(k}^a67fzEh!%KOdU)^B2Y&x6>=%d?Od8inEfme)E~e z-p1z%0O3n9nwVkv3!ho0y9x@uVZ-oxZR4b1rme!gZ#6<-Dg~BRwwZtbzTMj9&5W8^ zu@-vx%twYEv6{VA+6GJ}Vmj=#Xd5uo&3c`K;jN;%4AV922&`}A;(aiz<*Z^ITD-Zm zRDeHWq@|B}r8&`DgsNyWNWVa-+6c>@8xLC4g%3mVnl?3V09{3EPO+)l-7^vd%rqyN zU9`*?Ykm%gn&Jt#S%kNdnX?5N-uq_sf10M5PHC#o7O+pApKa$*oS7h=iZWi3eN!wu z@aCKqmhUv!w#<}yIz=; zm9#_xOBGvW4|*4>uG8kp+k^eBn%)seI9es_r4uIWgc1+SU-;BAk0JuC2-!FTTMZI= zFpk)ql_T}!qkTYb(E z)4o=yW{&4VHfJ@*e6Bi}BBBOv~)r*o%$j$jP_4iioz6zK9+=zOuyzS)n-3h#^ z^Xz&J2)oFjdk1;4ESx2h=i3AK9CR@2rQqmf`&d(A0#2ZzYn{I}`ny59x552y>YXz* zwBEsk#KC&AEM4!2VAku{^$xKu@h}L#!&cbkCA1mhHn!7PQZsB3DKith5z8^zNaJ8~ zzBLmn)Pw~>ZH_`>J&E+itDZ!Du4Xw&!}fuVq|xYo%|-izcB7A;WfLZvLxN5B8E)gA zMgZ1qyX~O$Jh2M2dc#2Axp~HxPb{Nj#n&mzFM&U;I%T?y%u;iBe|*7CRT8WKk9dvd z>|s;)PSE;&;G!F0Z5#&OrbY#_`E?80>FG4)b+(Oa@$AoUnHlvg&+;+Z*+>Ta-m1Jm zZbo@~VP7?_#Tyl~_o@}|`A3S_rW4aN0aF?BpsgDk<~H@tnOINI~2V~t2=&%EZ|9}@jTk#q!Tm)!(GysZ{pCdAx8Vz{ z@kX^P!Bd;nwB6Nsbbx;!;(Xn>3n`-jwQF1tSE2NTtXgTx5x$~P2;j(=SElpFSy)f! zzX#>8r!5$KcQtLw1`H*RP*QE)(uj)F@;3tA=8d=&FO8!zs`JF*j(=yU} z{NJnUXD))3Jw!Gy2QH{YvLSmAg>1s8FnEL60uPnH(sML`IAe87XTdyfa}yIv`(Hl+ z#+Z#uj|$%uWlE1-kbf3|-VTQCFvNkfJeN5q9lWwC+uY)Y!6g>qR)I$5dm=)(as^t1{C`&vtrAt zZBbFQ?<8#v(L`Ps%{=X8<7WZl8rkaHEg(fmeHT)bDs3}|u?6sX;2c(eo9PZ#oo2ac z4QH2e`&QK2x^ENy2LN_0vZcwiFTn~CR57eBjB^I<-$|R4vI;MRR-u~(_L5cTMv;%9 zNZ9W(ZfCz*_px6CrMxUl={8$*DG%1@Qeb^@6WSXrV;u0s(M(y!_WBE0G^f!S&N6pA#&(fYz#D!fW#U=AW@YY1!&sfT@YtYyE=Q zt8GE;9rFqdN{z!6L$hfB7Hq2-eS2dg{;xv*LHkhPE@50r0xKRfrD}-mEVm)dEweaY zyPg|@AoI-I4_f}As2Z1PMrJOo>{$83Zq4gPrkTJur+0b)kiC(V-IZOhx~mXtDj0ZV zZw2UJU*u3Ira>fICaSTTtrQEe*XI|D@STmX66_P!i0csxJ;a99;{K2M1g5EgJVjbb zf;{D@l&54VK}xMtkTTPJXF?Bxl!BQ-K}tSswrfF3+nG&Ar}{yh(r&GHKmH%f@+U9s znrYsJEX=!)&;*zkv;^0ik6a62+3QU|40Y3_S2ZMP54N{qtyTZ{bKo)+d@nd_*x&t!F5HkgnV+)b zy!GZGxSEX^ff{KxA_tL?n08Jfx!P`Sia{CM%U?KRna|Ee!o9{FtPgEdLNbMhs`cb_ zv<}7~vAi;3u8?p}{Cd)|sFdZ05xJ>rYRU>o9_5JI46B^CzBC_`VbizqDR;aCZ!5he ze)t^m5T0dthT?fiKR1P1Oc8&R)aN$(sfCas(qn>4NI!6r*H zd`L+Mt(>B=V$><7(6+%86@ysh`M%fQ=bU>kh}!Qpzt8LQ$LI1o>~r>B`)TdH*Is+= zwbv%3a7GFRN(xC_1nEE@%PFO~l!}dopFfJ-oIxKg3j5DoeAwxuSz(MmVklW#MD*%4 zNXK!rhr0yujlvEQz}0kVpktVPu+9|aCm+F>Lf~nIy@bkBP|0y0W8zkNiU}A0x6F_{}ucKkFhl@#04d(=D9T6lwTufPN zc$e`m=#hL3ZDZ{u()&jk&DMr8ZUALJ+FQJ=$|eL7fqBg#M&v;(qiICaJXyOIu?01`QkoqaD5-1g#`6OYV=Q8rSqiXuJPwx zQK!G4z=CeYj@Bwmx0UgWSlPqqKC^*q?m_Zfr|_UFNNH5#(!UPb#XC93G$za`ryoK^ zK*d;A+}BF3d(u2dUm$7EJS5K6uR!svxKkOv6YxU9AkGcCI|6WJH-#+mpX>}4Z>D*U zexP`CX&s~@+j(4Le*E&&Dc+(T1Mh&c@}m7wr<->nW27Rc=!IY)X|5Xr`9||;PCPaI z)5w^IhtI)nNkq@v=qhdWf~#)S5R-ezin|q1ymm{Og;*NAEcbH;Z(cJO9Q`E8*^3|| zb%>i%S=7!>*H)VzC5l9a|a;*u;o8;on* z7Wt>jF>$!RnAPK}c}Qv+y90sE{UCa$`<`*<;=rI&ntThLab;~A2s-cTdx^Y4K-Py7 zo$xb|yTxiqaop%$8YelflWXmHfk1O!4l<^knE4jUd-5bqC!fl->{@i&=Drvl>v;7i zqqnZC4FT~Z%IRK$G=i{6fsATo7g6{cxsqr5k;9A~h#l>UQp1L~;J-TlkPvag?0XDQ zPJ7X|vy%9Q>C{0#2X9Et``8$*dEu+({W}aK^gcI7JbK^Xkc5u%KOzDR{N3P~s5iZn z%TX?5b+Tm%XB;`b!hrn&Gee!;(a}AB_FFz2G_a2C+VM3=vm;!7Z-)G7Rme>kAYXGY zr{7%_tEuEzw(a2*yN(SkZa*zQTqa47#1%s5kr%Ym-?^4&5Lvs&dCIh7)Z$w=~0j=`qSZJQ? zS_Wh%#>|?eRDQKHv91|yo`e<;7CD?DdToM+VAj6vYsKBst1Q-a`|DVvNsee18XF)1 z4Z)k)oII&r@^_AO-(H0<#Ti;vkC<%m%U>&7$Y&+@ha!*^y3YDlGw!PVN^&jxN(x=I zi7LIcSPCtF0&km-@LejUzPvhgRXIFz-Fx4KBRQAmx|hz8oDMh(Bldv}&HcGoB%~HBQ+QEdd2Os#6(=lVL z{A=$a>w!po(#-qCgzEjn>{!6pdspvCWu<}g;NB?*Ebcnfl)=ugbmEe=(s=;8ZxZ|S ziy9J_@i#(ZDc<6o)7c8{V=B9ydHCC$vI)qEOs##nMMYm=NK+O2PyosqQG7YO-2_G^OMO~aFqUG@r=g9J-* znKrf(blzh<#A&d1+CXD`V8%`oHO2?&;PmB~V$h8K?t}vtkM(0Y#*VK5G_fjX*S0*y z3N9WoS;wqSZ1Tj*G4Y-ae3vMt#ZyW9Kk#AK>_VXR(PlF{`7i3;k5(keBz35f$116I z^j$8vxve5a#%TWu7wolLt4)sHEAJ|Ep&md$R@n+n{O#5QevV%5yUP5UP429+b29ZP z>RNi&-;K6L_4j~$NbD?jLx?`U0Kr@HX-I{{I@l|>2?10VRwRr0I;B9GAdQ#CfcGiD zAN|JQNumpj!T0e2j7=KcWZxjWk03-@cNqV{8G`?&NoY@*Mgt3e#ub4E8mO)_!KBj| z-Y`)g!`|E5LEh>Ds?p2sEcgQk?g<1Q7my#r97GFHqO70CVzL84Q`i1aBN>_neg@k| zwXB)XM>(@SeTl_n9uQ-SA6Je%2j_1=yew=&+{^9Va-!Sxx;z`hL zhoANv8$Fl%y$FB$wZa_+_y60St)Qc{Cr1R!cTbM16NJG#6gLUtK8~FGbG(`cI6ZQk z*q6HA&!KP%Xm2SVzmhxw`7aPa`>O8hY2;zDz?Y!AtG@A*9nLi5AH z-2Gs6H_yOS6IkVEkzDs=95hRnKCq8@VVe}@yddnKIBb}FP)-TU-T#%sY(C&2xUb$P z?PoarKsg~?jq;_!2Kqz^lTdfW!PJmpb}bE)93eF6Jp$28T}&7lDO5+5KlRDo|1X6d z1@o>|2HIj~HNLm*LKtPpvr%DB8zPa0*?IH4+>qz~FBG;2kw_tpWRzOd{0?)G&R1M} zyhWFjIzJ;h>AXX>`9wJ7zBK=X_>VmS;@=ySh{u*q+(#b$E0+7xyo2B<7^Y_5Y^Gp) zh0Vd_XTcvp^y!AH@+tF?qoJ);9sqiCq9C$u9(ywe@3w6AI(O~tWw?~u?P_W_!&SMK z{l|2r9tG`y8HnV252?+{g@CK@p{#S^zgWv^vO>|PbXnnA4n|8GUs<8(PO7Yr79Uq~(qUT&7$ z+J*NYuBqHSb0aBEmMhL-s*hYnnw-s=mZ$iXub}mH=&qrmy8;XDz=9!qYJenv2DXjw zq(SkjhK+<5ul2oX3>1xi;L9r9)p(JUlG$IgPJ)%7G3&0~iBgf2Y^NvTuqWXNwyUrM zf;B(a-bu;(I!5ENncq`<(Z6hBMamJZfv_L4;|}x^>k*H&zRr5Ie}%OkQYX2ud0rlM z#IU32h~p~0R+v5Yq*7=74%?-NDIN-nZB}}PW)BP4LTR+Qm*Duysz=_l%f?IJbQmQB^i-m;_q?K9~w){Hy4$OR>7!<(DLc{Z6>VUdtvjLECfIFCOzcX9@r38=X@pN`Cm(z9glhS)>+Dqz^m6|Td+YC( zhRBEU)@NeH60E5$QwBL3K?DU}v4!QaLV}D$?d<;l(DIW@h3=lFb&%!++1kL~qf*ea zi}m-Z<--1YEkTT@LUY5;hMzO)U%TTJnx1PzA*zb`TRO9}tuhvqKn|oOUl(}Am z5<~;_rA}J4^~D;i`4mdWRplYY3>4f`VZV!-1 zqs_%T-1uzI)p9}`I&TE#R<;i-=!%raL|U}FS&NRoVaTW5Qfziy&;I>KJ|>)3u`_ss zw&GyIP)eJplIWD!lP|_Fr97s4^MIC{hSw0@#-Z!2-?^53N9v1+Pa93Tw_f+V5nqNv zi54@GDjtr7V)JPoW;KUltT$@Tb?IuaCSAHFw*F=_XoB?%)(17Fh{v(oX+Ek)e1S*g zBXaiBVkNwrAewcEZvjzZ-Kj3$Mz5w_^22O2fGey=m;*aQBy<|azdKpDnuvoEIgFgY z12K|MVwck^HyDBUrP4&m3noEga0~V}$6?RpMm)FTZ4%xl!r#jMrb#hidvAu{R1QV( z$jcV8^tZ)RVIuE9y z_r@f%Ept$z7zcK7#Tc3>cbqwd^j*#o6?Y}eNe)U7yPr=YK|P48Vq)9yA$TG(>-QG~ z@`WU5Ei_Mbp>;k2NQmLEYNLnpyh-Fq`y?$-Aq8VTH&H%5wZYcj<$7(7qBfM{M#R&b zY$;Nwk+>S3)aGA9cmN3|DhkmC*H;#zg`_yPK7&u)G$-r^M))?@4Ch&1W=3kCC~WWP zT4AA`Nd((*1-(=QN!AvP)=X48ZgsQ&glcSAu4+VT6;NLQh~0tz9BY|(oD{?@w7eSO zJpMdthH#9bvI=XHF-eOcgXvU;a+_8LJ~K42xmncl+U(Htg(3widwInf^mr628RL-c z!%nD3t!xf$5nCAvk`t3zyfMEpAPg#CEDb3m5g|@{k$-fuX>h4g5~&RT&<4jaMCm_h zvcYb&P=p^dc^owhEyQSxkz6C!Pv8D359+RMROj?Yn#!^N1<4mEcPIPt&!X2o7pEZ+ z1Ks<lv4000pVj9gwa0J7Xw;L_-4LeOlRr^9cj!-R!&BhKkGv94GPD?-8B3 zH2aneX|t+fibuVG9C_=EEzsppX@U*66#|bMEw_ z4Z4jR5bf}uJb04a`$=paVQ;B#1yuDlWQOP!%>)#+*=9tdHuIwj@(p}+hHzRt;aAQ7 zOE%8)wqbm5E>|5F#}SiIZ^k_as-6J4&E{lcThI6bJw%b`0LTX=PfbQ4wMn60MamiK zu~4xnhd(B~GiWi7Khb0}PhOQbhawLu?T=52(k5Zm1)8k&FqBNpKi434W5Z0+v+|vP zh8Ro1=N~9>_`{QOegv6_`6nrrj)SS>-oi2=%XbXHK4NeADE2Vl4FYo(W5H(P+B6!! zVO)-=%2s3I;6Iik1Xu9)Jiq`zmDiKRIGKg1;mLrFQ^Rr844h~-wYZt~FvYiB|2}V9 z%tVo?E!M-ZzPBv~fxk1f#rscmX^Z~1ou@6JuyS@%m$oQFOugs)8F^4!EQBZZoI`Qv zYYXtrDi07LL$zVASmF&-xdD!Hrm#nmlR!1_g0pvxSkvF^xCcB&=d<{MHu)hJdqr|o zc-80xP|DO^zLOYvEYrS zf@2~c=~nPU#4Sw&7c>?SH$sXPi{}pL*i)@&A~wmJ0)b3bqqjb}85wq+Z(5e6OKkwN$X? z_1=ON>*HjSw_rcq0sw8OM)(dZ6dfa`9uP>D%|lXp1@XJ>P7}dTe>Yryj|_Lp`QjsUBg!vL62m zH`F5urP1qgFIY#aN2qT-h}1{h!yTFBAC;L`;?$fZEgy%bG)2{614lX(8)YUxe1u5J zi~Qui$>^>?INhzzRuIDff&@MGaN7JTabT7h(mo9s?+=zGE__zrB49X`-HBq+Oi@!g z*&YG4pm*2AMNou92k3mnA_;;7Ii%tQSfE*Xd5Dq7A`pY-fz)Wb*%9S|@~%(%So_AA zXDw3l?&IlyIq;Nn5ACZpAln!dwRz~{2iuPg{U|YSq1MK40!R&X42JS@q8godfK3Q& zj=oqoc?eLHL%5w+45{(R_i^vgT`>`|shnzI=e5v+;}I<8Kz&TTIuR|-$CUg&-(?K@ zeY1jNBP^YS?{#eUItXQ_ht*9F_miia-PPHi=@B%*hN*+=9mMZCxGN>s!VrJ^GgMLx_$N0l&mUh?#y6nR8@jjBc<`H}MT)(Dz})@gHI&wMPvTP3%Ez3JW#H_qr-lWz6Xi_~aJaiZOha89CA|5<~ zf-8ypi}G1-hOj6MLBb!pK=ibz(Dl__!c7Qw|3-3(1DOw_nxbw#b5}*OHZ-}KBQX}E z(pR9A`)TW59W&o(EC_NV`i$+_WU(QDTGZ*2j6pT zdAoCn+_ympHu*4F^#F#+15;_zfQBwh!AL{_g#ReEg0{~g1L1q?_d|)nwKR$} z6KhxwLijl9sXY#l^|r^TG@thPH&`dFJ+f&!+qmWY?ZHN9?ePc-s<*{>B&WB93+yQM z&auBSw8a)=exA0_ajA_@G9sVIp6%De_$=nZ4^uF;qt?~_O;fX%FL?O+^XN$o_bmZu z0yI5|8Nl;J^d#6g6@BXd(eGF5Bq}msGTX#^8 zqeFz9^sj^6hghoeu-|O0ona>ftLhMR61gF|G{PB-!OAkJiAWckDdz4-+}rTJ>o?I0R=n&BS-Kswxs z(R;c<{f1zog}zDI&I9RnOlgkAO!6tO8Gh_iQ4#7E)jUKZvz z^rLCyjWyFocsDPl53IBwrH?|;J~<_X)g>TR%r*$Z(%3;kN%Vm^b0K}$)LKA(o<`rd z)LGjhw`*6upuw zd*&0u^M`@h_M%seQjg6<{U1`U1D#+#eUxbPpxHX4cWQ_Q=U=DvcVZxOMZ^P^SpqQV zfncr(dsn>Bf(2|ChwbHTbnm6DbIAcMUV33w5SDptk?y^;U&X!Y1v=#9J&bGo_kof> ztK=Tx?J;@&Py&H;?06*&;)v!eWE^U(cYhOz%|lZ;Ls`i;DD;h(GQ5C)PKS3oO6IYR zCf#o6&&Cw9sXRG5k~2|qcD9x$7f;C*bWJXvCs*LH#k=>?zCJG|y|ACat$1ux+)J~0 zy4mbB_prE^&f^~QSOfQnlb6Qg=nT#W+RdKSsPd2Q4+aCg=`7mTHWEWYwnPzYjX49Q zl)3J+7ksP={#y<{u{|c=f`i&z3EI5`JOj+HaH3<0;_)YW?n$pIMu+s+u!jjAb0}>- zwz1&L$%T4(N?wKDiD;*zBB6y264$ZfH_u`V5nF*j%g$EM4i{?3kG$TBDIg}6&8GYz zq!YQNw6Hkx;Hu#KP&V{@^GL^z^nCMZ8q$ZydgMpa_#aUe6v@v1){Axp8C!mtnQsQZ zk0nO)KXv$BfUn^Fm~8|fNIb|kf@p?V^Jh$$#Qmx3jI+c6LMSHmDy}44e#&0y;3Z9i zzU{|G9Se1?B|QtFQlsj0>_knKOF!RrDS8^TYXM_BYwYte_xYSdn@jS0>}!!t7a&8n zEJ4%XNgK4g=F`~bo51y&Rz~T3I;{Z?0USwNJGt7@qfww*H$aMn zN4;81sh;4mh~^U?g*3n9-~(p?3-1yhnm9ls{&PMH1^k9XT#aeHTL+>PTX+PT zRkU(6Y&Mz?3v*Q+gHXlK5yV!l?o^tu&@lH=FgM?$tFLgoWVGJQ-4FGt`PcACvyy~H zYg|a3Z`|KWzBO`OZ1jg<#orQ=;z~Kr-sL;l=Ud>KE# z*+2v(3T6HhFutthDMnK^`fw`grIU(sUbHF7aeKQh-;bmWu~B|-v406Y`QzJ#hut?Svp?5M&@k z6lX2+%X1(~A{zjBowq}oi`mf`qRho8bBM9b#fiItT4@h2^Zt!mnWODxB9F4Jc}Qv= zfAgn2jHoi~`EnI1Hk-1(u7b}6$o&zFb`4`3AQ6)j&)p(&SJz~~wKzd>8O6V$ z!cCI~;@_>uA1nY8xp6p=#4ms56;RKM(>Y3F?vJSq_VH|OVm%Os#I#D zb7Su3hZ#GNB|Bt0siZ+Jsb%=&DWZ{W>}iO=XtRkuAzok&1dUxG8Dw!^B0jbd*%I1q z0c0^;qLnTzaGFo4bP{zju0i=(2ngslaFxGm`DjJl)Lc)n1!s2L9hW;{6$v{86D#5} zjh;!1CSrrYY{wk2)Bh|KXTCjqQrSI`a2^1|d!7JyZ63Pwwj8hCG{U5+g>$8ecxK|E zUk2P3aMRlcWck>-Asct=pUjfB|1nECQErhAf0Cu!xEuMWENu#eK4+t&eAM8+Y^nlGUS)yVi;C^z8{^^CwX z8c*luEXjg$Z~Osy<7q-$#r*;tf0iXx`e#dJsH^y4hCfl3E;XVdgA#BVU*BW^^V~dukX%zfR`pc~)C4uDj}_vL=OAqBw*M*;Nh8 z9A}oasf4Rbf%0&QuX$SR@*qCd3=pD6h|y>f8{a%w9>nde!Jq6|2C4ouxgdc*)FN-W z#V6402Wsq;u%1&*MS0N!h%^(VFK#HMw}6` zZ4~=^xo=0hcSGXx1z0KdMLa!9BBBspCGez#*D#9pE%9AoyfCM8oURoMxP(ei!dg#4 z6CGqtV4j3lO~JKIH1ZV%8g42QTK5bEf^(~Gl-RQ%`p~^VF1sfIf}N#l8M-nDTCk5e z6Q`BZG+EOZSZT|H##X08{&^Xfe@;@I9b9Nriy&C5VJE(X;K|uik-)f^GPf!c=bMm$ z;$$T2qXEexAxef&Y8#{_7G#Kh*CspWUOV1_J!UNsMgT-;^wI1uvI%|~% zy|2z%Eud@btcM{z>hM^P)LHAb@S}Cs1`&Ru&f197*6${HN>wqTXfV`R^(KmfPla`@ zkSSMzX-0j-$4mU9g~f2Ul|^$`l|Da$4{FihU~%7kK$}6e`IBf$UoOQJW z$(wNg6{~KA!$H`qg@+^TTB-Ds9)Rlcs9|Qqjzg)zkJ7#yXC3LMrB8k{rMrCmdf_WZ z%7p!vETmB26Nb}O*p*#?R7yZOz3GsDBA^}cf6(AhY0ZGWmqH#R2VdSeRK}_5NlUFf zLGYt8CgbTEW=5E(lQGnr9?_&YUgBcBdHtzuG03L~*q{<%j0rLAQfw}Pq=)XZD5L#K zdOHTkjrK2zY`#IR*)yyV-69%;bS|_FYxY>^bF}_BpFXb;pWb|6E(?|qlced=y;2%V zpNN{wz%$)Y7V2{vj1>@xz<#13oa(5BQ(POu>4!3}taYG+5NSB>d5T^=PjPY0QzWkO zWVo>FB6Hh0h<$uF zoHPe3I@6)lt!_Yn^@IBKA$A}ci(5Jm`6s-14kRPs&}uvWugA;{46MG9kgLFT&1 zBxkUsMP`FWdlJ1Az_pg zw#wnZXCpu_nuEzcQ!h6D_dwAh_CcRcrEes*0JH4JCPFomKDr!MN>;J4;@e|A8iOP1uAf6f%jcl5YK8i-^tk%xLq@xrf+gRBAg)4e~8pH}bN_ zB+)u#2$emR9c`t2H$VWR$P>#~5#p?%-nE?KSJM_fRR064C;Z5(I@-E(Suc2atkn~$ z=~%7nCqnX{rH)d4B>0V&|<8Uv~Wpe4y3gSWR6M_Zp?b~AjdKgP`D zl^STByHP_EQ%;{$0vaG~IK=Eoq1ob-#`1CSFGCu9Pc$|oc#!}8~K-Sy`0Am0^h9&zFqxb<)hQEL^#AoBHVNV{22WMPojl@A7 z&cSZLAlPh~ohP{`^;!|Gy*U?d&chzBdy;=yhU{)YTC8F?mV+s(tS%3#9SP{YpUt1s6sg8XnqDtOLP3=q2-^$tXx z!~VXU67a@!t@y29SYtlP2LcW zj5SNaJYDzPFN$Y1@h0-q^nZ`*{Al6jE!^=7P~V1)HTolgC;`VyCwib~=o+XkjSrH-H~ytr``RPQli-s70lnijAX1ddb_ZKbRf8 z>a4E?G>75cpTEOw0(|_D#&bN4!)kZ&Sof*4tVcx_fP}_?ga$cf9~Ek>@&vUpf&;8a{H*(2KL^7Qi*=i)DhfUH zkSh}ZU6@bKS$DXW?EpRf$|#z)pp`4isl&1^o{r^6WfJS z%+c*XLO0yniK`8WL&$wV;}B?t_1fQwSMLmL0%EZd#RiYY0`GWPFi0RmBc3!%+4usFiG zQ`Etv)?vH zkOyYOPR!;?g>*VsZ+q$=7qV4? zV5trHX}?Ji;xzd0aGx>U$M9^zvj-2E+8Nf{*JgCryCUi#ON(>i8Xr9W-TU{DIloV> zRV$_hib)(PdGxl?bvtxg9KDMSWVgXH*k;cx$tiTC6=uVi4V@}=a8T{`cz9y(=4MjR)X zt7EA`Wal?%FirG>qpeGD#™dYi1#XFC45C)c4oR-Z#z77-vO1ap_Z<8M*7*-80 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%0D?ctaZQ)_f>#qcF={uT{n9FIU=8Jrs`JF#XV)c#| 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

bcZll%=!8C) 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 Date: Thu, 9 Nov 2023 14:52:01 +0200 Subject: [PATCH 114/174] FPC compatibility --- Source/WrapDelphi.pas | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index f7267b22..37889b00 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1052,7 +1052,8 @@ implementation rs_ErrUnexpected = 'Unexpected error'; {$REGION 'TRttiInvokableTypeHelper - "Lifted" from Spring4D"'} -{$IF CompilerVersion < 36} + +{$IF not Defined(FPC) and Defined(EXTENDED_RTTI) and (CompilerVersion < 36)} {***************************************************************************} { } { Spring Framework for Delphi } @@ -1197,7 +1198,8 @@ function TRttiInvokableTypeHelper.CreateImplementation(AUserData: Pointer; //FI: m.Free; end; end; -{$IFEND CompilerVersion < 36} +{$IFEND not Defined(FPC) and Defined(EXTENDED_RTTI) and (CompilerVersion < 36)} + {$ENDREGION 'TRttiInvokableTypeHelper - "Lifted from Spring4D"'} From 6e486cc8e15af3e8a7ca0a28bfeda55c3ebb09b5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 13 Nov 2023 00:40:24 +0200 Subject: [PATCH 115/174] Fix #446 --- Demos/Demo06/Unit1.pas | 8 ++++---- Source/PythonEngine.pas | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Demos/Demo06/Unit1.pas b/Demos/Demo06/Unit1.pas index ebf58592..df25433d 100644 --- a/Demos/Demo06/Unit1.pas +++ b/Demos/Demo06/Unit1.pas @@ -165,7 +165,7 @@ function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; // Else check for a method Result := PyObject_GenericGetAttr(obj, PyUnicodeFromString(key)); if not Assigned(Result) then - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); end; end; end; @@ -186,7 +186,7 @@ function PyPoint_setattrfunc(obj : PPyObject; key : PAnsiChar; value : PPyObjec Result := 0; end else - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Attribute "%s" needs an integer',[key]))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Attribute "%s" needs an integer',[key])))); // Check for attribute y end else if key = 'y' then begin if PyLong_Check(value) then @@ -195,9 +195,9 @@ function PyPoint_setattrfunc(obj : PPyObject; key : PAnsiChar; value : PPyObjec Result := 0; end else - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Attribute "%s" needs an integer',[key]))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Attribute "%s" needs an integer',[key])))); end else - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Format('Unknown attribute "%s"',[key]))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); end; end; diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ad4df5fb..6d9ef18a 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -8859,10 +8859,10 @@ procedure TPythonType.Initialize; Module.AddClient( Self ); end; InitServices; - if Engine.PyType_Ready(TheTypePtr) <> 0 then - Engine.CheckError; FType.tp_pythontype := Self; // Store self into FType inherited; + if Engine.PyType_Ready(TheTypePtr) <> 0 then + Engine.CheckError; end; procedure TPythonType.Finalize; From c0cb7ec0a2fd630b978f41f2d441b2fe432e703d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 16 Nov 2023 00:44:07 +0200 Subject: [PATCH 116/174] Fix Demo11 for 64 bits. --- Demos/Demo11/SortThds.pas | 6 ++---- Demos/Demo11/ThSort.pas | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Demos/Demo11/SortThds.pas b/Demos/Demo11/SortThds.pas index bb696357..2648c49f 100644 --- a/Demos/Demo11/SortThds.pas +++ b/Demos/Demo11/SortThds.pas @@ -1,11 +1,9 @@ unit SortThds; - - interface uses - Classes, + Types, Classes, Graphics, ExtCtrls, PythonEngine; @@ -121,7 +119,7 @@ procedure TSortThread.ExecuteWithPython; FModule.InitializeForNewInterpreter; if Assigned(fScript) then ExecStrings(fScript); - pyfunc := FindFunction( ExecModule, fpyfuncname); + pyfunc := FindFunction( ExecModule, AnsiString(fpyfuncname)); if Assigned(pyfunc) then try EvalFunction(pyfunc,[NativeInt(self),0,FSize]); diff --git a/Demos/Demo11/ThSort.pas b/Demos/Demo11/ThSort.pas index c96acd51..841d2b95 100644 --- a/Demos/Demo11/ThSort.pas +++ b/Demos/Demo11/ThSort.pas @@ -182,11 +182,17 @@ procedure TThreadSortForm.ThreadDone(Sender: TObject); end; function TThreadSortForm.SortModule_GetValue( pself, args : PPyObject ) : PPyObject; cdecl; -var psort,index: integer; +var + psort: NativeInt; + index: integer; begin with GetPythonEngine do begin + {$IFDEF CPU64BITS} + if PyArg_ParseTuple( args, 'Li',@psort, @index) <> 0 then + {$ELSE} if PyArg_ParseTuple( args, 'ii',@psort, @index) <> 0 then + {$ENDIF} begin Result := PyLong_FromLong(TSortThread(psort)[index]); end else @@ -195,11 +201,17 @@ function TThreadSortForm.SortModule_GetValue( pself, args : PPyObject ) : PPyObj end; function TThreadSortForm.SortModule_Swap( pself, args : PPyObject ) : PPyObject; cdecl; -var psort,i,j: integer; +var + psort : NativeInt; + i,j: integer; begin with GetPythonEngine do begin + {$IFDEF CPU64BITS} + if PyArg_ParseTuple( args, 'Lii',@psort, @i, @j) <> 0 then + {$ELSE} if PyArg_ParseTuple( args, 'iii',@psort, @i, @j) <> 0 then + {$ENDIF} begin TSortThread(psort).VisualSwap(i,j); Result := ReturnNone; From 7452bf198937952edfdd4c9dd19864ebd709e941 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 22 Nov 2023 20:54:30 +0200 Subject: [PATCH 117/174] Simplify Demo33 --- Demos/Demo33/ThSort.pas | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Demos/Demo33/ThSort.pas b/Demos/Demo33/ThSort.pas index becbb9db..f47b8238 100644 --- a/Demos/Demo33/ThSort.pas +++ b/Demos/Demo33/ThSort.pas @@ -135,17 +135,12 @@ procedure TThreadSortForm.InitThreads(ThreadExecMode: TThreadExecMode; script: T procedure TThreadSortForm.Start1BtnClick(Sender: TObject); begin - with GetPythonEngine do - begin - ExecStrings(PythonMemo.Lines); - self.InitThreads(emNewState, nil); - end; + InitThreads(emNewState, PythonMemo.Lines); end; procedure TThreadSortForm.Start3BtnClick(Sender: TObject); begin InitThreads(emNewInterpreterOwnGIL, PythonMemo.Lines); -//PythonEngine1.ExecStrings(PythonMemo.Lines); end; procedure TThreadSortForm.LoadBtnClick(Sender: TObject); From f8d48fd00bdb0217a0682255671fca29beff60ad Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 22 Nov 2023 22:13:57 +0200 Subject: [PATCH 118/174] Catch exceptions in Demo 33 --- Demos/Demo33/SortThds.pas | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Demos/Demo33/SortThds.pas b/Demos/Demo33/SortThds.pas index 28a85d53..a2b34d70 100644 --- a/Demos/Demo33/SortThds.pas +++ b/Demos/Demo33/SortThds.pas @@ -127,15 +127,17 @@ procedure TSortThread.ExecuteWithPython; if Assigned(FModule) and (ThreadExecMode <> emNewState) then FModule.InitializeForNewInterpreter; if Assigned(fScript) then + try ExecStrings(fScript); + except + end; pyfunc := FindFunction(ExecModule, utf8encode(fpyfuncname)); if Assigned(pyfunc) then try EvalFunction(pyfunc,[NativeInt(self),0,FSize]); except end; - - Py_DecRef(pyfunc); + Py_XDecRef(pyfunc); end; finally running := false; From d8e4cdacd459e6557ad33eecbf2f6ff219c77873 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 5 Dec 2023 20:20:30 +0200 Subject: [PATCH 119/174] Synced with Embarcadero/P4D (added PythonDocs.pas and more) Fixed line endings --- Demos/Demo01/Demo01.dpr | 30 +- Demos/Demo02/Demo02.dpr | 33 +- Demos/Demo03/Demo03.dpr | 30 +- Demos/Demo03/Demo03.dproj | 332 +- Demos/Demo04/Demo04.dpr | 30 +- Demos/Demo04/Demo04.dproj | 374 +- Demos/Demo05/Demo05.dpr | 30 +- Demos/Demo05/Demo05.dproj | 372 +- Demos/Demo05/Unit1.dfm | 256 +- Demos/Demo06/Demo06.dpr | 30 +- Demos/Demo06/Demo06.dproj | 354 +- Demos/Demo07/Demo07.dpr | 30 +- Demos/Demo07/Demo07.dproj | 352 +- Demos/Demo08/Demo08.dpr | 30 +- Demos/Demo08/Demo08.dproj | 348 +- Demos/Demo09/Demo09.dpr | 30 +- Demos/Demo09/Demo09.dproj | 372 +- Demos/Demo09/grpDemo09.groupproj | 96 +- Demos/Demo16/Example1/Demo16a.dpr | 30 +- Demos/Demo16/Example1/Demo16a.dproj | 378 +- Demos/Demo16/Example1/Unit1.dfm | 488 +- Demos/Demo16/Example2/Demo16b.dpr | 30 +- Demos/Demo16/Example2/Demo16b.dproj | 378 +- Demos/Demo16/Example2/Unit1.dfm | 468 +- Demos/Demo17/Demo17.dpr | 30 +- Demos/Demo17/Demo17.dproj | 378 +- Demos/Demo17/Unit1.dfm | 246 +- Demos/Demo21/Demo21.dpr | 30 +- Demos/Demo21/Demo21.dproj | 378 +- Demos/Demo22/Demo22.dpr | 30 +- Demos/Demo22/Demo22.dproj | 380 +- Demos/Demo22/threading_test.py | 190 +- Demos/Demo23/Demo23.dpr | 30 +- Demos/Demo23/Demo23.dproj | 378 +- Demos/Demo23/threading_test.py | 190 +- Demos/Demo26/Demo26.dpr | 30 +- Demos/Demo26/Demo26.dproj | 378 +- Demos/Demo27/Demo27.dpr | 26 +- Demos/Demo27/Demo27.dproj | 384 +- Demos/Demo28/Demo28.dpr | 30 +- Demos/Demo28/Demo28.dproj | 378 +- Demos/Demo29/Demo29.dpr | 26 +- Demos/Demo29/Demo29.dproj | 366 +- Demos/Demo30/Demo30.dpr | 30 +- Demos/Demo30/Demo30.dproj | 380 +- Demos/Demo30/Unit1.dfm | 264 +- Demos/Demo31/Demo31.dpr | 50 +- Demos/Demo32/Demo32.dpr | 32 +- Demos/Demo32/Demo32.dproj | 334 +- Demos/Demo33/ThrdDemo2.dpr | 30 +- Demos/Demo33/ThrdDemo2.dproj | 400 +- Demos/Demo34/Demo34.dpr | 30 +- Demos/Demo34/Demo34.dproj | 1924 +- Demos/FMX/BasicTypes/PointF/MainForm.fmx | 276 +- Demos/FMX/BasicTypes/PointF/MainForm.pas | 126 +- Demos/FMX/BasicTypes/PointF/PointF.dpr | 28 +- Demos/FMX/BasicTypes/PointF/PointF.dproj | 2206 +- Demos/FMX/FormDemo/FormDemo.dpr | 30 +- Demos/FMX/FormDemo/FormDemo.dproj | 1952 +- Demos/FMX/FormDemo/MainForm.fmx | 306 +- Demos/FMX/FormDemo/MainForm.pas | 126 +- Demos/FMX/FormDemo/SecondForm.fmx | 62 +- Demos/FMX/FormDemo/SecondForm.pas | 58 +- Modules/DelphiFMX/DelphiFMX.dpr | 69 +- Modules/DelphiFMX/DelphiFMX.dproj | 424 +- Modules/DelphiFMX/TestFMX.py | 92 +- .../DelphiFMX/doc/Data.Bind.Components.xml | 17020 +++++ .../DelphiFMX/doc/Data.Bind.ObjectScope.xml | 9368 +++ Modules/DelphiFMX/doc/FMX.ActnList.xml | 1396 + Modules/DelphiFMX/doc/FMX.Bind.Navigator.xml | 776 + Modules/DelphiFMX/doc/FMX.BufferedLayout.xml | 238 + Modules/DelphiFMX/doc/FMX.Colors.xml | 1883 + Modules/DelphiFMX/doc/FMX.ComboEdit.xml | 566 + Modules/DelphiFMX/doc/FMX.Controls.xml | 7196 +++ Modules/DelphiFMX/doc/FMX.Dialogs.xml | 1646 + Modules/DelphiFMX/doc/FMX.Edit.xml | 1907 + Modules/DelphiFMX/doc/FMX.EditBox.xml | 504 + Modules/DelphiFMX/doc/FMX.Forms.xml | 6249 ++ Modules/DelphiFMX/doc/FMX.Grid.xml | 19587 ++++++ Modules/DelphiFMX/doc/FMX.Layouts.xml | 2724 + Modules/DelphiFMX/doc/FMX.ListBox.xml | 3616 ++ Modules/DelphiFMX/doc/FMX.ListView.xml | 11034 ++++ Modules/DelphiFMX/doc/FMX.Media.xml | 6436 ++ Modules/DelphiFMX/doc/FMX.Memo.xml | 3644 ++ Modules/DelphiFMX/doc/FMX.Menus.xml | 4662 ++ Modules/DelphiFMX/doc/FMX.MultiView.xml | 1183 + Modules/DelphiFMX/doc/FMX.Objects.xml | 3146 + Modules/DelphiFMX/doc/FMX.ScrollBox.xml | 21168 +++++++ Modules/DelphiFMX/doc/FMX.SearchBox.xml | 179 + Modules/DelphiFMX/doc/FMX.SpinBox.xml | 234 + Modules/DelphiFMX/doc/FMX.StdActns.xml | 3336 + Modules/DelphiFMX/doc/FMX.StdCtrls.xml | 10855 ++++ Modules/DelphiFMX/doc/FMX.Styles.xml | 601 + Modules/DelphiFMX/doc/FMX.TabControl.xml | 1908 + Modules/DelphiFMX/doc/FMX.Types.xml | 5326 ++ Modules/DelphiFMX/doc/System.Actions.xml | 2225 + Modules/DelphiFMX/doc/System.Classes.xml | 11815 ++++ Modules/DelphiFMX/doc/System.Types.xml | 3859 ++ Modules/DelphiFMX/doc/System.xml | 6501 ++ Modules/DelphiFMX/doc/docs.xml | 27512 ++++++++ Modules/DelphiFMX/uMain.pas | 120 +- Modules/DelphiVCL/DelphiVCL.dproj | 316 +- Modules/DelphiVCL/TestVCL.py | 90 +- .../DelphiVCL/doc/Data.Bind.Components.xml | 34373 ++++++++++ .../DelphiVCL/doc/Data.Bind.ObjectScope.xml | 15510 +++++ Modules/DelphiVCL/doc/System.Actions.xml | 2250 + Modules/DelphiVCL/doc/System.Classes.xml | 25017 ++++++++ Modules/DelphiVCL/doc/System.xml | 7570 +++ Modules/DelphiVCL/doc/Vcl.ActnList.xml | 2512 + Modules/DelphiVCL/doc/Vcl.Buttons.xml | 6201 ++ Modules/DelphiVCL/doc/Vcl.ComCtrls.xml | 52358 ++++++++++++++++ Modules/DelphiVCL/doc/Vcl.Controls.xml | 25198 ++++++++ Modules/DelphiVCL/doc/Vcl.Dialogs.xml | 10704 ++++ Modules/DelphiVCL/doc/Vcl.ExtCtrls.xml | 42683 +++++++++++++ Modules/DelphiVCL/doc/Vcl.Forms.xml | 18052 ++++++ Modules/DelphiVCL/doc/Vcl.Graphics.xml | 8666 +++ Modules/DelphiVCL/doc/Vcl.Grids.xml | 10157 +++ Modules/DelphiVCL/doc/Vcl.MPlayer.xml | 3327 + Modules/DelphiVCL/doc/Vcl.Menus.xml | 3999 ++ Modules/DelphiVCL/doc/Vcl.NumberBox.xml | 5138 ++ Modules/DelphiVCL/doc/Vcl.Samples.Spin.xml | 5311 ++ Modules/DelphiVCL/doc/Vcl.StdCtrls.xml | 30043 +++++++++ Modules/DelphiVCL/doc/Vcl.Themes.xml | 16434 +++++ Modules/DelphiVCL/doc/Vcl.WinXCtrls.xml | 18734 ++++++ Modules/DelphiVCL/doc/docs.xml | 19741 ++++++ Modules/DelphiVCL/uMain.pas | 120 +- Modules/ModulesDoc/Compiler/DocCompiler.dpr | 263 + Modules/ModulesDoc/Compiler/DocCompiler.dproj | 964 + Packages/Delphi/Delphi 10.4+/Python.dpk | 3 +- Packages/Delphi/Delphi 10.4+/Python.dproj | 5 +- Packages/Delphi/Delphi 10.4+/PythonFmx.dproj | 5 +- Packages/FPC/p4dlaz_register.pas | 50 +- Source/PythonDocs.pas | 738 + Source/VarPyth.pas | 13 +- Source/WrapDelphi.pas | 14 +- Tests/FMX/Android/MethodCallBackTest.pas | 524 +- Tests/FMX/Android/P4DAndroidTest.dpr | 36 +- Tests/FMX/Android/P4DAndroidTest.dproj | 3694 +- Tests/FMX/Android/PyEnvTest.pas | 212 +- Tests/FMX/Android/PythonLoad.pas | 258 +- Tests/FMX/Android/VarPythTest.pas | 2168 +- 141 files changed, 579087 insertions(+), 12792 deletions(-) create mode 100644 Modules/DelphiFMX/doc/Data.Bind.Components.xml create mode 100644 Modules/DelphiFMX/doc/Data.Bind.ObjectScope.xml create mode 100644 Modules/DelphiFMX/doc/FMX.ActnList.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Bind.Navigator.xml create mode 100644 Modules/DelphiFMX/doc/FMX.BufferedLayout.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Colors.xml create mode 100644 Modules/DelphiFMX/doc/FMX.ComboEdit.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Controls.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Dialogs.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Edit.xml create mode 100644 Modules/DelphiFMX/doc/FMX.EditBox.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Forms.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Grid.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Layouts.xml create mode 100644 Modules/DelphiFMX/doc/FMX.ListBox.xml create mode 100644 Modules/DelphiFMX/doc/FMX.ListView.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Media.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Memo.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Menus.xml create mode 100644 Modules/DelphiFMX/doc/FMX.MultiView.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Objects.xml create mode 100644 Modules/DelphiFMX/doc/FMX.ScrollBox.xml create mode 100644 Modules/DelphiFMX/doc/FMX.SearchBox.xml create mode 100644 Modules/DelphiFMX/doc/FMX.SpinBox.xml create mode 100644 Modules/DelphiFMX/doc/FMX.StdActns.xml create mode 100644 Modules/DelphiFMX/doc/FMX.StdCtrls.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Styles.xml create mode 100644 Modules/DelphiFMX/doc/FMX.TabControl.xml create mode 100644 Modules/DelphiFMX/doc/FMX.Types.xml create mode 100644 Modules/DelphiFMX/doc/System.Actions.xml create mode 100644 Modules/DelphiFMX/doc/System.Classes.xml create mode 100644 Modules/DelphiFMX/doc/System.Types.xml create mode 100644 Modules/DelphiFMX/doc/System.xml create mode 100644 Modules/DelphiFMX/doc/docs.xml create mode 100644 Modules/DelphiVCL/doc/Data.Bind.Components.xml create mode 100644 Modules/DelphiVCL/doc/Data.Bind.ObjectScope.xml create mode 100644 Modules/DelphiVCL/doc/System.Actions.xml create mode 100644 Modules/DelphiVCL/doc/System.Classes.xml create mode 100644 Modules/DelphiVCL/doc/System.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.ActnList.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Buttons.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.ComCtrls.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Controls.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Dialogs.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.ExtCtrls.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Forms.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Graphics.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Grids.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.MPlayer.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Menus.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.NumberBox.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Samples.Spin.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.StdCtrls.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.Themes.xml create mode 100644 Modules/DelphiVCL/doc/Vcl.WinXCtrls.xml create mode 100644 Modules/DelphiVCL/doc/docs.xml create mode 100644 Modules/ModulesDoc/Compiler/DocCompiler.dpr create mode 100644 Modules/ModulesDoc/Compiler/DocCompiler.dproj create mode 100644 Source/PythonDocs.pas diff --git a/Demos/Demo01/Demo01.dpr b/Demos/Demo01/Demo01.dpr index a5311311..f4399a7a 100644 --- a/Demos/Demo01/Demo01.dpr +++ b/Demos/Demo01/Demo01.dpr @@ -1,15 +1,15 @@ -program Demo01; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo01; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo02/Demo02.dpr b/Demos/Demo02/Demo02.dpr index 0c707f87..61e4f513 100644 --- a/Demos/Demo02/Demo02.dpr +++ b/Demos/Demo02/Demo02.dpr @@ -1,18 +1,15 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF -program Demo02; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo02; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo03/Demo03.dpr b/Demos/Demo03/Demo03.dpr index bf2ca159..c16c7d79 100644 --- a/Demos/Demo03/Demo03.dpr +++ b/Demos/Demo03/Demo03.dpr @@ -1,15 +1,15 @@ -program Demo03; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo03; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo03/Demo03.dproj b/Demos/Demo03/Demo03.dproj index a91c0015..63ceecae 100644 --- a/Demos/Demo03/Demo03.dproj +++ b/Demos/Demo03/Demo03.dproj @@ -1,166 +1,166 @@ - - - {6DC5FF01-BFF8-42E9-ACC2-10D6F1298CD9} - Demo03.dpr - True - Debug - 3 - Application - VCL - 19.1 - Win64 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - false - false - false - false - false - 00400000 - Demo03 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - RELEASE;$(DCC_Define) - 0 - false - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - false - true - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\delphi_PROJECTICON.ico - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\delphi_PROJECTICON.ico - - - - MainSource - - -
    Form1`
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - Delphi.Personality.12 - - - - - Demo03.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - True - True - - - 12 - - - -
    + + + {6DC5FF01-BFF8-42E9-ACC2-10D6F1298CD9} + Demo03.dpr + True + Debug + 3 + Application + VCL + 19.1 + Win64 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + false + false + false + false + false + 00400000 + Demo03 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + RELEASE;$(DCC_Define) + 0 + false + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + false + true + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\delphi_PROJECTICON.ico + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\delphi_PROJECTICON.ico + + + + MainSource + + +
    Form1`
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + Delphi.Personality.12 + + + + + Demo03.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + True + + + 12 + + + +
    diff --git a/Demos/Demo04/Demo04.dpr b/Demos/Demo04/Demo04.dpr index c7c5cb0e..00fc89f5 100644 --- a/Demos/Demo04/Demo04.dpr +++ b/Demos/Demo04/Demo04.dpr @@ -1,15 +1,15 @@ -program Demo04; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo04; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo04/Demo04.dproj b/Demos/Demo04/Demo04.dproj index 55b317e3..c035013e 100644 --- a/Demos/Demo04/Demo04.dproj +++ b/Demos/Demo04/Demo04.dproj @@ -1,187 +1,187 @@ - - - {6F45452F-882D-4BBD-8AEA-872276E8B856} - Demo04.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo04.exe - 00400000 - x86 - Demo04 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\delphi_PROJECTICON.ico - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo04.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {6F45452F-882D-4BBD-8AEA-872276E8B856} + Demo04.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo04.exe + 00400000 + x86 + Demo04 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\delphi_PROJECTICON.ico + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo04.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo05/Demo05.dpr b/Demos/Demo05/Demo05.dpr index ffc556ff..800acbf5 100644 --- a/Demos/Demo05/Demo05.dpr +++ b/Demos/Demo05/Demo05.dpr @@ -1,15 +1,15 @@ -program Demo05; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo05; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo05/Demo05.dproj b/Demos/Demo05/Demo05.dproj index 76b0d9ae..b4952350 100644 --- a/Demos/Demo05/Demo05.dproj +++ b/Demos/Demo05/Demo05.dproj @@ -1,186 +1,186 @@ - - - {38ABBD9D-A0AD-422F-959B-062CAB828F37} - Demo05.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo05.exe - 00400000 - x86 - Demo05 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo05.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {38ABBD9D-A0AD-422F-959B-062CAB828F37} + Demo05.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo05.exe + 00400000 + x86 + Demo05 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo05.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo05/Unit1.dfm b/Demos/Demo05/Unit1.dfm index 762973c6..e5e357e1 100644 --- a/Demos/Demo05/Unit1.dfm +++ b/Demos/Demo05/Unit1.dfm @@ -1,128 +1,128 @@ -object Form1: TForm1 - Left = 190 - Top = 118 - Caption = 'Demo of Python' - ClientHeight = 336 - ClientWidth = 528 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True - Position = poDefault - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 0 - Top = 129 - Width = 528 - Height = 3 - Cursor = crVSplit - Align = alTop - ExplicitWidth = 536 - end - object Memo1: TMemo - Left = 0 - Top = 132 - Width = 528 - Height = 168 - Align = alClient - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - Lines.Strings = ( - 'import spam' - 'print (spam.foo('#39'hello world'#39', 1))') - ParentFont = False - ScrollBars = ssBoth - TabOrder = 1 - end - object Panel1: TPanel - Left = 0 - Top = 300 - Width = 528 - Height = 36 - Align = alBottom - BevelOuter = bvNone - TabOrder = 0 - object Button1: TButton - Left = 6 - Top = 8 - Width = 115 - Height = 25 - Caption = 'Execute script' - TabOrder = 0 - OnClick = Button1Click - end - object Button2: TButton - Left = 168 - Top = 8 - Width = 91 - Height = 25 - Caption = 'Load script...' - TabOrder = 1 - OnClick = Button2Click - end - object Button3: TButton - Left = 264 - Top = 8 - Width = 89 - Height = 25 - Caption = 'Save script...' - TabOrder = 2 - OnClick = Button3Click - end - end - object Memo2: TMemo - Left = 0 - Top = 0 - Width = 528 - Height = 129 - Align = alTop - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - Lines.Strings = ( - 'Memo2') - ParentFont = False - TabOrder = 2 - end - object PythonEngine1: TPythonEngine - InitScript.Strings = ( - 'import sys' - 'print ("Python Dll: ", sys.version)' - 'print (sys.copyright)' - 'print') - IO = PythonGUIInputOutput1 - Left = 32 - end - object PythonModule1: TPythonModule - Engine = PythonEngine1 - OnInitialization = PythonModule1Initialization - ModuleName = 'spam' - Errors = <> - Left = 96 - end - object OpenDialog1: TOpenDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 176 - end - object SaveDialog1: TSaveDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 208 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo2 - Left = 64 - end -end +object Form1: TForm1 + Left = 190 + Top = 118 + Caption = 'Demo of Python' + ClientHeight = 336 + ClientWidth = 528 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poDefault + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 0 + Top = 129 + Width = 528 + Height = 3 + Cursor = crVSplit + Align = alTop + ExplicitWidth = 536 + end + object Memo1: TMemo + Left = 0 + Top = 132 + Width = 528 + Height = 168 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + Lines.Strings = ( + 'import spam' + 'print (spam.foo('#39'hello world'#39', 1))') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Top = 300 + Width = 528 + Height = 36 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Button1: TButton + Left = 6 + Top = 8 + Width = 115 + Height = 25 + Caption = 'Execute script' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 168 + Top = 8 + Width = 91 + Height = 25 + Caption = 'Load script...' + TabOrder = 1 + OnClick = Button2Click + end + object Button3: TButton + Left = 264 + Top = 8 + Width = 89 + Height = 25 + Caption = 'Save script...' + TabOrder = 2 + OnClick = Button3Click + end + end + object Memo2: TMemo + Left = 0 + Top = 0 + Width = 528 + Height = 129 + Align = alTop + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + Lines.Strings = ( + 'Memo2') + ParentFont = False + TabOrder = 2 + end + object PythonEngine1: TPythonEngine + InitScript.Strings = ( + 'import sys' + 'print ("Python Dll: ", sys.version)' + 'print (sys.copyright)' + 'print') + IO = PythonGUIInputOutput1 + Left = 32 + end + object PythonModule1: TPythonModule + Engine = PythonEngine1 + OnInitialization = PythonModule1Initialization + ModuleName = 'spam' + Errors = <> + Left = 96 + end + object OpenDialog1: TOpenDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 176 + end + object SaveDialog1: TSaveDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 208 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo2 + Left = 64 + end +end diff --git a/Demos/Demo06/Demo06.dpr b/Demos/Demo06/Demo06.dpr index 56766a80..23e00f90 100644 --- a/Demos/Demo06/Demo06.dpr +++ b/Demos/Demo06/Demo06.dpr @@ -1,15 +1,15 @@ -program Demo06; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo06; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo06/Demo06.dproj b/Demos/Demo06/Demo06.dproj index 77c3531a..cc11ba22 100644 --- a/Demos/Demo06/Demo06.dproj +++ b/Demos/Demo06/Demo06.dproj @@ -1,177 +1,177 @@ - - - {2E88E1AD-C1A3-403E-8AEE-28895B68FBF7} - Demo06.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1033 - Demo06.exe - 00400000 - x86 - Demo06 - - - true - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - Debug - true - $(BDS)\bin\delphi_PROJECTICON.ico - true - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\delphi_PROJECTICON.ico - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo06.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {2E88E1AD-C1A3-403E-8AEE-28895B68FBF7} + Demo06.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1033 + Demo06.exe + 00400000 + x86 + Demo06 + + + true + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + Debug + true + $(BDS)\bin\delphi_PROJECTICON.ico + true + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\delphi_PROJECTICON.ico + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo06.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo07/Demo07.dpr b/Demos/Demo07/Demo07.dpr index 29711893..3af181e0 100644 --- a/Demos/Demo07/Demo07.dpr +++ b/Demos/Demo07/Demo07.dpr @@ -1,15 +1,15 @@ -program Demo07; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo07; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo07/Demo07.dproj b/Demos/Demo07/Demo07.dproj index 580c213c..dd68a805 100644 --- a/Demos/Demo07/Demo07.dproj +++ b/Demos/Demo07/Demo07.dproj @@ -1,176 +1,176 @@ - - - {241C5DB1-E30A-4305-9F0A-4B7DD00FAD59} - Demo07.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1033 - Demo07.exe - 00400000 - x86 - Demo07 - - - true - Demo07_Icon1.ico - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - Demo07_Icon1.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - Debug - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\delphi_PROJECTICON.ico - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo07.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {241C5DB1-E30A-4305-9F0A-4B7DD00FAD59} + Demo07.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1033 + Demo07.exe + 00400000 + x86 + Demo07 + + + true + Demo07_Icon1.ico + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + Demo07_Icon1.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + Debug + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\delphi_PROJECTICON.ico + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo07.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo08/Demo08.dpr b/Demos/Demo08/Demo08.dpr index 12b61e1a..478925ab 100644 --- a/Demos/Demo08/Demo08.dpr +++ b/Demos/Demo08/Demo08.dpr @@ -1,15 +1,15 @@ -program Demo08; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo08; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo08/Demo08.dproj b/Demos/Demo08/Demo08.dproj index 54fe398e..bece2620 100644 --- a/Demos/Demo08/Demo08.dproj +++ b/Demos/Demo08/Demo08.dproj @@ -1,174 +1,174 @@ - - - {237903A4-03D0-4047-A134-AAF207C6AC42} - Demo08.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1033 - Demo08.exe - 00400000 - x86 - Demo08 - - - true - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - Debug - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\delphi_PROJECTICON.ico - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo08.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {237903A4-03D0-4047-A134-AAF207C6AC42} + Demo08.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1033 + Demo08.exe + 00400000 + x86 + Demo08 + + + true + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + Debug + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\delphi_PROJECTICON.ico + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo08.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo09/Demo09.dpr b/Demos/Demo09/Demo09.dpr index d184dc72..fde08269 100644 --- a/Demos/Demo09/Demo09.dpr +++ b/Demos/Demo09/Demo09.dpr @@ -1,15 +1,15 @@ -program Demo09; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo09; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo09/Demo09.dproj b/Demos/Demo09/Demo09.dproj index 6333c9b6..8408899f 100644 --- a/Demos/Demo09/Demo09.dproj +++ b/Demos/Demo09/Demo09.dproj @@ -1,186 +1,186 @@ - - - {A9EE3C80-927A-458F-83F8-5388BD57BAF3} - Demo09.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo09.exe - 00400000 - x86 - Demo09 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo09.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {A9EE3C80-927A-458F-83F8-5388BD57BAF3} + Demo09.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo09.exe + 00400000 + x86 + Demo09 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo09.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo09/grpDemo09.groupproj b/Demos/Demo09/grpDemo09.groupproj index 0b77844d..9305db3c 100644 --- a/Demos/Demo09/grpDemo09.groupproj +++ b/Demos/Demo09/grpDemo09.groupproj @@ -1,48 +1,48 @@ - - - {8878F812-492D-407E-9ED1-8A9BB8A14A3C} - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + {8878F812-492D-407E-9ED1-8A9BB8A14A3C} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos/Demo16/Example1/Demo16a.dpr b/Demos/Demo16/Example1/Demo16a.dpr index 54592df1..6dccbeab 100644 --- a/Demos/Demo16/Example1/Demo16a.dpr +++ b/Demos/Demo16/Example1/Demo16a.dpr @@ -1,15 +1,15 @@ -program Demo16a; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo16a; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo16/Example1/Demo16a.dproj b/Demos/Demo16/Example1/Demo16a.dproj index 4e842bf8..fba49668 100644 --- a/Demos/Demo16/Example1/Demo16a.dproj +++ b/Demos/Demo16/Example1/Demo16a.dproj @@ -1,189 +1,189 @@ - - - {FEB76A6C-3FF0-423D-AA7F-BA28CE5A6B63} - Demo16a.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo16a.exe - 00400000 - x86 - Demo16a - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - $(BDS)\bin\delphi_PROJECTICON.ico - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo16a.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {FEB76A6C-3FF0-423D-AA7F-BA28CE5A6B63} + Demo16a.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo16a.exe + 00400000 + x86 + Demo16a + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + $(BDS)\bin\delphi_PROJECTICON.ico + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo16a.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo16/Example1/Unit1.dfm b/Demos/Demo16/Example1/Unit1.dfm index 56e61e47..bf5b44b1 100644 --- a/Demos/Demo16/Example1/Unit1.dfm +++ b/Demos/Demo16/Example1/Unit1.dfm @@ -1,244 +1,244 @@ -object Form1: TForm1 - Left = 200 - Top = 108 - Caption = 'Example 1 : Using a DelphiVar with a Dictionary' - ClientHeight = 441 - ClientWidth = 812 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 305 - Top = 0 - Height = 441 - ExplicitHeight = 446 - end - object Panel1: TPanel - Left = 0 - Top = 0 - Width = 305 - Height = 441 - Align = alLeft - BevelOuter = bvNone - TabOrder = 0 - object GroupBox1: TGroupBox - Left = 16 - Top = 8 - Width = 273 - Height = 377 - Caption = 'Properties' - TabOrder = 0 - object Label1: TLabel - Left = 16 - Top = 16 - Width = 23 - Height = 13 - Caption = 'Title:' - end - object Label2: TLabel - Left = 16 - Top = 64 - Width = 31 - Height = 13 - Caption = 'Name:' - end - object Label3: TLabel - Left = 128 - Top = 176 - Width = 22 - Height = 13 - Caption = 'Age:' - end - object edName: TEdit - Left = 16 - Top = 80 - Width = 241 - Height = 21 - TabOrder = 0 - Text = 'Smith' - end - object cbInformatician: TCheckBox - Left = 16 - Top = 120 - Width = 97 - Height = 17 - Caption = 'Informatician?' - Checked = True - State = cbChecked - TabOrder = 1 - end - object rgSex: TRadioGroup - Left = 16 - Top = 168 - Width = 97 - Height = 65 - Caption = 'Sex' - ItemIndex = 0 - Items.Strings = ( - 'Male' - 'Female') - TabOrder = 2 - end - object cbPythonUser: TCheckBox - Left = 16 - Top = 136 - Width = 97 - Height = 17 - Caption = 'Python user?' - TabOrder = 3 - end - object cbTitle: TComboBox - Left = 16 - Top = 32 - Width = 241 - Height = 21 - TabOrder = 4 - Text = 'Mr' - Items.Strings = ( - 'Mr' - 'Mrs' - 'Miss' - 'Dr') - end - object edAge: TEdit - Left = 128 - Top = 192 - Width = 121 - Height = 21 - TabOrder = 5 - Text = '35' - end - end - object Button1: TButton - Left = 88 - Top = 408 - Width = 129 - Height = 25 - Caption = 'Execute Script' - TabOrder = 1 - OnClick = Button1Click - end - end - object Panel2: TPanel - Left = 308 - Top = 0 - Width = 504 - Height = 441 - Align = alClient - BevelOuter = bvNone - TabOrder = 1 - object Splitter2: TSplitter - Left = 0 - Top = 153 - Width = 504 - Height = 3 - Cursor = crVSplit - Align = alTop - ExplicitWidth = 380 - end - object Memo1: TMemo - Left = 0 - Top = 156 - Width = 504 - Height = 285 - Align = alClient - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - Lines.Strings = ( - '# Define some constants' - 'Male = 0' - 'Female = 1' - '' - '# Display the Properties content' - 'print (Properties)' - '# Get one of the properties' - 'print (Properties.Value['#39'Title'#39'])' - '# Change one of the properties' - 'Properties.Value['#39'Age'#39'] = 55' - '# By reassigning the same object, we force the OnChange event' - '# That will update the Delphi controls' - 'Properties.Value = Properties.Value' - '' - '# We can simplify it with a new class' - 'class TProperties:' - ' def __init__(Self, DelphiVar):' - ' Self.__DelphiVar__ = DelphiVar' - '' - ' def __getattr__(Self, Key):' - ' return Self.__dict__['#39'__DelphiVar__'#39'].Value[Key]' - '' - ' def __setattr__(Self, Key, Value):' - ' if Key == "__DelphiVar__":' - ' Self.__dict__['#39'__DelphiVar__'#39'] = Value' - ' else:' - ' Self.__DelphiVar__.Value[Key] = Value' - ' Self.__DelphiVar__.Value = Self.__DelphiVar__.Value' - '' - ' def __repr__(Self):' - ' return str(Self.__DelphiVar__.Value)' - '' - ' def __str__(Self):' - ' return str(Self.__DelphiVar__.Value)' - '' - '# Instantiate our new class' - 'Props = TProperties( Properties )' - '# Use this instance to read/write the properties' - 'print ("Name:", Props.Name)' - 'Props.Name = "Watson"' - 'Props.PythonUser = True' - 'if Props.Sex == Male:' - ' print (Props.Name, "is male!")' - 'else:' - ' print (Props.Name, "is female!")' - 'print (Props)') - ParentFont = False - ScrollBars = ssBoth - TabOrder = 0 - end - object Memo2: TMemo - Left = 0 - Top = 0 - Width = 504 - Height = 153 - Align = alTop - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - ParentFont = False - TabOrder = 1 - end - end - object PythonEngine1: TPythonEngine - IO = PythonGUIInputOutput1 - Left = 8 - Top = 400 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo2 - Left = 40 - Top = 400 - end - object PythonDelphiVar1: TPythonDelphiVar - Engine = PythonEngine1 - Module = '__main__' - VarName = 'Properties' - OnExtGetData = PythonDelphiVar1ExtGetData - OnExtSetData = PythonDelphiVar1ExtSetData - OnChange = PythonDelphiVar1Change - Left = 240 - Top = 400 - end -end +object Form1: TForm1 + Left = 200 + Top = 108 + Caption = 'Example 1 : Using a DelphiVar with a Dictionary' + ClientHeight = 441 + ClientWidth = 812 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 305 + Top = 0 + Height = 441 + ExplicitHeight = 446 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 305 + Height = 441 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object GroupBox1: TGroupBox + Left = 16 + Top = 8 + Width = 273 + Height = 377 + Caption = 'Properties' + TabOrder = 0 + object Label1: TLabel + Left = 16 + Top = 16 + Width = 23 + Height = 13 + Caption = 'Title:' + end + object Label2: TLabel + Left = 16 + Top = 64 + Width = 31 + Height = 13 + Caption = 'Name:' + end + object Label3: TLabel + Left = 128 + Top = 176 + Width = 22 + Height = 13 + Caption = 'Age:' + end + object edName: TEdit + Left = 16 + Top = 80 + Width = 241 + Height = 21 + TabOrder = 0 + Text = 'Smith' + end + object cbInformatician: TCheckBox + Left = 16 + Top = 120 + Width = 97 + Height = 17 + Caption = 'Informatician?' + Checked = True + State = cbChecked + TabOrder = 1 + end + object rgSex: TRadioGroup + Left = 16 + Top = 168 + Width = 97 + Height = 65 + Caption = 'Sex' + ItemIndex = 0 + Items.Strings = ( + 'Male' + 'Female') + TabOrder = 2 + end + object cbPythonUser: TCheckBox + Left = 16 + Top = 136 + Width = 97 + Height = 17 + Caption = 'Python user?' + TabOrder = 3 + end + object cbTitle: TComboBox + Left = 16 + Top = 32 + Width = 241 + Height = 21 + TabOrder = 4 + Text = 'Mr' + Items.Strings = ( + 'Mr' + 'Mrs' + 'Miss' + 'Dr') + end + object edAge: TEdit + Left = 128 + Top = 192 + Width = 121 + Height = 21 + TabOrder = 5 + Text = '35' + end + end + object Button1: TButton + Left = 88 + Top = 408 + Width = 129 + Height = 25 + Caption = 'Execute Script' + TabOrder = 1 + OnClick = Button1Click + end + end + object Panel2: TPanel + Left = 308 + Top = 0 + Width = 504 + Height = 441 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object Splitter2: TSplitter + Left = 0 + Top = 153 + Width = 504 + Height = 3 + Cursor = crVSplit + Align = alTop + ExplicitWidth = 380 + end + object Memo1: TMemo + Left = 0 + Top = 156 + Width = 504 + Height = 285 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + Lines.Strings = ( + '# Define some constants' + 'Male = 0' + 'Female = 1' + '' + '# Display the Properties content' + 'print (Properties)' + '# Get one of the properties' + 'print (Properties.Value['#39'Title'#39'])' + '# Change one of the properties' + 'Properties.Value['#39'Age'#39'] = 55' + '# By reassigning the same object, we force the OnChange event' + '# That will update the Delphi controls' + 'Properties.Value = Properties.Value' + '' + '# We can simplify it with a new class' + 'class TProperties:' + ' def __init__(Self, DelphiVar):' + ' Self.__DelphiVar__ = DelphiVar' + '' + ' def __getattr__(Self, Key):' + ' return Self.__dict__['#39'__DelphiVar__'#39'].Value[Key]' + '' + ' def __setattr__(Self, Key, Value):' + ' if Key == "__DelphiVar__":' + ' Self.__dict__['#39'__DelphiVar__'#39'] = Value' + ' else:' + ' Self.__DelphiVar__.Value[Key] = Value' + ' Self.__DelphiVar__.Value = Self.__DelphiVar__.Value' + '' + ' def __repr__(Self):' + ' return str(Self.__DelphiVar__.Value)' + '' + ' def __str__(Self):' + ' return str(Self.__DelphiVar__.Value)' + '' + '# Instantiate our new class' + 'Props = TProperties( Properties )' + '# Use this instance to read/write the properties' + 'print ("Name:", Props.Name)' + 'Props.Name = "Watson"' + 'Props.PythonUser = True' + 'if Props.Sex == Male:' + ' print (Props.Name, "is male!")' + 'else:' + ' print (Props.Name, "is female!")' + 'print (Props)') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 0 + end + object Memo2: TMemo + Left = 0 + Top = 0 + Width = 504 + Height = 153 + Align = alTop + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + ParentFont = False + TabOrder = 1 + end + end + object PythonEngine1: TPythonEngine + IO = PythonGUIInputOutput1 + Left = 8 + Top = 400 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo2 + Left = 40 + Top = 400 + end + object PythonDelphiVar1: TPythonDelphiVar + Engine = PythonEngine1 + Module = '__main__' + VarName = 'Properties' + OnExtGetData = PythonDelphiVar1ExtGetData + OnExtSetData = PythonDelphiVar1ExtSetData + OnChange = PythonDelphiVar1Change + Left = 240 + Top = 400 + end +end diff --git a/Demos/Demo16/Example2/Demo16b.dpr b/Demos/Demo16/Example2/Demo16b.dpr index 030afc3c..cb740757 100644 --- a/Demos/Demo16/Example2/Demo16b.dpr +++ b/Demos/Demo16/Example2/Demo16b.dpr @@ -1,15 +1,15 @@ -program Demo16b; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo16b; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo16/Example2/Demo16b.dproj b/Demos/Demo16/Example2/Demo16b.dproj index 093ab973..151e48f2 100644 --- a/Demos/Demo16/Example2/Demo16b.dproj +++ b/Demos/Demo16/Example2/Demo16b.dproj @@ -1,189 +1,189 @@ - - - {3B870EA7-EAEB-434F-8C0D-2800B09DC00C} - Demo16b.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo16b.exe - 00400000 - x86 - Demo16b - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - $(BDS)\bin\delphi_PROJECTICON.ico - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo16b.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {3B870EA7-EAEB-434F-8C0D-2800B09DC00C} + Demo16b.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo16b.exe + 00400000 + x86 + Demo16b + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + $(BDS)\bin\delphi_PROJECTICON.ico + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo16b.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo16/Example2/Unit1.dfm b/Demos/Demo16/Example2/Unit1.dfm index c1b00546..d5911db8 100644 --- a/Demos/Demo16/Example2/Unit1.dfm +++ b/Demos/Demo16/Example2/Unit1.dfm @@ -1,234 +1,234 @@ -object Form1: TForm1 - Left = 200 - Top = 108 - Caption = 'Example 2 : using module functions' - ClientHeight = 441 - ClientWidth = 680 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 305 - Top = 0 - Height = 441 - ExplicitHeight = 453 - end - object Panel1: TPanel - Left = 0 - Top = 0 - Width = 305 - Height = 441 - Align = alLeft - BevelOuter = bvNone - TabOrder = 0 - object GroupBox1: TGroupBox - Left = 16 - Top = 8 - Width = 273 - Height = 377 - Caption = 'Properties' - TabOrder = 0 - object Label1: TLabel - Left = 16 - Top = 16 - Width = 23 - Height = 13 - Caption = 'Title:' - end - object Label2: TLabel - Left = 16 - Top = 64 - Width = 31 - Height = 13 - Caption = 'Name:' - end - object Label3: TLabel - Left = 128 - Top = 176 - Width = 22 - Height = 13 - Caption = 'Age:' - end - object edName: TEdit - Left = 16 - Top = 80 - Width = 241 - Height = 21 - TabOrder = 0 - Text = 'Smith' - end - object cbInformatician: TCheckBox - Left = 16 - Top = 120 - Width = 97 - Height = 17 - Caption = 'Informatician ?' - Checked = True - State = cbChecked - TabOrder = 1 - end - object rgSex: TRadioGroup - Left = 16 - Top = 168 - Width = 97 - Height = 65 - Caption = 'Sex' - ItemIndex = 0 - Items.Strings = ( - 'Male' - 'Female') - TabOrder = 2 - end - object cbPythonUser: TCheckBox - Left = 16 - Top = 136 - Width = 97 - Height = 17 - Caption = 'Python User ?' - TabOrder = 3 - end - object cbTitle: TComboBox - Left = 16 - Top = 32 - Width = 241 - Height = 21 - TabOrder = 4 - Text = 'Mr' - Items.Strings = ( - 'Mr' - 'Mrs' - 'Miss' - 'Dr') - end - object edAge: TEdit - Left = 128 - Top = 192 - Width = 121 - Height = 21 - TabOrder = 5 - Text = '35' - end - end - object Button1: TButton - Left = 88 - Top = 408 - Width = 129 - Height = 25 - Caption = 'Execute Script' - TabOrder = 1 - OnClick = Button1Click - end - end - object Panel2: TPanel - Left = 308 - Top = 0 - Width = 372 - Height = 441 - Align = alClient - BevelOuter = bvNone - TabOrder = 1 - object Splitter2: TSplitter - Left = 0 - Top = 209 - Width = 372 - Height = 3 - Cursor = crVSplit - Align = alTop - ExplicitWidth = 380 - end - object Memo1: TMemo - Left = 0 - Top = 212 - Width = 372 - Height = 229 - Align = alClient - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - Lines.Strings = ( - 'import props' - '# Define some constants' - 'Male = 0' - 'Female = 1' - '' - '# Get one of the properties' - 'print (props.GetProperty('#39'Title'#39'))' - '# Change one of the properties' - 'props.SetProperty('#39'Age'#39', 55)' - '' - '# We can simplify it with a new class' - 'class TProperties:' - ' def __getattr__(Self, Key):' - ' return props.GetProperty(Key)' - '' - ' def __setattr__(Self, Key, Value):' - ' props.SetProperty(Key, Value)' - '' - ' def __repr__(Self):' - ' tmp = ""' - ' for i in props.GetPropertyList():' - ' if tmp:' - ' tmp = tmp + ", "' - ' tmp = tmp + i + " = " + str(getattr(Self,i))' - ' return tmp' - '' - '# Instantiate our new class' - 'Props = TProperties()' - '# Use this instance to read/write the properties' - 'print ("Name:", Props.Name)' - 'Props.Name = "Watson"' - 'Props.PythonUser = True' - 'if Props.Sex == Male:' - ' print (Props.Name, "is male!")' - 'else:' - ' print (Props.Name, "is female!")' - 'print (Props)') - ParentFont = False - ScrollBars = ssBoth - TabOrder = 0 - WordWrap = False - end - object Memo2: TMemo - Left = 0 - Top = 0 - Width = 372 - Height = 209 - Align = alTop - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - ParentFont = False - TabOrder = 1 - end - end - object PythonEngine1: TPythonEngine - IO = PythonGUIInputOutput1 - Left = 8 - Top = 400 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo2 - Left = 40 - Top = 400 - end - object PythonModule1: TPythonModule - Engine = PythonEngine1 - OnInitialization = PythonModule1Initialization - ModuleName = 'props' - Errors = <> - Left = 232 - Top = 400 - end -end +object Form1: TForm1 + Left = 200 + Top = 108 + Caption = 'Example 2 : using module functions' + ClientHeight = 441 + ClientWidth = 680 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 305 + Top = 0 + Height = 441 + ExplicitHeight = 453 + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 305 + Height = 441 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object GroupBox1: TGroupBox + Left = 16 + Top = 8 + Width = 273 + Height = 377 + Caption = 'Properties' + TabOrder = 0 + object Label1: TLabel + Left = 16 + Top = 16 + Width = 23 + Height = 13 + Caption = 'Title:' + end + object Label2: TLabel + Left = 16 + Top = 64 + Width = 31 + Height = 13 + Caption = 'Name:' + end + object Label3: TLabel + Left = 128 + Top = 176 + Width = 22 + Height = 13 + Caption = 'Age:' + end + object edName: TEdit + Left = 16 + Top = 80 + Width = 241 + Height = 21 + TabOrder = 0 + Text = 'Smith' + end + object cbInformatician: TCheckBox + Left = 16 + Top = 120 + Width = 97 + Height = 17 + Caption = 'Informatician ?' + Checked = True + State = cbChecked + TabOrder = 1 + end + object rgSex: TRadioGroup + Left = 16 + Top = 168 + Width = 97 + Height = 65 + Caption = 'Sex' + ItemIndex = 0 + Items.Strings = ( + 'Male' + 'Female') + TabOrder = 2 + end + object cbPythonUser: TCheckBox + Left = 16 + Top = 136 + Width = 97 + Height = 17 + Caption = 'Python User ?' + TabOrder = 3 + end + object cbTitle: TComboBox + Left = 16 + Top = 32 + Width = 241 + Height = 21 + TabOrder = 4 + Text = 'Mr' + Items.Strings = ( + 'Mr' + 'Mrs' + 'Miss' + 'Dr') + end + object edAge: TEdit + Left = 128 + Top = 192 + Width = 121 + Height = 21 + TabOrder = 5 + Text = '35' + end + end + object Button1: TButton + Left = 88 + Top = 408 + Width = 129 + Height = 25 + Caption = 'Execute Script' + TabOrder = 1 + OnClick = Button1Click + end + end + object Panel2: TPanel + Left = 308 + Top = 0 + Width = 372 + Height = 441 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object Splitter2: TSplitter + Left = 0 + Top = 209 + Width = 372 + Height = 3 + Cursor = crVSplit + Align = alTop + ExplicitWidth = 380 + end + object Memo1: TMemo + Left = 0 + Top = 212 + Width = 372 + Height = 229 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + Lines.Strings = ( + 'import props' + '# Define some constants' + 'Male = 0' + 'Female = 1' + '' + '# Get one of the properties' + 'print (props.GetProperty('#39'Title'#39'))' + '# Change one of the properties' + 'props.SetProperty('#39'Age'#39', 55)' + '' + '# We can simplify it with a new class' + 'class TProperties:' + ' def __getattr__(Self, Key):' + ' return props.GetProperty(Key)' + '' + ' def __setattr__(Self, Key, Value):' + ' props.SetProperty(Key, Value)' + '' + ' def __repr__(Self):' + ' tmp = ""' + ' for i in props.GetPropertyList():' + ' if tmp:' + ' tmp = tmp + ", "' + ' tmp = tmp + i + " = " + str(getattr(Self,i))' + ' return tmp' + '' + '# Instantiate our new class' + 'Props = TProperties()' + '# Use this instance to read/write the properties' + 'print ("Name:", Props.Name)' + 'Props.Name = "Watson"' + 'Props.PythonUser = True' + 'if Props.Sex == Male:' + ' print (Props.Name, "is male!")' + 'else:' + ' print (Props.Name, "is female!")' + 'print (Props)') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object Memo2: TMemo + Left = 0 + Top = 0 + Width = 372 + Height = 209 + Align = alTop + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + ParentFont = False + TabOrder = 1 + end + end + object PythonEngine1: TPythonEngine + IO = PythonGUIInputOutput1 + Left = 8 + Top = 400 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo2 + Left = 40 + Top = 400 + end + object PythonModule1: TPythonModule + Engine = PythonEngine1 + OnInitialization = PythonModule1Initialization + ModuleName = 'props' + Errors = <> + Left = 232 + Top = 400 + end +end diff --git a/Demos/Demo17/Demo17.dpr b/Demos/Demo17/Demo17.dpr index c8fa2a6a..f99a8739 100644 --- a/Demos/Demo17/Demo17.dpr +++ b/Demos/Demo17/Demo17.dpr @@ -1,15 +1,15 @@ -program Demo17; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo17; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo17/Demo17.dproj b/Demos/Demo17/Demo17.dproj index 34ec8770..1b4922db 100644 --- a/Demos/Demo17/Demo17.dproj +++ b/Demos/Demo17/Demo17.dproj @@ -1,189 +1,189 @@ - - - {45B70068-605E-4FFB-B78E-2045071FD5FA} - Demo17.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo17.exe - 00400000 - x86 - Demo17 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo17.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {45B70068-605E-4FFB-B78E-2045071FD5FA} + Demo17.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo17.exe + 00400000 + x86 + Demo17 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo17.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo17/Unit1.dfm b/Demos/Demo17/Unit1.dfm index d5def1fd..2e80f769 100644 --- a/Demos/Demo17/Unit1.dfm +++ b/Demos/Demo17/Unit1.dfm @@ -1,123 +1,123 @@ -object Form1: TForm1 - Left = 237 - Top = 135 - Caption = 'Demo of Python' - ClientHeight = 421 - ClientWidth = 528 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 0 - Top = 280 - Width = 528 - Height = 3 - Cursor = crVSplit - Align = alTop - ExplicitTop = 273 - ExplicitWidth = 536 - end - object Memo1: TMemo - Left = 0 - Top = 283 - Width = 528 - Height = 94 - Align = alClient - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - Lines.Strings = ( - 'import test' - 'print ("Displaying a sequence generated from a variant array:")' - 'print (test.L)' - 'print') - ParentFont = False - ScrollBars = ssBoth - TabOrder = 1 - end - object Panel1: TPanel - Left = 0 - Top = 377 - Width = 528 - Height = 44 - Align = alBottom - BevelOuter = bvNone - TabOrder = 0 - object Button1: TButton - Left = 6 - Top = 8 - Width = 115 - Height = 25 - Caption = 'Execute script' - TabOrder = 0 - OnClick = Button1Click - end - object Button2: TButton - Left = 168 - Top = 8 - Width = 91 - Height = 25 - Caption = 'Load script...' - TabOrder = 1 - OnClick = Button2Click - end - object Button3: TButton - Left = 264 - Top = 8 - Width = 89 - Height = 25 - Caption = 'Save script...' - TabOrder = 2 - OnClick = Button3Click - end - end - object Memo2: TMemo - Left = 0 - Top = 0 - Width = 528 - Height = 280 - Align = alTop - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Style = [] - ParentFont = False - ScrollBars = ssBoth - TabOrder = 2 - end - object PythonEngine1: TPythonEngine - IO = PythonGUIInputOutput1 - Left = 32 - end - object OpenDialog1: TOpenDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 176 - end - object SaveDialog1: TSaveDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 208 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo2 - Left = 64 - end - object PythonModule1: TPythonModule - Engine = PythonEngine1 - ModuleName = 'test' - Errors = <> - Left = 96 - end -end +object Form1: TForm1 + Left = 237 + Top = 135 + Caption = 'Demo of Python' + ClientHeight = 421 + ClientWidth = 528 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 0 + Top = 280 + Width = 528 + Height = 3 + Cursor = crVSplit + Align = alTop + ExplicitTop = 273 + ExplicitWidth = 536 + end + object Memo1: TMemo + Left = 0 + Top = 283 + Width = 528 + Height = 94 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + Lines.Strings = ( + 'import test' + 'print ("Displaying a sequence generated from a variant array:")' + 'print (test.L)' + 'print') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Top = 377 + Width = 528 + Height = 44 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Button1: TButton + Left = 6 + Top = 8 + Width = 115 + Height = 25 + Caption = 'Execute script' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 168 + Top = 8 + Width = 91 + Height = 25 + Caption = 'Load script...' + TabOrder = 1 + OnClick = Button2Click + end + object Button3: TButton + Left = 264 + Top = 8 + Width = 89 + Height = 25 + Caption = 'Save script...' + TabOrder = 2 + OnClick = Button3Click + end + end + object Memo2: TMemo + Left = 0 + Top = 0 + Width = 528 + Height = 280 + Align = alTop + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Style = [] + ParentFont = False + ScrollBars = ssBoth + TabOrder = 2 + end + object PythonEngine1: TPythonEngine + IO = PythonGUIInputOutput1 + Left = 32 + end + object OpenDialog1: TOpenDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 176 + end + object SaveDialog1: TSaveDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 208 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo2 + Left = 64 + end + object PythonModule1: TPythonModule + Engine = PythonEngine1 + ModuleName = 'test' + Errors = <> + Left = 96 + end +end diff --git a/Demos/Demo21/Demo21.dpr b/Demos/Demo21/Demo21.dpr index 4e33a039..f700414e 100644 --- a/Demos/Demo21/Demo21.dpr +++ b/Demos/Demo21/Demo21.dpr @@ -1,15 +1,15 @@ -program Demo21; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo21; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo21/Demo21.dproj b/Demos/Demo21/Demo21.dproj index 6923bc14..0c7ee8e0 100644 --- a/Demos/Demo21/Demo21.dproj +++ b/Demos/Demo21/Demo21.dproj @@ -1,189 +1,189 @@ - - - {8A0913B4-35C9-4DDA-A98A-02C28A91C049} - Demo21.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo21.exe - 00400000 - x86 - Demo21 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo21.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {8A0913B4-35C9-4DDA-A98A-02C28A91C049} + Demo21.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo21.exe + 00400000 + x86 + Demo21 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo21.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo22/Demo22.dpr b/Demos/Demo22/Demo22.dpr index e689f19f..86330e45 100644 --- a/Demos/Demo22/Demo22.dpr +++ b/Demos/Demo22/Demo22.dpr @@ -1,15 +1,15 @@ -program Demo22; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo22; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo22/Demo22.dproj b/Demos/Demo22/Demo22.dproj index 31273eb7..e3e76808 100644 --- a/Demos/Demo22/Demo22.dproj +++ b/Demos/Demo22/Demo22.dproj @@ -1,190 +1,190 @@ - - - {17D5A3A6-4820-4D9C-BD8A-71D8B83709A0} - Demo22.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo22.exe - 00400000 - x86 - Demo22 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - PerMonitorV2 - - - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo22.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {17D5A3A6-4820-4D9C-BD8A-71D8B83709A0} + Demo22.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo22.exe + 00400000 + x86 + Demo22 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + PerMonitorV2 + + + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo22.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo22/threading_test.py b/Demos/Demo22/threading_test.py index cf76f22e..423a85be 100644 --- a/Demos/Demo22/threading_test.py +++ b/Demos/Demo22/threading_test.py @@ -1,96 +1,96 @@ -from threading import * -from collections import deque -from time import sleep - -def _test(): - - class BoundedQueue(): - - def __init__(self, limit): - self.mon = RLock() - self.rc = Condition(self.mon) - self.wc = Condition(self.mon) - self.limit = limit - self.queue = deque() - - def put(self, item): - self.mon.acquire() - while len(self.queue) >= self.limit: - self._note("put(%s): queue full", item) - self.wc.wait() - self.queue.append(item) - self._note("put(%s): appended, length now %d", - item, len(self.queue)) - self.rc.notify() - self.mon.release() - - def get(self): - self.mon.acquire() - while not self.queue: - self._note("get(): queue empty") - self.rc.wait() - item = self.queue.popleft() - self._note("get(): got %s, %d left", item, len(self.queue)) - self.wc.notify() - self.mon.release() - return item - - def _note(self, format, *args): - format = format % args - ident = get_ident() - try: - name = current_thread().name - except KeyError: - name = "" % ident - format = "%s: %s" % (name, format) - print(format) - - class ProducerThread(Thread): - - def __init__(self, queue, quota): - Thread.__init__(self, name="Producer") - self.queue = queue - self.quota = quota - - def run(self): - from random import random - counter = 0 - while counter < self.quota: - counter = counter + 1 - self.queue.put("%s.%d" % (self.name, counter)) - sleep(random() * 0.00001) - - - class ConsumerThread(Thread): - - def __init__(self, queue, count): - Thread.__init__(self, name="Consumer") - self.queue = queue - self.count = count - - def run(self): - while self.count > 0: - item = self.queue.get() - print(item) - self.count = self.count - 1 - - NP = 3 - QL = 4 - NI = 5 - - Q = BoundedQueue(QL) - P = [] - for i in range(NP): - t = ProducerThread(Q, NI) - t.name = ("Producer-%d" % (i+1)) - P.append(t) - C = ConsumerThread(Q, NI*NP) - for t in P: - t.start() - sleep(0.000001) - C.start() - for t in P: - t.join() - C.join() - +from threading import * +from collections import deque +from time import sleep + +def _test(): + + class BoundedQueue(): + + def __init__(self, limit): + self.mon = RLock() + self.rc = Condition(self.mon) + self.wc = Condition(self.mon) + self.limit = limit + self.queue = deque() + + def put(self, item): + self.mon.acquire() + while len(self.queue) >= self.limit: + self._note("put(%s): queue full", item) + self.wc.wait() + self.queue.append(item) + self._note("put(%s): appended, length now %d", + item, len(self.queue)) + self.rc.notify() + self.mon.release() + + def get(self): + self.mon.acquire() + while not self.queue: + self._note("get(): queue empty") + self.rc.wait() + item = self.queue.popleft() + self._note("get(): got %s, %d left", item, len(self.queue)) + self.wc.notify() + self.mon.release() + return item + + def _note(self, format, *args): + format = format % args + ident = get_ident() + try: + name = current_thread().name + except KeyError: + name = "" % ident + format = "%s: %s" % (name, format) + print(format) + + class ProducerThread(Thread): + + def __init__(self, queue, quota): + Thread.__init__(self, name="Producer") + self.queue = queue + self.quota = quota + + def run(self): + from random import random + counter = 0 + while counter < self.quota: + counter = counter + 1 + self.queue.put("%s.%d" % (self.name, counter)) + sleep(random() * 0.00001) + + + class ConsumerThread(Thread): + + def __init__(self, queue, count): + Thread.__init__(self, name="Consumer") + self.queue = queue + self.count = count + + def run(self): + while self.count > 0: + item = self.queue.get() + print(item) + self.count = self.count - 1 + + NP = 3 + QL = 4 + NI = 5 + + Q = BoundedQueue(QL) + P = [] + for i in range(NP): + t = ProducerThread(Q, NI) + t.name = ("Producer-%d" % (i+1)) + P.append(t) + C = ConsumerThread(Q, NI*NP) + for t in P: + t.start() + sleep(0.000001) + C.start() + for t in P: + t.join() + C.join() + _test() \ No newline at end of file diff --git a/Demos/Demo23/Demo23.dpr b/Demos/Demo23/Demo23.dpr index 0d37f15a..68ae9b3b 100644 --- a/Demos/Demo23/Demo23.dpr +++ b/Demos/Demo23/Demo23.dpr @@ -1,15 +1,15 @@ -program Demo23; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo23; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo23/Demo23.dproj b/Demos/Demo23/Demo23.dproj index 3c6b7a16..d06536e7 100644 --- a/Demos/Demo23/Demo23.dproj +++ b/Demos/Demo23/Demo23.dproj @@ -1,189 +1,189 @@ - - - {C077A77D-C4BE-486B-A654-6605F805E4FE} - Demo23.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo23.exe - 00400000 - x86 - Demo23 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo23.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {C077A77D-C4BE-486B-A654-6605F805E4FE} + Demo23.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo23.exe + 00400000 + x86 + Demo23 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo23.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo23/threading_test.py b/Demos/Demo23/threading_test.py index cf76f22e..423a85be 100644 --- a/Demos/Demo23/threading_test.py +++ b/Demos/Demo23/threading_test.py @@ -1,96 +1,96 @@ -from threading import * -from collections import deque -from time import sleep - -def _test(): - - class BoundedQueue(): - - def __init__(self, limit): - self.mon = RLock() - self.rc = Condition(self.mon) - self.wc = Condition(self.mon) - self.limit = limit - self.queue = deque() - - def put(self, item): - self.mon.acquire() - while len(self.queue) >= self.limit: - self._note("put(%s): queue full", item) - self.wc.wait() - self.queue.append(item) - self._note("put(%s): appended, length now %d", - item, len(self.queue)) - self.rc.notify() - self.mon.release() - - def get(self): - self.mon.acquire() - while not self.queue: - self._note("get(): queue empty") - self.rc.wait() - item = self.queue.popleft() - self._note("get(): got %s, %d left", item, len(self.queue)) - self.wc.notify() - self.mon.release() - return item - - def _note(self, format, *args): - format = format % args - ident = get_ident() - try: - name = current_thread().name - except KeyError: - name = "" % ident - format = "%s: %s" % (name, format) - print(format) - - class ProducerThread(Thread): - - def __init__(self, queue, quota): - Thread.__init__(self, name="Producer") - self.queue = queue - self.quota = quota - - def run(self): - from random import random - counter = 0 - while counter < self.quota: - counter = counter + 1 - self.queue.put("%s.%d" % (self.name, counter)) - sleep(random() * 0.00001) - - - class ConsumerThread(Thread): - - def __init__(self, queue, count): - Thread.__init__(self, name="Consumer") - self.queue = queue - self.count = count - - def run(self): - while self.count > 0: - item = self.queue.get() - print(item) - self.count = self.count - 1 - - NP = 3 - QL = 4 - NI = 5 - - Q = BoundedQueue(QL) - P = [] - for i in range(NP): - t = ProducerThread(Q, NI) - t.name = ("Producer-%d" % (i+1)) - P.append(t) - C = ConsumerThread(Q, NI*NP) - for t in P: - t.start() - sleep(0.000001) - C.start() - for t in P: - t.join() - C.join() - +from threading import * +from collections import deque +from time import sleep + +def _test(): + + class BoundedQueue(): + + def __init__(self, limit): + self.mon = RLock() + self.rc = Condition(self.mon) + self.wc = Condition(self.mon) + self.limit = limit + self.queue = deque() + + def put(self, item): + self.mon.acquire() + while len(self.queue) >= self.limit: + self._note("put(%s): queue full", item) + self.wc.wait() + self.queue.append(item) + self._note("put(%s): appended, length now %d", + item, len(self.queue)) + self.rc.notify() + self.mon.release() + + def get(self): + self.mon.acquire() + while not self.queue: + self._note("get(): queue empty") + self.rc.wait() + item = self.queue.popleft() + self._note("get(): got %s, %d left", item, len(self.queue)) + self.wc.notify() + self.mon.release() + return item + + def _note(self, format, *args): + format = format % args + ident = get_ident() + try: + name = current_thread().name + except KeyError: + name = "" % ident + format = "%s: %s" % (name, format) + print(format) + + class ProducerThread(Thread): + + def __init__(self, queue, quota): + Thread.__init__(self, name="Producer") + self.queue = queue + self.quota = quota + + def run(self): + from random import random + counter = 0 + while counter < self.quota: + counter = counter + 1 + self.queue.put("%s.%d" % (self.name, counter)) + sleep(random() * 0.00001) + + + class ConsumerThread(Thread): + + def __init__(self, queue, count): + Thread.__init__(self, name="Consumer") + self.queue = queue + self.count = count + + def run(self): + while self.count > 0: + item = self.queue.get() + print(item) + self.count = self.count - 1 + + NP = 3 + QL = 4 + NI = 5 + + Q = BoundedQueue(QL) + P = [] + for i in range(NP): + t = ProducerThread(Q, NI) + t.name = ("Producer-%d" % (i+1)) + P.append(t) + C = ConsumerThread(Q, NI*NP) + for t in P: + t.start() + sleep(0.000001) + C.start() + for t in P: + t.join() + C.join() + _test() \ No newline at end of file diff --git a/Demos/Demo26/Demo26.dpr b/Demos/Demo26/Demo26.dpr index d36a8783..55127c29 100644 --- a/Demos/Demo26/Demo26.dpr +++ b/Demos/Demo26/Demo26.dpr @@ -1,15 +1,15 @@ -program Demo26; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo26; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo26/Demo26.dproj b/Demos/Demo26/Demo26.dproj index ee960ee1..2b4526c1 100644 --- a/Demos/Demo26/Demo26.dproj +++ b/Demos/Demo26/Demo26.dproj @@ -1,189 +1,189 @@ - - - {910E2A03-F875-4153-9E58-3434C6D9AB6F} - Demo26.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo26.exe - 00400000 - x86 - Demo26 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - $(BDS)\bin\delphi_PROJECTICON.ico - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo26.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {910E2A03-F875-4153-9E58-3434C6D9AB6F} + Demo26.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo26.exe + 00400000 + x86 + Demo26 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + $(BDS)\bin\delphi_PROJECTICON.ico + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo26.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo27/Demo27.dpr b/Demos/Demo27/Demo27.dpr index f6289d6f..117e145b 100644 --- a/Demos/Demo27/Demo27.dpr +++ b/Demos/Demo27/Demo27.dpr @@ -1,13 +1,13 @@ -program Demo27; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo27; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo27/Demo27.dproj b/Demos/Demo27/Demo27.dproj index 88c92d12..c21474fd 100644 --- a/Demos/Demo27/Demo27.dproj +++ b/Demos/Demo27/Demo27.dproj @@ -1,192 +1,192 @@ - - - {5A404EF7-3EA9-4DDC-AF3D-D6434CB20EEA} - Demo27.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo27.exe - 00400000 - x86 - Demo27 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 4105 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - $(BDS)\bin\delphi_PROJECTICON.ico - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo27.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 4105 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {5A404EF7-3EA9-4DDC-AF3D-D6434CB20EEA} + Demo27.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo27.exe + 00400000 + x86 + Demo27 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 4105 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + $(BDS)\bin\delphi_PROJECTICON.ico + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo27.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 4105 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo28/Demo28.dpr b/Demos/Demo28/Demo28.dpr index 46ba377f..d8519fbe 100644 --- a/Demos/Demo28/Demo28.dpr +++ b/Demos/Demo28/Demo28.dpr @@ -1,15 +1,15 @@ -program Demo28; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo28; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo28/Demo28.dproj b/Demos/Demo28/Demo28.dproj index d6e0c20f..be97b230 100644 --- a/Demos/Demo28/Demo28.dproj +++ b/Demos/Demo28/Demo28.dproj @@ -1,189 +1,189 @@ - - - {8B96EA5E-DEEA-4208-93B8-31AC94C87BCE} - Demo28.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo28.exe - 00400000 - x86 - Demo28 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - $(BDS)\bin\delphi_PROJECTICON.ico - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo28.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {8B96EA5E-DEEA-4208-93B8-31AC94C87BCE} + Demo28.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo28.exe + 00400000 + x86 + Demo28 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + $(BDS)\bin\delphi_PROJECTICON.ico + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo28.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo29/Demo29.dpr b/Demos/Demo29/Demo29.dpr index ac722099..585b9b25 100644 --- a/Demos/Demo29/Demo29.dpr +++ b/Demos/Demo29/Demo29.dpr @@ -1,13 +1,13 @@ -program Demo29; - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} -{$R XP_UAC.RES} -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo29; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} +{$R XP_UAC.RES} +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo29/Demo29.dproj b/Demos/Demo29/Demo29.dproj index 918ea928..09ae0e3a 100644 --- a/Demos/Demo29/Demo29.dproj +++ b/Demos/Demo29/Demo29.dproj @@ -1,183 +1,183 @@ - - - {2F621E09-DAC5-4AB2-83F7-BD019D49AAF2} - Demo29.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 4105 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Demo29.exe - 00400000 - x86 - Demo29 - - - $(BDS)\bin\default_app.manifest - 1033 - true - true - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - $(BDS)\bin\delphi_PROJECTICON.ico - PerMonitorV2 - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - true - PerMonitorV2 - $(BDS)\bin\delphi_PROJECTICON.ico - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - Debug - true - 1033 - true - - - true - true - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo29.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 4105 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - - True - True - - - 12 - - -
    + + + {2F621E09-DAC5-4AB2-83F7-BD019D49AAF2} + Demo29.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 4105 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + Demo29.exe + 00400000 + x86 + Demo29 + + + $(BDS)\bin\default_app.manifest + 1033 + true + true + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + $(BDS)\bin\delphi_PROJECTICON.ico + PerMonitorV2 + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + true + PerMonitorV2 + $(BDS)\bin\delphi_PROJECTICON.ico + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + Debug + true + 1033 + true + + + true + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo29.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 4105 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo30/Demo30.dpr b/Demos/Demo30/Demo30.dpr index ceea88c2..2ce1d60a 100644 --- a/Demos/Demo30/Demo30.dpr +++ b/Demos/Demo30/Demo30.dpr @@ -1,15 +1,15 @@ -program Demo30; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo30; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo30/Demo30.dproj b/Demos/Demo30/Demo30.dproj index c219d66f..7ecba0a6 100644 --- a/Demos/Demo30/Demo30.dproj +++ b/Demos/Demo30/Demo30.dproj @@ -1,190 +1,190 @@ - - - {E779713C-E867-4111-98ED-796E46162694} - Demo30.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo30.exe - 00400000 - x86 - Demo30 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - PerMonitorV2 - - - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - DEBUG;$(DCC_Define) - - - true - PerMonitorV2 - - - true - PerMonitorV2 - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo30.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - True - True - - - 12 - - -
    + + + {E779713C-E867-4111-98ED-796E46162694} + Demo30.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo30.exe + 00400000 + x86 + Demo30 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + PerMonitorV2 + + + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + DEBUG;$(DCC_Define) + + + true + PerMonitorV2 + + + true + PerMonitorV2 + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo30.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo30/Unit1.dfm b/Demos/Demo30/Unit1.dfm index 481c588b..f8ce3df4 100644 --- a/Demos/Demo30/Unit1.dfm +++ b/Demos/Demo30/Unit1.dfm @@ -1,132 +1,132 @@ -object Form1: TForm1 - Left = 241 - Top = 155 - Width = 597 - Height = 557 - VertScrollBar.Range = 200 - ActiveControl = Button1 - Caption = 'Demo of Python' - Color = clBackground - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = 11 - Font.Name = 'MS Sans Serif' - Font.Pitch = fpVariable - Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 - TextHeight = 13 - object Splitter1: TSplitter - Left = 0 - Top = 209 - Width = 581 - Height = 3 - Cursor = crVSplit - Align = alTop - Color = clBtnFace - ParentColor = False - ExplicitWidth = 589 - end - object Memo1: TMemo - Left = 0 - Top = 212 - Width = 581 - Height = 262 - Align = alClient - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Pitch = fpVariable - Font.Style = [] - Lines.Strings = ( - '# Look at the code in TForm1.Button1Click' - '' - 'class Person:' - - ' def __init__(self, first_name, last_name, age=None, height=Non' + - 'e, weight=None):' - ' self.first_name = first_name' - ' self.last_name = last_name' - ' self.age = age' - ' self.height = height' - ' self.weight = weight') - ParentFont = False - ScrollBars = ssBoth - TabOrder = 1 - end - object Panel1: TPanel - Left = 0 - Top = 474 - Width = 581 - Height = 44 - Align = alBottom - BevelOuter = bvNone - TabOrder = 0 - object Button1: TButton - Left = 6 - Top = 8 - Width = 115 - Height = 25 - Caption = 'Execute script' - TabOrder = 0 - OnClick = Button1Click - end - object Button2: TButton - Left = 168 - Top = 8 - Width = 91 - Height = 25 - Caption = 'Load script...' - TabOrder = 1 - OnClick = Button2Click - end - object Button3: TButton - Left = 264 - Top = 8 - Width = 89 - Height = 25 - Caption = 'Save script...' - TabOrder = 2 - OnClick = Button3Click - end - end - object Memo2: TMemo - Left = 0 - Top = 0 - Width = 581 - Height = 209 - Align = alTop - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Consolas' - Font.Pitch = fpVariable - Font.Style = [] - ParentFont = False - ScrollBars = ssBoth - TabOrder = 2 - end - object PythonEngine1: TPythonEngine - IO = PythonGUIInputOutput1 - Left = 32 - end - object OpenDialog1: TOpenDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Title = 'Open' - Left = 176 - end - object SaveDialog1: TSaveDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Title = 'Save As' - Left = 208 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo2 - Left = 64 - end -end +object Form1: TForm1 + Left = 241 + Top = 155 + Width = 597 + Height = 557 + VertScrollBar.Range = 200 + ActiveControl = Button1 + Caption = 'Demo of Python' + Color = clBackground + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 0 + Top = 209 + Width = 581 + Height = 3 + Cursor = crVSplit + Align = alTop + Color = clBtnFace + ParentColor = False + ExplicitWidth = 589 + end + object Memo1: TMemo + Left = 0 + Top = 212 + Width = 581 + Height = 262 + Align = alClient + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Pitch = fpVariable + Font.Style = [] + Lines.Strings = ( + '# Look at the code in TForm1.Button1Click' + '' + 'class Person:' + + ' def __init__(self, first_name, last_name, age=None, height=Non' + + 'e, weight=None):' + ' self.first_name = first_name' + ' self.last_name = last_name' + ' self.age = age' + ' self.height = height' + ' self.weight = weight') + ParentFont = False + ScrollBars = ssBoth + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Top = 474 + Width = 581 + Height = 44 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Button1: TButton + Left = 6 + Top = 8 + Width = 115 + Height = 25 + Caption = 'Execute script' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 168 + Top = 8 + Width = 91 + Height = 25 + Caption = 'Load script...' + TabOrder = 1 + OnClick = Button2Click + end + object Button3: TButton + Left = 264 + Top = 8 + Width = 89 + Height = 25 + Caption = 'Save script...' + TabOrder = 2 + OnClick = Button3Click + end + end + object Memo2: TMemo + Left = 0 + Top = 0 + Width = 581 + Height = 209 + Align = alTop + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Consolas' + Font.Pitch = fpVariable + Font.Style = [] + ParentFont = False + ScrollBars = ssBoth + TabOrder = 2 + end + object PythonEngine1: TPythonEngine + IO = PythonGUIInputOutput1 + Left = 32 + end + object OpenDialog1: TOpenDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Title = 'Open' + Left = 176 + end + object SaveDialog1: TSaveDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Title = 'Save As' + Left = 208 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo2 + Left = 64 + end +end diff --git a/Demos/Demo31/Demo31.dpr b/Demos/Demo31/Demo31.dpr index 62bbc2c6..2aac7769 100644 --- a/Demos/Demo31/Demo31.dpr +++ b/Demos/Demo31/Demo31.dpr @@ -1,25 +1,25 @@ -program Demo31; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}, - Unit2 in 'Unit2.pas' {TestForm}, - WrapDelphiTypes, - WrapDelphiWindows, - WrapVclExtCtrls, - WrapVclComCtrls, - WrapVclGrids, - WrapVclGraphics, - WrapVclButtons, - WrapVclDialogs; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.CreateForm(TTestForm, TestForm); - Application.Run; -end. +program Demo31; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + Unit2 in 'Unit2.pas' {TestForm}, + WrapDelphiTypes, + WrapDelphiWindows, + WrapVclExtCtrls, + WrapVclComCtrls, + WrapVclGrids, + WrapVclGraphics, + WrapVclButtons, + WrapVclDialogs; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.CreateForm(TTestForm, TestForm); + Application.Run; +end. diff --git a/Demos/Demo32/Demo32.dpr b/Demos/Demo32/Demo32.dpr index b3e0be6b..3268dd0a 100644 --- a/Demos/Demo32/Demo32.dpr +++ b/Demos/Demo32/Demo32.dpr @@ -1,17 +1,15 @@ -// JCL_DEBUG_EXPERT_GENERATEJDBG OFF -// JCL_DEBUG_EXPERT_INSERTJDBG OFF -program Demo32; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo32; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo32/Demo32.dproj b/Demos/Demo32/Demo32.dproj index 64833a60..e74684a6 100644 --- a/Demos/Demo32/Demo32.dproj +++ b/Demos/Demo32/Demo32.dproj @@ -1,167 +1,167 @@ - - - {26D3B086-D6C0-40C9-820A-269741BAC910} - Demo32.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo32 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 1032 - Demo32.exe - 00400000 - x86 - - - true - $(BDS)\bin\delphi_PROJECTICON.ico - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - $(BDS)\bin\default_app.manifest - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - PerMonitorV2 - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - $(BDS)\bin\default_app.manifest - true - 1033 - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - DEBUG;$(DCC_Define) - - - Debug - - - 1033 - true - Debug - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo32.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1032 - 1253 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - - True - True - - - 12 - - -
    + + + {26D3B086-D6C0-40C9-820A-269741BAC910} + Demo32.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo32 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1032 + Demo32.exe + 00400000 + x86 + + + true + $(BDS)\bin\delphi_PROJECTICON.ico + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + PerMonitorV2 + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + $(BDS)\bin\default_app.manifest + true + 1033 + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + DEBUG;$(DCC_Define) + + + Debug + + + 1033 + true + Debug + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo32.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1032 + 1253 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + True + True + + + 12 + + +
    diff --git a/Demos/Demo33/ThrdDemo2.dpr b/Demos/Demo33/ThrdDemo2.dpr index fb790876..36abc5ca 100644 --- a/Demos/Demo33/ThrdDemo2.dpr +++ b/Demos/Demo33/ThrdDemo2.dpr @@ -1,15 +1,15 @@ -program ThrdDemo2; - -uses - Forms, - SortThds in 'SortThds.pas', - ThSort in 'ThSort.pas' {ThreadSortForm}; - -{$R *.res} - -begin - Application.Initialize; - Application.MainFormOnTaskbar := True; - Application.CreateForm(TThreadSortForm, ThreadSortForm); - Application.Run; -end. +program ThrdDemo2; + +uses + Forms, + SortThds in 'SortThds.pas', + ThSort in 'ThSort.pas' {ThreadSortForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TThreadSortForm, ThreadSortForm); + Application.Run; +end. diff --git a/Demos/Demo33/ThrdDemo2.dproj b/Demos/Demo33/ThrdDemo2.dproj index 7fe61c0a..cd9a7ad9 100644 --- a/Demos/Demo33/ThrdDemo2.dproj +++ b/Demos/Demo33/ThrdDemo2.dproj @@ -1,200 +1,200 @@ - - - {9e78092e-5a16-44b9-97bf-b879c252b4ba} - Debug - DCC32 - ThrdDemo2.exe - ThrdDemo2.dpr - 19.1 - Debug - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - ThrdDemo2.exe - ThrdDemo2 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1049 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - PerMonitorV2 - - - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - PerMonitorV2 - - - 7.0 - 0 - False - 0 - RELEASE;$(DCC_Define) - - - true - PerMonitor - - - true - PerMonitor - - - 7.0 - DEBUG;JVCLThemesEnabled;COMPILER5_UP;PS_USESSUPPORT;$(DCC_Define) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_UnitSearchPath) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ResourcePath) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ObjPath) - C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_IncludePath) - - - true - PerMonitor - - - true - PerMonitor - true - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - Delphi.Personality.12 - - - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1049 - 1251 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - ThrdDemo2.dpr - - - - True - True - - - 12 - - - - MainSource - - - -
    ThreadSortForm
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - -
    + + + {9e78092e-5a16-44b9-97bf-b879c252b4ba} + Debug + DCC32 + ThrdDemo2.exe + ThrdDemo2.dpr + 19.1 + Debug + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + ThrdDemo2.exe + ThrdDemo2 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1049 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + PerMonitorV2 + + + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + PerMonitorV2 + + + 7.0 + 0 + False + 0 + RELEASE;$(DCC_Define) + + + true + PerMonitor + + + true + PerMonitor + + + 7.0 + DEBUG;JVCLThemesEnabled;COMPILER5_UP;PS_USESSUPPORT;$(DCC_Define) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_UnitSearchPath) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ResourcePath) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_ObjPath) + C:\Users\alex\python4delphi-read-only\PythonForDelphi\Components\Sources\Core;$(DCC_IncludePath) + + + true + PerMonitor + + + true + PerMonitor + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + Delphi.Personality.12 + + + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1049 + 1251 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + ThrdDemo2.dpr + + + + True + True + + + 12 + + + + MainSource + + + +
    ThreadSortForm
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + +
    diff --git a/Demos/Demo34/Demo34.dpr b/Demos/Demo34/Demo34.dpr index ea91f388..57216a73 100644 --- a/Demos/Demo34/Demo34.dpr +++ b/Demos/Demo34/Demo34.dpr @@ -1,15 +1,15 @@ -program Demo34; - - - -uses - Forms, - Unit1 in 'Unit1.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Demo34; + + + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/Demo34/Demo34.dproj b/Demos/Demo34/Demo34.dproj index 93b43433..99db9f04 100644 --- a/Demos/Demo34/Demo34.dproj +++ b/Demos/Demo34/Demo34.dproj @@ -1,962 +1,962 @@ - - - {EB7F2134-A78B-4510-B8F3-113A978D6B14} - Demo34.dpr - Debug - DCC32 - 19.1 - VCL - True - Win64 - 3 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - Demo34.exe - 00400000 - x86 - Demo34 - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1033 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - $(BDS)\bin\default_app.manifest - $(BDS)\bin\delphi_PROJECTICON.ico - true - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - PerMonitorV2 - - - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - $(BDS)\bin\default_app.manifest - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitor - - - true - PerMonitor - - - DEBUG;$(DCC_Define) - - - true - PerMonitor - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) - - - true - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - PerMonitor - - - - MainSource - - -
    Form1
    -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - - Delphi.Personality.12 - VCLApplication - - - - Demo34.dpr - - - False - True - False - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - - True - True - - - - - Demo34.exe - true - - - - - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - - 12 - - - -
    + + + {EB7F2134-A78B-4510-B8F3-113A978D6B14} + Demo34.dpr + Debug + DCC32 + 19.1 + VCL + True + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + Demo34.exe + 00400000 + x86 + Demo34 + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) + 1033 + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + $(BDS)\bin\default_app.manifest + $(BDS)\bin\delphi_PROJECTICON.ico + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + PerMonitorV2 + + + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + $(BDS)\bin\default_app.manifest + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitor + + + true + PerMonitor + + + DEBUG;$(DCC_Define) + + + true + PerMonitor + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + + + true + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + PerMonitor + + + + MainSource + + +
    Form1
    +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + VCLApplication + + + + Demo34.dpr + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + True + True + + + + + Demo34.exe + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + 12 + + + +
    diff --git a/Demos/FMX/BasicTypes/PointF/MainForm.fmx b/Demos/FMX/BasicTypes/PointF/MainForm.fmx index 69635976..dd6c7d0e 100644 --- a/Demos/FMX/BasicTypes/PointF/MainForm.fmx +++ b/Demos/FMX/BasicTypes/PointF/MainForm.fmx @@ -1,138 +1,138 @@ -object Form1: TForm1 - Left = 0 - Top = 0 - Caption = 'Demo of PointF' - ClientHeight = 517 - ClientWidth = 640 - FormFactor.Width = 320 - FormFactor.Height = 480 - FormFactor.Devices = [Desktop] - DesignerMasterStyle = 0 - object OpenDialog1: TOpenDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 360 - Top = 8 - end - object SaveDialog1: TSaveDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 392 - Top = 8 - end - object Memo1: TMemo - Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] - DataDetectorTypes = [] - Align = Top - Size.Width = 640.000000000000000000 - Size.Height = 200.000000000000000000 - Size.PlatformDefault = False - TabOrder = 9 - Viewport.Width = 636.000000000000000000 - Viewport.Height = 196.000000000000000000 - end - object Splitter1: TSplitter - Align = Top - Cursor = crVSplit - MinSize = 20.000000000000000000 - Position.Y = 200.000000000000000000 - Size.Width = 640.000000000000000000 - Size.Height = 3.000000000000000000 - Size.PlatformDefault = False - end - object Memo2: TMemo - Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] - DataDetectorTypes = [] - Lines.Strings = ( - 'from spam import PointF' - '' - 'print('#39'-------- Shows wrapped PointF info --------'#39')' - 'print(PointF)' - 'print(PointF.__doc__)' - 'help(PointF)' - '' - 'print('#39'-------- Creates a new PointF --------'#39')' - '' - 'p = PointF(2.3, 5.1)' - 'print(p)' - 'print(p.X)' - 'print(p.Y)' - 'print(format(p.X, '#39'.2f'#39'))' - 'print(format(p.Y, '#39'.2f'#39'))' - '' - 'print('#39'-------- Updates X and Y values --------'#39')' - '' - 'p.X = 3.1' - 'p.Y = 10.4' - '' - 'print(p)' - 'print(p.X)' - 'print(p.Y)' - 'print(format(p.X, '#39'.2f'#39'))' - 'print(format(p.Y, '#39'.2f'#39'))') - Align = Client - Size.Width = 640.000000000000000000 - Size.Height = 269.000000000000000000 - Size.PlatformDefault = False - TabOrder = 11 - Viewport.Width = 620.000000000000000000 - Viewport.Height = 265.000000000000000000 - end - object Panel1: TPanel - Align = Bottom - Position.Y = 472.000000000000000000 - Size.Width = 640.000000000000000000 - Size.Height = 45.000000000000000000 - Size.PlatformDefault = False - TabOrder = 12 - object Button1: TButton - Position.X = 8.000000000000000000 - Position.Y = 10.000000000000000000 - Size.Width = 97.000000000000000000 - Size.Height = 22.000000000000000000 - Size.PlatformDefault = False - TabOrder = 2 - Text = 'Execute script' - OnClick = Button1Click - end - object Button2: TButton - Position.X = 192.000000000000000000 - Position.Y = 10.000000000000000000 - TabOrder = 1 - Text = 'Load script...' - OnClick = Button2Click - end - object Button3: TButton - Position.X = 280.000000000000000000 - Position.Y = 10.000000000000000000 - TabOrder = 0 - Text = 'Save script...' - OnClick = Button3Click - end - end - object PythonEngine1: TPythonEngine - IO = PythonGUIInputOutput1 - Left = 288 - Top = 64 - end - object PythonModule1: TPythonModule - Engine = PythonEngine1 - ModuleName = 'spam' - Errors = <> - Left = 376 - Top = 64 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo1 - Left = 352 - Top = 112 - end - object PyDelphiWrapper1: TPyDelphiWrapper - Engine = PythonEngine1 - Module = PythonModule1 - Left = 480 - Top = 64 - end -end +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'Demo of PointF' + ClientHeight = 517 + ClientWidth = 640 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + DesignerMasterStyle = 0 + object OpenDialog1: TOpenDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 360 + Top = 8 + end + object SaveDialog1: TSaveDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 392 + Top = 8 + end + object Memo1: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + Align = Top + Size.Width = 640.000000000000000000 + Size.Height = 200.000000000000000000 + Size.PlatformDefault = False + TabOrder = 9 + Viewport.Width = 636.000000000000000000 + Viewport.Height = 196.000000000000000000 + end + object Splitter1: TSplitter + Align = Top + Cursor = crVSplit + MinSize = 20.000000000000000000 + Position.Y = 200.000000000000000000 + Size.Width = 640.000000000000000000 + Size.Height = 3.000000000000000000 + Size.PlatformDefault = False + end + object Memo2: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + Lines.Strings = ( + 'from spam import PointF' + '' + 'print('#39'-------- Shows wrapped PointF info --------'#39')' + 'print(PointF)' + 'print(PointF.__doc__)' + 'help(PointF)' + '' + 'print('#39'-------- Creates a new PointF --------'#39')' + '' + 'p = PointF(2.3, 5.1)' + 'print(p)' + 'print(p.X)' + 'print(p.Y)' + 'print(format(p.X, '#39'.2f'#39'))' + 'print(format(p.Y, '#39'.2f'#39'))' + '' + 'print('#39'-------- Updates X and Y values --------'#39')' + '' + 'p.X = 3.1' + 'p.Y = 10.4' + '' + 'print(p)' + 'print(p.X)' + 'print(p.Y)' + 'print(format(p.X, '#39'.2f'#39'))' + 'print(format(p.Y, '#39'.2f'#39'))') + Align = Client + Size.Width = 640.000000000000000000 + Size.Height = 269.000000000000000000 + Size.PlatformDefault = False + TabOrder = 11 + Viewport.Width = 620.000000000000000000 + Viewport.Height = 265.000000000000000000 + end + object Panel1: TPanel + Align = Bottom + Position.Y = 472.000000000000000000 + Size.Width = 640.000000000000000000 + Size.Height = 45.000000000000000000 + Size.PlatformDefault = False + TabOrder = 12 + object Button1: TButton + Position.X = 8.000000000000000000 + Position.Y = 10.000000000000000000 + Size.Width = 97.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Execute script' + OnClick = Button1Click + end + object Button2: TButton + Position.X = 192.000000000000000000 + Position.Y = 10.000000000000000000 + TabOrder = 1 + Text = 'Load script...' + OnClick = Button2Click + end + object Button3: TButton + Position.X = 280.000000000000000000 + Position.Y = 10.000000000000000000 + TabOrder = 0 + Text = 'Save script...' + OnClick = Button3Click + end + end + object PythonEngine1: TPythonEngine + IO = PythonGUIInputOutput1 + Left = 288 + Top = 64 + end + object PythonModule1: TPythonModule + Engine = PythonEngine1 + ModuleName = 'spam' + Errors = <> + Left = 376 + Top = 64 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo1 + Left = 352 + Top = 112 + end + object PyDelphiWrapper1: TPyDelphiWrapper + Engine = PythonEngine1 + Module = PythonModule1 + Left = 480 + Top = 64 + end +end diff --git a/Demos/FMX/BasicTypes/PointF/MainForm.pas b/Demos/FMX/BasicTypes/PointF/MainForm.pas index f99383a2..48f9c047 100644 --- a/Demos/FMX/BasicTypes/PointF/MainForm.pas +++ b/Demos/FMX/BasicTypes/PointF/MainForm.pas @@ -1,63 +1,63 @@ -unit MainForm; - -interface - -uses - System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, - FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, - FMX.StdCtrls, PythonEngine, FMX.PythonGUIInputOutput, - FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, WrapFmxTypes, WrapDelphi; - -type - TForm1 = class(TForm) - PythonEngine1: TPythonEngine; - PythonModule1: TPythonModule; - PythonGUIInputOutput1: TPythonGUIInputOutput; - PyDelphiWrapper1: TPyDelphiWrapper; - OpenDialog1: TOpenDialog; - SaveDialog1: TSaveDialog; - Memo1: TMemo; - Splitter1: TSplitter; - Memo2: TMemo; - Panel1: TPanel; - Button1: TButton; - Button2: TButton; - Button3: TButton; - procedure Button3Click(Sender: TObject); - procedure Button2Click(Sender: TObject); - procedure Button1Click(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form1: TForm1; - -implementation - -{$R *.fmx} - -procedure TForm1.Button1Click(Sender: TObject); -begin - PythonEngine1.ExecStrings(Memo2.Lines); -end; - -procedure TForm1.Button2Click(Sender: TObject); -begin - with OpenDialog1 do begin - if Execute then - Memo2.Lines.LoadFromFile( FileName ); - end; -end; - -procedure TForm1.Button3Click(Sender: TObject); -begin - with SaveDialog1 do begin - if Execute then - Memo2.Lines.SaveToFile(FileName); - end; -end; - -end. +unit MainForm; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, + FMX.StdCtrls, PythonEngine, FMX.PythonGUIInputOutput, + FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, WrapFmxTypes, WrapDelphi; + +type + TForm1 = class(TForm) + PythonEngine1: TPythonEngine; + PythonModule1: TPythonModule; + PythonGUIInputOutput1: TPythonGUIInputOutput; + PyDelphiWrapper1: TPyDelphiWrapper; + OpenDialog1: TOpenDialog; + SaveDialog1: TSaveDialog; + Memo1: TMemo; + Splitter1: TSplitter; + Memo2: TMemo; + Panel1: TPanel; + Button1: TButton; + Button2: TButton; + Button3: TButton; + procedure Button3Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.fmx} + +procedure TForm1.Button1Click(Sender: TObject); +begin + PythonEngine1.ExecStrings(Memo2.Lines); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + with OpenDialog1 do begin + if Execute then + Memo2.Lines.LoadFromFile( FileName ); + end; +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + with SaveDialog1 do begin + if Execute then + Memo2.Lines.SaveToFile(FileName); + end; +end; + +end. diff --git a/Demos/FMX/BasicTypes/PointF/PointF.dpr b/Demos/FMX/BasicTypes/PointF/PointF.dpr index de3aa575..7cc2d960 100644 --- a/Demos/FMX/BasicTypes/PointF/PointF.dpr +++ b/Demos/FMX/BasicTypes/PointF/PointF.dpr @@ -1,14 +1,14 @@ -program PointF; - -uses - System.StartUpCopy, - FMX.Forms, - MainForm in 'MainForm.pas' {Form1}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program PointF; + +uses + System.StartUpCopy, + FMX.Forms, + MainForm in 'MainForm.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/FMX/BasicTypes/PointF/PointF.dproj b/Demos/FMX/BasicTypes/PointF/PointF.dproj index 9748ad15..8c717bc1 100644 --- a/Demos/FMX/BasicTypes/PointF/PointF.dproj +++ b/Demos/FMX/BasicTypes/PointF/PointF.dproj @@ -1,1103 +1,1103 @@ - - - {E685A25A-2863-46E1-882C-16AA3E302630} - 19.1 - FMX - True - Debug - Win64 - 37915 - Application - PointF.dpr - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - true - true - true - true - true - true - true - true - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - PointF - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - true - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - true - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - 10.0 - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - Debug - true - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - PerMonitorV2 - - - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - - MainSource - - -
    Form1
    - fmx -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - Delphi.Personality.12 - Application - - - - PointF.dpr - - - - - - true - - - - - true - - - - - true - - - - - PointF.exe - true - - - - - PointF.rsm - true - - - - - PointF.exe - true - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - - True - True - False - True - True - False - True - True - True - - - 12 - - - - -
    + + + {E685A25A-2863-46E1-882C-16AA3E302630} + 19.1 + FMX + True + Debug + Win64 + 37915 + Application + PointF.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + true + true + true + true + true + true + true + true + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + PointF + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png + 10.0 + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + + + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + + MainSource + + +
    Form1
    + fmx +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + Delphi.Personality.12 + Application + + + + PointF.dpr + + + + + + true + + + + + true + + + + + true + + + + + PointF.exe + true + + + + + PointF.rsm + true + + + + + PointF.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + True + False + True + True + False + True + True + True + + + 12 + + + + +
    diff --git a/Demos/FMX/FormDemo/FormDemo.dpr b/Demos/FMX/FormDemo/FormDemo.dpr index 5cd27c59..677bb6eb 100644 --- a/Demos/FMX/FormDemo/FormDemo.dpr +++ b/Demos/FMX/FormDemo/FormDemo.dpr @@ -1,15 +1,15 @@ -program FormDemo; - -uses - System.StartUpCopy, - FMX.Forms, - MainForm in 'MainForm.pas' {Form1}, - SecondForm in 'SecondForm.pas' {DelphiSecondForm}; - -{$R *.res} - -begin - Application.Initialize; - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program FormDemo; + +uses + System.StartUpCopy, + FMX.Forms, + MainForm in 'MainForm.pas' {Form1}, + SecondForm in 'SecondForm.pas' {DelphiSecondForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/Demos/FMX/FormDemo/FormDemo.dproj b/Demos/FMX/FormDemo/FormDemo.dproj index e83c0f22..cac1eb26 100644 --- a/Demos/FMX/FormDemo/FormDemo.dproj +++ b/Demos/FMX/FormDemo/FormDemo.dproj @@ -1,976 +1,976 @@ - - - {1C2733B2-64A7-4C99-BBD6-00BD9304B46E} - 19.1 - FMX - True - Debug - Win64 - 3 - Application - FormDemo.dpr - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - FormDemo - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;PythonVcl;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - PerMonitorV2 - - - true - PerMonitorV2 - true - 1033 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - - MainSource - - -
    Form1
    - fmx -
    - -
    DelphiSecondForm
    - fmx -
    - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
    - - Delphi.Personality.12 - Application - - - - FormDemo.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - true - - - - - FormDemo.rsm - true - - - - - true - - - - - true - - - - - FormDemo.exe - true - - - - - FormDemo.exe - true - - - - - FormDemo.exe - true - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - - True - True - - - 12 - - - - -
    + + + {1C2733B2-64A7-4C99-BBD6-00BD9304B46E} + 19.1 + FMX + True + Debug + Win64 + 3 + Application + FormDemo.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + FormDemo + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;PythonVcl;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + + + true + PerMonitorV2 + true + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + + MainSource + + +
    Form1
    + fmx +
    + +
    DelphiSecondForm
    + fmx +
    + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
    + + Delphi.Personality.12 + Application + + + + FormDemo.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + FormDemo.rsm + true + + + + + true + + + + + true + + + + + FormDemo.exe + true + + + + + FormDemo.exe + true + + + + + FormDemo.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + True + + + 12 + + + + +
    diff --git a/Demos/FMX/FormDemo/MainForm.fmx b/Demos/FMX/FormDemo/MainForm.fmx index 2dd3dcb4..a889bd21 100644 --- a/Demos/FMX/FormDemo/MainForm.fmx +++ b/Demos/FMX/FormDemo/MainForm.fmx @@ -1,153 +1,153 @@ -object Form1: TForm1 - Left = 0 - Top = 0 - Caption = 'MainForm' - ClientHeight = 480 - ClientWidth = 640 - FormFactor.Width = 320 - FormFactor.Height = 480 - FormFactor.Devices = [Desktop] - DesignerMasterStyle = 0 - object OpenDialog1: TOpenDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 200 - end - object SaveDialog1: TSaveDialog - DefaultExt = '*.py' - Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' - Left = 232 - end - object Memo1: TMemo - Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] - DataDetectorTypes = [] - Align = Top - Size.Width = 640.000000000000000000 - Size.Height = 200.000000000000000000 - Size.PlatformDefault = False - TabOrder = 8 - Viewport.Width = 636.000000000000000000 - Viewport.Height = 196.000000000000000000 - end - object Splitter1: TSplitter - Align = Top - Cursor = crVSplit - MinSize = 20.000000000000000000 - Position.Y = 200.000000000000000000 - Size.Width = 640.000000000000000000 - Size.Height = 3.000000000000000000 - Size.PlatformDefault = False - end - object Memo2: TMemo - Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] - DataDetectorTypes = [] - Lines.Strings = ( - 'from spam import Form' - '' - 'class SubForm(Form): ' - ' def __init__(self, Owner):' - ' self.Caption = '#39'Subclassed form defined in Python'#39 - '' - 'class DelphiSecondForm(Form):' - ' pass' - '' - 'def createbaseform():' - ' print('#39'Creates a Delphi FMX.TForm'#39')' - ' form = Form(None)' - ' try:' - ' form.Caption = "Delphi FMX base form"' - ' form.ShowModal()' - ' finally:' - ' form.Free();' - '' - 'def createpysubform():' - ' print('#39'Creates a Delphi FMX.TForm subtype defined in Python'#39')' - ' form = SubForm(None)' - ' try:' - ' form.ShowModal()' - ' finally:' - ' form.Free()' - '' - 'def createdelphisubform():' - - ' print('#39'Creates an instance of TDelphiSecondForm registerd form' + - #39')' - ' form = DelphiSecondForm(None)' - ' try:' - ' print('#39'Label: '#39', form.Label1.Text)' - ' form.ShowModal()' - ' finally:' - ' form.Free()' - '' - 'def main():' - ' createbaseform()' - ' createpysubform()' - ' createdelphisubform()' - '' - 'if __name__ == '#39'__main__'#39':' - ' try:' - ' main()' - ' except SystemExit:' - ' pass') - Align = Client - Size.Width = 640.000000000000000000 - Size.Height = 232.000000000000000000 - Size.PlatformDefault = False - TabOrder = 10 - Viewport.Width = 620.000000000000000000 - Viewport.Height = 228.000000000000000000 - end - object Panel1: TPanel - Align = Bottom - Position.Y = 435.000000000000000000 - Size.Width = 640.000000000000000000 - Size.Height = 45.000000000000000000 - Size.PlatformDefault = False - TabOrder = 11 - object Button1: TButton - Position.X = 8.000000000000000000 - Position.Y = 10.000000000000000000 - Size.Width = 97.000000000000000000 - Size.Height = 22.000000000000000000 - Size.PlatformDefault = False - TabOrder = 2 - Text = 'Execute script' - OnClick = Button1Click - end - object Button2: TButton - Position.X = 192.000000000000000000 - Position.Y = 10.000000000000000000 - TabOrder = 1 - Text = 'Load script...' - OnClick = Button2Click - end - object Button3: TButton - Position.X = 280.000000000000000000 - Position.Y = 10.000000000000000000 - TabOrder = 0 - Text = 'Save script...' - OnClick = Button3Click - end - end - object PythonEngine1: TPythonEngine - IO = PythonGUIInputOutput1 - Left = 8 - end - object PythonModule1: TPythonModule - Engine = PythonEngine1 - ModuleName = 'spam' - Errors = <> - Left = 40 - end - object PythonGUIInputOutput1: TPythonGUIInputOutput - UnicodeIO = True - RawOutput = False - Output = Memo1 - Left = 104 - end - object PyDelphiWrapper1: TPyDelphiWrapper - Engine = PythonEngine1 - Module = PythonModule1 - Left = 72 - end -end +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'MainForm' + ClientHeight = 480 + ClientWidth = 640 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + DesignerMasterStyle = 0 + object OpenDialog1: TOpenDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 200 + end + object SaveDialog1: TSaveDialog + DefaultExt = '*.py' + Filter = 'Python files|*.py|Text files|*.txt|All files|*.*' + Left = 232 + end + object Memo1: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + Align = Top + Size.Width = 640.000000000000000000 + Size.Height = 200.000000000000000000 + Size.PlatformDefault = False + TabOrder = 8 + Viewport.Width = 636.000000000000000000 + Viewport.Height = 196.000000000000000000 + end + object Splitter1: TSplitter + Align = Top + Cursor = crVSplit + MinSize = 20.000000000000000000 + Position.Y = 200.000000000000000000 + Size.Width = 640.000000000000000000 + Size.Height = 3.000000000000000000 + Size.PlatformDefault = False + end + object Memo2: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + Lines.Strings = ( + 'from spam import Form' + '' + 'class SubForm(Form): ' + ' def __init__(self, Owner):' + ' self.Caption = '#39'Subclassed form defined in Python'#39 + '' + 'class DelphiSecondForm(Form):' + ' pass' + '' + 'def createbaseform():' + ' print('#39'Creates a Delphi FMX.TForm'#39')' + ' form = Form(None)' + ' try:' + ' form.Caption = "Delphi FMX base form"' + ' form.ShowModal()' + ' finally:' + ' form.Free();' + '' + 'def createpysubform():' + ' print('#39'Creates a Delphi FMX.TForm subtype defined in Python'#39')' + ' form = SubForm(None)' + ' try:' + ' form.ShowModal()' + ' finally:' + ' form.Free()' + '' + 'def createdelphisubform():' + + ' print('#39'Creates an instance of TDelphiSecondForm registerd form' + + #39')' + ' form = DelphiSecondForm(None)' + ' try:' + ' print('#39'Label: '#39', form.Label1.Text)' + ' form.ShowModal()' + ' finally:' + ' form.Free()' + '' + 'def main():' + ' createbaseform()' + ' createpysubform()' + ' createdelphisubform()' + '' + 'if __name__ == '#39'__main__'#39':' + ' try:' + ' main()' + ' except SystemExit:' + ' pass') + Align = Client + Size.Width = 640.000000000000000000 + Size.Height = 232.000000000000000000 + Size.PlatformDefault = False + TabOrder = 10 + Viewport.Width = 620.000000000000000000 + Viewport.Height = 228.000000000000000000 + end + object Panel1: TPanel + Align = Bottom + Position.Y = 435.000000000000000000 + Size.Width = 640.000000000000000000 + Size.Height = 45.000000000000000000 + Size.PlatformDefault = False + TabOrder = 11 + object Button1: TButton + Position.X = 8.000000000000000000 + Position.Y = 10.000000000000000000 + Size.Width = 97.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Execute script' + OnClick = Button1Click + end + object Button2: TButton + Position.X = 192.000000000000000000 + Position.Y = 10.000000000000000000 + TabOrder = 1 + Text = 'Load script...' + OnClick = Button2Click + end + object Button3: TButton + Position.X = 280.000000000000000000 + Position.Y = 10.000000000000000000 + TabOrder = 0 + Text = 'Save script...' + OnClick = Button3Click + end + end + object PythonEngine1: TPythonEngine + IO = PythonGUIInputOutput1 + Left = 8 + end + object PythonModule1: TPythonModule + Engine = PythonEngine1 + ModuleName = 'spam' + Errors = <> + Left = 40 + end + object PythonGUIInputOutput1: TPythonGUIInputOutput + UnicodeIO = True + RawOutput = False + Output = Memo1 + Left = 104 + end + object PyDelphiWrapper1: TPyDelphiWrapper + Engine = PythonEngine1 + Module = PythonModule1 + Left = 72 + end +end diff --git a/Demos/FMX/FormDemo/MainForm.pas b/Demos/FMX/FormDemo/MainForm.pas index 3f9768ca..e76da392 100644 --- a/Demos/FMX/FormDemo/MainForm.pas +++ b/Demos/FMX/FormDemo/MainForm.pas @@ -1,63 +1,63 @@ -unit MainForm; - -interface - -uses - System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, - FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, - FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, - PythonEngine, WrapDelphi, FMX.PythonGUIInputOutput, WrapDelphiFmx; - -type - TForm1 = class(TForm) - OpenDialog1: TOpenDialog; - SaveDialog1: TSaveDialog; - Memo1: TMemo; - Splitter1: TSplitter; - Memo2: TMemo; - Panel1: TPanel; - Button1: TButton; - Button2: TButton; - Button3: TButton; - PythonEngine1: TPythonEngine; - PythonModule1: TPythonModule; - PythonGUIInputOutput1: TPythonGUIInputOutput; - PyDelphiWrapper1: TPyDelphiWrapper; - procedure Button2Click(Sender: TObject); - procedure Button3Click(Sender: TObject); - procedure Button1Click(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form1: TForm1; - -implementation - -{$R *.fmx} - -procedure TForm1.Button1Click(Sender: TObject); -begin - PythonEngine1.ExecStrings(Memo2.Lines); -end; - -procedure TForm1.Button2Click(Sender: TObject); -begin - with OpenDialog1 do begin - if Execute then - Memo2.Lines.LoadFromFile( FileName ); - end; -end; - -procedure TForm1.Button3Click(Sender: TObject); -begin - with SaveDialog1 do begin - if Execute then - Memo2.Lines.SaveToFile(FileName); - end; -end; - -end. +unit MainForm; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, + FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, + PythonEngine, WrapDelphi, FMX.PythonGUIInputOutput, WrapDelphiFmx; + +type + TForm1 = class(TForm) + OpenDialog1: TOpenDialog; + SaveDialog1: TSaveDialog; + Memo1: TMemo; + Splitter1: TSplitter; + Memo2: TMemo; + Panel1: TPanel; + Button1: TButton; + Button2: TButton; + Button3: TButton; + PythonEngine1: TPythonEngine; + PythonModule1: TPythonModule; + PythonGUIInputOutput1: TPythonGUIInputOutput; + PyDelphiWrapper1: TPyDelphiWrapper; + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.fmx} + +procedure TForm1.Button1Click(Sender: TObject); +begin + PythonEngine1.ExecStrings(Memo2.Lines); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + with OpenDialog1 do begin + if Execute then + Memo2.Lines.LoadFromFile( FileName ); + end; +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + with SaveDialog1 do begin + if Execute then + Memo2.Lines.SaveToFile(FileName); + end; +end; + +end. diff --git a/Demos/FMX/FormDemo/SecondForm.fmx b/Demos/FMX/FormDemo/SecondForm.fmx index b18c8f4d..0666c3b5 100644 --- a/Demos/FMX/FormDemo/SecondForm.fmx +++ b/Demos/FMX/FormDemo/SecondForm.fmx @@ -1,31 +1,31 @@ -object DelphiSecondForm: TDelphiSecondForm - Left = 0 - Top = 0 - Caption = 'Delphi second form' - ClientHeight = 480 - ClientWidth = 640 - FormFactor.Width = 320 - FormFactor.Height = 480 - FormFactor.Devices = [Desktop] - DesignerMasterStyle = 0 - object Label1: TLabel - Align = Top - AutoSize = True - StyledSettings = [Family, FontColor] - Margins.Left = 10.000000000000000000 - Margins.Top = 10.000000000000000000 - Margins.Right = 10.000000000000000000 - Margins.Bottom = 10.000000000000000000 - Position.X = 10.000000000000000000 - Position.Y = 10.000000000000000000 - Size.Width = 620.000000000000000000 - Size.Height = 30.000000000000000000 - Size.PlatformDefault = False - StyleLookup = 'labelstyle' - TextSettings.Font.Size = 22.000000000000000000 - TextSettings.Font.StyleExt = {00070000000000000004000000} - TextSettings.HorzAlign = Center - Text = 'This is a Delphi registerd form' - TabOrder = 1 - end -end +object DelphiSecondForm: TDelphiSecondForm + Left = 0 + Top = 0 + Caption = 'Delphi second form' + ClientHeight = 480 + ClientWidth = 640 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + DesignerMasterStyle = 0 + object Label1: TLabel + Align = Top + AutoSize = True + StyledSettings = [Family, FontColor] + Margins.Left = 10.000000000000000000 + Margins.Top = 10.000000000000000000 + Margins.Right = 10.000000000000000000 + Margins.Bottom = 10.000000000000000000 + Position.X = 10.000000000000000000 + Position.Y = 10.000000000000000000 + Size.Width = 620.000000000000000000 + Size.Height = 30.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'labelstyle' + TextSettings.Font.Size = 22.000000000000000000 + TextSettings.Font.StyleExt = {00070000000000000004000000} + TextSettings.HorzAlign = Center + Text = 'This is a Delphi registerd form' + TabOrder = 1 + end +end diff --git a/Demos/FMX/FormDemo/SecondForm.pas b/Demos/FMX/FormDemo/SecondForm.pas index 732d0fcf..78ab3872 100644 --- a/Demos/FMX/FormDemo/SecondForm.pas +++ b/Demos/FMX/FormDemo/SecondForm.pas @@ -1,29 +1,29 @@ -unit SecondForm; - -interface - -uses - System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, - FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, - FMX.Controls.Presentation, FMX.StdCtrls; - -type - TDelphiSecondForm = class(TForm) - Label1: TLabel; - private - { Private declarations } - public - { Public declarations } - end; - -var - DelphiSecondForm: TDelphiSecondForm; - -implementation - -{$R *.fmx} - -initialization - RegisterClass(TDelphiSecondForm); - -end. +unit SecondForm; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, + FMX.Controls.Presentation, FMX.StdCtrls; + +type + TDelphiSecondForm = class(TForm) + Label1: TLabel; + private + { Private declarations } + public + { Public declarations } + end; + +var + DelphiSecondForm: TDelphiSecondForm; + +implementation + +{$R *.fmx} + +initialization + RegisterClass(TDelphiSecondForm); + +end. diff --git a/Modules/DelphiFMX/DelphiFMX.dpr b/Modules/DelphiFMX/DelphiFMX.dpr index 5a20b6ef..9f2c0bb7 100644 --- a/Modules/DelphiFMX/DelphiFMX.dpr +++ b/Modules/DelphiFMX/DelphiFMX.dpr @@ -1,35 +1,34 @@ -library DelphiFMX; - -uses - System.StartUpCopy, - SysUtils, - Classes, - FMX.Forms, - FMX.Types, - {$IFDEF OSX} - FMX.Context.Metal, - {$ENDIF OSX} - uMain in 'uMain.pas'; - -{$I ..\..\Source\Definition.Inc} - -exports - // This must match the pattern "PyInit_[ProjectName]" - // So if the project is named DelphiFMX then - // the export must be PyInit_DelphiFMX - PyInit_DelphiFMX; -{$IFDEF MSWINDOWS} -{$E pyd} -{$ENDIF} -{$WARN SYMBOL_PLATFORM OFF} -{$IFDEF LINUX} -{$SONAME 'DelphiFMX'} -{$ENDIF} -{$WARN SYMBOL_PLATFORM ON} - -begin - {$IFDEF OSX} - GlobalUseMetal := TCustomContextMetal.IsMetalSupported(); - {$ENDIF OSX} -end. - +{$IFDEF ANDROID} +program DelphiFMX; +{$ELSE} +library DelphiFMX; +{$ENDIF ANDROID} +uses + System.StartUpCopy, + SysUtils, + Classes, + FMX.Forms, + FMX.Types, + {$IFDEF OSX} + FMX.Context.Metal, + {$ENDIF OSX} + uMain in 'uMain.pas'; +{$I ..\..\Source\Definition.Inc} +exports + // This must match the pattern "PyInit_[ProjectName]" + // So if the project is named DelphiFMX then + // the export must be PyInit_DelphiFMX + PyInit_DelphiFMX; +{$IFDEF MSWINDOWS} +{$E pyd} +{$ENDIF} +{$WARN SYMBOL_PLATFORM OFF} +{$IFDEF LINUX} +{$SONAME 'DelphiFMX'} +{$ENDIF} +{$WARN SYMBOL_PLATFORM ON} +begin + {$IFDEF OSX} + GlobalUseMetal := TCustomContextMetal.IsMetalSupported(); + {$ENDIF OSX} +end. diff --git a/Modules/DelphiFMX/DelphiFMX.dproj b/Modules/DelphiFMX/DelphiFMX.dproj index 94c14f41..f94ad6e5 100644 --- a/Modules/DelphiFMX/DelphiFMX.dproj +++ b/Modules/DelphiFMX/DelphiFMX.dproj @@ -1,202 +1,222 @@ - - - True - Library - Release - None - DelphiFMX.dpr - Linux64 - {0C4154A5-D276-4D62-BA30-564FACD77917} - 19.3 - 168083 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - DelphiFMX - .\dcu\$(Config)\$(Platform) - .\pyd\$(Config)\$(Platform) - 00400000 - System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) - ..\..\Source;..\..\Source\fmx;..\..\Source\vcl;$(DCC_UnitSearchPath) - true - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - 1033 - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - Debug - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - Debug - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - - - Debug - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - Debug - true - Base - true - - - Debug - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - - - Debug - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - - - 0 - RELEASE;$(DCC_Define) - false - 0 - - - #000000 - 1 - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - - - (None) - - - DEBUG;$(DCC_Define) - true - false - - - true - - - true - true - Cfg_2 - true - - - (None) - - - - MainSource - - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - - - - - DelphiFMX.dpr - - - - - True - True - False - True - True - True - True - True - - - 12 - - - - - + + + True + Library + Release + None + DelphiFMX.dpr + Win32 + {0C4154A5-D276-4D62-BA30-564FACD77917} + 19.5 + 168083 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + DelphiFMX + .\dcu\$(Config)\$(Platform) + .\pyd\$(Config)\$(Platform) + 00400000 + System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) + ..\..\Source;..\..\Source\fmx;..\..\Source\vcl;$(DCC_UnitSearchPath) + true + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 1033 + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + Debug + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + Debug + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + Debug + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + true + Base + true + + + Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + + + 0 + RELEASE;$(DCC_Define) + false + 0 + + + #000000 + 1 + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + + + (None) + + + DEBUG;$(DCC_Define) + true + false + + + true + + + true + + + true + true + Cfg_2 + true + + + (None) + + + + MainSource + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + + + + + DelphiFMX.dpr + + + + + True + True + False + False + True + True + True + True + True + + + 12 + + + + + diff --git a/Modules/DelphiFMX/TestFMX.py b/Modules/DelphiFMX/TestFMX.py index 252a0add..dfd04466 100644 --- a/Modules/DelphiFMX/TestFMX.py +++ b/Modules/DelphiFMX/TestFMX.py @@ -1,46 +1,46 @@ -from DelphiFMX import * - -class MainForm(Form): - - def __init__(self, Owner): - self.Caption = "A FMX Form..." - self.SetBounds(10, 10, 500, 400) - - self.lblHello = Label(self) - self.lblHello.SetProps(Parent=self, Text="Hello Python") - self.lblHello.SetBounds(10, 10, 300, 24) - - self.edit1 = Edit(self) - self.edit1.SetProps(Parent=self) - self.edit1.SetBounds(10, 30, 250, 24) - - self.button1 = Button(self) - self.button1.Parent = self - self.button1.SetBounds(270,24,100,30) - self.button1.Text = "Add" - self.button1.OnClick = self.Button1Click - - self.lb1 = ListBox(self) - self.lb1.Parent = self - self.lb1.SetBounds(10,60,300,300) - - self.OnClose = self.MainFormClose - - def MainFormClose(self, Sender, Action): - Action.Value = caFree - Application.Terminate - - def Button1Click(self, Sender): - self.lb1.Items.Add(self.edit1.Text) - self.edit1.Text = "" - -def main(): - Application.Initialize() - Application.Title = "MyDelphiApp" - f = MainForm(Application) - f.Show() - #FreeConsole() - Application.Run() - -main() - +from DelphiFMX import * + +class MainForm(Form): + + def __init__(self, Owner): + self.Caption = "A FMX Form..." + self.SetBounds(10, 10, 500, 400) + + self.lblHello = Label(self) + self.lblHello.SetProps(Parent=self, Text="Hello Python") + self.lblHello.SetBounds(10, 10, 300, 24) + + self.edit1 = Edit(self) + self.edit1.SetProps(Parent=self) + self.edit1.SetBounds(10, 30, 250, 24) + + self.button1 = Button(self) + self.button1.Parent = self + self.button1.SetBounds(270,24,100,30) + self.button1.Text = "Add" + self.button1.OnClick = self.Button1Click + + self.lb1 = ListBox(self) + self.lb1.Parent = self + self.lb1.SetBounds(10,60,300,300) + + self.OnClose = self.MainFormClose + + def MainFormClose(self, Sender, Action): + Action.Value = caFree + Application.Terminate + + def Button1Click(self, Sender): + self.lb1.Items.Add(self.edit1.Text) + self.edit1.Text = "" + +def main(): + Application.Initialize() + Application.Title = "MyDelphiApp" + f = MainForm(Application) + f.Show() + #FreeConsole() + Application.Run() + +main() + diff --git a/Modules/DelphiFMX/doc/Data.Bind.Components.xml b/Modules/DelphiFMX/doc/Data.Bind.Components.xml new file mode 100644 index 00000000..32ea9deb --- /dev/null +++ b/Modules/DelphiFMX/doc/Data.Bind.Components.xml @@ -0,0 +1,17020 @@ + + + + exprUnspecified + + + + + exprPosSource + + + + + exprPosControl + + + + + exprFill + + + + + exprParse + + + + + exprFormat + + + + + exprClear + + + + + exprFormatColumn + + + + + exprOther1 + + + + + exprOther2 + + + + + exprOther3 + + + + + exprFormatControl + + + + + dirSourceToControl + + + + + dirControlToSource + + + + + dirBidirectional + + + + + mtUnknown + + + + + mtText + + + + + mtInteger + + + + + mtFloat + + + + + mtBitmap + + + + + mtMemo + + + + + mtBoolean + + + + + mtBCD + + + + + mtUInteger + + + + + mtDateTime + + + + + mtCurrency + + + + + mtObject + + + + + mtVariant + + + + + mtDate + + + + + mtTime + + + + + mtChar + + + + + mtTValue + + + + + cbUnchecked + + + + + cbChecked + + + + + cbGrayed + + + + + fmFill + + + + + fmInsert + + + + + fmAdd + + + + + fmUpdate + + + + + linkBidirectional + + + + + linkDataToControl + + + + + linkControlToData + + + + + eaInclude + + + + + eaExclude + + + + + colExpressions + + + + + colCollections + + + + + exprControlToSource + + + + + exprSourceToControl + + + + + exprBidirectional + + + + + biBindsComponent + + + + + biBindsComponentProperty + + + + + biBindsOther + + + + + dbcoptAddDataBindingsProperty + + + + + dbcoptApplyToDescendents + + + + + moTrack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter method for the BindingsList property. + + + + + + +Reads the state of this component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + + + + +Protected getter method for the ControlComponent property. + + + + + + +Protected setter method for the ControlComponent property. + + + +Verifies whether the control component is assigned. +If the ControlComponent is nil, then CheckControlComponent raises an exception. + + + + + + +Protected getter implementation for the DisplayName property. + + + + + + +Returns whether this component is in design mode. + + + + + + +Returns whether this component is in loading mode. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. + + + + + + + +Returns whether the control component can be set a given value. +As implemented in TContainedBindComponent, CanSetControlComponent always returns True, but in descendants it actually returns whether the given Value (that is itself a TComponent) can be assigned to the control component. + + + + + + +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. + + + + + + +Verifies whether the contained binding component has a parent. +HasParent returns True if the contained binding component has a parent, False otherwise. + + + + + + +Sets the parent component of this component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. + + +Specifies a list that holds the binding expressions. + + + + + + +Returns the index of this component in the bindings list. + + +Specifies the component that will be bound to the source component, by means of LiveBindings. + + +Returns a string containing the name of this component. + + +Specifies a category for this component. +For example, for a binding expression called BindExpressionForm121, of type TBindExpression, the following code: + + ShowMessage(BindExpressionForm121.Category); + +shows the following message: Binding Expressions. + + + +Base class for all common binding components descending from it. +TContainedBindComponent is an abstract class that is the base class for TCommonBindComponent. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + exprUnspecified + + + + + + + + + + + exprUnspecified + + + + + + + + + + + + exprUnspecified + + + + + + + + + + + + exprUnspecified + + + + + + + + + + + + + + + + + + + + + + + Describe the component/property that a binding component depends upon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TCustomBindingsList.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TCustomBindingsList.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Data.Bind.Components.TCustomBindingsList.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Enumerates all child components. +Data.Bind.Components.TCustomBindingsList.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + +Specifies a list of available methods. For more information about these methods, read the LiveBindings Methods topic. + + +Specifies a list of available output converters. For more information about output converters, read the LiveBindings Output Converters help topic. + + + + + + +Returns a TComponent enumerator. +Data.Bind.Components.TCustomBindingsList.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Specifies whether the bindings list uses the global application manager for managed bindings. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Represents the base class for the binding list. +The TCustomBindingsList class implements a list of binding expressions, output converters, method scopes, and other binding list-related functionality. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Describe the component/property that a binding component depends upon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Implements the bindings list component. TBindingsList is built on the TCustomBindingsList component and publishes additional properties that can be accessed from within the Object Inspector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editors implement these methods to support the expression ListItemIndex(Self). + + + + + + + + + + + + + + + Get or set the list item index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Enumerator of data source records, such as records in a dataset. + + + + + Data source member name, such as a FieldName. + + + + + Editor for a list, such as a FMX TListView. + + + + + Member name for a list, such as "Text". + + + + + Indicate whether the assignment can be evaluated without expression engine. + + + + + Expression engine description of assignment. + + + + + Event to execute when the expression engine raises an exception + + + + + Indicate whether the expression has been customized. A customized expression must + be evaluated with expression engine, rather than by shortcut. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Enumerator of data source records, such as records in a dataset. + + + + + Data source member name, such as a FieldName. + + + + + Indicate whether the assignment can be evaluated without expression engine. + + + + + Expression engine description of expression to evaluate. + + + + + Event to call when the expression engine raises an exception + + + + + Indicate whether the expression has been customized. A customized + expression must be evaluated with expression engine, rather than as a shortcut + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate expressions to fill a break header + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Informs the wrapper binding component that a delegate (or contained) binding component has been activated. + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Used internally for observing purposes. + + + + + + + + +Returns an array of scopes for the source component. + + + + + + + + + +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + + + + +Returns True if this binding component delegate supports evaluation shortcuts or False otherwise. +Subclasses of TBindComponentDelegate that support evaluation shortcuts must reimplement GetUseEvalShortcuts to return True. + + + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + +Event that occurs as an expression is evaluated and is assigning to a value of an object member. Event handlers can intercede in the assignment operation. + + +Event that occurs after an expression has been evaluated and has assigned a value to an object member. + + +Event that occurs when an exception is raised while evaluating an expression, such as a conversion error. Event handlers can intercede and raise a different exception. + + +Event that occurs when activating the binding expressions of this delegate wrapper. + + +Event that occurs when the binding expressions of this delegate wrapper have been activated. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter method for the ControlComponent property. + + + + + + +Protected setter method for the ControlComponent property. + + + + + + +Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + + + + +Activates or deactivates the bind control value of this link delegate wrapper. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Returns whether the given parameter can be used as the control component of this binding component. +CanSetControlComponent returns whether the given Value (that is itself a TComponent) can be used as the control component of this binding component. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected setter implementation for the DataSource property. + + + + + + Base class for scope with supports linking + + + + +Protected getter implementation for the DataSource property. + + + + + + +Protected setter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use SetSourceMember as the setter implementation. + + + + + + +Protected getter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use GetSourceMember as the getter implementation. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies a TBaseLinkingBindSource object to which this delegate component links. +Use DataSource to determine or set the TBaseLinkingBindSource object that connects to a specific dataset. + + + + + + Direction of data flow for a TLinkControlToFieldDelegate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Direction of data flow for a TLinkControlToFieldDelegate + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TCustomLinkControlToField.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + +Returns an array of scopes for the source component. +Data.Bind.Components.TCustomLinkControlToField.GetSourceScopes inherits from Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. +Returns an array of scopes for the source component. + + + + + + + + + +Used for renaming a member of this binding component. +Data.Bind.Components.TCustomLinkControlToField.MemberRenaming inherits from Data.Bind.Components.TBindComponentDelegate.MemberRenaming. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.MemberRenaming. +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Used internally for observing purposes. +Data.Bind.Components.TCustomLinkControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + +Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + +Setter of UseEvalShortcuts. + + + + + + + + +Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkListControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + + + + +Returns a string containing the name of the control component member. +Data.Bind.Components.TCustomLinkListControlToField.GetControlComponentMemberName inherits from Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. +Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkListControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Used internally for observing purposes. +Data.Bind.Components.TCustomLinkListControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + +Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkListControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +Data.Bind.Components.TCustomLinkListControlToField.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Setter of UseEvalShortcuts. + + + + + + + + +Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkListControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies additional optional expressions to use when filling the list control. Use this collection when multiple expressions are needed to fill an item in the list. +For instance, you can use FillExpressions in order to populate a FireMonkey list box item Text and Detail properties. Use the FillDisplayCustomFormat and FillDisplayCustomFormat properties in order to fill the Text property and add an item to the FillExpressions collection, for the Detail property. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies a collection of expressions to fill a list header. This property is optional. + + +Specifies the field used to determine a break. This property is optional. + + +Specifies a custom expression that is used with the field defined by the FillBreakFieldName property. For instance, the expression StrCopy(%s, 0, 1); causes a break when the first character of the field is different. This property is optional. + + +Specifies the field to display in the list header. If FillBreakFieldName and FillBreakCustomFormat are blank, then the value determined using FillHeaderFieldName and FillBreakCustomFormat controls breaks. This is the only required field to cause breaking. + + +Specifies a custom expression that is used with the field defined by the FillHeaderFieldName property. For instance, the expression StrCopy(%s, 0, 1); displays the first character of the field in the header. This property is optional. + + +Specifies a collection of break value ranges. The break value falls within an item in this collection. The display value associated with the item is displayed in the header. This property is optional. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected setter implementation for the DataSource property. + + + + + + Base class for scope with supports linking + + + + +Protected getter implementation for the DataSource property. + + + + + + +Protected setter implementation for the FieldName property. + + + + + + +Protected getter implementation for the FieldName property. + + + + + + +Protected getter implementation for the Component property. + + + + + + +Protected setter implementation for the Component property. + + + + + + +Protected setter implementation for the ComponentProperty property. + + + + + + +Protected setter implementation for the Active property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies a TDataSource object to which this delegate component links. +Use DataSource to determine or set the TDataSource object that connects to a specific dataset. + + +Specifies the component that this wrapping binding component references. + + +Specifies the name of the property of the component that this wrapping binding component references. + + +Specifies the field name that this wrapping binding component references. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provide member names to use in generated expressions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected setter implementation for the ScopeMappings property. + + + + + + + +Adds the given scope mapping to the ScopeMappings list. The scope mapping to be added is given through the AScope parameter. + + + + + + + +Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the binding scope for this source component. +The GetScope method returns the binding scope for this source component. This binding scope allows expressions to access properties and methods of the source component, as opposed to GetMemberScope, which allows expressions to access properties and methods of a member of the source component, such as a field. + + + + + + + +Returns the binding scope for the given member name. +The GetMemberScope method returns the binding scope for the member name given through the AMemberName parameter. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + + + + +Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TBaseBindScopeComponent.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Activates or deactivates all the binding expressions of this binding scope component at once. +The ActivateExpressions method activates or deactivates, depending on the value of the AValue parameter, all the binding expressions contained by this binding scope component at once. + +Tip: If one or more of the binding expressions does not support one of the IBindLink, IBindPosition, or IBindActivate interfaces, then ActivateExpressions does nothing for that particular binding expression. + +Specifies a list of binding components that are using this source component. + + +Specifies an owned collection of scope mappings. +The ScopeMappings property specifies an owned collection whose elements are scope mappings. ScopeMappings are used to add name/value pairs that can be referenced by expressions that reference this source component. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TBaseBindScopeComponent.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Data.Bind.Components.TBaseBindScopeComponent.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Base class for the binding scope component. TBaseBindScopeComponent is the ancestor for the TCustomBindScope component. TBaseBindScopeComponent provides functionality for adding scope mappings, getting scope members and values, returning the scope itself or the scope of a member. It also provides properties for accessing the binding expressions in this scope and the scope mappings. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + colExpressions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate expression to assign a value from a data source to an editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate an expression to retrieve a value from a data source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provide an evaluator for assigning from data source to editor + + + + + + + + + + Indicate whether this factory can provide an evaluator for assigning from data source to editor + + + + + + + + + Provide an evaluator for retrieving a value from a data source + + + + + + + + + + Indicate whether this factory can provide an evaluator for retrieving a value from a data source to editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provide an evaluator for assigning from data source to editor + + + + + + + + + + Indicate whether a factory can provide an evaluator for assigning from data source to editor + + + + + + + + + Provide an evaluator for retrieving a value from a data source + + + + + + + + + + Indicate whether a factory can provide an evaluator for assigning from a data source to editor + + + + + + + + + Register an evaluator shortcut factory + + + + + + + + Unregister an evaluator shortcut factory + + + + + + + + Singleton instance property. Use this property to access instance methods. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Get the expresss that is used to set and get the value list item + For example, "Text" is used to set the value of a listbox item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Get the property that is used to set and get the value of a control + For example, the Text property is used to get and set the value of TEdit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Register the member which is the value of an observable control + Text is the value property of TEdit + + + + + + + + + + + Register options for observable components + + + + + + + + + + Register the property which is the value of an non-observable component + Caption is the value property of TGroupBox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Register the expression which is the value of list control item + Selected(Text) is the value property of TEdit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/Data.Bind.ObjectScope.xml b/Modules/DelphiFMX/doc/Data.Bind.ObjectScope.xml new file mode 100644 index 00000000..22b3caf0 --- /dev/null +++ b/Modules/DelphiFMX/doc/Data.Bind.ObjectScope.xml @@ -0,0 +1,9368 @@ + + + + ftString + + + + + ftInteger + + + + + ftSingle + + + + + ftBoolean + + + + + ftBitmap + + + + + ftUInteger + + + + + ftCurrency + + + + + ftDateTime + + + + + ftTStrings + + + + + ftDate + + + + + ftTime + + + + + ftChar + + + + + optShuffle + + + + + optRepeat + + + + + seInactive + + + + + seBrowse + + + + + seEdit + + + + + seInsert + + + + + aaFail + + + + + aaAbort + + + + + aaRetry + + + + + optAllowModify + + + + + optAllowApplyUpdates + + + + + optAllowCancelUpdates + + + + + loptAllowInsert + + + + + loptAllowDelete + + + + + loptAllowModify + + + + + loptAllowApplyUpdates + + + + + loptAllowCancelUpdates + + + + + Event signature for creating an adapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Returns the member for the given member name. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetMember inherits from Data.Bind.Components.TBaseBindScopeComponent.GetMember. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.GetMember. +Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Initializes the component after the form file has been read into memory. +Data.Bind.ObjectScope.TBaseObjectBindSource.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + +Adds the given bind component to the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.AddExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.AddExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.AddExpression. +Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + + + + +Removes the given binding component from the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.RemoveExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. +Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + $FFFFFFFF + + + + + +Returns a TComponent enumerator. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates whether the bind source adapter is positioned in the last record. +Read Eof (end of file) to determine if ItemIndex is located in the last record. If Eof is True, the bind source has an adapter and the active record is the last one or there are no records. Eof is False if the ItemIndex is located in any other position. + + +Indicates whether the bind source adapter is positioned in the first record. +Read BOF (beginning of file) to determine if ItemIndex is located in the first record. If BOF is True, the bind source has an adapter and the active record is the first one. BOF is also True if there is no active record. BOF is False in all other cases. + + +Specifies whether the bind source has permission to modify the data. +Check CanModify to determine if data can be edited. When CanModify is set to True, the bind source can edit the data. When CanModify is set to False, the bind source cannot edit the data. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TBaseObjectBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Specifies whether the bind source adapter is active. +Read Active to determine whether the bind source adapter is active. By default, the Active property is set to True. +When Active is False, the bind source does not have an adapter or its adapter is not active. When Active is True, the bind source has an active adapter. + + +Specifies whether the bind source is automatically activated. Set AutoActive to True for automatic activation. + + +Specifies the index of the current record. +ItemIndex holds the index of the current record of the dataset the bind source adapter is currently on. The first item has the index 0, the second item has the index 1, and so on. If no item is selected, the value of ItemIndex is -1. + + +Indicates whether the data is in edit mode. +Read Editing to determine whether the bind source adapter can currently edit the data. If the Editing property is True, the data provided by the bind source adapter is in editing mode. Otherwise, it is False. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Returns the internal adapter of the bind source. +The InternalAdapter property holds the internal adapter of the bind source. InternalAdapter uses the GetInternalAdapter method to return the internal adapter of the bind source. + +Note: The GetInternalAdapter method always returns nil. Descendant classes must override this method to return the internal adapter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bind source which supports adapters to connect to different types of data + Adapter my be provided by setting a property or by implementing + the OnCreateAdapter event + + + + + + + + + + + + + + + + + + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TCustomPrototypeBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Is a base class that implements a bind source for creating sample data. +If you want to create your own custom prototype bind source, then you should derive your class from TCustomPrototypeBindSource. When designing applications, TPrototypeBindSource is available from the Tool Palette. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + State of a scope adapter + + + + + + + + + Interface for retrieving the underlying object exposed an adapter field + + + + + + + + + + Type information about an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modes which allow editing + + + [seEdit..seInsert] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.ActnList.xml b/Modules/DelphiFMX/doc/FMX.ActnList.xml new file mode 100644 index 00000000..5ae95973 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.ActnList.xml @@ -0,0 +1,1396 @@ + + + + Interface used by the framework to access an action in a + class. + + + + The root component. This is usually a form on which the control which supports this interface is placed. + This function is used by framework + Instance of component that supports IRoot interface + + + + + + + + This method is used by the framework to determine that an instance of object which supports this + interface is used when working with actions. See also InitiateAction. If returns False then the + instance will be ignored + The value set using the method SetActionClient + + + + + + + + This method sets value that the GetActionClient function returns + + + + + + + + + + + + + + + + + + When the framework performs periodical execution of InitiateAction, it invokes the controls in + order defined by this index + + + + + + + + Calls the action link's Update method if the instance is associated with an action link + + + + + + Action associated with this instance + + + + + + The IIsChecked interface provides access to the IsChecked + property for controls that can be checked. + + + + + + + + + + + + + + Determines whether the IsChecked property needs to be stored in the fmx-file + True if IsChecked property needs to be stored, usually if it contains non default value + + + + + + + + + True if the control is in the ON state + + + + + + The IGroupName interface provides access to the GroupName + property for controls that need to provide exclusive checking inside a + group. + + + + + + + + + + + + + + True if GroupName property should be stored + True if GroupName property needs to be stored, usually if it contains non default + ('', '0', '-1') value + + + + + + + + Name of the control group + + + + + + Interface used to access the Shortcut property of some + classes. + + + + + + + + + + + + + + The combination of hot keys that the class should handle + + + + + + If an object supports the ICaption interface, when the text of + the object changes, the Text must also be changed. + + + + + + + + + + + + + + If this function returns true, the text should be save in the fmx-file. + + + + + + + + This property is used to changed the display text. + + + + + + Declares basic methods and properties used to manage lists of + images. + + + + + + + + + + + + + + + + + + + + + + + + Should be called when you change an instance or reference to instance of TBaseImageList or the + ImageIndex property + + + + + Zero based index of an image. The default is -1 + If non-existing index is specified, an image is not drawn and no exception is raised + + + + + The list of images. Can be nil + + + + + + + + + + + + + + + + + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + + + + +Destroys an instance of TContainedActionList. +FMX.ActnList.TCustomActionList.Destroy inherits from System.Actions.TContainedActionList.Destroy. All content below this line refers to System.Actions.TContainedActionList.Destroy. +Destroys an instance of TContainedActionList. +This destructor is inherited from TComponent, see TComponent.Destroy for more information. + + See Also +System.Actions.TContainedActionList.Create +System.Classes.TComponent.Destroy + + + + + + + + + +Evaluates an input key combination to determine whether it is a shortcut for one of the actions in the list. +Typically, your applications do not need to call DialogKey explicitly. When the form's KeyDown method does not evaluate a shortcut key by some other means (such as an event handler), it calls DialogKey for every associated action list until it finds an action that can handle the shortcut. +The action list's DialogKey method, in turn, checks the specified keystroke against the ShortCut property and SecondaryShortCuts properties of each action in the list. If it finds a match, it tells the action to handle the shortcut, and then returns True. If DialogKey cannot find an action to handle the shortcut, it returns False. +DialogKey has the following parameters: + + + +Parameter + +Description + + +Key + +Is the key code for the potential shortcut key. + + +Shift + +Specifies the state of the Shift, Alt, and Ctrl keys that may be combined with Key. + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +The base class for list of actions, without the published properties. +FMX.ActnList.TCustomActionList inherits from System.Actions.TContainedActionList. All content below this line refers to System.Actions.TContainedActionList. +The base class for list of actions, without the published properties. +Implement TContainedActionList to work with common properties for all GUI application frameworks. +Actions lists the actions maintained by the action list. +The ActionCount property returns the number of actions in the list. +OnStateChange sends a notification when the State changes. + + + + + + + + + + + + + +Maintains a list of actions that can be used by components such as controls, menu items, and tool buttons. +Use Action lists to centralize the responses to user actions. Action list components maintain a list of actions that are available to the client controls in an application. You can add action list components to your form from the Standard page of the component palette. +TActionList lets you set up actions using the Action List editor. Double-click the action list to display the Action List editor, from which you can add, delete, and rearrange actions. +TActionList extends the TCustomActionList class redeclaring the public +Name, State, OnChange, OnExecute, +OnStateChange, and OnUpdate properties and events with the published visibility; therefore, these properties and events can be managed in the Object Inspector at design time. + +Code Examples +FMX.ActionsDemo Sample +FMX.PhotoEditorDemo Sample + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference to IGlyph interface of Client. Nil if Client is undefined or + does not support this interface + + + + + + + + + + + The list of images. Can be nil + + + + + + Same as IsHintLinked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UpdateSupported is called when the Supported property can be changed. +UpdateSupported is called from Update or when the value of the +UnsupportedArchitectures or UnsupportedPlatforms property has changed. +UpdateSupported analyzes whether the action can be supported under the current CPU architecture and OS platform with the current settings of the UnsupportedArchitectures, UnsupportedPlatforms, HideIfUnsupportedInterface, and IsSupportedInterface properties. If Supported is estimated False, then UpdateSupported sets Visible and Enabled to False, otherwise UpdateSupported restores the values of Visible and Enabled to the values that were stored before the last time when Supported became False. + + + + + + +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + + + + +Creates the TShortCutList object for the action. +CreateShortCutList creates an empty FireMonkey shortcut list object for the current action. +Notice that implementations of shortcuts are FireMonkey or VCL framework-specific. + + + + + + +Implements a method for storing an action object's unpublished data on a stream such as a form file. +By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the object's properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method: + +TCustomAction overrides the DefineProperties method, defined in TComponent, to define storing of the Caption and ImageIndex properties. +The System.Classes.TComponent.DefineProperties method, defined in TComponent, defines methods to store the "fake" Top and Left properties. These are defined so that action components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Sets the value of the Target property. +The protected SetTarget method is provided so that descendant classes will be able to set the value of the Target property. + + + + + + +Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +FMX.ActnList.TCustomAction.SetEnabled inherits from System.Actions.TContainedAction.SetEnabled. All content below this line refers to System.Actions.TContainedAction.SetEnabled. +Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +The behavior of SetEnabled depends upon the State of the ActionList action list: + +If the value of State is asSuspended, then SetEnabled sets to the specified Value only the Enabled property of the action. +If the value of State is asSuspendedEnabled, then SetEnabled sets to True the Enabled property of the action and of all clients of the action. +Otherwise, SetEnabled sets to the specified Value the Enabled property of the action and propagates this Value to all clients of the action. + + + + + +Sets the new Value of the Visible property for the action and action's clients. +FMX.ActnList.TCustomAction.SetVisible inherits from System.Actions.TContainedAction.SetVisible. All content below this line refers to System.Actions.TContainedAction.SetVisible. +Sets the new Value of the Visible property for the action and action's clients. +SetVisible always propagates this Value to all clients of the action. + + + +Initializes the component after the form file has been read into memory. +FMX.ActnList.TCustomAction.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + +CustomText is a user text. +Some actions can, by default, automatically set the Text property. For example, in the TFileExit standard action, the Text property has the Quit <Application.Title> value. To set your own value, set the value of the Text property to the value of the CustomText property. + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + + +Responds when a client control "fires". +Execute is called automatically when a client control "fires" (for example, when the user clicks a button or selects a menu item). +Execute first ensures that the action is updated. Then Execute calls the inherited System.Classes.TBasicAction.Execute method. System.Classes.TBasicAction.Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called and the action is Enabled. Otherwise, Execute returns False. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.ActnList.TCustomAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + + + +Checks whether the specified keyboard key corresponds to one of the action's shortcuts. +IsDialogKey returns True if the keyboard key specified by the combination of Key and Shift corresponds to one of the action's shortcuts. Here: + +Key is a keyboard scan code. You can find constants for keyboard scan codes in the Constants section of the System.UITypes unit. These are vkXXXX constants (vkEscape, vkReturn, vkF1, and others). +Shift specifies the combination of the ALT, CTRL, SHIFT, and CMD (only Mac) keys. +The action's shortcuts are listed in the ShortCut and SecondaryShortCuts properties. + +Represents the caption of the action. +Text holds the string that is used in the same way as the Caption of the action, when it is set. The value of Text is propagated to the action's clients. +Text is the same as Caption. You can use both Text and Caption, but descendant classes should only use the published property Text, so that the Object Inspector displays only the Text property, as in most FireMonkey components. +In the Text property you can define an accelerator key. On Windows platforms, an accelerator key is shown as an underlined letter. To specify an accelerator key, precede an <accelerator_letter> with an ampersand & character. The letter after the ampersand appears underlined. For example, to set the S character as an accelerator key for a Save action, type &Save. On Windows platforms, accelerator keys enable the user to activate actions pressing Alt+<accelerator_letter> key combination. To show a single ampersand & character in a Text property specify doubled ampersand && characters. Notice that & and _ are seen and can be used only under Windows. + + + +Holds the action list to which the action belongs. +FMX.ActnList.TCustomAction.ActionList inherits from System.Actions.TContainedAction.ActionList. All content below this line refers to System.Actions.TContainedAction.ActionList. +Holds the action list to which the action belongs. + + +Defines whether the UnSupported action can be visible and accessible. +If HideIfUnsupportedInterface is True, then the +IsSupportedInterface function is used for retrieving the value of the Supported property. In this case, if IsSupportedInterface returns False, then this action is always inaccessible and invisible. +If HideIfUnsupportedInterface is False, then this action can be visible or invisible depending on other properties. In this case, descendant classes or application objects should call IsSupportedInterface to retrieve the visibility and accessibility of the action. + + +Specifies that the action is fired by pressing a keyboard key, not by clicking with the mouse. +ShortCutPressed is a read-only property. When ShortCutPressed is True, it specifies that the action is fired by pressing a keyboard key, and not by clicking a control with the mouse. + + + + +Defines the component for which the action is executed. +Target is a read-only property. Target defines the component for which the action is executed. It can be nil. In the case where several controls can be called with one shortcut, Target corresponds to the first matched control. + + +Defines the set of unsupported CPU architectures. +The TArchitecture type defines the arIntelX86 and arIntelX64 constants that identify the processor architectures Intel x86 and Intel x64. +Use UnsupportedArchitectures to identify sets of unsupported processor architectures. + + +Defines the set of unsupported OS platforms. +The TPlatform type defines the pfWindows, pfMacOS, pfiOS, pfAndroid, and pfLinux constants that identify the Windows, Mac OS, Android, and other platforms. +Use UnsupportedPlatforms to identify sets of unsupported OS platforms. + + +Defines whether the action can work on the current platform and CPU architecture. +Supported is a read-only property. Supported defines whether the action can work on the current platform and CPU architecture. The value of this property is defined by the UnsupportedArchitectures and UnsupportedPlatforms properties and also by the IsSupportedInterface function. If Supported is False, then this action is always inaccessible and invisible. + + + +TCustomAction is a base class for FireMonkey actions intended to be used with menu items and controls. +TCustomAction introduces support for the properties, events, and methods of menu items and controls that are clients of actions. +Most properties and events introduced in TCustomAction are public; therefore, use TCustomAction as a base class when deriving your own actions that publish specific subset of properties of associated controls. +Actions centralize responses to user commands (user actions). An action is associated with the user interface elements (components) in an application that uses this action. Actions provide an easy way to synchronize values of properties of an action and of associated components (clients), for example, the enabled state and caption of an action and of an associated speed button and a menu item, and handle the response when the user clicks these components. Each component, which is called the client, has its properties dynamically updated by the associated action and forwards user commands to the action for a response. +The Text property can be used to set an accelerator key to the action. Notice that & and _ are seen and can be used only for Windows. +At design time, you can work in the Action List editor with actions contained in an action list. The action list is a container for actions, organized into categories (File, Edit, and others). +Public properties and events of a component and control that are supported in TCustomAction, either directly or through an ancestor, are the following: + +Properties: Caption, Checked, Enabled, HelpType, HelpContext, HelpKeyword, Hint, ImageIndex, ShortCut, Visible. +Events: OnHint, OnUpdate, OnExecute. +TCustomAction is the base class for TAction and TCustomViewAction. +TCustomAction acts as the base class for several predefined action classes. For predefined actions that augment the behavior of TCustomAction, see the action classes in the FMX.StdActns unit. + +Code Examples +FMX.ActionsDemo Sample +FMX.KeyboardToolbar Sample +FMX.ScrollableForm Sample + + + + + + + + + + + + + + + + + + + + + +Responds when components are created or destroyed. +FMX.ActnList.TCustomViewAction.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Setter for the Component property. + + + + +Is fired when the target component is created. +Event handlers of the TOnCreateComponent type have the following parameters: + + + +Parameter + +Description + + +Sender + +Is the instance of the action that fired the event. + + +NewComponent + +Returns the created component. + +Only a component object of the TFmxObject type can be created in the event handler of this event. If the created component is not a descendant of TFmxObject, then an exception is raised and a new object is destroyed. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.ActnList.TCustomViewAction.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + +Keeps a component that executes an action and whose image becomes visible during the action execution. + + + +A base class for actions that show a specified component when executed. +Descendants of TCustomViewAction can be associated with a component that is made visible when the action executes. +TCustomViewAction extends TCustomAction declaring the component that the action shows when it executes. +TObjectViewAction extends the TCustomViewAction class that defines the FmxObject property and keeps the component value that should be the TFmxObject type object in this case. +Descendants of TObjectViewAction are associated with the TFmxObject type component that is made visible when the action executes. +TVirtualKeyboard and TViewAction are standard actions that descend from TObjectViewAction. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TCustomViewAction (and its descendants) does not distribute changes in values of Caption, Enabled, Checked, GroupIndex, ShortCut, Visible, and OnExecute properties to the respective properties of clients linked with action links. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Bind.Navigator.xml b/Modules/DelphiFMX/doc/FMX.Bind.Navigator.xml new file mode 100644 index 00000000..ecf0c837 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Bind.Navigator.xml @@ -0,0 +1,776 @@ + + + + $190 + + + + + $64 + + + + + $5 + + + + + ngEnabled + + + + + ngDisabled + + + + + nsAllowTimer + + + + + nsFocusRect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies the bind navigator controller that will execute the standard LiveBindings actions. + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateAction.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateAction.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + +Destroys the instance of the contained action. +Fmx.Bind.Navigator.TFMXBindNavigateAction.Destroy inherits from System.Actions.TContainedAction.Destroy. All content below this line refers to System.Actions.TContainedAction.Destroy. +Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +Fmx.Bind.Navigator.TFMXBindNavigateAction.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +Fmx.Bind.Navigator.TFMXBindNavigateAction.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + + +Introduces an interface for a method of notifying a client when the action updates itself. +Fmx.Bind.Navigator.TFMXBindNavigateAction.UpdateTarget inherits from System.Classes.TBasicAction.UpdateTarget. All content below this line refers to System.Classes.TBasicAction.UpdateTarget. +Introduces an interface for a method of notifying a client when the action updates itself. +UpdateTarget does nothing in TBasicAction. UpdateTarget was introduced in TBasicAction so that descendants can override it to correspondingly update a target when the action updates. + + +Specifies the linking bind source (binding datasource) that will be affected by standard LiveBindings actions (for instance, Delete, ApplyUpdates, CancelUpdates, and so on). + + + +Implements a standard LiveBindings action. +TFMXBindNavigateAction is the base class for all standard LiveBindings actions that are compatible with the bind navigator. The standard LiveBindings actions are listed in the following table. + + + +Button + +Purpose + + +Fmx.Bind.Navigator.TFMXBindNavigateFirst + +Sets the current record to the first record in the data source, disables the First and Prior buttons, and enables the Next and Last buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigatePrior + +Sets the current record to the previous record and enables the Last and Next buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigateNext + +Sets the current record to the next record and enables the First and Prior buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigateLast + +Sets the current record to the last record in the data source, disables the Last and Next buttons, and enables the First and Prior buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigateInsert + +Inserts a new record before the current record and sets the data source into Insert and Edit states. + + +Fmx.Bind.Navigator.TFMXBindNavigateDelete + +Deletes the current record and makes the next record the current record. + + +Fmx.Bind.Navigator.TFMXBindNavigateEdit + +Puts the data source into Edit state so that the current record can be modified. + + +Fmx.Bind.Navigator.TFMXBindNavigatePost + +Writes changes in the current record to the data source. + + +Fmx.Bind.Navigator.TFMXBindNavigateCancel + +Cancels edits to the current record, restores the record display to its condition prior to editing, and turns off the Insert and Edit states, if they are active. + + +Fmx.Bind.Navigator.TFMXBindNavigateRefresh + +Refreshes the buffered data in the associated data source. + + +Fmx.Bind.Navigator.TFMXBindNavigateApplyUpdates + +Applies all pending updates to the data source. + + +Fmx.Bind.Navigator.TFMXBindNavigateCancelUpdates + +Cancels all pending updates to the data source. + +For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateFirst.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard First LiveBindings action. +The TFMXBindNavigateFirst class implements a standard LiveBindings action that is used to set the current record to the first record in the data source, to disable the First and Prior buttons, and to enable the Next and Last buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigatePrior.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Prior LiveBindings action. +The TFMXBindNavigatePrior class implements a standard LiveBindings action that is used to set the current record to the previous record and to enable the Last and Next buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateNext.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Next LiveBindings action. +The TFMXBindNavigateNext class implements a standard LiveBindings action that is used to set the current record to the next record and to enable the First and Prior buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateLast.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Last LiveBindings action. +The TFMXBindNavigateLast class implements a standard LiveBindings action that is used to set the current record to the last record in the data source, to disable the Last and Next buttons, and to enable the First and Prior buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateInsert.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Insert LiveBindings action. +The TFMXBindNavigateInsert class implements a standard LiveBindings action that is used to insert a new record before the current record and to set the data source into Insert and Edit states. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateDelete.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + + + + +Introduces an interface for invoking an action on a target client component or control. +Fmx.Bind.Navigator.TFMXBindNavigateDelete.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Implements a standard Delete LiveBindings action. +The TFMXBindNavigateDelete class implements a standard LiveBindings action that is used to delete the current record and to make the next record the current record. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateEdit.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Edit LiveBindings action. +The TFMXBindNavigateEdit class implements a standard LiveBindings action that is used to put the data source into Edit state so that the current record can be modified. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigatePost.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Post LiveBindings action. +The TFMXBindNavigatePost class implements a standard LiveBindings action that is used to apply edits made in the current record to the data source. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateCancel.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Cancel LiveBindings action. +The TFMXBindNavigateCancel class implements a standard LiveBindings action that is used to cancel edits to the current record, to restore the record display to its condition prior to editing, and to turn off the Insert and Edit states, if they are active. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateRefresh.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard Refresh LiveBindings action. +The TFMXBindNavigateRefresh class implements a standard LiveBindings action that is used to refresh the current row only from the data source. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateApplyUpdates.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard ApplyUpdates LiveBindings action. +The TFMXBindNavigateApplyUpdates class implements a standard LiveBindings action that is used to apply updates to the database with all changes that have been made to the data source. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + + + + + + + + + +Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateCancelUpdates.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + +Implements a standard CancelUpdates LiveBindings action. +The TFMXBindNavigateCancelUpdates class implements a standard LiveBindings action that is used to discard all changes that have been made to the data source and restores the data source to the values originally retrieved from the database. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.BufferedLayout.xml b/Modules/DelphiFMX/doc/FMX.BufferedLayout.xml new file mode 100644 index 00000000..a665049c --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.BufferedLayout.xml @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A layout is a container for other graphical objects. +FMX.BufferedLayout.TCustomBufferedLayout inherits from FMX.Layouts.TLayout. All content below this line refers to FMX.Layouts.TLayout. +A layout is a container for other graphical objects. +Use the layouts when you need to organize multiple graphical controls under the same parent. +For instance, you can use these layouts when you need to create rich FireMonkey applications with many graphical controls that are grouped on the same layer. You can set the visibility of all the controls on a layout at once by affecting the visibility of the layout. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Colors.xml b/Modules/DelphiFMX/doc/FMX.Colors.xml new file mode 100644 index 00000000..000c7c68 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Colors.xml @@ -0,0 +1,1883 @@ + + + + $A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Renders the control's surface. +FMX.Colors.TColorBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + +Specifies the alpha color displayed by this color box. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a rectangular-shaped color indicator. +A TColorBox is a visual component represented as a rectangular-shaped optical indicator whose color can be changed programmatically by means of the Color property, or by attaching it to one of the following color selector components: + +TColorPanel +TColorQuad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +OnMouseMove event dispatcher. +FMX.Colors.TColorQuad.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.Colors.TColorQuad.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Colors.TColorQuad.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Renders the control's surface. +FMX.Colors.TColorQuad.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + +Checks whether the point specified by local coordinates belongs to the control area. +FMX.Colors.TColorQuad.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorQuad.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorQuad.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Specifies the alpha channel (transparency) to apply to the selected color. +Change the Alpha property to a value in the range from 0 through 1 to set the alpha channel (transparency) for the selected color. + + + + + + +Specifies the color box attached to this color quad component. +A color box is a visual component represented as a rectangular-shaped optical indicator that changes color according to the color selected in this color quad component. + + + + + + + + + + +Specifies the hue of the selected color, in HSL color coordinates. +Set or read Hue in conjunction with Sat and Lum in order to change or obtain the color selected in this color quad component. + + +Specifies the luminance of the selected color, in HSL color coordinates. +Set or read Lum in conjunction with Hue and Sat in order to change or obtain the color selected in this color quad component. + + + + + + + + + +Specifies the saturation of the selected color, in HSL color coordinates. +Set or read Sat in conjunction with Hue and Lum in order to change or obtain the color selected in this color quad component. + + + + + + + + + + + +Occurs immediately after changing the color on this color quad component. +Write an OnChange event handler to provide additional functionality when changing the color of this color quad component. + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a three-color gradient color selector. +A TColorQuad component is a color selector that displays a color spectrum drawn as a three-color gradient (black, white, and a specified color) that lets you fine-tune your color selection. TColorQuad can be attached to a TColorPicker component. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +OnMouseMove event dispatcher. +FMX.Colors.TColorPicker.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.Colors.TColorPicker.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + +Getter function for the AbsoluteRect property. +FMX.Colors.TColorPicker.GetAbsoluteRect inherits from FMX.Controls.TControl.GetAbsoluteRect. All content below this line refers to FMX.Controls.TControl.GetAbsoluteRect. +Getter function for the AbsoluteRect property. + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Colors.TColorPicker.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Renders the control's surface. +FMX.Colors.TColorPicker.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + +Checks whether the point specified by local coordinates belongs to the control area. +FMX.Colors.TColorPicker.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorPicker.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorPicker.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Specifies the alpha color selected in this color picker. +Color changes in respect to the variation of the Hue property. Programmatically set Hue to a specific value, or visually move the hue selector of this color picker, at run time, to obtain the color in the Color property. + + + + + + +Specifies the TColorQuad component that is attached to this color picker. +Specify a TColorQuad component that is attached to this TColorPicker. In this way, every time you change the Color in this color picker, the color quad component automatically updates to the color selected in the color picker, further allowing you to tweak the saturation and luminance. + +In the picture above, a 0.5 alpha channel TColorBox component was also attached to the TColorQuad for a complete color selection application. + + + + + + + + + + +Specifies the color, by hue, from this color picker. +Hue variates from 0 to 1 and spans the entire color spectrum drawn on this color picker. Programmatically set Hue to a specific value, or visually move the hue selector of this color picker, at run time, to obtain the color in the Color property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a color selector that displays the entire color spectrum. +A TColorPicker component is a color selector that displays a color spectrum and lets you pick any color by moving a dot-style selector. TColorPicker can be attached to a TColorQuad component. + + + +Note: The TColorPicker (Delphi) example describes how to implement a color picker as shown in the image. +See Also +FMX.Colors.THueTrackBar +FMX.Colors.TColorQuad +TColorPicker (Delphi) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +OnMouseDown event dispatcher. +FMX.Colors.TGradientEdit.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.Colors.TGradientEdit.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.Colors.TGradientEdit.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Colors.TGradientEdit.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Renders the control's surface. +FMX.Colors.TGradientEdit.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TGradientEdit.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TGradientEdit.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Executes each time the selected color changes in order to update the gradient. + + +Specifies the color gradient this gradient edit component will use. +Set or get the Gradient property to a TGradient type in order to specify a new gradient pattern. + + +Specifies the location of the selector point over the spanning of the component, which is a gradient color selector. +When the CurrentPoint property changes, an OnSelectPoint event also occurs. + + + + + + +Specifies the color picker attached to this gradient editor component. +A color picker is a visual component represented as a rectangular-shaped optical indicator that permits you to select a color from the color spectrum. + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs immediately after changing the color on this component, which is a gradient color selector. +Write an OnChange event handler to provide additional functionality when changing the color of this component, which is a gradient color selector. + + + + + + + + + + + + + + + + + + + + + + + + +Occurs immediately after clicking over the surface of this gradient color selector. +Write an OnSelectPoint event handler to provide additional functionality when clicking over the surface of this gradient color selector component. OnSelectPoint also occurs when setting the value of the CurrentPoint property. + + + +Represents a gradient editor component. +A TGradientEdit component is a gradient editor that can be used to create new gradient patterns. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Getter of Observers. +FMX.Colors.TColorPanel.GetObservers inherits from System.Classes.TComponent.GetObservers. All content below this line refers to System.Classes.TComponent.GetObservers. +Getter of Observers. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.Colors.TColorPanel.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Executes every time the alpha channel track bar changes its value. + + + + + + +Executes every time the hue track bar changes its value. + + + + + + +Executes every time the color selected by this color panel changes. + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Colors.TColorPanel.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorPanel.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorPanel.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Specifies the alpha color selected by this color panel. + + +Specifies the color box attached to this color panel component. +A color box is a visual component represented as a rectangular-shaped optical indicator that changes color according to the color selected in this color panel component. + + + + + + + + + + + + + + + + + + + + + + +Specifies whether this color panel component will display the alpha channel track bar. +Set the UseAlpha property to True to make this color panel component display the alpha channel (transparency) track bar. Set UseAlpha to False to use solid non-alpha colors. +The default value for the UseAlpha property is True. + + + + + + +Occurs immediately after changing the color of this color panel component. +Write an OnChange event handler to provide additional functionality when changing the color of this color panel component. + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a color selector component complete with alpha channel selection. +A TColorPanel component is a color selector that displays a color spectrum represented as a THueTrackBar, an alpha channel track bar selector, and a color quad. These make the TColorPanel component a great color selector. +A similar color selector can be found in the drop-down mode of the TComboColorBox component. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.Colors.TComboColorBox.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.Colors.TComboColorBox.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + +Customizes styles in complex objects. +FMX.Colors.TComboColorBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Colors.TComboColorBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + +Executes each time the OnPaint event appears. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.Colors.TComboColorBox.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + +Executed right after the value of the Parent property changes. +FMX.Colors.TComboColorBox.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + + +Executes each time the OnChange event appears. + + + + + + +Executes each time the OnChange event appears. + + + +The DoValidating method validates the Text input string. +The method tries to modify the Text input string to match a color name in case the input string is not exactly the name of a color. + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TComboColorBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TComboColorBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Makes this combo color box expand its color selection display. +Call DropDown in applications to make this combo color box expand its contents, allowing you to select a new color from the drop-down list. + + + + + + + + +Specifies the color selected by this combo color box component. +Set or get the Color property in order to specify or obtain the alpha color selected by this combo color box component. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies whether this combo color box component will display the alpha channel track bar when in drop-down mode. +Set the UseAlpha property to True to make this combo color box display the alpha channel (transparency) track bar, when it is in drop-down mode. Set UseAlpha to False to use solid non-alpha colors. + + + + + + + +Occurs immediately after changing the color selected by this combo color box. +Write an OnChange event handler to provide additional functionality when changing the color specified by this combo color box. + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a combo box that allows you to select an alpha color from a color spectrum. +A TComboColorBox behaves like a standard TComboBox, with the difference that, while in drop-down mode, it displays a color spectrum represented as a THueTrackBar, an alpha channel track bar, a color quad, a HEX color value edit box, and a color box. These make the TComboColorBox a great color selector. + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.Colors.TColorButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + +Frees the style of TStyledControl. +FMX.Colors.TColorButton.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.Colors.TColorButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + +Destroys this instance of TPresentedControl. +FMX.Colors.TColorButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + + + +Specifies the color this button will display. The Color property is of type TAlphaColor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs when the Color of TColorButton is changed. +The OnChange event occurs when the button Color property is changed. + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a standard button that displays a color instead of a standard caption. +A TColorButton behaves like a standard TButton. It can even have a modal result, just like typical standard buttons. The only difference between a standard button and a TColorButton is that the latter does not display a standard text caption, but a color in a rectangle that fills almost completely the surface of the button. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Gets the text of the selected item. +FMX.Colors.TColorListBox.GetData inherits from FMX.ListBox.TCustomListBox.GetData. All content below this line refers to FMX.ListBox.TCustomListBox.GetData. +Gets the text of the selected item. +GetData returns the text of the item that is selected in the list box or an empty string, if no item is selected. + + + + + + +Sets the text of the selected item. +FMX.Colors.TColorListBox.SetData inherits from FMX.ListBox.TCustomListBox.SetData. All content below this line refers to FMX.ListBox.TCustomListBox.SetData. +Sets the text of the selected item. +If no item is selected, nothing happens. + + + +Clears the actual items in the color list box, then rebuilds the list with the color items. + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Colors.TColorListBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorListBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorListBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Specifies the alpha color that is currently selected from the list. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a combo box that allows you to select an alpha color from a color spectrum. +A TColorListBox behaves like a standard TListBox, but instead of standard text items, it displays a list of colors under the form of small colored squares, along with the color names. +The TColorComboBox component also displays this kind of list when in drop-down mode. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.Colors.TCustomColorComboBox.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.Colors.TCustomColorComboBox.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + +Clears the items in the color list box, then rebuilds the list with the color items. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Colors.TCustomColorComboBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Colors.TCustomColorComboBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TCustomColorComboBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +A TCustomComboBox is the base class for combo box components. +FMX.Colors.TCustomColorComboBox inherits from FMX.ListBox.TCustomComboBox. All content below this line refers to FMX.ListBox.TCustomComboBox. +A TCustomComboBox is the base class for combo box components. +Inherit from TCustomComboBox to create a control that represents a specialized combo box. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a combo box that allows you to select a color from a color palette. +A TColorComboBox behaves like a standard TComboBox, with the difference that, when in drop-down mode, it displays a list of colors from the standard Delphi palette that you can select. The colors appear in the drop-down list as small colored squares, along with their names. + + +Note: The number of colors in the color palette is more than can be concurrently shown in the TListBoxItem list box. You can use the scroll bar to scroll the items shown in the list box. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll colors using the mouse wheel. To enforce the scroll bar to be shown by default, you can use the code like following: +ColorComboBox1.ListBox.AniCalculations.AutoShowing := false; + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.ComboEdit.xml b/Modules/DelphiFMX/doc/FMX.ComboEdit.xml new file mode 100644 index 00000000..2f551159 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.ComboEdit.xml @@ -0,0 +1,566 @@ + + + + $171B + + + + + $171C + + + + + $171D + + + + + $171E + + + + + $171F + + + + + $1720 + + + + + $1721 + + + + + $1722 + + + + + $1004 + + + + + $1005 + + + + + $1008 + + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.ComboEdit.TComboEditBase.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +Executes internally when the edit control is left-clicked. +DropDown is overridden by edit controls that have pop-up windows that open and close when the edit control is left-clicked. +If the pop-up window is open, then DropDown closes the pop-up window. Else, it opens it. + + + +Tries to close the drop-down list. +CloseDropDown sends a PM_CLOSE_DROPDOWN message to the presentation layer through its presentation proxy. + + + + +The base class for edit boxes having a list of predefined choices. +TComboEditBase extends TCustomEdit defining the DropDown method. + + + + + + + $8 + + + + + $13 + + + + + Native + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.ComboEdit.TCustomComboEdit.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + + + +Returns the name of the default presentation proxy that your presented control uses. +FMX.ComboEdit.TCustomComboEdit.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.ComboEdit.TCustomComboEdit.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +The data model representing the data used by the presentation of the current control. +FMX.ComboEdit.TCustomComboEdit.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + +Returns whether the drop-down box associated with the current TComboEdit object is visible. + + +Count returns the number of items contained by the ListBox object. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Defines whether to use TCustomListPicker pickers providing platform-specific drop-down lists to select string items. +The TDropDownKind type is also used in the TComboEdit, +TComboBox, and TPopupBox controls to define whether to use the TCustomListPicker picker to provide platform-specific controls to select string items from drop-down lists. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs just before the drop-drown list appears. +Write an OnPopup event handler to take specific action just before the drop-drown list appears. + + + +The base class, implementing the basic functionality, for edit boxes having a list of predefined choices. +TCustomComboEdit extends TComboEditBase implementing the basic functionality for edit boxes having a list of predefined choices. +TCustomComboEdit is a presented control. Its data model is TComboEditModel and presentation is TStyledComboEdit. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +An edit box with a list of predefined choices. +TComboEdit stores the predefined choices in its Items property, which can be edited at design time. +TComboEdit encapsulates TComboEditListBox, which is displayed in the drop-down box when the right arrow icon is clicked. Although the ListBox object is fully exposed, we recommend that you use Items to access the list of items. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Controls.xml b/Modules/DelphiFMX/doc/FMX.Controls.xml new file mode 100644 index 00000000..c9d6f58a --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Controls.xml @@ -0,0 +1,7196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converts a point from the scene coordinate system to the screen coordinate system. + + + + + + + + + Converts a point from the screen coordinate system to the scene coordinate system. + + + + + + + + + + + + + + + Disable Scene's updating + + + + + Enable Scene's updating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Controls that can respond to hint-related events must implement + this interface. + + + + This method is called when a hint is triggered. + + + + + + A class needs to implement this interface in order to be able to + register IHintReceiver instances. + + + + Triggers the TriggerOnHint method of all the objects that are registered in this registry. + + + + + Registers a new receiver. + + + + + + + + Unregisters a receiver. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Field to store the hint. + + + + + Field to store the status (enabled or not) of the hint. + + + + + Method that updates the state of enabled. + + + + + + + + Constructor. A constructor needs the native handle of the view that holds the hint. To give an example, + in MS Windows is the HWND of the native window. + + + + + + + + Sets the full hint string. + + + + + + + + Gets the full hint string. + + + + + + + + The hint can follows the following pattern: 'A short Text| A Long text'. It means, the hint can hold + two texts separated by the '|' character. This method returns the short text of the hint. + + + + + + + + Returns the long text of the hint. + + + + + + + + If the specific implementation supports it, this metods places the hint in the given position. + + + + + + + + + Register a class to create hint instances. When a new THint instance is needed, the registered classes are invoked + to create the needed instance. + + + + + + + + Returns an instance created by the first available registered class. This method can return nil if there are no classes + registered or none of the registered classes can create a THint instance. + + + + + + The base class for an object that can manage a hint. + + + + + + + Returns True if there are some THint class registered. + + + + + + + + If this property is true, the hint can be displayed, if it is False, the hint won't be displayed. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Responds when components are created or destroyed. +FMX.Controls.TCustomControlAction.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.Controls.TCustomControlAction.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + +Embarcadero Technologies does not currently have any additional information. + + + + + +TCustomControlAction is the base class for the actions that can be associated with some of the controls. +You can add a control action to a control by setting the Action property of the control, if it is supported. In the Object Inspector choose New Standard Action > No Category > TControl Action for the Action property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This method is invoked to allow a link to customize a Hint that is going to be displayed. + + + + + + + + + This method sets the string of the hint. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FMXFlasher + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Helper for TControlType. + + + + + Returns string presentation of value of this type + + + + + + + + + + + The marker for TControl component, which supports native control implementation. Use this interface to mark + the component that can use the native OS implementation. The FMX platform implementation may use it for + the better manipulation of focus management. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $A + + + + + $6 + + + + + 0.6 + + + + + $A0909090 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sets the InPaintTo property. +Value specifies the value to set the InPaintTo to. +SetInPaintTo is used internally by PaintTo to have the InPaintTo flag set while the control is being painted. Value is likewise applied to all of the control's children. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Setter for the Hint property. + + + + + + + + + + +Setter of Enabled. + + + + + +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +FMX.Controls.TControl.Updated inherits from System.Classes.TComponent.Updated. All content below this line refers to System.Classes.TComponent.Updated. +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Controls.TControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Controls.TControl.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + + +Notification method called after the creation order is changed. +FMX.Controls.TControl.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Setter function for the Visible property. Value specifies the new value of the Visible property. + + + + + + + + + + +Warning: DoSetWidth is deprecated. Please use DoSetSize. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Warning: DoSetHeight is deprecated. Please use DoSetSize. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Executed right after the value of the Size property changes. +The control does not execute HandleSizeChanged if you assign Size the same value that it already has. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Setter function for the Height property. Value specifies the new value of the Height property. + + + + + + +Setter function for the Width property. Value specifies the new value of the Width property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + False + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter function for the AbsoluteRect property. + + + + + + + + +Returns the children transformation matrix. +The AbsoluteMatrix is calculated as: + + AbsoluteMatrix = (LocalMatrix * Parent.GetChildrenMatrix) * Parent.AbsoluteMatrix + +TScaledLayout overrides GetChildrenMatrix to prescale layout contents. + + + + + + +Getter function for the AbsoluteScale property. + + + + + + + +Warning: GetParentedRect is deprecated. Please use GetBoundsRect. + + +Getter function for the ParentedRect property. + + + + + + +Getter function for the ClipRect property. + + + + + + +Returns the rectangle occupied by the effects applied over the control. It is used when the control is updated. + + + + + + +Getter function for the AbsoluteEnabled property. + + + + + + +Getter function for the ChildrenRect property. + + + + + + +Getter function for the LocalRect property. + + + + + + +Getter function for the BoundsRect property. + + + + + + +Setter function for the BoundsRect property. Value specifies the new value of the BoundsRect property. + + + + + + + +Warning: IsHeightStored is deprecated. Please use IsSizeStored. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Warning: IsWidthStored is deprecated. Please use IsSizeStored. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Setter function for the PopupMenu property. Value specifies the new value of the PopupMenu property. + + + + + + +Getter function for the AbsoluteMatrix property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter function for the UpdateRect property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter function for the AbsoluteOpacity property. + + + +Begins the drag operation automatically. +BeginAutoDrag is called automatically when a user drags a control whose DragMode is dmAutomatic. Do not call BeginAutoDrag in application code. +Write an event handler for OnDragOver to specify what happens when a dragged object is over the area of the current control. + + + +Saves the control that currently captures all the mouse messages. +Capture sets the current root's Captured property if root is not empty. +ReleaseCapture prevents the current control from receiving all the mouse messages. + + + +Prevents the control from currently capturing all the mouse messages. +Capture empties the root's Captured property. + + +Defines whether the control can use Action.OnExecute for mouse clicks, key pressing, and input on touch devices (gestures). +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise the OnClick event handler is executed. +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. +EnableExecuteAction is True in TTextControl, TImageControl, TSwitch, and their descendants, while False in others. + + + +Responds to user clicks, key pressing, and input on touch devices (gestures). +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. Click also can be called in DialogKey and other methods handling an input from keyboards and touch devices. +Call Click in applications to simulate an OnClick mouse event. +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise executes the OnClick event handler. + + + +Responds to user double-clicks. +DblClick is an event handler for the OnDblClick event. It is automatically called when the left mouse button is pressed and released twice, consecutively, with the pointer over the control. +Call DblClick in applications to simulate a mouse OnDblClick event. + + + + + + + + + +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +OnMouseWheel event dispatcher. +A control calls MouseWheel in response to any of mouse wheel messages, decoding the message parameters into the shift-key state, wheel rotation, and handle, which it passes in the Shift, WheelDelta, and Handled parameters, respectively: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +Handled indicates whether the scroll bar was already moved, depending on the WheelDelta value. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the rolling on the other scroll bar, if it exists. +Override the protected MouseWheel method to provide other responses when the mouse wheel is rotated while the cursor is over the control. + + + + + + + + + +Calls Click and starts the animation by calling StartTriggerAnimation. +MouseClick receives the following parameters: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys -- SHIFT, CTRL, ALT, and CMD (only for Mac) -- were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. + + + + + + + +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + + + + + + +OnKeyUp event dispatcher. +KeyUp provides a response when a key is released while the control has keyboard focus. KeyUp calls the OnKeyUp event handler if one is assigned. +A control calls KeyUp in response to any key-up messages, decoding the message parameters into the key code, character code, and shift state. The control passes them in the Key, KeyChar, and Shift parameters, respectively: + +Key is the scan code of the released keyboard key. +KeyChar is the character code of the released key. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when you release the previously pressed key with the control in focus. +Override the protected KeyUp method to provide other responses when a key is released while the control has keyboard input focus. + + + + + + + +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Displays the PopupMenu context menu of this control on the specified ScreenPosition screen point. +ShowContextMenu returns True if PopupMenu was successfully displayed. Otherwise, ShowContextMenu returns False. +To set or get a context (pop-up) menu for the current control, use the PopupMenu property. +Descendants can override this method. For example, descendants can show a default context menu if PopupMenu = nil. + + + + + + + +OnDragEnter event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +A control calls DragEnter when a dragged object enters the control area. +Override the protected DragEnter method to provide other responses when a dragged object enters the control area. + + + + + + + + +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + + + + + +OnDragDrop event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor, within the client area of the control. +A control calls DragDrop when a dragged object is dropped on the control area. +Override the protected DragDrop method to provide other responses when a dragged object is dropped on the control area. + + + +OnDragLeave event dispatcher. +A control calls DragLeave when a dragged object leaves the control area. +Override the protected DragLeave method to provide other responses when a dragged object leaves the control area. + + + +OnDragEnd event dispatcher. +A control calls DragEnd when a dragging session ends. +Override the protected DragEnd method to provide other responses when the dragging session ends. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Checks whether the input is taken by the control or by its parent. +EnterChildren returns True if the input is taken directly by the control's parent, and False otherwise. +Usually, EnterChildren returns False. If the control is an item such as TListBoxItem, a TTreeViewItem, or TMenuItem, EnterChildren returns True. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the value of the ParentedVisible property. +GetParentedVisible is a protected method in the TControl class and is used to obtain the current value of the ParentedVisible property. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Executed right before the value of the Enabled property of an effect changes, and provides the value of the property before it changes. +The control does not execute BeforeEffectEnabledChanged if you assign Enabled the same value that it already has. + + + + + + +Executed right after the value of the Enabled property of an effect changes, and provides the new value of the property. +The control does not execute EffectEnabledChanged if you assign Enabled the same value that it already has. +Effects execute EffectEnabledChanged instead of FMX.Controls.TControl.EnabledChanged. + + + +Performs the realignment of the control's children within itself. +The children are realigned taking into account their alignment properties, margins, and padding. +It is called internally every time the control's visual properties are changed. Realign is also called by EndUpdate, if there are no opened update sessions (FUpdating is 0). + + + +Executed when the alignment of the children of the control changes. +The alignment of the children of the control may change for any of the following reasons: + +The alignment of a child control changes. +The anchoring of a control changes. +The control looses one of its child controls. + + + + + +Getter function for the Align property. + + + + + + +Setter function for the Align property. Value specifies the new value of the Align property. + + + + + + +Getter function for the Anchors property. + + + + + + +Setter function for the Anchors property. +Value specifies the new value of the Anchors property. + + + + + + +Getter function for the Margins property. + + + + + + +Getter function for the Padding property. + + + + + + +Getter function for the Width property. + + + + + + +Getter function for the Height property. + + + + + + +Getter function for the Left property. + + + + + + +Getter function for the Top property. + + + + + + +Getter function for the AllowAlign property. + + + + + + +Getter function for the AnchorRules property. + + + + + + +Getter function for the AnchorOrigin property. + + + + + + +Getter function for the OriginalParentSize property. + + + + + + +Getter function for the AnchorMove property. + + + + + + +Setter function for the AnchorMove property. +Value specifies the new value of the AnchorMove property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter function for the ContainerWidth property. +The container width is equal to the control width. + + + + + + +Getter function for the ContainerHeight property. +The container height is equal to the control height. + + + + + + +Returns the current control as a TFmxObject. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter function for the Visible property. + + + + + + +Getter function for the DesignInteractive property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +OnEnter event dispatcher. +DoEnter is called automatically when the control receives the input focus. +DoEnter repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. The applied animations and effects highlight the focused control. +Override the protected DoEnter method to provide other responses when the current control receives focus. + + + +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Dispatcher of the OnDeactivate event. + + + +OnMouseEnter event dispatcher. +DoMouseEnter is called automatically when the mouse pointer enters the control's area. +DoMouseEnter starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to highlight the control. +Override the protected DoMouseEnter method to provide other responses when the mouse pointer enters the control's area. + + + +OnMouseLeave event dispatcher. +DoMouseLeave is called automatically when the mouse pointer leaves the control's area. +DoMouseLeave starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to background the control. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the control's area. + + + + + + +Verifies whether the current control can receive focus. +A control can receive focus if the ParentedVisible, CanFocus, and AbsoluteEnabled properties are True. +CheckForAllowFocus returns True if the control can receive focus, and False otherwise. + + + + + + +Getter function for the DragMode property. + + + + + + +Setter function for the DragMode property. ADragMode specifies the new value of the DragMode property. + + + + + + +Getter function for the Locked property. + + + + + + +Getter function for the HitTest property. + + + + + + +Getter function for the AcceptsControls property. + + + + + + +Setter function for the AcceptsControls property. + + + + + + + + +Returns the target control. +P is the current position of the dragged object. +Data is the dragged object. +FindTarget checks whether P belongs to the current control or any of its children (using a recursive method) and, if so, returns the control that contains P. +If the target control or any of its children is in designing mode or is not visible, FindTarget returns nil. + + + + + + + +Returns the control in which a specified point can be found. +P is the specified point in the object. +ObjectAtPoint returns the control in which the P point is found. +To start searching within the current control, the control must be visible and enabled. If P is within a child of the control and the child is also a control, the search continues inside the child. +If P is inside the control (not within a child) and the control can be hit, then ObjectAtPoint returns the control. +ObjectAtPoint is used internally. + + + +Returns True if the control has an available hint to display. + + + + + + + +Returns the text of the hint. + + + + + + + +Returns the custom hint object that manages the hint display. +Usually, this is an instance of THint. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Called when the Tap gesture on the style presentation is recognized. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of DefaultSize. + + + + + + + + +Returns the filling direction of the control's text. +FillTextFlags is used by controls that provide the text area to get the filling direction of the text, depending on the reading direction of the control of the current Root, if it exists. + + + +Applies effects to the control, if specified. +This method is called internally during the process of component rendering. +Do not call this method. To apply an effect to a control, add an effect component as a child to the control. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +Processes the painting of the control. +This method is called internally from PaintTo and PaintChildren. DoPaint defines the drawing area by clipping the Canvas to the areas occupied by the control and its children, paints the children and then the control itself. The call to DoPaint is always preceded by a call to Painting and succeeded by a call to AfterPaint. + + + +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + + + + $A0909090 + + + + + $A0909090 + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Performs the alignment of a FireMonkey control. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. + + + +Notifies its child controls that the parent of an ancestor of your control has changed. + + + + +Executed right after the value of the ClipChildren property changes. +The control does not execute ClipChildrenChanged if you assign ClipChildren the same value that it already has. + + + +Executed right after the value of the HitTest property changes. +The control does not execute HitTestChanged if you assign HitTest the same value that it already has. + + + +Executed right after the value of the Padding property changes. +The control does not execute PaddingChanged if you assign Padding the same value that it already has. + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Controls.TControl.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Temporary copy of the canvas on which the control is drawn. +It is used internally in the process of painting. Do not use it in applications. + + + + + + +Setter function for the Left property. Value specifies the new value of the Left property. + + + + + + +Setter function for the Top property. Value specifies the new value of the Top property. + + + +Updates the explicit bounds' properties of the control. +UpdateExplicitBounds is called by SetBounds after updating the control's anchors rules, to update the ExplicitLeft, ExplicitTop, ExplicitWidth, and ExplicitHeight properties. +It is for internal use only. + + + + + + False + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the horizontal coordinate of the left edge of a component, relative to its parent. +The Left property is used to determine where the left side of the control begins or to reposition the left side of the control. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Left property is relative to the screen, in pixels. +Use Position in applications to allow read and write access. + + +Specifies the vertical coordinate of the upper-left corner of a control, relative to its parent, in pixels. +The Top property is used to locate the top of the control or to reposition the control to a different Y coordinate. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Top property is relative to the screen, in pixels. +Use Position in applications to allow read and write access. + + +Specifies the explicit horizontal pixel coordinate of the left edge of a component, relative to its parent. +ExplicitLeft is a read-only property used internally by Delphi. Use Left in applications to allow read and write access. + + +Specifies the explicit vertical pixel coordinate of the top edge of a component, relative to its parent. +ExplicitTop is a read-only property used internally by Delphi. Use Top in applications to allow read and write access. + + +Specifies the explicit horizontal size of the control (in pixels). +ExplicitWidth is a read-only property used internally by Delphi. Use Width in applications to allow read and write access. + + +Specifies the explicit vertical size of the control (in pixels). +ExplicitHeight is a read-only property used internally by Delphi. Use Height in applications to allow read and write access. + + + + + + +Returns the associated action link class. +FMX.Controls.TControl.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + + + +Specifies the behavior of a TControl control when Action changes. +Depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +Enabled, Hint, Visible, OnClick, and PopupMenu parameters of TControl. Then ActionChange calls the inherited TFmxObject.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns True when the Visible property needs to be stored in the fmx-file. + + + +Executed right after the value of the Enabled property changes. +The control does not execute EnabledChanged if you assign Enabled the same value that it already has. +EnabledChanged is never executed for effects, which execute EffectEnabledChanged instead. + + + + +Executed right after the value of the Visible property changes. +The control does not execute VisibleChanged if you assign Visible the same value that it already has. + + + + +Returns True if the control rect is empty. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Processes the unhandled gesturing events. +DoGesture is run automatically for all gesturing events that were not handled by the user. DoGesture is run only if OnGesture is not set or if it did not handle the gesture event. +Override DoGesture in descending classes to support default behavior for gesture events that were not handled by the user. In TControl, the DoGesture method simply returns and does no special processing. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the amount (in degrees) by which the control is rotated from the x-axis. +Positive angles correspond to clockwise rotation. For counterclockwise rotation, use negative values. +To set the rotation center, use RotationCenter. + + +Specifies the position of the pivot point of the control. +The coordinates of the rotation center take values in the range from 0 through 1. The point with the coordinates (0,0) corresponds to the upper-left corner of the control, the point with the coordinates (1,1) corresponds to the lower-right corner of the control. The default center of rotation is (0.5, 0.5). +Values outside of [0,0] and [1,1] can be clipped in some descendant classes. +To set the rotation angle, use RotationAngle. + + +Specifies the scale of the control. +Set the Scale coordinates to specify the scale on each axis. +The initial scale rate is 1 on each axis. + +Note: Controls that have the Align or Anchors properties set can use a scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +If True, the value of the ShowHint property of this control inherits the value of the ShowHint property of the parent control. +See Using Hints to Show Contextual Help in a FireMonkey Application - Enabling Hints for a Control for more information. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Controls.TControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Controls.TControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + + + + + + + +Sets the boundaries of the current control. +Use SetBounds to change all of the boundary properties of the control at one time. +X specifies the X coordinate of the Position of the control. +Y specifies the Y coordinate of the Position of the control. +AWidth specifies the value of the Width of the control. +AHeight specifies the value of the Height of the control. +The same effect can be achieved by setting the Position, Width, and Height properties separately, but SetBounds changes all properties at once, ensuring that the control will not repaint between changes. +After setting the boundary properties, SetBounds specifies to the control to maintain the alignment of the control within its parent and of its children within it. The given parameter does not necessarily reflect in the Position, Width, and Height properties. The properties can be updated when the alignment is applied. + + + +Translates coordinated of the specified Point from an global perspective to a local coordinates of this control. +The absolute context for a control is the parent form area, and the local context is the control area. +Point is the point to be transformed. +AbsoluteToLocal returns the transformed point. +To have the inverse effect over a point, use LocalToAbsolute. + + + + + + + + +Translates coordinated of the specified Point from an global perspective to a local coordinates of this control. +The absolute context for a control is the parent form area, and the local context is the control area. +Point is the point to be transformed. +AbsoluteToLocal returns the transformed point. +To have the inverse effect over a point, use LocalToAbsolute. + + + + + + + + +Transforms and returns a specified point from the local perspective to the absolute perspective. +Use LocalToAbsolute to get the transposed coordinates of a point from the local context to the absolute context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the point to be transformed. +LocalToAbsolute returns the transformed point. +To have the inverse effect over a point, use AbsoluteToLocal. + + + + + + + + +Transforms and returns a specified point from the local perspective to the absolute perspective. +Use LocalToAbsolute to get the transposed coordinates of a point from the local context to the absolute context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the point to be transformed. +LocalToAbsolute returns the transformed point. +To have the inverse effect over a point, use AbsoluteToLocal. + + + + + + + + +Transforms and returns a specified point from the screen perspective to the local perspective. +P is the point to be transformed. +ScreenToLocal is used internally. + + + + + + + + +Transforms and returns a specified point from the local perspective to the screen perspective. +P is the point to be transformed. +LocalToScreen is used internally when applying a certain placement. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + +Transforms and returns a specified vector from the absolute perspective to the local perspective. +Use AbsoluteToLocalVector to get the transposed coordinates of a vector from the absolute context to the local context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the vector to be transformed. +AbsoluteToLocalVector returns the transformed vector. +To have the inverse effect over a point, use LocalToAbsoluteVector. + + + + + + + +Transforms and returns a specified vector from the local perspective to the absolute perspective. +Use LocalToAbsoluteVector to get the transposed coordinates of a vector from the local context to the absolute context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the vector to be transformed. +LocalToAbsoluteVector returns the transformed vector. +To have the inverse effect over a vector, use AbsoluteToLocalVector. + + + + + + + + +Checks whether the point, specified by the absolute coordinates, belongs to the control area. +PointInObject returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the absolute coordinates (relative to the main form) of the point to be checked (compare with PointInObjectLocal): + +X is the X coordinate. +Y is the Y coordinate. +The points of the control boundary specified by BoundsRect belong to the control and PointInObject returns True for them. + +Note: PointInObject simply converts absolute coordinates of the point to local coordinates and calls PointInObjectLocal. + + + + + + + +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + +Takes and returns a screenshot of the control. +MakeScreenshot creates a new TBitmap, draws on it the image of the current control by calling PaintTo, and returns it. + + + +Marks the start of an update session of the control and its children. +It increases the value of the FUpdating semaphore. A call to BeginUpdate must be complemented by calls to EndUpdate after the update is finished. +FUpdating is an internal semaphore used to mark the process of control updating. Painting of a control is disabled while FUpdating is higher than 0. + + + + + + +Returns True if this control is in the middle of one or more update sessions. It returns False otherwise. + + + +Marks the end of an update session of the control and its children. +The update session must be started first by calling BeginUpdate. +EndUpdate decreases the FUpdating semaphore. If all update sessions end and FUpdating is 0, EndUpdate invokes Realign to process layout changes. + + + +Recalculates AbsoluteMatrix. +It is used in the painting process. Do not call RecalcAbsoluteNow in an application. + + + +Forces the current control to recalculate its UpdateRect property. RecalcUpdateRect also forces the control's parent--if necessary--and children to recalculate their UpdateRect property. + + + +Forces the current control to recalculate its Opacity property. RecalcOpacity also forces the control's children to recalculate their Opacity property. + + + +Forces the current control to recalculate the AbsoluteMatrix property. RecalcAbsolute also forces the control's children to recalculate their AbsoluteMatrix. + + + +Forces the current control to recalculate its enabled state. RecalcEnabled also forces the control's children to recalculate their enabled state. + + + +Forces the current control to recalculate its HasEffect property. RecalcHasEffect also forces the control's parent to recalculate its HasEffect property. + + + +Forces the current control to recalculate its HasClipParent property. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Updates the effects of the current control and of the control's parent. +UpdateEffects is called every time the current control is changed (repainted, realigned, resized). UpdateEffects is also used when a new child is added to the control by calling AddObject. + + + + + + + +Applies the specified mouse trigger effect to all the children of this FMX object that are of type TEffect. +ApplyTriggerEffect iterates through all the children of this FMX object and, if one of them is of type TEffect, applies the mouse trigger given through the ATrigger parameter (which can be 'IsMouseOver', 'IsMouseOver', 'IsDragOver', and so on). +AInstance specifies the instance of the FMX object to which the trigger effect is applied. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Sets the focus to the current control, if CanFocus is True. When the current control receives focus, the OnCanFocus event is triggered. + + + +Removes the focus from a control or from any children of the control. + + + +Paints the current control to a specified canvas. +ACanvas specifies the canvas to draw on. +ARect specifies the rectangle area of the ACanvas to draw on. +AParent specifies the Parent of the control. By default, it is empty. +PaintTo is called in the process of applying effects on the control in ApplyEffect, in which the control is first painted on the effect's canvas using PaintTo and then the effect is processed. It is also used in MakeScreenshot in order to produce a screenshot bitmap. +Descendants of TControl override PaintTo to provide specific rendering of the respective controls. + + + + + + + nil + + + + + + +Forces the control to repaint its image on the screen. +Repaint updates the effects applied to the control, if any, and adds a new update rectangle--which corresponds to the control's UpdateRect--to the control's Scene. +Call Repaint when the control's displayed area needs to be updated. + + + + + + +Adds a rectangle to the update region of the scene. +ARect specifies the rectangle to be invalidated. +InvalidateRect transposes ARect to the local perspective and then adds it to the update region of the Scene. + + + +Locks the current control, so it cannot be changed at design time. Lock also locks the current control's children. + + +Specifies the absolute transformation matrix of the control. +AbsoluteMatrix is calculated using FLocalMatrix and AbsoluteMatrix of its parent. +The calculation only takes place if FRecalcAbsolute is True and the result is then cached in the FAbsoluteMatrix field. +If the calculation is not taking place during an update session and InPaintTo is not set, it initiates Repaint. +AbsoluteMatrix is used when the control is painted or needs to be repainted. + + +Specifies the absolute opacity of the control. +If the control has another TControl as parent, AbsoluteOpacity depends on the absolute opacity of its parent. +To explicitly set the opacity of a control, use the Opacity property. + + +Specifies the absolute width of the control. +Usually, it has the same values as the Width property. The value can be affected by the transformations applied over the control. + + +Specifies the absolute height of the control. +Usually, it has the same value as the Height property. The value can be affected by the transformations applied over the control. + + +Specifies the absolute scale of the control. +The absolute scale of a control is the scale relative to the scale of its parent. +AbsoluteScale is kept as a TPointF. The X coordinate is the scale for the X axis and Y is the scale for the Y axis. + + +Specifies whether the control is absolutely enabled. +AbsoluteEnabled is True only if Enabled is True and the parent also reports AbsoluteEnabled as True. Therefore, this logic climbs the parent hierarchy to determine whether the control is truly enabled or not. +If Parent is set and the parent's AbsoluteEnabled property is False, AbsoluteEnabled is set to False, otherwise it has the value of the Enabled property. + + +Specifies the absolute rectangle that bounds the control. It returns the bounding rectangle of the control in absolute coordinates (relative to the main form). + + + +Specifies the absolute rectangle of the control after all its parent controls clip it. + + + +A TRectF defined by the width and height of the control. +This TRectF is normalized. DoGetUpdateRect uses this property. + + + +A flag that signals when a control is in the process of applying an effect. +The ApplyEffect method uses this flag to correctly render a control. + + + +Specifies whether the control has an applied effect. +HasEffect is False if an effect was applied to the control, and True otherwise. + + +Specifies whether the control's effect is painted. +HasDisablePaintEffect is True if the control has disabled the painting effect, and False otherwise. + + +Specifies whether the control has an effect that is applied after the control is painted. +HasAfterPaintEffect is True if the control has an effect that is applied after the control is painted, and False otherwise. + + +Control that is a direct child of this control and has clipped this control. + + +Specifies the bigger rectangle area occupied by parent and children controls. +ChildrenRect is a rectangle obtained by performing a union operation between the rectangles occupied by the parent control and the children controls. + +Use the ChildrenRect.Width property on the parent, to obtain the width of the rectangle. +Use the ChildrenRect.Height property on the parent, to obtain the height of the rectangle. +Note: They are read-only properties. + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the inverse matrix of AbsoluteMatrix. + + +Specifies whether the control is currently being painted. +InPaintTo is True if the current control is being painted. + + +Specifies the local rectangle for painting the control. +The coordinates of the upper-left corner of the rectangle are (0,0) and the coordinates of the bottom right corner are (Width, Height). + + +Indicates whether the control is currently pressed. +Mouse action event handlers use this property as a flag to determine how to proceed in some cases. + + + +A point that indicates where exactly on the control the click occured. +MouseDown sets PressedPosition if Button is mbLeft. + + + +Specifies the rectangle area of the control that needs to be updated. +UpdateRect is a union between the rectangle areas that need to be painted over the control when: + +The control receives focus. +The control gets new effects. +The control's children are updated. +The control's parent is updated. + +Specifies the bounding rectangle of the control. +The coordinates of the upper-left corner of the bounding rectangle are X and Y coordinates of the control Position. The coordinates of the lower-right corner are X+Width and Y+Height. +For example: + +R:=Control.BoundsRect; + +The coordinates of the R rectangle are: + +R.Left = Control.Position.X; +R.Top = Control.Position.Y; +R.Right = Control.Position.X + Control.Width; +R.Bottom = Control.Position.Y + Control.Height; + +When BoundsRect is set, the Position property is set to be the upper-left corner of the given bound rectangle, and the Width and Height of the control receive the values of the width and height of the given bound rectangle. +For example: + +Control.BoundsRect:=R; + +The controls have the following properties: + +Control.Position.X= R.Left; +Control.Position.Y= R.Top; +Control.Width= R.Width; +Control.Height= R.Height; + + +Specifies the bounding rectangle of the control within its parent. + + +Specifies whether all the control's parents are visible. +A control can be set to visible if all its parents are also visible. +ParentedVisible returns True if the control's parents are visible, and False otherwise. + + +Specifies the bound rectangle to be clipped. +The values of ClipRect are specified by: + +Left and Top, equal to 0. +Right, equal to Width. +Bottom, equal to Height. + +Provides the drawing surface of the control. +Canvas defines an area within which you can explicitly position child elements by using coordinates that are relative to the drawing area. +For more details, see TCanvas. + + +Stores an array of child controls attached to this parent control. + + +Number of controls that are direct children of this control. + + +Specifies the parent control of this control. + +Tip: You cannot set the parent control of this control as the control itself (Self (Delphi) or this (C++Builder)). + +Specifies the current scene in which the control is drawn. +The Scene of the control is also the scene of its children. + + +Specifies whether the control captures mouse events. +When a control captures the mouse, all subsequent mouse events go to that control until the user releases the mouse button. + + +Specifies whether the current control can receive focus. +CanFocus is True if it can receive focus, and False otherwise. +If it is set to False, the control cannot be selected when using the TAB key. +A control can receive focus after it is created. + + +Specifies whether the parent of this control should be evaluated to receive focus. +CanParentFocus is True when the parent of this control should be evaluated to receive focus if this control cannot receive focus itself, and False otherwise. + + +Specifies whether the control has the focus effect disabled. +Set DisableFocusEffect to True so the control disables the effect applied when it receives focus. Usually, DisableFocusEffect for FireMonkey controls is False. + + +Whether the current style of this control has been actually applied to the control. +IsInflated is True if the current style of the control has been applied to the control. It is False otherwise. +For example, if you change the style of a control at run time, IsInflated is False until the control is updated to show its new style. + + + + + + +Loops through the controls that are children of this control, and runs the specified procedure once per control, with a different control as the first parameter in each call. + +Warning: EnumControls is deprecated as a function. You should use it as a procedure instead. This page describes the syntax and use of the EnumControls procedure. +EnumControls loops not only through direct children of this control, but also through their children (grand-children), and so on, using a depth-first search algorithm. +Each time EnumControls visits a control during the search, it executes the Proc procedure. This procedure receives the visited control as argument, and it returns a value of type TEnumControlsResult. The return value defines what EnumControls does next. You may return any of the following values: + +Continue lets EnumControls keep searching the controls as usual. +Discard makes the search skip the children of the current control (the control in the first parameter), as well as their children (grand-children) and so on. +Stop interrupts the search loop. If EnumControls were a language-level control loop, Stop would be the Break keyword. +Example +The following is an example call to EnumControls that loops through the children of a panel (Panel1) and fills a list (ListOfVisibleControls) with all the controls that are visible: + + +In Delphi: + +Panel1.EnumControls(function (Control: TControl): TEnumControlsResult + begin + if not Control.Visible then + Result := TEnumControlsResult.Discard + else + begin + ListOfVisibleControls.Add(Control); + Result := TEnumControlsResult.Continue; + end; + end); + + + +In C++: + +1. Define a class that implements the TFunc__2 interface: +class TMethodReference : public TCppInterfacedObject<TFunc__2<TControl*,TEnumControlsResult> > +{ +public: + TEnumControlsResult __fastcall Invoke(TControl* Control) + { + if (!Control->Visible) + return TEnumControlsResult::Discard; + else { + TForm2::ListOfVisibleControls->Add(Control); + return TEnumControlsResult::Continue; + } + } +}; + +2. Then pass an instance of this class to EnumControls: +Panel1->EnumControls(new TMethodReference); + + + + + + + + True + + + + + +Loops through the controls that are children of this control, and runs the specified procedure once per control, with a different control as the first parameter in each call. + +Warning: EnumControls is deprecated as a function. You should use it as a procedure instead. This page describes the syntax and use of the EnumControls procedure. +EnumControls loops not only through direct children of this control, but also through their children (grand-children), and so on, using a depth-first search algorithm. +Each time EnumControls visits a control during the search, it executes the Proc procedure. This procedure receives the visited control as argument, and it returns a value of type TEnumControlsResult. The return value defines what EnumControls does next. You may return any of the following values: + +Continue lets EnumControls keep searching the controls as usual. +Discard makes the search skip the children of the current control (the control in the first parameter), as well as their children (grand-children) and so on. +Stop interrupts the search loop. If EnumControls were a language-level control loop, Stop would be the Break keyword. +Example +The following is an example call to EnumControls that loops through the children of a panel (Panel1) and fills a list (ListOfVisibleControls) with all the controls that are visible: + + +In Delphi: + +Panel1.EnumControls(function (Control: TControl): TEnumControlsResult + begin + if not Control.Visible then + Result := TEnumControlsResult.Discard + else + begin + ListOfVisibleControls.Add(Control); + Result := TEnumControlsResult.Continue; + end; + end); + + + +In C++: + +1. Define a class that implements the TFunc__2 interface: +class TMethodReference : public TCppInterfacedObject<TFunc__2<TControl*,TEnumControlsResult> > +{ +public: + TEnumControlsResult __fastcall Invoke(TControl* Control) + { + if (!Control->Visible) + return TEnumControlsResult::Discard; + else { + TForm2::ListOfVisibleControls->Add(Control); + return TEnumControlsResult::Continue; + } + } +}; + +2. Then pass an instance of this class to EnumControls: +Panel1->EnumControls(new TMethodReference); + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Indicates whether a control should be ignored in ObjectAtPoint. +False if the control should be ignored in ObjectAtPoint. ShouldTestMouseHits normally returns the same value as the value of Visible property of the control. +TFrame overrides this method to allow itself to be painted in design time regardless of the value of its Visible property. + + + + + + +Specifies whether the mouse cursor is over the control. +IsMouseOver is True when the mouse is passing over the control. +For effect triggers, setting IsMouseOver to True triggers the effect while the mouse passes over the control. + + +Specifies whether a dragged object is over the area of the current control. +IsDragOver is True when the dragged object is over the current control. +For effect triggers, setting IsDragOver to True triggers the effect when the dragged object is over the current control. + + +Specifies whether the control is in focus. +IsFocused is True when the focus is on the control. +For effect triggers, setting IsFocused to True triggers the effect when the user selects the control. + + +Specifies whether the control is visible. +IsVisible is True when the control is visible. Use Visible in applications to allow write access. +For effect triggers, setting IsVisible to True triggers the effect when the control is visible on the form. + + +Specifies the alignment options (top, left, client, and so on) of this control. +Use Align to automatically set the alignment of the current control. Setting Align to a value different than None can affect the position, size (height and width), and anchors of the control. By default, Align is set to None. +Descendants of TControl typically set the visibility and value for the Align property. For example, for TToolBar, Align defaults to TAlignLayout.Top. +To see the possible values for Align and their visible effects over the control, see FMX.Types.TAlignLayout. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + +Specifies how the control is anchored to its parent. +Use Anchors to ensure that a control maintains its current position relative to the edges of its parent, even if the parent is resized. When its parent is resized, the control holds its position relative to the edges to which it is anchored. Anchors is enforced only when the parent control is resized. +If a control is anchored to opposite edges at the same time, the control stretches horizontally or vertically to maintain constant the distance between the control edges and parent edges. If a control is anchored to all four edges of its parent, the control stretches in all directions. By default, a control is anchored to the top and left edges of its container (Anchors=[akTop,akLeft]). +The automatic alignment may affect the anchors of a control. When Align is set to None, all the anchors are available. If Align is not None, the anchors affected by the automatic alignment are excluded. Changing the state of the anchors affected by the automatic alignment has no effect over the control. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + +Image to use to represent the mouse pointer when it passes into the region covered by the control. +Change the value of Cursor to provide feedback to the user when the mouse pointer enters the control. For a list of cursor constants, see System.UITypes Constants. The image representations of the cursor depend on the theme active on the current platform. +If Cursor is set to the default cursor, this control might display a different cursor when the mouse pointer is over it. The actual cursor that this control displays is the cursor defined in InheritedCursor, a read-only property that is calculated based not only in the value of Cursor in this control, but also the value of Cursor in any ancestor of this control (parent, grand-parent, and so on until the parent form). + + +Image used to represent the mouse pointer when it passes into the region covered by the control. +The value of the read-only InheritedCursor property is the value of the Cursor property unless Cursor has the default value, in which case InheritedCursor contains the first non-default InheritedCursor value of its ancestors (parent, grand-parent, and so on until the parent form). If every ancestor of this control has InheritedCursor set to the default value, InheritedCursor has the default value in this control as well. +Changing the value of Cursor in this control or in any ancestor of this control may affect the value of InheritedCursor in this control. + + +Specifies how the control initiates drag-and-drop operations. +Use DragMode to control when the user can drag the control. Disable the drag-and-drop capability at run time by setting the DragMode property value to dmManual. Enable automatic dragging by setting DragMode to dmAutomatic. + + +Specifies whether the control is highlighted when the dragged object is over it. + + +Specifies whether the control responds to mouse, keyboard, and timer events. +Use Enabled to change the availability of the control to the user. To disable a control, set Enabled to False. Some disabled controls appear dimmed (for example: buttons, check boxes, labels), while others (container controls) simply lose their functionality without changing their appearance. If Enabled is set to False, the control ignores mouse, keyboard, and timer events. +To re-enable a control, set Enabled to True. +This property applies to all TControl descendants. + + +Aligns the component to the position points of other components (Bounds points). +Specifies the upper-left corner of the current control, relative to its parent. +The Position can be affected by the Padding of its parent and the Margins of the control. + + +Specifies whether the control is locked at design time. +A locked control prohibits to move the control at design time, all the other properties can be modified at design time. +To lock the control, set Locked to True. +By default, Locked is False, and the control can be modified at design time. + + +Specifies the horizontal size of the control (in pixels). +Use the Width property to read or change the width of the control. + + +Height specifies the vertical size of the control (in dp). +Use the Height property to read or change the height of the control. + + +Specifies the vertical and horizontal size (Size.Height and Size.Width) of the control (in pixels). +Use the Size property to read or change the size of the control. + + +Aligns the component to the padding points of other components. +The Padding of a control specifies how close, in pixels, the control's children can come to each of its edges (top, left, bottom, right). Padding adds space to the inner side of the control. +The control's children are repositioned and resized, if necessary, to maintain the Padding. +If the Padding control has zero values, RAD Studio uses the default values (Left=4, Top=4, Right=4, Bottom=4). You can also set your own Padding values. +The following image shows how Padding and Margins properties affect alignment, position, and size of controls. + + +Note: Padding constraints do not work for TScrollBox, TListBox, TTreeView, and TGrid based controls. + + + +Aligns the component to the margins points of other components. +The Margins of a control are the distances (in pixels) from each edge (top, left, bottom, right) to another control within the same Parent or to the edge of its Parent. The Margins add space to the outer side of the control. It only applies for controls that do not use TAlignLayout None and the components are located to each other. +If a margin is not 0, no other control will come closer to the control than the specified distance. If the distance from a Parent edge to the corresponding control edge is smaller than the specified Margins for that edge, the control is repositioned and resized, if necessary, to maintain the specified distance. +If the Margins control has zero values, RAD Studio uses the default values (Left=4, Top=4, Right=4, Bottom=4). You can also set your own Margins values. It only applies to the IDE control's guidelines, when you are dragging control. But if you use Align=Client (for example), it will use the specified values in Margins. +The following image shows how Padding and Margins properties affect alignment, position, and size of controls. + + + +Specifies the control opacity. +Set Opacity to customize the transparency of the current control. +Opacity takes values between 0 and 1. If Opacity is 1, the control is completely opaque; if it is 0, the control is completely transparent. The values over 1 are treated as 1, and the ones under 0 are treated as 0. +Opacity applies to the control's children. + + +Specifies if children of the control should be clipped to the control's on-screen region. +Set ClipChildren to + +True if you want child controls to be clipped to the control's on-screen region. +False if you want child controls to be able to extend beyond the region of the parent control. + +Specifies whether the current control has clipped its parent. +When ClipParent is True, TControl cuts off the portion of the parent that lies under the control when the control is painted by the Paint and Painting methods. +Parts of the control that do not contain visible objects cut off holes in the parent's image. +ClipParent is ignored in PaintChildren and other painting methods. +If one parent has more that one child control having ClipParent equals True, then only one of these child controls is painted with ClipParent equals True. Others child controls are painted as if ClipParent equals False. + + +Enables the control to capture mouse events. + +If you set HitTest to True, this control captures all mouse events. The example below shows the use of HitTest for an OnClick event. +If you set HitTest to False, the mouse events will pass through this control, so that a control laid out behind this one receives the mouse events instead of this control. +Note: The HitTest enables all mouse-related events, which also include the display of Hints and Hint-related events. +For most controls, HitTest is True by default. However, this is not true for all the controls. For example, for TLabel and TPathLabel, HitTest is False by default; these two controls do not capture the mouse-related events unless you set HitTest to True. + +Example of HitTest +1. On a form, place a TPanel component. +2. Inside the panel, place a TPathLabel component. +3. Implement the OnClick event for both the TPanel and the TPathLabel: + +procedure TForm1.Panel1Click(Sender: TObject); +begin + ShowMessage('OnClick event fired for TPanel'); +end; + +procedure TForm1.PathLabel1Click(Sender: TObject); +begin + ShowMessage('OnClick event fired for TPathLabel'); +end; + +4. Set the TPathLabel HitTest property to False (this is the default setting). Run the application and click the label. The OnClick event is fired for the panel (not the label). +5. Set the TPathLabel HitTest property to True. Run the application and click the label. The OnClick event is fired for the TPathLabel. + + +Specifies the context (pop-up) menu object. +Use PopupMenu to set the context menu of the current control. The pop-up window is displayed when ShowContextMenu is called. + + +Indicates the position of the control in its parent's tab order. +TabOrder is the order in which child controls are visited when the user presses the TAB key. The control with the TabOrder value of 0 is the control that has the focus when the form first appears. +Initially, the tab order is always the order in which the controls were added to the form. The first control added to the form has a TabOrder value of 0, the second is 1, the third is 2, and so on. Change this by changing the TabOrder property. +Each control has a unique tab-order value within its parent. +Assigning TabOrder a value greater than the number of controls contained in the parent control moves the control to the end of the tab order. The control does not take on the assigned value of TabOrder, but instead is given the number that ensures that the control is the last in the tab order. + + + + +Specifies whether the component appears onscreen. +Use the Visible property to control the visibility of the control at run time. If Visible is True, the control appears. If Visible is False, the control is not visible. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs when a dragged object enters the area of the current control. +OnDragEnter also occurs when DragEnter is called. +Write an event handler for OnDragEnter to specify what happens when a dragged object enters the area of the current control. + + +Occurs when a dragged object leaves the area of the current control. +OnDragLeave also occurs when DragLeave is called. +Write an event handler for OnDragLeave to specify what happens when a dragged object leaves the area of the current control. + + +Occurs when a dragged object is over the area of the current control. +OnDragOver also occurs when DragOver is called. +Write an event handler for OnDragOver to specify what happens when a dragged object is over the area of the current control. +For most controls, HitTest is True by default. However, this is not true for TLabel, TPathLabel and, TMagnifierGlass where HitTest is False by default; these controls do not capture the OnDragOver event unless you set HitTest to True. +This event provides the following arguments to its event handler: + +Sender is a pointer to the object that called this function. +Data is the dragged object. +Point is the current point of the mouse pointer within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. + +Occurs when a dragged control is dropped. +OnDragDrop also occurs when DragDrop is called. +Write an event handler for OnDragDrop to specify what happens when a dragged control is dropped. + + +Occurs when the dragging of a control ends. +A dragging session can be ended either by dropping the control or by canceling the dropping. +OnDragEnd also occurs when DragEnd is called. +Write an event handler for OnDragEnd to specify what happens when the dragging session ends. + + +Occurs when a key is pressed while the control has focus. +OnKeyDown is called from KeyDown methods of GUI components, for example, of controls and forms. +Write an event handler for OnKeyDown to specify what happens when a control or a form has the input focus and a key is pressed. + + +Occurs when a key is released while the control has focus. +OnKeyUp also occurs when KeyUp is called. +Write an event handler for OnKeyUp to specify what happens when the control is in focus and a key is released. + + +Occurs when the control is clicked. +For controls (such as TLabel and TPathLabel) that have the HitTest property set to False by default, the OnClick and OnDblClick mouse events pass through to the control behind this control. +Usually, the OnClick event happens when the left mouse button is pressed and released with the pointer over the control or when Click is called. +For buttons controls, the OnClick event also happens when the control is in focus and the SPACEBAR or ENTER key is pressed. +For controls with state, like TRadioButton and TCheckBox, OnClick does not change the state (the IsChecked property is not changed). OnClick cannot be associated to a form. + + +Occurs when the left mouse button is double-clicked with the pointer over the control. +OnDblClick also occurs when DblClick is called. +For controls (such as TLabel and TPathLabel) that have the HitTest property set to False by default, the OnClick and OnDblClick mouse events pass through to the control behind this control. + + +Occurs when a control can receive focus. +SetFocus is an event handler for OnCanFocus. +Write an event handler for OnCanFocus to customize the behavior when the control receives focus. + + +Occurs when the control receive input focus. +OnEnter also occurs when DoEnter is called. +Write an event handler for OnEnter to specify what happens when the control receive input focus. + + +Occurs when the input focus is taken from the control. +OnExit also occurs when DoExit is called. +Write an event handler for OnExit to specify what happens when the input focus is taken from the control. + +Note: For example in TEdit control, you may want to prevent the user from leaving the control until a certain value has been entered into it. This can be done with the code like this: +procedure TForm1.Edit1Exit(Sender: TObject); +begin + if Edit1.Text <> 'Hello' then + Edit1.Abort; +end; + +Notice that the code like Edit1.SetFocus; does not have the expected effect. + +Occurs when a mouse button is pressed over a control. +OnMouseDown also occurs when MouseDown is called. +Write an event handler for OnMouseDown to specify what happens when one of the mouse buttons is pressed over the control. + + +Occurs when the mouse cursor moves while over the control area. +OnMouseMove also occurs when MouseMove is called. +Write an event handler for OnMouseMove to specify what happens when the mouse cursor is moved while over the control area. + + +Occurs when the mouse button that was pressed over the control is released. +OnMouseUp also occurs when MouseUp is called. +Write an event handler for OnMouseUp to specify what happens when the button of the mouse that was pressed over the control is released. + + +Occurs when the mouse wheel moves while the control has focus. +OnMouseWheel also occurs when the MouseWheel is called. +Write an event handler for OnMouseWheel to specify what happens when the mouse wheel is moved while the control has focus. + + +Occurs when the mouse cursor enters the area of the control. +OnMouseEnter also occurs when DoMouseEnter is called. +Write an event handler for OnMouseEnter to specify what happens when the mouse cursor is moved inside the control area. + + +Occurs when the mouse cursor leaves the control area. +OnMouseLeave also occurs when DoMouseLeave is called. +Write an event handler for OnMouseLeave to specify what happens when the mouse cursor is moved outside the control area. + + +Occurs when the control is painted. +OnPainting also occurs when Painting is called. +Write an event handler for OnPainting to change the way the control is painted. + + +Occurs when the control is redrawn. +OnPaint also occurs when DoPaint is called. +Write an event handler for OnPaint to change the way the control renders itself. + +Tip: Notice that calling BeginScene in the OnPaint event handlers has no effect, because BeginScene is called before the OnPaint event handler runs. This guarantees that painting always occurs in OnPaint without requiring extra and probably unexpected code to allow drawing to have an effect. + +Occurs immediately after the control is resized. +OnResize also occurs when Resize is called. +Write an event handler for OnResize to make any final adjustments after a control is resized. + +Note: This function is deprecated, instead use the OnResized function. + +Occurs immediately after the control is resized. +This event is invoked when the control is resized, and all the controls children are aligned. + + + +Occurs when the window where this control gains the focus, and the control of the window that has the focus is either this control itself or a descendant of this control. A descendant may be a child, a grand-child, and so on. + + +Occurs when the window where this control is loses the focus while this control or a descendant of this control has the focus. A descendant may be a child, a grand-child, and so on. + + +Occurs when a style is applied to the control. +Write an OnApplyStyleLookup event handler to customize the process of applying a style. +ApplyStyleLookup is an event handler for OnApplyStyleLookup. Override it to customize the process of applying a style. +OnApplyStyleLookup is used for styled controls. + + +Set of optional pixel values you can specify to expand the touch target of a FireMonkey styled control. +FMX.Controls.TControl.TouchTargetExpansion is a published property of all FireMonkey styled controls that support Touch. +Defined as an FMX.Types.TBounds, TouchTargetExpansion takes four optional parameters representing the expansion of the four sides of the control in pixels (Bottom, Left, Right, Top). Each parameter specifies the size of an additional screen area that is to be treated as part of the touch target of the control. +The following figure illustrates how TouchTargetExpansion expands the touch target for a FireMonkey control: + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Specifies whether the Hint can be shown. +If ShowHint is set to True, a Hint string is displayed when the user moves the mouse over the control. + + + + +Specifies the text string that appears when the user moves the mouse over a control. +See Using Hints to Show Contextual Help in a FireMonkey Application for more information about hints. + + + +Specifies the touch manager component associated with the control. +Use the Touch property to access gesturing options associated with a control. Touch specifies a class of type TTouchManager. +Touch is used to: + +Associate a TGestureManager. +(TGestureManager manages all the standard gestures that can be used by the control.) +Select the standard, interactive, or custom gestures to associate with the control. +(You can also connect each gesture to an action; see Assigning Actions to Gestures.) + +Occurs when you perform a gesture associated with this control. +Write an event handler for OnGesture to perform custom processing for gesture events. OnGesture is fired on controls that subscribed for specific gestures using the TTouchManager class. If your code did process the gesture event, do not forget to set the Handled parameter to True so that the event is not propagated further. +If no event handler is associated with the control, the default DoGesture method is executed performing its own processing for the event. +OnGesture is an event handler of type FMX.Types.TGestureEvent. + + +Occurs when a user taps the control using a finger or a similar device (not a mouse). +Write an event handler for OnTap to specify what happens when the user taps the form. +Events occur in the following order: + +OnTap +OnSelectCell +OnSelChanged + + +TControl is the base class for FMX on-screen components. Subclasses are roughly divided into primitive shapes and styleable controls. +TControl extends TFmxObject to present objects that are seen, by adding properties and methods for: + +Size and position +Margins and padding +Alignment with others +Visibility, opacity, scale, and rotation +Mouse interaction and hit testing +Keyboard interaction +Focus and tab order +Triggers for animations and effects +Painting + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + Determines the current state of the style + Unapplied - The style was successfully freed, or was not applied yet + Freeing - At the moment the style is being freed + See FreeStyle + Applying - At the moment the style is being applied + See ApplyStyle + Error - an exception was raised during applying or freeing the style + Applied - The style was successfully applied + + + + + + + + + + + + + + style + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Gets the index of TStyledControl. It always returns 1. It is for internal use only. + + + + + + + + +Specifies whether HelpContext is stored. It is for internal use only. + + + + + + +Setter method for the HelpContext property. It is for internal use only. + + + + + + +Setter method for the HelpKeyword property. It is for internal use only. + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Controls.TStyledControl.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Executed internally each time ApplyStyleLookup is called for this TStyledControl object. +DoApplyStyleLookup activates the OnApplyStyleLookup event handler. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Requests the value of the StylesData property of the style object. + + + +OnPainting event dispatcher. +FMX.Controls.TStyledControl.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Returns context for behavior manager. + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + +Getter for the ParentClassStyleLookupName property. + + + + + + + +Responds when receiving input focus. +DoEnter is called automatically when the control receives the input focus. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Sets the size of the control. +AdjustSize sets the size values that AdjustSizeValue specifies. + + + + + + +Sets the fixed size of the control. +AdjustFixedSize sets the fixed size according to ChooseAdjustType. + + + +Returns an adjust type based on the provided FixedSize. +FixedSize is the value of the FixedSize property of the control that is passed to AdjustFixedSize. + + + + + + + + +Indicates that the control needs to update the style and calls Repaint. +FMX calls DoStyleChanged after the style was changed. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Generates a style lookup name based on the provided AClassName. +The generated style name is composed of the class name without the leading T, followed by the string "style". For example, if you provide TEdit as AClassName, GenerateStyleName returns the string Editstyle. + + + + + + + + + + + +Gets the style resource object linked to TStyledControl. +GetStyleObject is called when the style is applied. Apply a style by calling the ApplyStyleLookup method. +If no style is defined for the current control, it receives the style of the current scene. If the current scene does not have a resource object, GetStyleObject continues to look through the default styles and Parent's style. +Do not call GetStyleObject in an application. + + + + + + + +Gets the style resource object linked to TStyledControl. +GetStyleObject is called when the style is applied. Apply a style by calling the ApplyStyleLookup method. +If no style is defined for the current control, it receives the style of the current scene. If the current scene does not have a resource object, GetStyleObject continues to look through the default styles and Parent's style. +Do not call GetStyleObject in an application. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Returns the style resource for this control as TFmxObject. + + + + + + + +Returns the style resource for this control as TControl. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +FMX.Controls.TStyledControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + +Performs any necessary actions before the first destructor is called. +FMX.Controls.TStyledControl.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + + + +Disposes of the component and its owned components. +FMX.Controls.TStyledControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Determines if and how the width and height of this control should be modified to take the fixed space dictated by the style of this control. +Use one of the values of TAdjustType. + + +Updates the width and height of this control according to its current style. + + + +This property allows you to define the current state of style. It changes when calls virtual methods: FMX.Controls.TStyledControl.FreeStyle, FMX.Controls.TStyledControl.ApplyStyle, and FMX.Controls.TStyledControl.DoApplyStyleLookup. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + False + + + + + +Finds the linked resource object for the style specified by name. +The AStyleLookup parameter specifies the name of the style. +If AStyleLookup is empty, FindStyleResource returns nil. If no resource object is linked directly to the control, FindStyleResource looks to the styles of the control's children. If no resource object is found, it returns nil. +Clone determines whether the returned style resource object should be the original style object (False) or a copy of the original (True). + + + +Finds the linked resource object for the style specified by name. +The AStyleLookup parameter specifies the name of the style. +If AStyleLookup is empty, FindStyleResource returns nil. If no resource object is linked directly to the control, FindStyleResource looks to the styles of the control's children. If no resource object is found, it returns nil. +Clone determines whether the returned style resource object should be the original style object (False) or a copy of the original (True). + + + + + + + + + +Finds the specified resource object and makes a copy. +AStyleLookup specifies the name of the resource object to search for. A clone of the original resource is set on AResource. +FindAndCloneStyleResource returns true if the corresponding resource object is found and it is of type T. Otherwise it returns nil. + + + + + + + + + + + + +Sets a new Scene for the current control. +FMX.Controls.TStyledControl.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + +Gets and applies the style of a TStyledControl. +ApplyStyleLookup gets the style by calling the GetStyleObject method and applies it through the ApplyStyle method. + + + +Call this procedure to indicate that this control requires to get and apply its style lookup. +This forces the next call to ApplyStyleLookup to get and apply its style lookup. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether the control's text should be translated. +Set AutoTranslate to True to permit the control text (if it exists) to be translated, when the control is used in an application available in several languages. Set it to False to keep the text unchanged. + + +Returns a string with the name of the default style of this control. +The name of the default style is composed of the class name without the leading T, followed by the string style, for instance panelstyle. + + + +The name of the default style of the parent class of this control. +The name of the style is composed of the class name without the leading T, followed by the string "style". For example, if the class name is TEdit, the style name is Editstyle. + + + +Specifies whether the control's context-sensitive Help topic is identified by a context ID or by keyword. +If HelpType is htContext, the HelpContext property value identifies the control's Help topic. +If HelpType is htKeyword, the HelpKeyword property value identifies the control's Help topic. + + +Contains the keyword string that identifies the Help topic for the control. +To enable the keyword-based context-sensitive Help for a control, set the HelpType property to htKeyword and set HelpKeyword to a keyword string. +No keyword (zero-length string, the default) means that no Help topic is provided for the control. + + +Contains the numeric context ID that identifies the Help topic for the control. +In case of a .chm Help file, you must symbolically map Context IDs of Help topics to numeric topic ID values in the [MAP] section of your project (.hhp) file. +To enable Context ID-based context-sensitive Help for a control, set HelpType to htContext and set HelpContext to a numeric topic ID. +A topic ID of 0 (default) means that no Help topic is provided for the control. + + + +Specifies the name of the resource object to which the current TStyledControl is linked. +StyleLookup becomes especially useful with the introduction of Metropolis UI styles. Metropolis UI styles contain lots of styles for buttons, panes, lists, and other control elements. Each control has the default style, but you can change this default style to any style accessible for the class of a control. The StyleLookup property can be used to specify such additional style. In the Object Inspector, you can select in the StyleLookup property the name of an additional style for the control -- like searchbuttontext -- from the general style loaded into the TStyleBook or from the default style for the used platform. See StyleLookup Support for Metropolis UI Controls. + + +Note: At design time, using the StyleLookup property of a control in any form in the current project group you can access any custom style defined in any TStyleBook component used in the current project group. That is, even if the form does not have a particular TStyleBook component, controls from this form can use custom styles defined in this TStyleBook component (if this TStyleBook component is used in any form in the current project group). At run time, only styles in the current project and only after an owner of the TStyleBook containing these styles is already created can be accessed. + + + LoadableStyle is used to retrieve the style object. + + + + +Looks for the style resource object linked to the TStyledControl. +If no style is defined for the current control, LookupStyleObject seeks in the current scene for the active style. +If the current scene does not have a resource object, LookupStyleObject continues the search through the default styles and Parent's style. + + + + + + + + + + + + True + + + + + + + +TStyledControl is the base class for customizable and user-interaction controls. +TStyledControl extends TControl to act as the immediate superclass for concrete user-facing widgets. +For descendants of TStyledControl, you can set the style resource and the basis for FireMonkey's dynamic look-and-feel. Subclasses of TStyledControl search their style resource among those assigned to the StyleBook property of the form, using a simple search routine based on class names returned by the GetStyleObject method. The access to the subcomponents defined by the same style permits the parent control to be modified at run time. To apply a style to a control, set the StyleLookup property to the name of the style. +For more details about the style and design of FireMonkey components, see FireMonkey Component Rendering and Customizing with Styles. +Descendants of TStyledControl are controls like TPanel, TLabel, TCheckBox, TImageControl, or TCalendar. + + + + + + + + + + + + + + Scene where the style has been changed, nil if the change is global + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reload style from binary stream + + + + + Save style to binary stream + + + + + Clear style and binary stream + + + + + Return true is style is empty + + + + + Load style from stream + + + + + + + + Load style from file + + + + + + + + Save style to stream + + + + + + Indexed + + + + + + + Link to owner StyleBook + + + + + Style that stored on this item + + + + + If style can not be load on current platform tihs property is True and Style is empty + + + + + Name used to idenity style in collection + + + + + Design-time only property used to show Style Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents an item in an instance of TStyleCollection that holds + a style for a platform. + + + + + + + + + + + + + + + + + + + + + + + + Create and add new item + + + + + Represents an item in an instance of TStyleCollection that holds + a style for a platform. + + + + + + + Access property for style collection items + + + + + + + Record type that contains design-time information for the Form + Designer. + + + + ClassName of selected control + + + + + If True that edit custom style mode is active + + + + + Default StyleLookup for selected control + + + + + Name of selected control + + + + + StyleLookup of selected control + + + + + Selected control itself + + + + + True if StyleBook just created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Gets the style of the CurrentItem stored in TStyleCollectionItem. Getter of Style. + TStyleCollectionItem stores one style for the specified platform. GetStyle gets the style item. +The style is a TFmxObject type. + + + + + + + + + + + + + + + + + + + + + + + Represents an item in an instance of TStyleCollection that holds + a style for a platform. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Use it to look for a style in a global pool. + + + + + + + + + + + +It chooses style depending on context. + + + + + + +Creates an empty item on demand. + CreateDefaultItem calls Add to create a TStyleCollectionItem and add it to the TStyleCollection. The new style collection item is placed at the end of the Items array. +Add returns the new style collection item. +Add inherits from System.Classes.TCollection.Add. + + + + +Loads the style. Loaded is called automatically to load the style definition from the file that is set using the FileName property. + + + + + + +Provides an interface for a method that reads and writes otherwise unpublished data. DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Reads the resources from the given stream. ReadResources is called automatically to read resources from the given stream into the TStyleBook object. + + + + + + + + +Creates and initializes a TStyleBook instance. Create constructs a TStyleBook object and initializes its data before the object is first used. + + + + + +Destroys an instance of TStyleBook and frees the associated memory. +Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy. + + + + DesignInfo is a TStyleBookDesignInfo record that contains design-time information only used by the Form designer. + + ClassName: Class name of the selected control. + CustomStyle: True when edit custom style mode is active. + DefaultStyleLookup: The default StyleLookup for the selected control. + Name: Name of the selected control. + StyleLookup: Name of the StyleLookup for the selected control. + Control: The selected control itself. + + + +Clears the style collection of a TStyleBook. + TStyleCollection is a collection that stores the styles for the different platforms. + Clear deletes all items from the collection. + + + + +Gets the style of the CurrentItem stored in TStyleCollectionItem. Getter of Style. + TStyleCollectionItem stores one style for the specified platform. GetStyle gets the style item. +The style is a TFmxObject type. + + + + + + + + +Method to load a style to the TStyleBook, from a stream. +To load the style from a file use LoadFromFile. + +procedure TForm1.FormCreate(Sender: TObject); +var + S: TFileStream; +begin + S := TFileStream.Create('Air.Style', fmOpenRead); + Stylebook1.LoadFromStream(S); +end; + +procedure TForm2.FormCreate(Sender: TObject); +var + iStream: TMemoryStream; +begin + StyleBook1.LoadFromFile('Air.Style'); //Loads the style from a file. + iStream := TMemoryStream.Create; //Instanziate the memory stream var. + TStyleStreaming.SaveToStream(StyleBook1.Style, iStream); //saves the style as a memory stream. + StyleBook1.Clear; //Clear the styles from the stylebook. + iStream.Position := 0; //Sets the position to start the streaming. + StyleBook1.LoadFromStream(iStream); //Loads the style to the stylebook from the memory stream. +end; + + + + + + + +Method to load a style to a TStyleBook, from a file. +Select the full path to the file or the file name when located in the project folder. +FireMonkey styles are delivered in the RAD Studio product installation, at the following paths: + +C:\Program Files (x86)\Embarcadero\Studio\21.0\Redist\styles\Fmx +C:\Users\Public\Documents\Embarcadero\Studio\21.0\Styles +Apply the style to the form using the StyleBook property of the form, for example: + +procedure TForm1.FormCreate(Sender: TObject); +begin + StyleBook1.LoadFromFile('Air.Style'); + Form1.StyleBook := StyleBook1; +end; + +To load a style to an item of the TStyleCollection, that is a style for each platform added to the TStyleBook, then use FMX.Controls.TStyleCollectionItem.LoadFromFile. + + + + + + + +Represents the current style as a TFmxObject. + + + + +Index of the current style in the style collection. + CurrentItemIndex is the index of the current StyleCollectionItem from the StyleCollection array. + CurrentItemIndex is an integer value. + + + + +Current style in the style collection. + CurrentItem is the current StyleCollectionItem from the StyleCollection. + + + +The style definition. Resource is a string list containing the style defined by the TStyleBook. + + + +Indicates whether the style can be loaded in the current target platform. +If the style cannot be loaded, UnsupportedPlatform is True and Style is empty. + + + + +The name of the file that contains the style definition. +Use FileName to specify the .style file from which the TStyleBook loads its Resource. +Setting the FileName also loads and applies the style. + + + + +Specifies whether the TStyleManager replaces the default style for the whole application. + + + + +Contains the collection of styles stored in the TStyleBook. + + + + +TStyleBook stores a collection of styles for a form. +There are two ways to create and use a TStyleBook component: + +Drop a TStyleBook component from the Tool Palette onto the Form Designer and make your new TStyleBook component the value of the StyleBook property of the form. This works for desktop applications and mobile applications. +Right-click a control on a FireMonkey desktop form and choose either Edit Default Style or Edit Custom Style. This automatically creates a TStyleBook component, sets it to the form's StyleBook, and opens the Style Designer. +TStyleBook stores the style definition as text in the Resource property and can be loaded from a .style file. +Double-clicking the TStyleBook component on the form opens the Style Designer. + +TStyleBook and Form Inheritance +If you want all the descendant forms to have the same style as the base form, place the TStyleBook in the base form. +If you want the descendant forms to have different styles, place separate TStyleBooks in the descendant forms. +Note: At design time, using the StyleLookup property of a control in any form in the current project group you can access any custom style defined in any TStyleBook component used in the current project group. That is, even if the form does not have a particular TStyleBook component, controls from this form can use custom styles defined in this TStyleBook component (if this TStyleBook component is used in any form in the current project group). At run time, only styles in the current project and only after an owner of the TStyleBook containing these styles is already created can be accessed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LONGINT64 + LONGINT64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + +DoRootChanging is executed when the root container (typically a form) is defined or changes. +For example, DoRootChanging is executed when this control is added to a form or moved from one form to another. +When this control works as an accelerator key receiver, DoRootChanging overrides TControl.DoRootChanging to: + +Register this control to a specific form when the text control is added to the form. +Unregister and register this control from one form to another when this control is moved between forms. + + + + + + +Filters the string contained in the Text property. +For example, you can use DoFilterControlText to filter the ampersand symbol of the accelerator key character. +If the control is registered as an accelerator key receiver, you can override this method to do your own filtering to the accelerator keys. + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Controls.TTextControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Customizes styles in complex objects. +FMX.Controls.TTextControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + +Calls the inherited TStyledControl.DoStyleChanged, then tries to translate the Text. +DoStyleChanged calls the inherited TStyledControl.DoStyleChanged to set that the control needs to update the style, then calls Repaint to redraw the control, and then tries to translate the control's Text calling Translate. + + + + + + +Protected setter implementation for the Text property. +In descendants, override SetText to allow for further functionality when setting the text using the Text property. +Do not use SetText directly in applications. Use the Text property instead. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sets the value of the Name property. +FMX.Controls.TTextControl.SetName inherits from System.Classes.TComponent.SetName. All content below this line refers to System.Classes.TComponent.SetName. +Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + + + + + + + +Protected getter implementation for the Data property. +FMX.Controls.TTextControl.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.Controls.TTextControl.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + +Specifies the behavior of a TTextControl control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TCustomAction.Text property of the Sender action to set the new value to the +Text property of TTextControl. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + +Initializes the component after the form file has been read into memory. +FMX.Controls.TTextControl.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + + + + +Retrieves the resource object linked to the style of the current TTextControl object. +In the current implementation, FindTextObject retrieves the resource object linked to the 'text' style. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Keeps the resource object linked to the style of the current TTextControl object. +In the current implementation, TextObject keeps the resource object linked to the 'text' style. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Copies the values of the styled text representation properties of the specified Value object to the current TTextControl object. +SetTextSettings calls + +TTextSettings.Assign(Value); + + + + + + +Setter for the StyledSettings property. + + + +Updates the representation of the text on the control. +DoChanged is called internally from the Change methods. +Do not call DoChanged explicitly; call the Change method. + + + + + + +Retrieves whether any of the default values of font properties that are stored in the StyledSettings property is changed. +StyledSettingsStored retrieves whether StyledSettings needs to be stored in the .fmx form file, keeping the description of the FMX form. +StyledSettingsStored returns True if StyledSettings <> DefaultStyledSettings. The DefaultStyledSettings property is set during the style loading in the ApplyStyle method. See also AllStyledSettings. + + + + + + +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.Controls.TTextControl.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + +Determines whether the object reacts to the accelerator key or not. +FMX.Controls.TTextControl.CanTriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. +Determines whether the object reacts to the accelerator key or not. +Use CanTriggerAcceleratorKey for objects that are not intended to react to the accelerator key, for example: a hidden tab page or a hidden submenu. The object triggers the action if CanTriggerAcceleratorKey is True. Otherwise, the object cannot trigger the action. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey + + + + + + + + +Returns the character key that serves as the keyboard accelerator for the receiver object. +FMX.Controls.TTextControl.GetAcceleratorChar inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. +Returns the character key that serves as the keyboard accelerator for the receiver object. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex + + + + + + + + +Returns the index of the accelerator character within the text string of the receiver object. +FMX.Controls.TTextControl.GetAcceleratorCharIndex inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. +Returns the index of the accelerator character within the text string of the receiver object. +Use GetAcceleratorCharIndex to highlight the accelerator character when the text string contains several times the same character. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Controls.TTextControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Controls.TTextControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Responds after the last constructor has executed. +FMX.Controls.TTextControl.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + + + + +Returns a string containing the class name followed by the text that is rendered over the surface of this TTextControl object. +ToString returns a string containing the concatenation of two substrings: + +The first substring contains the class name of the instance that is being called (retrieved by TObject.ToString). For example, calling on a TCheckBox instance returns a substring containing TCheckBox. +The second substring contains the text from the Text property. This is the text that will be rendered over the surface of the object in which ToString is called. + +Specifies the text that will be rendered over the surface of this TTextControl object. +Set the Text property to specify the text that will be displayed by this TTextControl. Text can be any string. +If there are any effects already applied before changing the Text property, they will be preserved for the new text. Also, the surface of this TTextControl is repainted. +In the Text property you can define an accelerator key. On Windows platforms, an accelerator key is shown as an underlined letter. To specify an accelerator key, precede an <accelerator_letter> with an ampersand & character. The letter after the ampersand appears underlined. For example, to set the S character as an accelerator key for a Save button, type &Save. On Windows platforms, accelerator keys enable the user to access controls pressing Alt+<accelerator_letter> key combination. When run on not Windows platforms, a single ampersand is simply stripped from the text. To show a single ampersand & character in a Text property specify doubled ampersand && characters. + +Tip: If you specify a new text string that is exactly the same as the one already displayed, the effects will not be re-updated and this TTextControl object will not be repainted. +Note: FMX.ExtCtrls.TPopupBox.Text is not a writable property in the same way as FMX.Controls.TTextControl.Text. The FMX.ExtCtrls.TPopupBox.Text property cannot be "any string", but instead must be just one of the strings in the FMX.ExtCtrls.TPopupBox.Items property and, in this case, FMX.ExtCtrls.TPopupBox.ItemIndex is updated accordingly. + +Stores a TTextSettings type object keeping the default values of the text representation properties. +DefaultTextSettings is set during the loading of the style in the ApplyStyle method. +DefaultTextSettings is initialized in Create with the following values: + +Font.Size := 11 ; // depends on the platform +Font.Family = 'Tahoma'; // depends on the platform +Font.Style := [] ; +FontColor := TAlphaColorRec.Black; +TextAlign := TTextAlign.Leading; +VertTextAlign := TTextAlign.Center; +Trimming := TTextTrimming.None; +WordWrap := False; + + +Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + +Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + +Keeps final values of text representation properties. These values are really used to draw texts in a control. +ResultingTextSettings keeps a TTextSettings object that manages the final values of the text representation properties. These values are really used to draw texts in a control. +To obtain values stored in ResultingTextSettings, a control uses the StyledSettings property. For example, if StyledSettings contains the TStyledSetting.Family value, then the TFont.Family value is taken from the DefaultTextSettings. (That is the font family name defined in the loaded style is used. The font family name defined by the programmer in the Object Editor is ignored.) Oppositely, if StyledSettings does not contain TStyledSetting.Family, then the font family name defined by the programmer in the Object Editor is used and the font family name defined in the loaded style is ignored. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +RecalculateTextSettings updates the ResultingTextSettings. + + + +Calls DoChanged when any of the styled text representation properties of the current TTextControl control is changed. +Change is called when any of the Font, FontColor, VertTextAlign, Trimming or WordWrap properties is changed. +If the control is not in a loading or destroying state (csLoading or csDestroying), Change calls DoChanged to update the representation of the text on the control. + + +Specifies the font to use when rendering the text. +Set Font to specify the font to use when rendering the text. To change to a new font, specify a new TFont object. To modify a font, change the value of the Family, Size, or Style of the TFont object. + + +Specifies the font color of the text in this TTextControl control. +Use the FontColor property to read or change the font color of the text in this TTextControl control. The default value of the FontColor property is TAlphaColorRec.Black. + + +Specifies how the text will be displayed in terms of vertical alignment. +The VertTextAlign property specifies how the TTextControl control displays the text in terms of vertical alignment. VertTextAlign can have one of the following values (defined in TTextAlign): + +Center (default)--aligns the text on a vertical axis, at the middle of the TTextControl object. +Leading--aligns the text on a vertical axis, at the topmost position inside the TTextControl object. +Trailing--aligns the text on a vertical axis, at the bottommost position inside the TTextControl object. +When you use text representation properties stored in ITextSettings.TextSettings, remember that VertTextAlign corresponds to VertAlign. + + +Specifies how the text will be displayed in terms of horizontal alignment. +The TextAlign property specifies how the TTextControl object will display the text in terms of horizontal alignment. TextAlign can have one of the following values (defined in TTextAlign): + +Center (default)--aligns the text on a horizontal axis, at the middle of the TTextControl object. +Leading--aligns the text on a horizontal axis, at the leftmost position inside the TTextControl object. +Trailing--aligns the text on a horizontal axis, at the rightmost position inside the TTextControl object. +When you use text representation properties stored in ITextSettings.TextSettings, remember that TextAlign corresponds to HorzAlign. + + +Specifies whether the text inside the TTextControl object wraps when it is longer than the width of the control. +Set WordWrap to True to allow the TTextControl control to display multiple lines of text. When WordWrap is True, text that is too long for the TTextControl object wraps at the right margin and continues in additional lines. +Set WordWrap to False for the text to span onto a single line of the TTextControl. However, in this case, the text that is too long for TTextControl appears truncated. +The default value for the WordWrap property is False. + + +Specifies the behavior of the text, when it overflows the area for drawing the text. +Trimming may take the following values defined in the TTextTrimming type: None, Character, and Word. +If the value of this property is not None and the text does not fit in the drawing area, then it is trimmed to fit the area and an ellipsis sign is printed after the trimmed text. + +Note: Under the iOS platform, Trimming works only when WordWrap = False. + + +Determines whether the ampersand character (&) is considered as a special prefix character. +The default value is TPrefixStyle.HidePrefix, which means that the (first) ampersand is hidden at run-time. + + + + +Base class for all text controls such as TDateEdit. +TTextControl is the base class for all graphical controls that display text, such as TTimeEdit, TListBoxItem, TTabItem, and so on. +TTextControl encapsulates standard functionality to manipulate the displayed text, offering the possibility of changing the font, the alignment of the text, or enabling word wrapping. +If you need to create a new control from scratch that displays text (for instance, an enhanced label graphical control or a custom redesigned check box control), then you should derive your component from TTextControl. +TTextControl implements the ITextSettings interface. This interface provides methods and properties to manage the most common text representation properties of general text objects independently of the particular types of these objects. TTextControl and its descendants contain the public property TextSettings of the TTextSettings type. Using the methods and the properties declared in the ITextSettings interface, you can manage the text representation TFont.Family, TFont.Size, TFont.Style, FontColor, HorzAlign, VertAlign, Trimming, and WordWrap properties defining visual parameters of the text representation. For more information, see Setting Text Parameters in FireMonkey. +TTextControl uses the TTextSettingsInfo service class to manage sets of styled text representation properties stored in the DefaultTextSettings, TextSettings, StyledSettings, and ResultingTextSettings properties. +TTextControl implements the IAcceleratorKeyReceiver interface to allow the use of this control as an accelerator key receiver. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.Controls.TPopup.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Renders the control's surface. +FMX.Controls.TPopup.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Controls.TPopup.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Controls.TPopup.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. + + + +Dispatcher of the OnClosePopup event. + + + + +Dispatcher of the OnPopup event. + + + +Closes the current TPopup. + +Note: We do not recommend using Popup and ClosePopup. To open and explicitly close a TPopup, set the TPopup.IsOpen property to True and False, respectively. +Call ClosePopup to explicitly close a TPopup. If there is more than one pop-ups opened, ClosePopup closes only the specified instance. +To take specific action when TPopup closes, write an OnClosePopup event handler. + + + + + + +For internal use. +Creates a new TCustomPopupForm pop-up form. +This pop-up form is stored in the PopupForm property. Popup calls CreatePopupForm. + + +Holds the form that appears on the screen after the Popup method execution. +The value of the PopupForm property is nil if the form does not exist. + + + + + + +Specifies whether TPopup has an associated action. +The VisibleStored method returns True if TPopup has an associated action (if the ActionClient property is True). This method returns False otherwise. + + + + + + +Creates and initializes a TPopup instance. +Create constructs a TPopup object and initializes its data before the object is used. + + + + + +Destroys the TPopup instance. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the TPopup object is not nil before calling Destroy. + + + + + + False + + + + +Displays the TPopup window. + +Note: We do not recommend using Popup and ClosePopup. To open and explicitly close a TPopup, set the TPopup.IsOpen property to True and False, respectively. +When AShowModal is True, then Popup drops down TPopup as a modal dialog. +Popup applies the specified placement and style to TPopup, before making it visible. +To set the placement, use the PlacementRectangle, PlacementTarget, HorizontalOffset, VerticalOffset, and Placement properties. + + + + + + +Returns whether and how the modal form of TPopup closes. +PopupModal returns 0 if the modal form is not closed. Otherwise PopupModal returns the value of the ModalResult property. +To change how the modal form of TPopup is closed, set the ModalResult property. +You can check a return value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions and use the StripAllFromResult function to convert the return value from a constant that refers to "all" to the corresponding simple constant. + + + + + + +Returns whether the PopupForm property holds a pop-up form. +HasPopupForm returns True if PopupForm holds the pop-up form that appears on the screen after the Popup method execution. + + + +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +FMX.Controls.TPopup.BringToFront inherits from FMX.Types.TFmxObject.BringToFront. All content below this line refers to FMX.Types.TFmxObject.BringToFront. +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +You can call BringToFront at run time as in the following code snippet: + + Label1.BringToFront; + +or, at design time, by right-clicking the FMX visual control and selecting Control > Bring to Front from the pop-up menu. + + +Sets the animation duration during appearing or closing of the pop-up window. +AniDuration defines time (in seconds) of a custom animation execution. The OnAniTimer event is periodically triggered during the AniDuration time after the pop-up window starts appearing or closing. During the AniDuration time, the AniPosition property changes from 0 to 1 (during opening) and from 1 to 0 (during closing) respectively. The OnAniTimer event handler contains the code that is performed during animation. + +Note: AniDuration does not influence on a duration of an external animation (for example TFloatAnimation animation) if such is assigned to the TPopup pop-up window. + +Embarcadero Technologies does not currently have any additional information. + + + + +Determines whether and how the TPopup closes its modal form. +TModalResult describes possible values of ModalResult. +You can check a ModalResult value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions and use the StripAllFromResult function to convert the ModalResult value from a constant that refers to "all" to the corresponding simple constant. + + +Is True if the TPopup is dropped down, False otherwise. + + +Is True if the TPopup has a closing animation, False otherwise. + + +Sets the size of the TPopup through a TSizeF object. +For example, the following code will set up the TPopup Width to 200 and Height to 250: +Delphi: + + p1.PopupFormSize := TSizeF.Create(200, 250); + +C++ Builder: + + p1->PopupFormSize = TSizeF->Create(200, 250); + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Periodically occurs during TCustomPopupForm custom animation execution. +The OnAniTimer event periodically occurs during AniDuration time while a custom animation executes during appearing and closing of the current TPopup pop-up window. +Write an OnAniTimer event handler to provide animation functionality during appearing and closing of the current pop-up window. AniDuration defines the animation duration in seconds. +To show a TPopup window you can set the IsOpen property to True or call the Popup method. Rendering the TPopup window, the owner form calls CreatePopupForm to create an instance of a TCustomPopupForm pop-up form stored in the PopupForm property. Notice that all visual components placed in the TPopup window are contained in the ContentControl created in the PopupForm pop-up form. +The OnAniTimer event handler has the type TNotifyEvent declared as follows: + + TNotifyEvent = procedure(Sender: TObject) of object; + +Therefore, the Sender parameter, in the following example, can be cast to TCustomPopupForm. See how this is used in the AniTimeProc event handler of the OnAniTimer event in the following example implementing animation of appearing and closing of the TPopup window: + +type + TForm1 = class(TForm) + Button1: TButton; + Popup1: TPopup; + Button2: TButton; + Rectangle1: TRectangle; + procedure FormCreate(Sender: TObject); + public + T: TDateTime; + procedure AniTimeProc(Sender: TObject); + end; + +var + Form1: TForm1; + +implementation + +procedure TForm1.AniTimeProc(Sender: TObject); +begin + Button1.Text := FloatToStr(RoundTo((Now - T) * 86400{SecPerDay}, -2)); + TCustomPopupForm(Sender).ContentControl.Opacity := TCustomPopupForm(Sender).AniPosition; + TCustomPopupForm(Sender).Left := Self.Left + Round(100 * TCustomPopupForm(Sender).AniPosition); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + T := Now; + Popup1.Popup; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + Popup1.AniDuration := 4; + Popup1.OnAniTimer := AniTimeProc; +end; + +end. + +Notice that OnAniTimer can use AniPosition and other properties of TCustomPopupForm. + + + + + + + + +Specifies whether the TPopup is dragged together with its parent. +If DragWithParent is set to True, TPopup is dragged too, when its parent is the target of a drag-and-drop operation. The default value is False. +For example, the TPopup of a combo box is dragged with its parent. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Sets and gets the horizontal distance between the target origin and the TPopup alignment point. +To set the target origin and the alignment point, use the PlacementTarget, Placement, and PlacementRectangle properties. +HorizontalOffset has no effect if Placement has one of the values: Absolute, Mouse, MouseCenter. + + + + + +Determines how to position the TPopup form relative to a rectangle specified by the PlacementRectangle or PlacementTarget properties, relative to the screen, or relative to the mouse (pointing device) position. +Placement also specifies the behavior of the TPopup form, when it overlaps screen boundaries. The default value is Bottom. +TPlacement determines possible values of Placement. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of TPopup. + + +Gets or sets the rectangle element relative to which TPopup is positioned. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of TPopup. +This is an example of a TPopup with PlacementRectangle: + + + +Gets or sets the target relative to which TPopup is positioned. +If PlacementTarget is not set, and TPopup has a parent, TPopup is positioned relative to its parent. If PlacementTarget and Parent are not set, TPopup is positioned relative to the main window. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of TPopup. + + + + + + + + +Gets and sets the TPopup stored style. +To create a new style, use the Style Designer. See details here: Style Resource Storage. + + + + +Sets and gets the vertical distance between the target origin and the TPopup alignment point. +To set the target origin and the alignment point, use the PlacementTarget, Placement, and PlacementRectangle properties. +VerticalOffset has no effect if Placement has one of the values: Absolute, Mouse, MouseCenter. + + + + + +Occurs when the TPopup object is closed. Write an OnClosePopup event handler to take specific action when the TPopup closes. + + +Occurs just before the pop-up window appears. +Write an OnPopup event handler to take specific action just before the pop-up window appears. + + + + + + + + + + + + + + + + + + + + + + + + + +TPopup provides a pop-up window. +Use TPopup to display content in a temporary window. +By default, a TPopup content is empty. You can add any number of objects to the TPopup content: + +To add a control to the TPopup content, set the Parent property of the control or create it with the TPopup as its owner. +To access the TPopup children, use ChildrenCount and Children properties. +To position a TPopup, use the following properties: + +PlacementRectangle +PlacementTarget +HorizontalOffset +VerticalOffset +Placement +When TPopup is open, it does not reposition itself if its parent is repositioned. To drag a TPopup together with its parent, set the DragWithParent property to True. +TPopup supports animations and graphic effects. The animations and graphic effects are applied to the displayed window, and not to every child of the TPopup. For opacity effects, set the effects directly to the TPopup children. TPopup children do not inherit the animations and effects applied to the parent. +If TPopup is not explicitly sized, it is sized by its content. In this case, if an effect is applied that increases the content's displayed size, part of the content might be obscured. To avoid this, explicitly set the size for TPopup or set its bounds through the BoundsRect, Margins, and Padding properties. +To open and explicitly close a TPopup, set the TPopup.IsOpen property to True and False, respectively. +(We do not recommend using Popup and ClosePopup.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Dialogs.xml b/Modules/DelphiFMX/doc/FMX.Dialogs.xml new file mode 100644 index 00000000..76659b52 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Dialogs.xml @@ -0,0 +1,1646 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +OnCanClose event dispatcher. +DoCanClose is called automatically when the user closes the dialog. +DoCanClose returns True (by default) to allow closing the dialog or False to prevent the dialog from closing. +DoCanClose executes the handler of the OnCanClose event if defined and allows you to set the CanClose parameter of the OnCanClose event handler to True or False. DoCanClose returns the value that CanClose has after the event handler finishes. + + + +OnSelectionChange event dispatcher. +DoSelectionChange is called automatically whenever the file selection is changed. +DoSelectionChange executes the handler of the OnSelectionChange event if defined. + + + +OnFolderChange event dispatcher. +DoFolderChange is called automatically when the directory whose contents are displayed in the dialog changes. +DoFolderChange executes the handler of the OnFolderChange event if defined. + + + +OnTypeChange event dispatcher. +DoTypeChange is called automatically when the selection from the type combo box in the dialog is changed. +DoTypeChange executes the handler of the OnTypeChange event if defined. + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Dialogs.TOpenDialog.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Displays the dialog box. +FMX.Dialogs.TOpenDialog.DoExecute inherits from FMX.Dialogs.TCommonDialog.DoExecute. All content below this line refers to FMX.Dialogs.TCommonDialog.DoExecute. +Displays the dialog box. +For TCommonDialog, DoExecute does nothing. +TCommonDialog descendants override the DoExecute method in order to properly display the required dialog box. DoExecute returns a Boolean value, usually True if the user has clicked OK, and False otherwise. + +Note: DoExecute is a protected method for TCommonDialog descendants; therefore, to display the dialog box, call Execute instead. + + + + + + + +Creates and initializes a TOpenDialog instance. +Create generates a TOpenDialog instance, but the new dialog does not appear on the form at runtime until the Execute method is called. +AOwner is the component that is responsible for freeing the TOpenDialog instance. It becomes the value of the Owner property. + + + + + +Destroys the TOpenDialog object and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free calls Destroy if the TOpenDialog reference is not nil. + + +Represents the list containing the absolute paths of the selected files. +Files represents a string list that contains the absolute path of each selected file. + +Note: In order for the user to select multiple files, set the ofAllowMultiSelect flag in Options. + +Maintains a list of the previously selected files. Obsolete property. +HistoryList is maintained for compatibility with older versions of TOpenDialog. It is not used. + + +Specifies a default file extension. +DefaultExt specifies a file extension that is appended automatically to the selected file name, unless the selected file name already includes a registered extension. +Extensions longer than three characters are not supported. Do not include the period (.) that separates the file name from the extension. + + +Indicates the absolute path for the last file selected. +The FileName represents the absolute (full) path of the file most recently selected from the dialog. The value of FileName is the same as the first item in the Files property. + + +Represents the file masks (filters) of the dialog. +The file-selection dialog includes a drop-down list of file types on the left of the 'File Name:' edit box. When the user picks a file type from the list, only files of the selected type are displayed in the dialog. You can select only one filter at a time. +In order for Filter to work properly, the assigned string must be formatted as follows: +'<first displayed name>|<first file extension>|<second displayed name>|<second file extension>|...|<n-th displayed name>|<n-th file extension>' +For example, the next code sample will add filters for text and executable files: + + OpenDialog1.Filter:='Applications (*.exe)|*.EXE|Text files (*.txt)|*.TXT'; + + +Determines which filter is selected by default when the dialog opens. +FilterIndex determines which of the file types in Filter is selected by default when the dialog opens. Set FilterIndex to 1 to choose the first file type in the list as default, 2 to choose the second file type as the default, and so on. If the value of FilterIndex is out of range, the last file type listed in Filter is selected by default. + + +Determines which directory is selected by default when the dialog opens. +InitialDir determines the default directory displayed in the file-selection dialog when it opens. +If no value is assigned to InitialDir, or the specified directory does not exist, the initial directory is controlled by a special registry key assigned to your application. + +Note: For Windows, the registry key can be found at HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU\. + +Determines the appearance and behavior of the file-selection dialog. +Use the Options property to customize the appearance and functionality of the dialog. + + +Augments the Options property with additional flags that determine the appearance and behavior of the file selection dialog. +Use the OptionsEx property to further customize the file open dialog beyond the options covered by the Options property. + + +Specifies the text displayed in the dialog's title bar. +Use Title to set the text that appears in the file-selection dialog's title bar. If no value is assigned to Title, the dialog's title is "Open". + + + + +Occurs when the user tries to close the dialog. +Write an OnCanClose event handler to provide custom validation of the value of FileName. File selection dialogs provide a number of built-in validations, such as checking for invalid characters, prompting for confirmation before overwriting, checking whether a file or path exists, and so on. These validations can be specified using the Options property. However, applications can provide additional validation of file names in an OnCanClose event handler. +Set the CanClose parameter to False to prevent the dialog from closing. The OnCanClose event handler is responsible for telling the user why the dialog doesn't close. + + +Occurs when the current work directory from the dialog is changed. +The OnFolderChange event occurs when the user changes the directory whose contents are displayed in the dialog. This can happen when the user double-clicks a directory, clicks the Up arrow, or uses the list box at the top of the dialog to navigate through the directory structure. + + +Occurs when file names displayed in the dialog are changed. +The OnSelectionChange event occurs whenever the file selection is changed. This can include opening the file-selection dialog box, highlighting a file or directory, selecting a new filter, selecting a new directory, or creating a new folder. +The currently selected file is stored in the FileName and Files properties. Files is used for multiple file selection. +The Sender parameter is an instance of the TOpenDialog. + + +Occurs when the selection from the type combo box in the dialog is changed. +The OnTypeChange event occurs when the user selects a new filter from the Type combo box at the bottom of the dialog. This includes the moment when the TOpenDialog is displayed. + + + +TOpenDialog is a class used to display a file-selection dialog. +Use TOpenDialog to display a dialog box for selecting and opening files. +When the user clicks the Open button, the dialog closes and the selected files are stored in the Files property. + +Note: The dialog does not appear at run time until it is activated by a call to the Execute method. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [mbYes..mbNo] + + + + + [mbYes..mbNo,mbCancel] + + + + + [mbYes..mbNo,mbCancel,mbNoToAll..mbYesToAll] + + + + + [mbOK..mbCancel] + + + + + [mbAbort..mbIgnore] + + + + + [mbAbort,mbIgnore] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Message dialogs must be shown in the UI thread. This procedure chacks that and raises an exception if is not in the UI thread. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + nil + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Edit.xml b/Modules/DelphiFMX/doc/FMX.Edit.xml new file mode 100644 index 00000000..5b37b428 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Edit.xml @@ -0,0 +1,1907 @@ + + + + $1701 + + + + + $1702 + + + + + $1703 + + + + + $1704 + + + + + $1705 + + + + + $1706 + + + + + $1707 + + + + + $1708 + + + + + $1709 + + + + + $170A + + + + + $170B + + + + + $170F + + + + + $1710 + + + + + $1711 + + + + + $1712 + + + + + $1713 + + + + + $1715 + + + + + $1716 + + + + + $1717 + + + + + $1718 + + + + + $1719 + + + + + $171A + + + + + $1001 + + + + + $1002 + + + + + $1003 + + + + + + + + $802A8ADF + + + + + Leading + + + + + $FF000000 + + + + + True + + + + + ecNormal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Invokes sequence: DoFiltering -> DoTruncating -> DoValidating + + + + + + + + + + + + + + + + + + + + + + + + Initial text filtering before calling DoTruncating + + + + + + + + + Maximum available text length filtering before calling DoValidating + + + + + + + + + Validate inputing text. Calling before OnChangeTracking + + + + + + + + + + + + + + + + + + + + + + + + + + + This property indicates that the control is in validate value mode. See DoValidate, Change + + + + + + + + + + + + + + + + + + + + + + + + + + Set text in model without text validation and sending notification to presenter + + + + + + + + Returns caret position by specified hittest point. + Works only for TEdit.ControlType=Styled. + + + + + + + + + + + + + Text control is in read-only mode + + + + + + + + + + + + + + + + + + + Defines character case for text in component + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.Edit.TCustomEdit.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.Edit.TCustomEdit.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.Edit.TCustomEdit.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + + + + +Protected getter implementation for the Text property. + + + + + + +Protected setter implementation for the Text property. + + + + + + +Adds a child object to the edit control. +If AObject is a TEditButton, it is added to the buttons associated with the edit control. + + + + + + + +Adds a child object at the specified index. +If the AObject is a TEditButton, it is inserted into the TCustomEdit.ButtonsContent at the specified Index. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Protected getter implementation for the ImeMode property. + + + + + + +Protected setter implementation for the ImeMode property. + + + + + + +Sets the value of the InputSupport property. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Edit.TCustomEdit.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Gets the default size of the control. +Returns a TSizeF with the default values of Width and Height. + + + +OnResize event dispatcher. +FMX.Edit.TCustomEdit.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Realigns the edit buttons container within the edit control. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + +Sets a new value for the text settings in the TextSettingsInfo property of the TCustomEditModel. + + + + + + +Setter method for the StyledSettings property. + + + + + + +Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +StyledSettingsStored returns True when the set of styled text representation properties stored in +StyledSettings differs from the default set of styled text representation properties for this control. + + + + + + +Protected setter implementation for the KeyboardType property. + + + + + + +Protected getter implementation for the KeyboardType property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether the edit control accepts any sort of input from the user. +If InputSupport is False, no interaction with the control is provided, including editing, selection and focus. + + + + + + +Returns the number of TEditButton objects associated with the edit control. + + + + + + + +Returns the edit button with the specified index. +GetItem returns the TEditButton associated with the edit control, at the position specified by AIndex. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + Class reference of TDataModel. + + + + +Returns a class reference to a data model of this presented control. +FMX.Edit.TCustomEdit.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + +Returns the name of the default presentation proxy that your presented control uses. +FMX.Edit.TCustomEdit.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + +The data model representing the data used by the presentation of the current control. +FMX.Edit.TCustomEdit.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + + + + + +Creates a new instance of TPresentedControl. +FMX.Edit.TCustomEdit.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + +Destroys this instance of TPresentedControl. +FMX.Edit.TCustomEdit.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + +Removes the selected text from the edit control. +Use DeleteSelection to delete the selected text from the edit control. If no text is selected, DeleteSelection does nothing. If all the text is selected, DeleteSelection clears all the text. + + + +Copies the selected text in the edit control to the Clipboard, in plain text format. +Use CopyToClipboard to replace the contents of the Clipboard with the selected text. CopyToClipboard does not clear the Clipboard if no text is selected. If no text is selected, CopyToClipboard does nothing. + + + +Copies the selected text to the Clipboard, in plain text format, and then deletes the selection. +Use CutToClipboard to replace the contents of the Clipboard with the selected text while clearing the selected text. If no text is selected, CutToClipboard does nothing. + + + +Pastes the plain text contents of the Clipboard text into the edit control. +Use PasteFromClipboard to paste the plain text contents held by the Clipboard into the edit control. If the Clipboard does not have a plain text content, PasteFromClipboard does nothing. PasteFromClipboard does not clear the contents of this edit control. + + + +Selects all the characters of the displayed Text at once. +Equivalent to the CTRL+A key combination on Windows, or Command+A on OS X. +SelectAll does not change the current CaretPosition. + + + +SelectWord assigns to the FMX.Edit.TCustomEdit.SelLength property the length of the first word found if this exists. +If several words exist in the text, the procedure SelectWord checks if the cursor position is the start position of a word. If not, it searches for the closest word from the left of cursor position. + + + + +Resets the selection from an edit box. +ResetSelection sets the CaretPosition property with the start position of the selection and resets the value of the SelLength property to 0. If no text is selected, the ResetSelection property does nothing. + + + +Moves the cursor to the end of the text in the edit control. + + + +Moves the cursor to the beginning of the text in the edit control. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns true if any selection exists in the edit box, false otherwise. +Use HasSelection in order to check if any part of the text is selected. + + +Returns the control that contains the edit buttons associated with the edit control. + + +Represents the caret of the control. +Caret is of type TCaret. + + +Provides access to the caret position in this edit control. +Use CaretPosition to determine the position of the cursor in the edit control. +CaretPosition indicates the horizontal character coordinate of the cursor, indexed from zero. +Modify the value of the CaretPosition property to change the position of the cursor within the edit control. For the cursor to be visible, the edit control must have focus. +For example, if CaretPosition is set to 4, then the cursor is at the fifth character. If the length of text in the edit control is shorter than 5, the cursor moves to the end of the string. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Defines whether the spell-checking feature of the edit control is on or off. +This property enables spell checking on the TEdit component. When set to True a red squiggly line appears underlining the words misspelled. +The spell checking is performed by an operating system service. It is only supported on iOS and OS X. + + +Stores a TTextSettings type object keeping the default values of the text representation properties. +DefaultTextSettings is initialized in Create with the following values: + +Font.Size := 11 ; // depends on the platform +Font.Family = 'Tahoma'; // depends on the platform +Font.Style := [] ; +FontColor := TAlphaColorRec.Black; +TextAlign := TTextAlign.Leading; +VertTextAlign := TTextAlign.Center; + +The ApplyStyle method might load from a style the values of the following +DefaultTextSettings properties: FontColor, Font, +TextAlign, and VertTextAlign. + + +Specifies the font to use when rendering the text. +Set Font to specify the font to use when rendering the text. To change to a new font, specify a new TFont object. To modify a font, change the value of the Family, Size, or Style of the TFont object. + + +Specifies the color of the text in the edit control. + + +Specifies which characters are allowed to be typed into this edit control. +The FilterChar property specifies a string containing individual characters that are allowed to be typed into this edit control. +For instance, if you set FilterChar to '123abc', then only the a, b, and c letters and the 1, 2, and 3 numerals are allowed to be typed into this edit control. All other characters are ignored. However, note that the uppercase version of a, b, and c are not allowed by this filter string. If you want to add uppercase variants, then FilterChar should be set to '123abcABC'. +To allow for all characters, set FilterChar to an empty string (''). + + +For internal use only. +Do not use this member. It is for internal use only. + + +Determines the type of the virtual keyboard. +Set KeyboardType to determine the type of virtual keyboard this edit is to use. Possible values for the KeyboardType property are Alphabet, Default, EmailAddress, NamePhonePad, and so on (values are selectable in the Object Inspector and are described in FMX.Types.TVirtualKeyboardType). +Keyboard types are illustrated in the Mobile Tutorial: Using the Web Browser Component (iOS and Android). + +Note: On Android, the Alphabet keyboard type has no word completion or word suggestions. The keyboard looks the same as the Default keyboard, but without suggestions. + + + +Specifies whether to hide the virtual keyboard by clicking the Return key. +When KillFocusByReturn is True, clicking the Return key hides the virtual keyboard. + + +Specifies the maximum length of the text entered in this edit control. +Set the MaxLength property in order to limit the maximum length of the text held by this edit control. For instance, if you want to be able to input strings of maximum 5 characters, set MaxLength to 5. +Note that setting MaxLength to a value lower than the length of the actual display text does not affect the display. It only limits the number of characters while typing. + + +Specifies whether this edit control shows its characters or not. +Set the Password property to True to make this edit control hide its characters for password-like input. Set Password to False to make this edit control show all its characters. + + +Determines whether you can change the text of this edit control. +To prevent the contents of the edit control from being edited, set the ReadOnly property to True. Set ReadOnly to False to allow the contents of the edit control to be edited. +Setting ReadOnly to True ensures that the text is not altered, while still allowing you to select text. The selected text can then be manipulated by the application, or copied to the Clipboard. + + +Indicates the type of action that the edit control performs when you are editing the text of the control and you press the return key on the virtual keyboard. The run-time platform uses this value to determine the type of return button that it displays on the virtual keyboard for the edit control. +The value of ReturnKeyType does not affect the actual action that the edit control performs when you press the return key. To define that action, use the OnKeyUp event. + +Platform Support +This property only has effect on Android and iOS. + + + + +Keeps final values of text representation properties. These values are really used to draw texts in a control. +ResultingTextSettings keeps a TTextSettings object that manages the final values of the text representation properties. These values are really used to draw texts in a control. +To obtain values stored in ResultingTextSettings, a control uses the StyledSettings property. For example, if StyledSettings contains the TStyledSetting.Family value, then the TFont.Family value is taken from the DefaultTextSettings. (That is the font family name defined in the loaded style is used. The font family name defined by the programmer in the Object Editor is ignored.) Oppositely, if StyledSettings does not contain TStyledSetting.Family, then the font family name defined by the programmer in the Object Editor is used and the font family name defined in the loaded style is ignored. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +RecalculateTextSettings updates the ResultingTextSettings. + + +Specifies the color and pattern used to fill the font of the selected text or to stroke the outline of it. +Read the SelectionFill property to get a TBrush object with the color and pattern used to fill the font of selected text displayed, or to stroke the outline of it. + + +Specifies the position of the first selected character in the text. +Read SelStart to determine the position of the first selected character, where 0 indicates the first character. If there is no selected text, SelStart indicates the position of the cursor. Set SelStart to remove the current selection and to position the cursor just before the indicated character. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. + + +Specifies the number of characters that are selected. +Read SelLength to determine the length, in bytes, of the selected text. This is the same as the number of characters, unless you are using a multibyte character set. Set SelLength to change the selection to consist of the first SelLength bytes starting at SelStart. + +Tip: Setting SelLength to a value greater than the number of characters from SelStart to the end of the text results in the selection of all characters from SelStart to the end of the text. Reading SelLength immediately after setting it to a value greater than the number of available characters returns the number of characters actually selected, not the value that was just set. + +Specifies the selected portion of the edit control's text. +Read SelText to determine the value of the selected text. Set SelText to replace the selected text with a new string. If there is no selection, but the edit control has focus, set SelText to insert a new string into the text, at the cursor. + + +Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + +Contains the text displayed by this edit control. +Use the Text property to read the text of this edit control or to specify a new string to be displayed. + + +Specifies how the text will be displayed in terms of horizontal alignment. +The TextAlign property specifies how this edit control displays the text in terms of horizontal alignment. TextAlign can have one of the following, defined in TTextAlign, values: + +Center (default) aligns the text at the middle of the edit control. +Leading aligns the text at the leftmost position inside the edit control. +Trailing aligns the text at the rightmost position inside the edit control. +When you use text representation properties stored in ITextSettings.TextSettings, remember that TextAlign corresponds to HorzAlign. + + +Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + +A hint or message to be displayed when the Text property is empty. +Use TextPrompt to cue the user about the kind of entry that is expected in the text field. The TextPrompt is grayed (like a watermark), cannot be scrolled at run time, and is cleared from the entry field as soon as the user begins to type into the edit field. +The following image contains a design-time preview of setting the TextPrompt property: + + + +Specifies whether the user is typing something in this edit control. +The Typing property is True if the user is typing something into this edit control, False otherwise. +When any printable character is typed, the Typing property is set to True. A printable character is any character that is not a control character. +When the ENTER key is pressed, the Typing property is set to False. + + +Specifies how the text will be displayed in terms of vertical alignment. +The VertTextAlign property specifies how the TCustomEdit control displays the text in terms of vertical alignment. VertTextAlign can have one of the following values (defined in TTextAlign): + +Center (default)--aligns the text on a vertical axis, at the middle of the TCustomEdit object. +Leading--aligns the text on a vertical axis, at the topmost position inside the TCustomEdit object. +Trailing--aligns the text on a vertical axis, at the bottommost position inside the TCustomEdit object. +When you use text representation properties stored in ITextSettings.TextSettings, remember that VertTextAlign corresponds to VertAlign. + + + +It defines whether to implement the UPPER or lower case conversion to the memo's text. + + + + + +Occurs when the text for the edit control may have changed. +Write an OnChange event handler to take specific action whenever the text for the edit control may have changed. The Text property of the edit control will already have been updated to reflect any changes. + +Tip: OnChange does not occur after individual characters have been typed, but only after the user presses the ENTER key or the focus leaves the control. An event that responds to individual character changes is OnChangeTracking. + +Occurs when typing individual characters into the edit control. +Write an OnChangeTracking event handler to take specific action whenever you set the text for the edit control or type individual characters in it. The Text property of the edit control will already have been updated to reflect any changes. This event provides the first opportunity to respond to modifications the user brought to the text of the edit control. + +Tip: There is also an OnChange event that does not occur after individual characters have been typed, but only after the user presses the ENTER key or the focus leaves the control. For responding to individual character changes, use only the OnChangeTracking event. + +Occurs when you are typing into this edit control. +Write an OnTyping event handler to take specific action whenever you type into this edit control. While you type in characters, the Typing property is also set to True. + + +Occurs when you are entering symbols or when focus shifts away from this edit control. +Write an OnValidating event handler to immediately validate any edits while the user is entering information into the edit control. The OnValidating event handler can verify the supplied text and, if it is not acceptable, return an error or warning message. + +Example +To clarify, consider the following scenario: an application provides a text edit box designed to enter an email address. If the user enters the blank character or the "@." substring, the OnValidating event handler displays the exclamation icon next to the edit control. This icon informs the user that the current symbols are not acceptable for the email address. + + +Note: Initially, the exclamation icon is invisible. The OnValidating event handler sets the TImage.Visible property to True, if an input error occurs. + + + +For this scenario, you can implement the following OnValidating event handlers: + + +Delphi: + +procedure TForm1.Edit1Validating(Sender: TObject; var Text: string); +begin + Image1.Visible := Text.Contains(' ') or Text.Contains('@.'); +end; + + + +C++Builder: + +void __fastcall TForm1::Edit1Validating(TObject *Sender, UnicodeString &Text) { + Image1->Visible = ContainsStr(Text, " ") || ContainsStr(Text, "@."); +} + + + +Note: To process the user's input, these code snippets use: + +For C++Builder: the System.StrUtils.ContainsStr routine. +For Delphi: the System.SysUtils.TStringHelper.Contains methode. + + +Occurs after the user presses the ENTER key or the focus leaves the control. + +Write an OnValidate event handler to validate any edits the user enters in the edit control before the text has changed. +The OnValidate event handler can verify the supplied text and, if it is not acceptable, return an error or warning message. + +Code Snippets +To clarify, consider the following scenario: an application provides a text edit box designed to enter a user email address from the mycompany.com domain, such as John.Doe@mycompany.com. If the user enters a text that does not end with the "mydomain.com" substring, the application displays an error message in the edit control. +In this scenario, you can implement the following OnValidate event handlers: + + +Delphi: + +procedure TForm1.Edit1Validate(Sender: TObject; var Text: string); +begin + if not EndsText('mycompany.com', Text) then + Text := 'Invalid email!' +end; + + + +C++Builder: + +void __fastcall TForm1::Edit1Validate(TObject *Sender, UnicodeString &Text) +{ + if (!EndsText("mycompany.com", Text)) { Text = "Invalid email!"; + + } +} + + + +Note: These code snippets use the System.StrUtils.EndsText routine. + + + + + + + + + +TCustomEdit is the base class from which all FireMonkey edit boxes and memo controls are derived. +TCustomEdit encapsulates the behavior common to all components for editing text by introducing methods and properties that provide: + +Basic text editing functions such as selecting text, modifying selected text, and case conversions. +Ability to respond to changes in the contents of the text. +Access control of the text for making it read-only or introducing a password character to hide the actual value. +When not in focus, TCustomEdit does not draw a selection rectangle even though the user has selected the text. You can verify whether the text is selected by using the SelText property. +Do not create instances of TCustomEdit. Use TCustomEdit as a base class when declaring control objects that permit the user to enter or modify text. Properties and methods of TCustomEdit provide basic behavior that descendant classes inherit, as well as behavior that components can override to customize their behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Maxmimum length of text that can be input in the edit field. + On Android due to platform limitations text is truncated only after pressing ENTER key or after losing + focus. + + + + + Defines characters which can be input in the edit field. All characters not in FilterChar will be + ignored. Empty FilterChar value means no filtering. + On Android due to platform limitations text is filtered only after pressing ENTER key or after control + losing focus. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +General-purpose FireMonkey edit box. +TEdit extends the functionality of TCustomEdit by publishing a set of properties to the Object Inspector so you can customize the look and feel of this edit box. +For using TEdit in a Metro application, see +Creating Metropolis UI Edit Buttons with Embedded Glyphs. +When not in focus, TEdit does not draw a selection rectangle even though the user has selected the text. You can verify whether the text is selected by using the SelText property. + +Note: For a multiline edit control, use FMX.Memo.TMemo. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.EditBox.xml b/Modules/DelphiFMX/doc/FMX.EditBox.xml new file mode 100644 index 00000000..a37129c4 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.EditBox.xml @@ -0,0 +1,504 @@ + + + + $171B + + + + + $171C + + + + + $171D + + + + + $171E + + + + + $171F + + + + + + + + $2 + + + + + $1 + + + + + Integer + + + + + NumberPad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +It returns False in case Value has a default value, which means there is no need to store it. + + + + + + + + + + + + +Returns whether the HorzIncrement value is stored in the form file. + + + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.EditBox.TCustomEditBox.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + + + + +Protected setter implementation for the Value property. +SetValue sets a value to the Value property of edit boxes. + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.EditBox.TCustomEditBox.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + + + +Protected setter implementation for the Data property. +FMX.EditBox.TCustomEditBox.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + +Returns the appropriate action link class associated with the track bar. +GetActionLinkClass returns a TValueRangeActionLink. + + + + + + + +Specifies the behavior of a TCustomEditBox control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +ValueRange property of TCustomEditBox. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + +Returns the default interval for the values of the control. + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.EditBox.TCustomEditBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + + + +Returns the name of the default presentation proxy that your presented control uses. +FMX.EditBox.TCustomEditBox.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + + +The data model representing the data used by the presentation of the current control. +FMX.EditBox.TCustomEditBox.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.EditBox.TCustomEditBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +Responds after the last constructor has executed and loads the control presentation. +FMX.EditBox.TCustomEditBox.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Represents the value with which the number is incremented or decremented when, while holding down the mouse button, you move the mouse horizontally. +HorzIncrement represents the value added or decreased from the number when, while holding down the mouse button, you move the mouse to the left or to the right. + + +Provides access to the Value and its Min and Max boundaries. + + + + + + +Specifies the number of decimal positions of the displayed Value. +This property has effect only if the ValueType property is set to Float. + + +Contains the minimum value the number displayed by an edit control can show. +Min sets the minimum value that can be displayed by edit controls that manipulate only numerical values. + + +Contains the maximum value the number displayed by an edit control can show. +Max sets the maximum value that can be displayed by edit controls that manipulate only numerical values. + + +Contains the default number displayed by an edit control. + + +Defines the integer or float type of the Value number displayed by the edit box control. + + + + +Base class for all edit boxes that manipulate only numerical values. +TCustomEditBox is the base class for all edit boxes that manipulate only numerical values, such as a TNumberBox. TCustomEditBox implements functionality to set the minimum and maximum value that this edit box can display, and also the possibility to specify the number of decimal digits of the displayed value. +If you want to create your own custom edit box control that manipulates number data, then you should derive from TCustomEditBox. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Forms.xml b/Modules/DelphiFMX/doc/FMX.Forms.xml new file mode 100644 index 00000000..0e3b1492 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Forms.xml @@ -0,0 +1,6249 @@ + + + + + backgroundstyle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IDesignerHook is an interface that allows component writers to + interact with the form designer in the IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Called after the form has been completely painted, so additional painting can be performed on top on it + + + + + + + + + + Deprecated, only kept for backwards compatibility + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Perform method TComponent.ExecuteAction for current active control or active form or + Application + True if the method ExecuteTarget of Action was performed + This method is analogous to the CM_ACTIONEXECUTE handler's in VCL + + + + + + + + + + + + + + + + + + + + + Provides a mechanism for checking if application analytics has been enabled without accessing the + AnalyticsManager property (which will create an instance of an application manager if one does not already + exist). Returns True if an instance of TAnalyticsManager is assigned to the application. Returns False + otherwise. + + + + + + + + + + + + + + + + + + + Cancels the display of a hint for a control. + + + + + Hides the current hint. + + + + + Determines whether Help Hints are enabled or disabled for the entire application. + + + + + Occurs when the mouse pointer moves over a control or menu item that can display a Help Hint. + + + + + + + + + + + + + + + Returns true if RealCreateForms was invoked; otherwise, false. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns an instance of TAnalyticsManager. An instance will be created if one does not already exist. + There should only be one AnalyticsManager per application. + + + + + Specifies the text string that appears in the Help Hint box. + + + + + Enables the display of keyboard shortcuts. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A service for working with form size constraints. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notifies when form changed style. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Previous focused control. + + + + + + + + New control, which are going to have focus. + + + + + Does focus changing finished? True - NewFocusedControl received focus, False - otherwise. + + + + + + + + + + + + + + + + + $5F + + + + + FM + + + + + .TMP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + Visible + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color of system status bar + + + + + Different modes of showing system status bar + + + + + + + Service for working with native system status bar + + + + Sets background color of system status bar + + + + + + + + + Sets how system status bar will be shown. See TVisibilityMode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The base class for an object that can manage a hint. + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the first item in the children list. +FMX.Forms.TCommonCustomForm.GetBackIndex inherits from FMX.Types.TFmxObject.GetBackIndex. All content below this line refers to FMX.Types.TFmxObject.GetBackIndex. +Returns the first item in the children list. This value is usually 0, but for styled objects, which have a style as the first object in the children list, this value is 1. + + + + + + +Schedules a repaint of the specified rectangle zone on the given form. +InvalidateRect takes in the R TRectF parameter and repaints the rectangle. + + + +Re-creates this form. +Recreate sets this form state to Recreating, then destroys and re-creates its handle, finalizing by showing the form on the screen. In the end, Recreate restores the original form's state by removing the Recreating attribute. +If the form is in a csDesigning state, Recreate exits doing nothing. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sets the value of the Active property. + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Forms.TCommonCustomForm.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + +Returns the specified control located at the given coordinates. +FindTarget iterates through all the children of this form and searches for the control given through the Data parameter at the coordinates specified by P. If the given control was not found, FindTarget returns nil, otherwise it returns the object. +FindTarget is used internally in drag-and-drop operations. + +Tip: The control searched for must be an IControl, must be Visible, and HitTest must be set to True. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Returns a reference to a specified interface if the current component supports that interface. +FMX.Forms.TCommonCustomForm.QueryInterface inherits from System.Classes.TComponent.QueryInterface. All content below this line refers to System.Classes.TComponent.QueryInterface. +Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Creates the window for this form and assigns it a handle. CreateHandle is overridden in subclasses to add extra functionality when creating the window containing this form. + + + +Destroys the window handle created by CreateHandle. DestroyHandle is overridden in subclasses to add extra functionality when destroying the window containing this form. + + + +Resizes this form according to ClientWidth and ClientHeight. +ResizeHandle is overridden in subclasses to implement functionality to resize the dimensions of this form according to the values of the ClientWidth and ClientHeight properties. + + + + + + +Returns a reference to this form object. + + + + + + +Retrieves the active control. +Retrieves the IControl type object stored in the FActiveControl field. + + + + + + +Sets the focus to the specified AControl control. +SetActiveControl sets the focus to the specified AControl control (sets the active control), if possible. +The descendant TCustomForm class uses this protected SetActiveControl method in the setter of the ActiveControl property. +SetActiveControl internally calls FMX.Controls.TControl.SetFocus. + + + + + + +Sets the value of the Captured property. + + + + + + + +Retrieves the control that can obtain the focus. +NewFocusedControl checks whether the specified Value control can obtain the focus. If Value cannot obtain the focus, then NewFocusedControl returns the youngest parent of Value that can obtain the focus. Otherwise, NewFocusedControl returns nil. + + + + + + +Protected setter implementation for the Focused property. +SetFocused sets the focus to the specified control. The control must be located on this form and must exist. + + + + + + +Sets the Hovered property and activates the functionality informing that the mouse pointer has entered the area of the control. +Sets the control stored in the Hovered property and activates an animation and effects informing that the mouse pointer has entered the area of the control by calling DoMouseEnter. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Protected getter implementation for the Captured property. + + + + + + +Returns the value of the Focused property. + + + + + + +Protected getter implementation for the BiDiMode property. + + + + + + +Retrieves the control stored in the Hovered property. + + + + + + + +Implements functionality to start the drag-and-drop operation for the given object on the surface of the given form. +ABitmap specifies the image that will be displayed while dragging the object specified by the Source parameter. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Repaints all the rectangles given through the UpdateRects parameter. UpdateRects is an array of TRectF rectangles. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Used internally by the canvas of this form. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the component after the form file has been read into memory. +FMX.Forms.TCommonCustomForm.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + + +Ensures that AComponent is notified that the component is going to be destroyed. +FMX.Forms.TCommonCustomForm.FreeNotification inherits from System.Classes.TComponent.FreeNotification. All content below this line refers to System.Classes.TComponent.FreeNotification. +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Forms.TCommonCustomForm.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +FMX.Forms.TCommonCustomForm.Updated inherits from System.Classes.TComponent.Updated. All content below this line refers to System.Classes.TComponent.Updated. +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Forms.TCommonCustomForm.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + +Ensures that renaming an owned component does not create a name conflict. +FMX.Forms.TCommonCustomForm.ValidateRename inherits from System.Classes.TComponent.ValidateRename. All content below this line refers to System.Classes.TComponent.ValidateRename. +Ensures that renaming an owned component does not create a name conflict. +ValidateRename checks whether a component can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the Components list, ValidateRename raises an EComponentError exception. +ValidateRename is used internally when the Name property is modified. It is not necessary to call it directly. + + + + + + + + + +Enumerates all child components. +FMX.Forms.TCommonCustomForm.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the value of the ClientWidth property. + + + + + + +Returns the value of the ClientHeight property. + + + +UpdateActions updates all the actions associated to the current form. + + + + + + +Returns the associated action link class. +FMX.Forms.TCommonCustomForm.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + + + +Specifies the behavior of a TCommonCustomForm form when Action changes. +Depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +Visible and Caption properties of TCommonCustomForm. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +The listener for virtual keyboard events of the form. +TCommonCustomForm uses the System.Messaging.TMessageManager.SubscribeToMessage method to subscribe the VirtualKeyboardChangeHandler listener to the TVKStateChangeMessage virtual keyboard events. +The VirtualKeyboardChangeHandler listener handles the KeyboardVisible and +KeyboardBounds properties by calling the +OnVirtualKeyboardShown and OnVirtualKeyboardHidden event handlers. + + + + + + + + + +Determines whether the pressed key should be processed only by the control having the focus or by all children controls and menus of the form. +IsDialogKey is used internally in the KeyDown method. +IsDialog returns True, if KeyChar < ' ' or Shift identifies any of the CTRL, ALT, or CMD keys. That is, if the KeyChar and Shift combination identifies some control combination -- not a printable character. IsDialog returns False, if the Key and KeyChar combination identifies some printable character. The ' ' character has the $20 ASCII value. ASCII values less than $20 identify control combinations. +IsDialogKey has the following parameters: + +Key is the scan code of the pressed keyboard key. This parameter is ignored. +KeyChar is the character code of the pressed key. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when you press the key. +IsDialog is the return boolean parameter. +See also +FMX.Forms.TCommonCustomForm.KeyDown + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Processes the unhandled OnTap events. +DoTap is run automatically for all tap events that were not handled by the user. DoTap is run only if OnTap is not set or if it did not handle the tap event. +Override DoTap in descending classes to support default behavior for tap events that were not handled by the user. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Event handler for the event that occurs when there is a change in the scale of the control. +For instance, changing from retina to non-retina screen on OS X platforms implies a change in the scale factor of the control. + + + + + + + + +Event handler for the event that occurs when there is a style change. +Note: When there is a style change, the control sends a TStyleChangedMessage message. + + + + + + + + +Calls the TriggerOnHint method of all the objects that are registered in the registry. + + + + + + +Registers a new receiver. + + + + + + +Unregisters a receiver. +AReceiver specifies the receiver to remove from the registry list. + + + + + + +Creates and initializes this form. +Create calls the inherited Create to create this form. Create +retrieves the IFMXWindowService, IFMXCursorService, +IFMXFullScreenWindowService, and +IFMXWindowsTouchService services. +Create calls InitializeNewForm to initialize such form parameters as bounds, width and height, border icons, style, border style, and client size for the form. +AOwner specifies the owner of this form. +An AOwner (usually the application) is responsible for freeing the created form. +Most applications do not call this constructor, but rather instantiate a descendant of TForm that is defined in the forms designer. Forms added to an application at design time are created automatically. + + + + + + + $0 + + + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Forms.TCommonCustomForm.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Performs several initializations required by this form. +These initializations include bounds, width and height, border icons, border style, and client size for the form. InitializeNewForm is used by the form constructors. + + + +Responds after the last constructor has executed. +FMX.Forms.TCommonCustomForm.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + + + +Performs any necessary actions before the first destructor is called. +FMX.Forms.TCommonCustomForm.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + + + + + +Returns the object located at the given coordinates. +ObjectAtPoint iterates through all the children of this form and returns the component situated at the coordinates given through the AScreenPoint TPointF parameter. +If the object at the specified coordinates was not found, or is not an IControl, or its state is csDesigning, ObjectAtPoint returns nil. Otherwise the object is returned as IControl. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Executes each time you press a mouse button. +MouseDown has the following parameters: + +Button specifies the mouse button that has been pressed. +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you press the mouse button. +X specifies the horizontal position of the mouse. +Y specifies the vertical position of the mouse. + + + + + + + +Executes each time you move the mouse over the surface of this form. +MouseMove has the following parameters: + +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you released the mouse button. +X specifies the horizontal position of the mouse. +Y specifies the vertical position of the mouse. + + + + + + + + + True + + + + +Executes each time you release a mouse button. +MouseUp has the following parameters: + +Button specifies the mouse button that has been released. +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you released the mouse button. +X specifies the horizontal position of the mouse. +Y specifies the vertical position of the mouse. + + + + + + + +Executes each time you roll the mouse wheel. +MouseWheel has the following parameters: + +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you released the mouse button. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, and negative if the mouse was rotated downward. +Handled specifies whether this form handles the mouse wheel, or other child controls do this. + + +Executes each time the mouse leaves the surface of this form. + + + + + + + + +Executed when a key is pressed while this form has the input focus. +In FireMonkey framework KeyDown is the main method to process pressing of keys in forms. KeyDown is executed each time a key is pressed, when this form has the input focus. KeyDown is used internally: to activate menus and actions and to treat TAB requests to cycle through the children controls of this form. Editors can use KeyDown to add symbols into a text being edited. +You can override KeyDown to provide additional key treating in subclasses. +KeyDown has the following parameters: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +The UITypes unit defines Virtual Keys providing symbolic constants for scan codes of keyboard keys. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). Under FireMonkey framework, platform-specific units (for example FMX.Platform.Mac.pas) should translate native (iOS for FMX.Platform.Mac.pas unit) scan codes to the corresponding Windows codes defined in the UITypes unit. As the result Key always has scan code values defined by vkXXXX constants in UITypes. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key +vkEscape = $1B; { 27 } corresponds to the ESCAPE +vkSpace = $20; { 32 } corresponds to the SPACE +vkF2 = $71; { 113 } corresponds to the F2 keyboard key +Keys of digits and letters -- independently of the selected input language and case of alphabetic keys -- have values corresponding to the '0'..'9' and 'A'..'Z' symbols. For example, Key = vkP = $50 corresponds to the 'P' keyboard key. +If Key = $0, then KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and Input Method Editor (IME) state. +Combinations of the Key and Shift parameters can be translated to shortcut key combinations. + + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be handled as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Determines the state of the CTRL, ALT, SHIFT, and CMD (only for Mac) keys at the moment you press the key. + + + +KeyDown processes pressed keys according to the following algorithm: + +KeyDown first calls the IsDialogKey with the same parameters as those specified for KeyDown. The IsDialog parameter returns True if KeyChar < ' ' or Shift is any of the CTRL, ALT or CMD keys. That is, if the KeyChar and Shift combination identifies some control combination -- not a printable character. Otherwise, it returns False. The ' ' character has the $20 ASCII value. ASCII values less than $20 identify control combinations. +If IsDialogKey returns True in the IsDialog parameter, then the pressed key combination is passed, in the following order, to all child controls, menus and action lists in the form until this key combination is processed: +To the control having focus. +To the context menu of the control having focus. +To all other menus and context menus in the form. +To all other controls (not having focus) in the form. +To action lists in the form and in all child components having assigned action list elements. +To menus and action lists in all other forms. +If the pressed key combination was processed during one of the previous steps, then KeyDown sets Key = 0 and KeyChar = #0 and terminates. +If Key = vkTab, then KeyDown moves the focus to the next control in the controls "tab order" and terminates. +If Key <> 0 or KeyChar <> #0, then KeyDown calls the KeyDown method of the control having focus and then calls the OnKeyDown event handler of the form if one is assigned. +In the finally block, KeyDown stores the current date and time in the LastKeyPress and LastUserActive properties of the current application. + + + + + + + +Is executed each time when a key is released while this form has the input focus. +First, KeyUp calls the OnKeyUp event handler (if one is defined) of the control having input focus, then KeyUp calls the OnKeyUp event handler. In the finally block, KeyUp stores the current date and time in the LastKeyPress and LastUserActive properties of the current application. +KeyUp has the following parameters: + +Key is the scan code of the pressed keyboard key. The UITypes unit defines Virtual Keys providing symbolic constants for scan codes of keyboard keys. +KeyChar is the character representation of the pressed key. +Shift determines the state of the CTRL, ALT, SHIFT, and CMD (only for Mac) keys at the moment you press the key. +You can override KeyUp to provide additional ways to handle keys in subclasses. + + + +Sets the mouse capture to this window, which belongs to the current thread. + + + +Releases the mouse capture from this window that belongs to the current thread and restores normal mouse input processing. + + + +Recreates the context where the form renders itself. + + + + + + +The HandleNeeded method requests the form to create its handle at this moment and all the resources associated to it. + + + + + + +Activation event dispatcher. +The form component calls Activate when it gets the focus either because of a change in the active windows within an application or because of the application becoming active. Activate fires an OnActivate event. + + + +Deactivation event dispatcher. +The form component calls Deactivate when it loses the focus either because of a change in the active windows within an application or because of the application becoming inactive. Deactivate fires an OnDeactivate event. + + + + + + + +Executes when you drag an object while entering the surface of this form. +Override DragEnter to add additional code that executes when you enter the surface of this form while dragging an object. +Data is the object being dragged. +Point is the position of the mouse. + + + + + + + + +Executes when you drag an object over the surface of this form. +Override DragOver to add additional code that executes when you drag an object over the surface of this form. DragOver sets the Accept parameter to True to indicate that you can drop the dragged object on this form. It sets Accept to False to indicate that you cannot drop the dragged object on this form. +The Data parameter is the object being dragged. +Point indicates the current position of the mouse. + + + + + + + +Executes when you drop an object over the surface of this form. +Override DragDrop to add additional code that executes when you drop an object over the surface of this form. +The Data parameter is the object that was dropped onto this form. The Point parameter has the mouse coordinates where the object was dropped. + + + +Executes when you drag an object while leaving the surface of this form. +Override DragLeave to add additional code that executes when you leave the surface of this form while dragging an object. + + + +Starts the menu loop for the main menu bars that this form might contain. +EnterMenuLoop iterates through all the child controls of this form and, if one of them is a TMenuBar, then starts its menu loop. + + + +Signals that this form's window is about to be dragged. StartWindowDrag exits if this form has a csDesigning component state. + + + +Signals that this form's window is about to be resized. StartWindowResize exits if this form has a csDesigning component state. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Sets the boundaries for this form. +SetBounds has the following parameters: + +ALeft--the left boundary +ATop--the top boundary +AWidth--the right boundary +AHeight--the bottom boundary + + + + + + + +Sets the boundaries for this form. +SetBounds has the following parameters: + +ALeft--the left boundary +ATop--the top boundary +AWidth--the right boundary +AHeight--the bottom boundary + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Bounds of form - position and size. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Converts the given mouse coordinates to screen coordinates. The local coordinates on the surface of this form are given through the Point parameter. + + + + + + + +Transforms the global screen coordinates to local client area coordinates. The global screen coordinates are given through the Point parameter. + + + + + + +Retrieves whether the form is not visible. +CanShow returns True if Visible is False (when the form is not visible). + + + + + + +Close-attempt event dispatcher. +CloseQuery is called automatically when an attempt is made to close the form. CloseQuery can allow the form to close by returning True, or prevent the form from closing by returning False. +As implemented in TCommonCustomForm, CloseQuery calls the OnCloseQuery event handler, if it exists. If no such event handler exists, CloseQuery returns True. + + + + + + +Returns a TRectF with the coordinates of the client area. The width of the rectangle is the same as ClientWidth and the height of the rectangle is ClientHeight. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Closes the form and returns the close action that the form uses. +Call Close to close a form. +Attempts to close a form can be aborted by the CloseQuery event dispatcher or the OnCloseQuery event handler. + +Note: When the main form of the application closes, the application terminates. + + + + + + +Displays the form onscreen. +The form is displayed onscreen, with the specified Position. + + +Attention: On macOS, the Secondary window created by a modal windows must also be shown using ShowModal. Do not call Show for a window that is being shown from a window shown using ShowModal. + + + +Hides the form. +Hide sets the Visible property to False. + + + +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +FMX.Forms.TCommonCustomForm.BringToFront inherits from FMX.Types.TFmxObject.BringToFront. All content below this line refers to FMX.Types.TFmxObject.BringToFront. +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +You can call BringToFront at run time as in the following code snippet: + + Label1.BringToFront; + +or, at design time, by right-clicking the FMX visual control and selecting Control > Bring to Front from the pop-up menu. + + + +Sends this FMX visual object to the background letting other overlapping visual controls that are on the same form to be on top of it. +FMX.Forms.TCommonCustomForm.SendToBack inherits from FMX.Types.TFmxObject.SendToBack. All content below this line refers to FMX.Types.TFmxObject.SendToBack. +Sends this FMX visual object to the background letting other overlapping visual controls that are on the same form to be on top of it. +You can call SendToBack at run time as in the following code snippet: + + Label1.SendToBack; + +or, at design time by right-clicking the FMX visual control and selecting Control > Send To Back from the pop-up menu. + + + + + + +Shows the form as a modal dialog box. +Use ShowModal to show the form as a modal dialog box. When a modal form is opened the application cannot continue to run until the modal form is closed. Thus, ShowModal does not return until the form has closed. When the form has closed, it returns the value of the ModalResult property. +To close a modal form, set its ModalResult property to a nonzero value. + + +Tip: If the form contains buttons with a ModalResult property set to a value other than mrNone, the form automatically closes when the user clicks one of these buttons and returns the ModalResult value as the return value of ShowModal. +Warning: Modal dialog boxes are not supported in Android apps. We recommend do not use modal dialog boxes on either of the mobile platforms (iOS and Android) because unexpected behavior can result. Avoiding usage of modal dialog boxes eliminates potential problems in debugging and supporting your mobile apps. +Attention: On macOS, secondary windows shown from a modal window must also be shown modally using ShowModal, otherwise secondary windows do not gain focus. + + + + + + +Shows the form as a modal dialog box. +Use ShowModal to show the form as a modal dialog box. When a modal form is opened the application cannot continue to run until the modal form is closed. Thus, ShowModal does not return until the form has closed. When the form has closed, it returns the value of the ModalResult property. +To close a modal form, set its ModalResult property to a nonzero value. + + +Tip: If the form contains buttons with a ModalResult property set to a value other than mrNone, the form automatically closes when the user clicks one of these buttons and returns the ModalResult value as the return value of ShowModal. +Warning: Modal dialog boxes are not supported in Android apps. We recommend do not use modal dialog boxes on either of the mobile platforms (iOS and Android) because unexpected behavior can result. Avoiding usage of modal dialog boxes eliminates potential problems in debugging and supporting your mobile apps. +Attention: On macOS, secondary windows shown from a modal window must also be shown modally using ShowModal, otherwise secondary windows do not gain focus. + + + +Prepares a modal form for closing and returns the close action that the form uses. +Do not call CloseModal in your application. CloseModal is used by the the FireMonkey framework when a modal form needs to be closed. CloseModal does not close the form by itself; it simply calls the registered close events and updates the ModalResult property. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Schedules a repaint of this form. +Invalidate informs the form that its entire surface needs to be repainted. Calling Invalidate can prevent flicker caused by a series of partial repaints. There is no performance penalty for calling Invalidate multiple times before the form is actually repainted. + + + +Starts updating all the child controls in this form. +BeginUpdate starts updating all the child controls placed on this form, thus speeding any operations you might perform on the form or on multiple children. BeginUpdate signals the beginning of an update operation and must be followed by EndUpdate when all the updates have been completed. + + + +Ends updating all the child controls in this form. +EndUpdate ends updating all the child controls placed on this form, finalizing any updates you might have performed on the form or on multiple children. EndUpdate signals the end of an update operation and must be preceded by BeginUpdate and by the updates themselves. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Returns true only if the handle is allocated. + + + + + + + + +Specifies the handle of this form. + + +Specifies the parent form of this form. +The ParentForm parent form must be an instance of a TCommonCustomForm descendant. ParentForm contains the parent component of the current TCommonCustomForm form. ParentForm is responsible for deleting the current TCommonCustomForm form. +The value of ParentForm is set when you change the Parent property. If Parent is a form, then ParentForm is set to the value of Parent. Otherwise, ParentForm is set to the value of the form, to which the Parent belongs. + + +Determines the form style. +FormStyle is one of the Normal, Popup, or StayOnTop values defined in TFormStyle. + + +Represents the return value of a form that is used as a modal dialog box. +Use ModalResult to close the form when it is displayed modally. +By default, ModalResult is mrNone. Set ModalResult to any nonzero value to close the form. The ModalResult value becomes the return value of the ShowModal function called to display the form. +The following table lists the constants defined in the System.UITypes unit to be used for the ModalResult property of the TModalResult type. + + + +Constant + +Value + +Meaning + + + +mrNone + + + +0 + + + +None. Used as a default value before the user exits. + + + + +mrOk + + + +idOK = 1 + + + +The user exited with the OK button. + + + + +mrCancel + + + +idCancel = 2 + + + +The user exited with the CANCEL button. + + + + +mrAbort + + + +idAbort = 3 + + + +The user exited with the ABORT button. + + + + +mrRetry + + + +idRetry = 4 + + + +The user exited with the RETRY button. + + + + +mrIgnore + + + +idIgnore = 5 + + + +The user exited with the IGNORE button. + + + + +mrYes + + + +idYes = 6 + + + +The user exited with the YES button. + + + + +mrNo + + + +idNo = 7 + + + +The user exited with the NO button. + + + + +mrClose + + + +idClose = 8 + + + +The user exited with the CLOSE button. + + + + +mrHelp + + + +idHelp = 9 + + + +The user exited with the HELP button. + + + + +mrTryAgain + + + +idTryAgain = 10 + + + +The user exited with the TRY AGAIN button. + + + + +mrContinue + + + +idContinue = 11 + + + +The user exited with the CONTINUE button. + + + + +mrAll + + + +mrContinue + 1 (12 or $C) + + + +The user exited with the ALL button. + + + + +mrNoToAll + + + +mrAll +1 (13 or $D) + + + +The user exited with the NO TO ALL button. + + + + +mrYesToAll + + + +mrNoToAll +1 (14 or $E) + + + +The user exited with the YES TO ALL button. + + +You can check a ModalResult value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions and use the StripAllFromResult function to convert ModalResult values that refer to "ALL" buttons to identifying values corresponding simple buttons (Ok, No, or Yes). + +Note: This property can be modified automatically setting corresponding ModalResult properties of controls in the modal form. + +Indicates transitional state information about the form. +Read FormState to determine the state of the form. FormState indicates when the form is in various transitional states or when certain operations have occurred. The following table lists the values that can be included in a form's state: + + + + + +Value + +Meaning + + + +Recreating + + + +The form is recreating its handle and its window is being shown on the screen. + + + + +Modal + + + +The form was created as a modal window. + + + + + + +Specifies the designer interface for the form. +The Designer property is used internally at design time. Never assign a value to this property. This is done automatically by the form designer. Only use this property when designing classes for use in the form designer, such as property editors and component editors. + + +Specifies the control that has captured the mouse. Captured is read-only. + + +Specifies the control that has the focus set on it. + + +Identifies the control over which the mouse pointer is hovering. +Used internally for mouse hovering-over purposes. + + +Specifies whether the form has focus. +Use Active to determine whether the form has focus. The Active form receives all keyboard input. If it has a title bar, it is drawn using the active colors specified by the operating system. +If Active is True, the form has focus; if Active is False, the form does not have focus. + + +Indicates the layout of this form when running under Middle Eastern versions of the operating system. +Use BiDiMode to specify the bi-directional mode for the application. The bi-directional mode controls the direction in which text appears (left-to-right or right-to-left), the placement of vertical scroll bars, and the default alignment of text when the application runs in Middle Eastern locales. + + +Specifies a text string that identifies the form to the user. +Use Caption to specify the text string that labels the form, identifying it to the user. + + +Specifies the mouse cursor that will be used on this form. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the appearance and behavior of the form border. +Use BorderStyle to get or set the appearance and behavior of the form border. BorderStyle can be any of the following TFmxFormBorderStyle values: + + + +Value + +Meaning + + + +Single + + + +Not resizable; minimize/maximize menu + + + + +None + + + +Not resizable; no visible border line + + + + +Sizeable + + + +Standard resizable border + + + + +ToolWindow + + + +Similar to Single, but with a smaller caption + + + + +SizeToolWin + + + +Similar to Sizeable, but with a smaller caption + + +Notes: + +In iOS applications, None makes your form run in fullscreen mode. With any other value, your iOS app shows the iOS status bar. +In Android applications, the BorderStyle property does not control fullscreen display. Instead, you should set the theme property on the Project > Options > Version Info page of your Android project: +Setting the theme = TitleBar means that your Android app includes a title or status bar. +Setting the theme = NoTitleBar means that your Android app runs in fullscreen mode, without a title or status bar. + +Specifies which icons appear on the title bar of the form. +Use BorderIcons to get or set the icons that appear on the title bar of the form. BorderIcons can include any of the following TBorderIcons values: + + + +Value + +Meaning + + + +biSystemMenu + + + +The form has a Control menu (also known as a System menu). + + + + +biMinimize + + + +The form has a Minimize button. + + + + +biMaximize + + + +The form has a Maximize button. + + + + +biHelp + + + +Has no effect in FireMonkey. + + + + + + +Bounds of form - position and size. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Specifies the height (in pixels) of the form's client area. +Use ClientHeight to determine the height (in pixels) of the form's client area. The client area is the usable area inside the form's border, excluding the title bar, scroll bars, and so on. +Set ClientHeight to change the height of the form's window based on the desired client area. To change the height of the form's window based on the total size of the window (including the border, menu, status bar and so on), use the Height property instead. + + +Specifies the width (in pixels) of the form's client area. +Use ClientWidth to determine the width (in pixels) of the form's client area. The client area is the usable area inside the form's border. Set ClientWidth to change the width of the form's window based on the desired client area. To change the width of the form's window based on the total size of the window (including the border, status bar, and so on), use the Width property instead. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the padding of the form. +The Padding of a form specifies how close, in pixels, the child of the form can come to each of its edges (top, left, bottom, right). Padding adds space to the inner side of the form. +The child of the form is repositioned and resized, if necessary, to fit the Padding. + + + +Represents the size and placement of the form. +Use Position to get or set the size and placement of the form. Position can have one of the following TFormPosition values: + + + +Value + +Meaning + + + +Designed + + + +The form appears positioned on the screen and with the same height and width as it had at design time. + + + + +Default + + + +The form appears in a position on the screen and with a height and width determined by the operating system. Each time you run the application, the form moves slightly down and to the right. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of None, for example), the window is positioned in the upper-left corner of the screen. +On OS X, the default position for new windows is the upper-left corner of the screen. + + + + +DefaultPosOnly + + + +The form displays with the size you created it at design time, but the operating system chooses its position on the screen. Each time you run the application, the form moves slightly down and to the right. When the form can no longer move down and to the right and keep the same size while remaining entirely visible on the screen, the form displays in the upper-left corner of the screen. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of None, for example), the window is positioned in the upper-left corner of the screen. +On OS X, the default position for new windows is the upper-left corner of the screen. + + + + +DefaultSizeOnly + + + +The form appears in the position you left it at design time, but the operating system chooses its size. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. + + + + +ScreenCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. + + + + +DesktopCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. No adjustments are made for multi-monitor applications. + + + + +MainFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the application's main form. No adjustments are made for multi-monitor applications. This position should only be used with secondary forms. If set for a main form, it acts like ScreenCenter. + + + + +OwnerFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the owner form. If there is no owner form, this position acts like MainFormCenter. + + +Note that, if Position is set to Default, DefaultPosOnly, or DefaultSizeOnly, and BorderStyle is set to None, the form will be positioned at (0,0). + + +Specifies the style book for this form. For more information on how to customize the looks of a FireMonkey application with styles, refer to the Customizing FireMonkey Applications with Styles help topic. + + + +System status bar settings on mobile platforms. + + + + + +Indicates whether the form is transparent or not. +Use Transparency to determine whether the form is displayed as a totally transparent one. However, note that in this situation, all the controls will not be transparent and will be displayed normally. Only the form's background will be set to a transparent state. +If you set Transparency to True, the form will not display its title bar, nor its border. This means that you need to apply programmatic methods (involving setting of the Top and Left properties) to move the form on the screen surface. + + +Specifies the horizontal size of the form (in pixels). +Use the Width property to read or change the width of the form. + + +Specifies the vertical size of the form (in pixels). +Use the Height property to read or change the height of the form. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates whether the form is visible. +Use Visible to determine whether the form is visible. +If Visible is True, the form is visible unless it is completely obscured by other forms. If Visible is False, the form is not visible. +The Show and ShowModal methods set Visible to True and bring the form to the front of all open windows. + + +Represents how the form appears on the screen. +Set WindowState to minimize, maximize, or restore the form window. Read WindowState to determine whether the form is minimized, maximized, or in a normal state. +Possible values for the WindowState property are: + +wsMaximized +wsMinimized +wsNormal + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates whether the form is in fullscreen mode. +Use FullScreen to specify whether the form is in fullscreen mode. + + +Indicates whether the Mac fullscreen icon is visible. +Use ShowFullScreenIcon to specify whether the Mac fullscreen icon or is visible. + +Note: ShowFullScreenIcon has no visible effect in Windows. + +Specifies the form factor for this FireMonkey form, that is, the TFormFactor properties: width, height, orientations, and devices. + + +Is a string property that specifies the form family this form is part of. +The logic can choose a different form as the main form depending on size, if an app has several forms with the same .FormFamily value as the app's main form. + + +Specifies the save state of the FireMonkey form. +The SaveState property is an instance of the TFormSaveState class, used to save the state of a form so this state can be restored once the application is restarted. + + + +Determines whether help hints are enabled or disabled for first level child controls in the form. +For more information about the rules for enabling hints for a control, see Using Hints to Show Contextual Help in a FireMonkey Application. + TCommonCustomForm.ShowHint is a Boolean property set as True by default. When you place a child control in the form, and set the TControl.Hint property, the hint is displayed because the TControl.ParentShowHint is True by default. +If the TCommonCustomForm.ShowHint property of the form is set to False, the hint is not displayed in the child control. +To show the hint for a control, even when the TCommonCustomForm.ShowHint property of the form is set to False, set TControl.ShowHint for the control to True. + + + +Occurs when the form is created. +Use OnCreate to perform special processing when the form is created and is invoked by the constructor. Either implement this event or override the constructor of the form; do not perform both actions. Any objects created in the OnCreate event should be freed by the OnDestroy event. +When a form is being created and its Visible property is True, the following events occur in the order listed: + +OnCreate +OnActivate + +Occurs when the form is destroyed. +Use OnDestroy to perform special processing when the form is destroyed. Either implement this event or override the destructor of the class, but not both. This event should destroy any objects created in the OnCreate event. + + +Occurs when the form closes. +Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close. The handler specified by OnClose might, for example, test that all fields in a data entry form have valid contents before allowing the form to close. +A form is closed by the Close method or when the user chooses Close from the form's system menu. +The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines whether the form actually closes. +The following table lists the possible values of Action: + + + + +Value + +Meaning + + + +caNone + + + +The form is not allowed to close, so nothing happens. + + + + +caHide + + + +The form is not closed, but just hidden. Your application can still access a hidden form. This is the default value for Action. + + + + +caFree + + + +The form is closed and all allocated memory for the form is freed. + + + + +caMinimize + + + +The form is minimized, rather than closed. + + + +By default, Action is set to caHide. +To close the form and free it in an OnClose event, set Action to caFree. + +Note: When the application shuts down, the main form receives an OnClose event, but any child forms do not receive the OnClose event. + +Occurs when there is an attempt to close the form. +Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler returns a Boolean CanClose value that determines whether a form is allowed to close. Its default value is True. +You can use an OnCloseQuery event handler to ask users whether they are sure they want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form. +The TCloseQueryEvent type points to the method that determines whether a form can be closed. The value of the CanClose parameter determines whether the form can be closed or not. + + +Occurs when the form becomes active. +Use OnActivate to perform special processing when the form receives focus. A form becomes active when the focus is transferred to it (when the user clicks in the form, for example). + + +Occurs when the form loses focus. +Use OnDeactivate to perform special processing when the active form becomes inactive and another form in the same application becomes the active one. + + +Occurs when a key is pressed while the form has focus. +OnKeyDown also occurs when KeyDown is called. +Write an event handler for OnKeyDown to specify what happens when the form is in focus and a key is pressed. + + +Occurs when a key is released while the form has focus. +OnKeyUp also occurs when KeyUp is called. +Write an event handler for OnKeyUp to specify what happens when the form is in focus and a key is released. + + +Occurs when a mouse button is pressed over the form. +OnMouseDown also occurs when MouseDown is called. +Write an event handler for OnMouseDown to specify what happens when one of the mouse buttons is pressed over the form. + + +Occurs when the mouse cursor moves while over the form area. +OnMouseMove also occurs when MouseMove is called. +Write an event handler for OnMouseMove to specify what happens when the mouse pointer is moved while over the form area. + + +Occurs when the mouse button that was pressed over the form is released. +OnMouseUp also occurs when MouseUp is called. +Write an event handler for OnMouseUp to specify what happens when the button of the mouse that was pressed over the form is released. + + +Occurs when the mouse wheel moves while the form has focus. +OnMouseWheel also occurs when MouseWheel is called. + +Note: On OS X platforms, this function can be called when the mouse wheel is moved while the mouse pointer is over the window. It is not necessary for the window to have focus. +Write an event handler for OnMouseWheel to specify what happens when the mouse wheel is moved while the form is in focus. + + +Occurs immediately after the form is resized. +Use OnResize to make any final adjustments after the form is resized. +OnResize is an event handler of type TNotifyEvent. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs when the form is shown (that is, when its Visible property is set to True). +Use OnShow to perform special processing when the form is shown (that is, when the form's Visible property is set to True). + + +Occurs when the form is hidden (that is, when its Visible property is set to False). +Use OnHide to perform special processing when the form is hidden (that is, when the form's Visible property is set to False). + + +Occurs when the current Form loses the focus. +Use OnFocusChanged to manage custom actions in case the focus changes from the current form to another control. + + +Occurs when the virtual keyboard of the form is shown. +Use OnVirtualKeyboardShown to perform special processing when the virtual keyboard of the form is shown. +The Sender parameter of the event handler identifies the form that called the event handler. The Bounds parameter of the event handler specifies the screen coordinates of the window of the virtual keyboard. + + +Occurs when the virtual keyboard of the form is hidden. +Use OnVirtualKeyboardHidden to perform special processing when the virtual keyboard of the form is hidden. +The Sender parameter of the event handler identifies the form that called the event handler. The Bounds parameter of the event handler specifies the screen coordinates of the window of the virtual keyboard. + + +Occurs when the form is about to go to background on mobile devices or when the form is about to be closed on desktop. +Any form-related data should be saved during the OnSaveState event so this data can be restored once the application is restarted. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs when a user taps the form using a finger or a similar device (not a mouse). +Write an event handler for OnTap to specify what happens when the user taps the form. + + +Occurs when the user touches the form area. +You can implement an event handler to manage custom actions when OnTouch occurs. +Note: The number of touch points is platform-specific. + + +Specifies the X coordinate of the upper-left corner of the form, relative to the screen. +Use Left to locate the top of the form or reposition the form to a different X coordinate. The Left property, like the Top property, is the position of the form relative to its container (the screen), in pixels. + + +Specifies the Y coordinate of the upper-left corner of the form, relative to the screen. +Use Top to locate the top of the form or reposition the form to a different Y coordinate. The Top property, like the Left property, is the position of the form relative to its container (the screen), in pixels. + + + +TCommonCustomForm represents the base class for all forms, whether they are 2D or 3D. +TCommonCustomForm is the base class for all TCustomForm and TCustomForm3D, and all their derived objects such as TForm and TForm3D. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Forms.TCustomForm.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Forms.TCustomForm.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Applies the style for this form. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Fires an OnPaint event. + + + + + + +Gets the style resource object linked to this form. +GetStyleObject is called when the style is applied through a call to the ApplyStyleLookup method. +GetStyleObject internally calls LookupStyleObject. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Creates the window for this form and assigns it a handle. +FMX.Forms.TCustomForm.CreateHandle inherits from FMX.Forms.TCommonCustomForm.CreateHandle. All content below this line refers to FMX.Forms.TCommonCustomForm.CreateHandle. +Creates the window for this form and assigns it a handle. CreateHandle is overridden in subclasses to add extra functionality when creating the window containing this form. + + + +Destroys the window handle created by CreateHandle. +FMX.Forms.TCustomForm.DestroyHandle inherits from FMX.Forms.TCommonCustomForm.DestroyHandle. All content below this line refers to FMX.Forms.TCommonCustomForm.DestroyHandle. +Destroys the window handle created by CreateHandle. DestroyHandle is overridden in subclasses to add extra functionality when destroying the window containing this form. + + + +Resizes this form according to ClientWidth and ClientHeight. +FMX.Forms.TCustomForm.ResizeHandle inherits from FMX.Forms.TCommonCustomForm.ResizeHandle. All content below this line refers to FMX.Forms.TCommonCustomForm.ResizeHandle. +Resizes this form according to ClientWidth and ClientHeight. +ResizeHandle is overridden in subclasses to implement functionality to resize the dimensions of this form according to the values of the ClientWidth and ClientHeight properties. + + + + + + + + + + +Repaints all the rectangles given through the UpdateRects parameter. +FMX.Forms.TCustomForm.PaintRects inherits from FMX.Forms.TCommonCustomForm.PaintRects. All content below this line refers to FMX.Forms.TCommonCustomForm.PaintRects. +Repaints all the rectangles given through the UpdateRects parameter. UpdateRects is an array of TRectF rectangles. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. +FMX.Forms.TCustomForm.Realign inherits from FMX.Forms.TCommonCustomForm.Realign. All content below this line refers to FMX.Forms.TCommonCustomForm.Realign. +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Event handler for the event that occurs when there is a style change. +FMX.Forms.TCustomForm.StyleChangedHandler inherits from FMX.Forms.TCommonCustomForm.StyleChangedHandler. All content below this line refers to FMX.Forms.TCommonCustomForm.StyleChangedHandler. +Event handler for the event that occurs when there is a style change. +Note: When there is a style change, the control sends a TStyleChangedMessage message. + + See Also +FMX.Forms.TCommonCustomForm.ScaleChangedHandler +FMX.Controls.TStyleChangedMessage + + + + + + + +Creates and initializes this form. +FMX.Forms.TCustomForm.Create inherits from FMX.Forms.TCommonCustomForm.Create. All content below this line refers to FMX.Forms.TCommonCustomForm.Create. +Creates and initializes this form. +Create calls the inherited Create to create this form. Create +retrieves the IFMXWindowService, IFMXCursorService, +IFMXFullScreenWindowService, and +IFMXWindowsTouchService services. +Create calls InitializeNewForm to initialize such form parameters as bounds, width and height, border icons, style, border style, and client size for the form. +AOwner specifies the owner of this form. +An AOwner (usually the application) is responsible for freeing the created form. +Most applications do not call this constructor, but rather instantiate a descendant of TForm that is defined in the forms designer. Forms added to an application at design time are created automatically. + + + + + + + $0 + + + + + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Forms.TCustomForm.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Performs several initializations required by this form. +FMX.Forms.TCustomForm.InitializeNewForm inherits from FMX.Forms.TCommonCustomForm.InitializeNewForm. All content below this line refers to FMX.Forms.TCommonCustomForm.InitializeNewForm. +Performs several initializations required by this form. +These initializations include bounds, width and height, border icons, border style, and client size for the form. InitializeNewForm is used by the form constructors. + + + +Ends updating all the child controls in this form. +FMX.Forms.TCustomForm.EndUpdate inherits from FMX.Forms.TCommonCustomForm.EndUpdate. All content below this line refers to FMX.Forms.TCommonCustomForm.EndUpdate. +Ends updating all the child controls in this form. +EndUpdate ends updating all the child controls placed on this form, finalizing any updates you might have performed on the form or on multiple children. EndUpdate signals the end of an update operation and must be preceded by BeginUpdate and by the updates themselves. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Recreates the canvas where the form renders itself. + + + +Provides access to the drawing area of the form. +Use Canvas to draw directly on the client area of the form. + + +Specifies the way the background on this form is filled. +Use Fill to get or set the brush that defines the way the background of this form is painted (gradient, solid, and so on). + +Tip: Using a brush for Fill overrides the functionality of the Transparency property. + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the active control on the form. +Use ActiveControl to get or set the active control (having the focus) on the form. Only one control can have the focus at a given time, in an application. +If the form does not have the focus, ActiveControl is the control, on the form, that receives the focus when the form itself receives the focus. + + +Specifies the name of the style to look up and apply to this form. The FireMonkey Component Design help topic shows, among other useful things related to component designing, how to apply a style to a TPanel component. + + +Occurs when the form is redrawn. +Use OnPaint to perform special processing when the form is redrawn. Any special painting on the form should be done in this event. OnPaint occurs before any controls on the form are painted. + +Tip: Notice that calling BeginScene in the OnPaint event handlers has no effect, because BeginScene is called before the OnPaint event handler runs. This guarantees that painting always occurs in OnPaint without requiring extra and probably unexpected code to allow drawing to have an effect. + + +TCustomForm represents the base class from which you derive other windows such as dialog boxes and forms. +Create a subclass derived from TCustomForm if you want to create new forms such as dialog boxes. A derived form can contain one or more FireMonkey objects, such as TLabel, TComboBox, and so on. +Note that every descendant of TCustomForm is a 2D FireMonkey form or dialog box. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Initializes the component after the form file has been read into memory. +FMX.Forms.TCustomPopupForm.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +FMX.Forms.TCustomPopupForm.Updated inherits from System.Classes.TComponent.Updated. All content below this line refers to System.Classes.TComponent.Updated. +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Forms.TCustomPopupForm.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. +FMX.Forms.TCustomPopupForm.Realign inherits from FMX.Forms.TCommonCustomForm.Realign. All content below this line refers to FMX.Forms.TCommonCustomForm.Realign. +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + $0 + + + + + + + + + + nil + + + + + nil + + + + + True + + + + +Creates and initializes this pop-up form. +Create calls CreateNew, which creates this pop-up form and sets initial values to several properties of the created pop-up form. Then Create initializes the PlacementTarget, +Parent, and StyleBook properties for the created pop-up form. +AOwner specifies the owner of this pop-up form. The AOwner is responsible for freeing the created pop-up form. +AStyleBook specifies the style book to set for the StyleBook property of this pop-up form. +APlacementTarget specifies the PlacementTarget property for this pop-up form. + + + + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Forms.TCustomPopupForm.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Positions the current pop-up form. +ApplyPlacement positions the TCustomPopupForm pop-up form using the current Size and Placement properties. + + + + + + +Retrieves whether the form is not visible. +First CanShow calls the inherited +TCommonCustomForm.CanShow. If TCommonCustomForm.CanShow returns False, CanShow exits returning False. If TCommonCustomForm.CanShow returns True, CanShow initiates animation +(AniDuration, AniPosition, DoAniTimer) and +exits returning True. + + + + + + +Close-attempt event dispatcher. +FMX.Forms.TCustomPopupForm.CloseQuery inherits from FMX.Forms.TCommonCustomForm.CloseQuery. All content below this line refers to FMX.Forms.TCommonCustomForm.CloseQuery. +Close-attempt event dispatcher. +CloseQuery is called automatically when an attempt is made to close the form. CloseQuery can allow the form to close by returning True, or prevent the form from closing by returning False. +As implemented in TCommonCustomForm, CloseQuery calls the OnCloseQuery event handler, if it exists. If no such event handler exists, CloseQuery returns True. + + +Sets the animation duration for the pop-up form to close or to show. +AniDuration is measured in seconds. +AniDuration defines a duration time for execution of the custom event handler assigned to the OnAniTimer event of the current TCustomPopupForm pop-up form. + +Note: AniDuration does not influence onto an animation duration of an external animation (for example TFloatAnimation animation) if such is assigned to the TCustomPopupForm pop-up form. AniDuration is used for the custom event handler assigned to the OnAniTimer event. + +Read-only property returning values between 0 and 1. You can use AniPosition in an OnAniTimer event handler. +The AniPosition value changes during AniDuration time of a custom animation execution from 0 to 1 (during opening of the current pop-up form) and from 1 to 0 (during closing) respectively. +AniPosition might be used as a parameter in intermediate values of animated properties in an OnAniTimer event handler. For example, you can use AniPosition to calculate an intermediate position or intermediate opacity during custom animation. Where AniPosition = 0 corresponds to a starting moment and AniPosition = 1 to a termination of opening animation. +For example, in the sample below the form Width (as a component of the form Size) changes from 0 (when AniPosition = 0) to 200 (when AniPosition = 1) during appearing of the pop-up form and vice versa on the form closing: + +... +procedure TForm1.AniTimerProc(Sender: TObject); +begin + if Sender is TCustomPopupForm then + begin +// You can use AniPosition whether to define Opacity or Size +// TCustomPopupForm(Sender).ContentControl.Opacity := TCustomPopupForm(Sender).AniPosition; + TCustomPopupForm(Sender).Size := TSize.Create(Round(200 * TCustomPopupForm(Sender).AniPosition), 100); + end; +end; + +procedure TForm1.Button1Click(Sender: TObject); +var + R: TRectangle; +begin + R := TRectangle.Create(Self); + F := TCustomPopupForm.Create(Self); + F.AniDuration := 0.5; + F.ContentControl := R; + F.OnAniTimer := AniTimerProc; + F.PlacementTarget := Button1; + F.Show; +end; +... + +Commented line shows how to use AniPosition to animate a form transparency. +See also discussion in TPopup.OnAniTimer. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the control that is shown on the pop-up form. +If a pop-up form does not contain any visible control, then the pop-up form is totally transparent. Therefore, some visible control should be placed onto the pop-up form. This control is specified by the ContentControl property. + +Note: A ContentCtrl control can be associated to a PopupForm pop-up form using the Parent property of the control, like in the following example: ContentCtrl.Parent := ParentForm. However, we recommend using the ContentControl property like ParentForm.ContentControl := ContentCtrl, because TCustomPopupForm handling ContentControl takes into account the current scale and rotation of the ContentCtrl control. + + +Specifies the padding of the pop-up form. +The ContentPadding of a pop-up form specifies how close, in pixels, the children of the form can come to each of the form edges (top, left, bottom, right). See also Padding. +The adhering of the pop-up form is executed to the boundaries of this indented 'padding rectangle'. + + + + +Specifies whether the current TCustomPopupForm can be dragged after it is shown. +For example, if DragWithParent is True, TCustomPopupForm is dragged together with its parent form when the parent form is the target of a drag-and-drop operation. When Placement is Mouse or MouseCenter, then the pop-up form moves following the mouse cursor. On mobile devices, after changing the orientation (portrait/landscape) the pop-up form can change its position in order not to be partially positioned outside of the screen boundaries. +The default is True. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +The offset of the padding rectangle relative to the rectangle of the pop-up form. +Defines the number of pixels, by which the pop-up form is displaced relatively to the main form position; this number is obtained taking into account all positioning properties used in the TCustomPopupForm class. The Offset direction depends on a Placement value. The Offset property is used, for example, in multi-level menus, when pop-up forms of submenus are placed overlapping a form of a previous level. + + + +Gets or sets how the TCustomPopupForm is positioned relative to rectangles specified by the PlacementRectangle or PlacementTarget properties, relative to the screen, or relative to the mouse (pointing device) position. +TPlacement defines possible values of Placement. +TPlacement also specifies the behavior of the TCustomPopupForm, when it overlaps screen boundaries. The default value is Bottom. +This figure demonstrates the TopCenter value. + +In the figure, ScreenPlacementRect is the colored Fuchsia rectangle of the Show popup button. +Use Placement, PlacementTarget, and PlacementRectangle to set the positioning of TCustomPopupForm. + + +Gets or sets a rectangle, relative to which the TCustomPopupForm is positioned. +Screen coordinates of PlacementRectangle are calculated relative to PlacementTarget (if specified). Otherwise, relative to the top left corner of the screen. The following rules are used: + +If PlacementRectangle is not specified (width or height equals to zero 0), but PlacementTarget is specified, then the coordinates and size of PlacementTarget are used. +If neither PlacementRectangle nor PlacementTarget are specified, then adhering of the top left corner of the form is implemented to the mouse cursor. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of the TCustomPopupForm. + + +The target control, relative to which the TCustomPopupForm is positioned. +If PlacementTarget is not set, and the TCustomPopupForm has a ParentForm, then the TCustomPopupForm is positioned relative to its parent. If PlacementTarget and ParentForm are not set, TCustomPopupForm is positioned relative to the main window. +Use Placement, +RealPlacement, and PlacementRectangle to set the target origin and the alignment point of TCustomPopupForm. + + +Specifies the index of the display that shows the pop-up form. +Specifies the index of the display in the Displays array that shows the current pop-up form. +PreferedDisplayIndex is used for context menus. When an application opens several submenus of context menus, all these submenus should be shown on the same display, even if a new pop-up submenu can be shown on a neighbor display. +If a specified PreferedDisplayIndex does not exist, then a pop-up form is shown on a display that is the closest to the place where the form should appear according to all specified positioning parameters Placement, PlacementTarget, and PlacementRectangle. + + +Used internally. +The CreateNew constructor initializes RealPlacement equal to Placement. At run time RealPlacement can be changed according to the real environment properties. For example, if a run-time environment supports the mouse, then RealPlacement can be set to +TPlacement.Mouse, otherwise to +TPlacement.Absolute. + + +Screen coordinates of the rectangle relative to which controls in the pop-up form are positioned. +ScreenContentRect is the rectangle inside which all controls of the pop-up form are positioned. +Notice that some 'decorative elements', like 'triangular peaks' on TCalloutPanel rectangles, can be positioned outside the ScreenContentRect. + + + +Screen coordinates of the rectangle relative to which the pop-up form is positioned. +ScreenPlacementRect is defined taking into account PlacementRectangle and PlacementTarget. + +In the figure, ScreenPlacementRect is the colored Fuchsia rectangle of the Show popup button. + + +The working area size of the current pop-up form. +Size defines the width and height of the working area of the current TCustomPopupForm pop-up form. Size defines the rectangle to which all controls of the form are aligned. +In the following picture the Size rectangular of the pop-up form is specified with the green dashes. The physical rectangle of the pop-up form window (defined by Width and Height) is marked with red dashes. + +As you see from the picture, the physical rectangle is not used for positioning. +ClientWidth and ClientHeight of the working area of the form are defined automatically according to the specified Size and Padding. If PlacementRectangle is defined and Placement is Absolute, then Size is ignored. +Use a TSizeF object to set the Size of a pop-up form. +For example, the following code will set up the working area width to 200 and height to 250: + + Form1.Size := TSizeF.Create(200, 250); + + +Periodically occurs during TCustomPopupForm custom animation execution. +The OnAniTimer event periodically occurs during AniDuration time while an animation executes during appearing and closing of the current pop-up form. +Write an OnAniTimer event handler to provide animation functionality during appearing and closing of a pop-up form. See the example in TPopup.OnAniTimer. +AniDuration defines the custom animation duration in seconds. OnAniTimer can use AniPosition and other properties. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +TCustomPopupForm represents the base class for FMX pop-up forms. +Create a subclass derived from TCustomPopupForm if you want to create new pop-up forms. A derived pop-up form can contain one or more FireMonkey objects, such as TLabel, TComboBox, and so on. +Note that every descendant of TCustomPopupForm is a 2D FireMonkey pop-up form. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TForm represents a standard FireMonkey application window (form). +When you create forms in the Form designer at design time, they are implemented as descendants of TForm. Forms can represent the application's main window, or dialog boxes or various preferences-related windows. A form can contain any other FireMonkey objects, such as TButton, TCheckBox, TComboBox objects, and so on. + + + + + + + + + + +Renders the control's surface. +FMX.Forms.TFrame.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +Initializes the component after the form file has been read into memory. +FMX.Forms.TFrame.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +OnResize event dispatcher. +FMX.Forms.TFrame.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter function for the Visible property. +FMX.Forms.TFrame.GetVisible inherits from FMX.Controls.TControl.GetVisible. All content below this line refers to FMX.Controls.TControl.GetVisible. +Getter function for the Visible property. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Forms.TFrame.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + +Responds after the last constructor has executed. +FMX.Forms.TFrame.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + + + + + + + +Enumerates all child components. +FMX.Forms.TFrame.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + +Indicates whether a control should be ignored in ObjectAtPoint. +FMX.Forms.TFrame.ShouldTestMouseHits inherits from FMX.Controls.TControl.ShouldTestMouseHits. All content below this line refers to FMX.Controls.TControl.ShouldTestMouseHits. +Indicates whether a control should be ignored in ObjectAtPoint. +False if the control should be ignored in ObjectAtPoint. ShouldTestMouseHits normally returns the same value as the value of Visible property of the control. +TFrame overrides this method to allow itself to be painted in design time regardless of the value of its Visible property. + + See Also +FMX.Forms.TFrame +FMX.Controls.TControl.ObjectAtPoint +FMX.Controls.TControl.Visible + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TFrame is a container for components; it can be nested within forms or other frames. +When you create frames, they are implemented as descendants of TFrame. +A frame, like a form, is a container for other components. It uses the same ownership mechanism as forms for automatic instantiation and destruction of the components on it, and the same parent-child relationships for synchronization of component properties. But frames can be nested within forms or other frames, and they can be saved on the Component palette for easy reuse. After a frame is created and saved, it continues to function as a unit and to inherit changes from the components (including other frames) it contains. Moreover, an embedded frame continues to inherit changes made to the frame from which it is derived. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about display. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + The size of primary display. + + + + + + + + + + + + + + + + + Tries to return a rectangular having the specified Size and positioned in the center of the desktop. + See also IFMXMultiDisplayService.GetDesktopCenterRect + + + + + + + + + + + + + + Information about display. + + + + + + + + + + Information about display. + + + + + + + + + + Information about display. + + + + + + + + + + Information about display. + + + + + + + + + + Information about display. + + + + + + + + + + + Information about display. + + + + + + + + + + + Information about display. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Grid.xml b/Modules/DelphiFMX/doc/FMX.Grid.xml new file mode 100644 index 00000000..8f7f1b09 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Grid.xml @@ -0,0 +1,19587 @@ + + + + $1710 + + + + + $1711 + + + + + $1712 + + + + + $1713 + + + + + $1714 + + + + + $1715 + + + + + $1716 + + + + + $1717 + + + + + $1718 + + + + + $1719 + + + + + $171A + + + + + $171B + + + + + $171C + + + + + $171D + + + + + $171E + + + + + $100B + + + + + $100C + + + + + $100D + + + + + $100E + + + + + $100F + + + + + $1010 + + + + + $1011 + + + + + $1019 + + + + + + The state, which affects the view of cell + Selected The cell is selected but does not have the input focus + Focused The cell is selected and has focus + RowSelected The cell placed in the selected row. See TGridOption.RowSelect + + + + + + + + + + + + + + This type defines the action which is performed after the finish cell editing by pressing Enter (Return) + None - the selected cell does not change + GotoNextRow - the next row is selected + GotoNextColumn - the next editable cell in row is selected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This interface can be used by the presentation to paint the cells + See also IDrawableCell + + + + This method should draw the cell background + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interface to access to the column which this object belong to + + + + + + The base class of all columns + + + + + + + + + + + + This is the column which this object belong to + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $3 + + + + + $3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Renders the control's surface. +FMX.Grid.TColumn.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +OnResize event dispatcher. +FMX.Grid.TColumn.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Notifies its child controls that the parent of an ancestor of your control has changed. +FMX.Grid.TColumn.AncestorParentChanged inherits from FMX.Controls.TControl.AncestorParentChanged. All content below this line refers to FMX.Controls.TControl.AncestorParentChanged. +Notifies its child controls that the parent of an ancestor of your control has changed. + + See Also +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Grid.TColumn.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Getter of Observers. +FMX.Grid.TColumn.GetObservers inherits from System.Classes.TComponent.GetObservers. All content below this line refers to System.Classes.TComponent.GetObservers. +Getter of Observers. + + + + + +Executed right after the value of the Enabled property changes. +FMX.Grid.TColumn.EnabledChanged inherits from FMX.Controls.TControl.EnabledChanged. All content below this line refers to FMX.Controls.TControl.EnabledChanged. +Executed right after the value of the Enabled property changes. +The control does not execute EnabledChanged if you assign Enabled the same value that it already has. +EnabledChanged is never executed for effects, which execute EffectEnabledChanged instead. + + See Also +FMX.Controls.TControl.BeforeEffectEnabledChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + +Executed right after the value of the Visible property changes. +FMX.Grid.TColumn.VisibleChanged inherits from FMX.Controls.TControl.VisibleChanged. All content below this line refers to FMX.Controls.TControl.VisibleChanged. +Executed right after the value of the Visible property changes. +The control does not execute VisibleChanged if you assign Visible the same value that it already has. + + See Also +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + + +Getter of DefaultSize. +FMX.Grid.TColumn.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Grid.TColumn.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Initializes the component after the form file has been read into memory. +FMX.Grid.TColumn.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +This method is called before DRAW of the column. +DrawableCell calls DrawableCell.BeforeDrawing. + + + + + + + + + +This method is called after DRAW of the column. +DrawableCell calls DrawableCell.AfterDrawing. + + + + + + + + + +Responds when need to draw a cell. +When Model.DefaultDrawing is True, DrawableCell.DrawCell, DefaultDrawCell, and Model.DoDrawColumnCell are called. + + + + + + + + + + + + + +Draws the cell background. +FMX.Grid.TColumn.DrawBackground inherits from FMX.Grid.IDrawableCellEx.DrawBackground. All content below this line refers to FMX.Grid.IDrawableCellEx.DrawBackground. +Draws the cell background. +DrawBackground receives the following parameters: + +Canvas is the canvas where DrawBackground paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawBackground is called before DrawCell. + + See Also +FMX.Grid.IDrawableCell.DrawCell +FMX.Grid.IDrawableCell.BeforeDrawing +FMX.Grid.IDrawableCell.AfterDrawing + + + + + + + + + + + + + + + +Getter function for the AbsoluteOpacity property. +FMX.Grid.TColumn.GetAbsoluteOpacity inherits from FMX.Controls.TControl.GetAbsoluteOpacity. All content below this line refers to FMX.Controls.TControl.GetAbsoluteOpacity. +Getter function for the AbsoluteOpacity property. + + + +Returns the object used to draw the cells in the column. +The instance is created when you first access this property. The class of the object being created is retrieved by TStyledGrid.GetCellClass. The class of the object is determined by the native or style control that is registered using TPresentationProxyFactory. Usually this is control that supports the IDrawableCell interface. +CellObject can return nil. + + + + +IDrawableCell interface for the cell control, or nil if the cell control does not exist or if it does not support the IDrawableCell interface. + + + + + + + + +Notification method called after the creation order is changed. +FMX.Grid.TColumn.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + +This virtual method is called when the data is changed in the cell editor. +You should not perform this method on your own. Instead, use the EditorModified method. +True if it is possible to change the EditorState value. + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Grid.TColumn.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +The current text layout that is used to draw text in cells. + + + + + + +Determines what column is in edit mode. +This property is left for compatibility. + + + + +Specifies the current state of the cell editor. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +This method is called when the column changes, and it notifies the model about those changes. + + + + + + + + + + + + +Sets the boundaries of the current control. +FMX.Grid.TColumn.SetBounds inherits from FMX.Controls.TControl.SetBounds. All content below this line refers to FMX.Controls.TControl.SetBounds. +Sets the boundaries of the current control. +Use SetBounds to change all of the boundary properties of the control at one time. +X specifies the X coordinate of the Position of the control. +Y specifies the Y coordinate of the Position of the control. +AWidth specifies the value of the Width of the control. +AHeight specifies the value of the Height of the control. +The same effect can be achieved by setting the Position, Width, and Height properties separately, but SetBounds changes all properties at once, ensuring that the control will not repaint between changes. +After setting the boundary properties, SetBounds specifies to the control to maintain the alignment of the control within its parent and of its children within it. The given parameter does not necessarily reflect in the Position, Width, and Height properties. The properties can be updated when the alignment is applied. + + + +Indicates whether this column is visible (True) or not (False). + + + + + + +Returns True if the column can show a value editor or False otherwise. + + + + + + + +Changes the value of the column editor (InplaceEdit) to the specified value, and returns True on success or False otherwise. +This function may return False, for example, if the target column is read-only and the editor does not support read-only values, which prevents the editor from working. + + + + + + + + + +This method should be performed in the cell editor to notify the grid about changes. + + + + +Called when the user finishes using the specified column editor (InplaceEdit) on a cell. +Value contains the value defined with the column editor. +If Accept is True, EditingDone changes the value of the cell to Value and returns True on success or False otherwise. +If Accept is False, EditingDone always returns True. + + + + + + + + + + +Sends the MM_POST_EDITOR_VALUE message to the presentation. +This method is used in LiveBinding. + + + + + + + + + +This virtual method is called from the EditingDone method if the parameter is False and some changes are made. +You can override this method in the heir, but you do not have to call it manually. +This method is used to interact with the LiveBinding. + + + + +Determines that the specified value should not be displayed in the cell and stored in the caches. + + + + + + + + +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + + + + + + + + +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +For example, if the column contains numeric values, only digits, sign symbols (+ and -) and digit separators (, and .) would be considered valid. + + + + + + + + + + +The reference to the data model of the parent control. +Model is set when changing the parent control. If a current column does not belong to the TPresentedControl, or the model of PresentedControl does not belong to the TGridModel, then this property contains nil. + + + + +The reference to the control using this column and the data model. + + + + +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + + + + + + + + + + +Default text settings. + + + + + + +Stretches and aligns the Source rectangle, preserving its rectangle proportions, to best fit into the Bounds rectangle. +RectPlaceIntoBounds calls PlaceInto to best fit the Source rectangle, preserving its rectangle proportions, into the Bounds rectangle. RectPlaceIntoBounds uses the default alignment parameters of the current column to align the stretched rectangle in the Bounds rectangle. +RectPlaceIntoBounds returns Source if any of the Bounds rectangle dimensions is zero. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Specifies the string in the header cell of the column. + + + + + + The padding of any cells in this column + + + + + + + +Specifies whether the cells in this column can be edited or not. +Set ReadOnly to True to specify that the content of the cells can only be read. + + + + +Specifies whether to display this column in run-time. + + + + + + + + + + + + + + + + + + $64 + + + + + + + + + + + + + + + + +Function that ensures that the value of Max is only stored in the form file if it is not the default value of the property (TProgressColumn.DefaultMax). + + + + + + + +Function that ensures that the value of Min is only stored in the form file if it is not the default value of the property (0). + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TProgressColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + +Returns True if the column can show a value editor or False otherwise. +FMX.Grid.TProgressColumn.CanEdit inherits from FMX.Grid.TColumn.CanEdit. All content below this line refers to FMX.Grid.TColumn.CanEdit. +Returns True if the column can show a value editor or False otherwise. + + See Also +FMX.Grid.TColumn.EditingCancelled +FMX.Grid.TColumn.EditingDone +FMX.Grid.TColumn.EditorModified +FMX.Grid.TColumn.PostEditorValue +FMX.Grid.TColumn.RefreshEditor + + + + + + + + + + + +Draws the default cell background. +FMX.Grid.TProgressColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + +Specifies the maximum value for all the progress cells in this column. + + +Specifies the minimum value for all the progress cells in this column. + + + +Represents a column in a grid, whose cells show progress bars. + + + + + + + checkcellstyle + + + + + + + +Getter of DefaultSize. +Getter of DefaultSize. +FMX.Grid.TCheckColumn.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + +Creates a check box picture, which can be used to paint cells in the current column. +Model defines the grid model used to handle data. +Checked defines whether the rendered check box is checked. +EditorMode determines whether the check box picture is created in edit mode or not. + + + + + + + False + + + + + + + + + + + + + + +Draws the default cell background. +FMX.Grid.TCheckColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + + + + + + +Draws the value of the column cell. +FMX.Grid.TCheckColumn.ValueToString inherits from FMX.Grid.TColumn.ValueToString. All content below this line refers to FMX.Grid.TColumn.ValueToString. +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + + + +Tries to fill BoolValue with the specified value, and returns True on success or False if Value is not a boolean. + + + + + + + + + + + +Represents a column in a grid, whose cells show check boxes. + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TDateTimeColumnBase.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Draws the value of the column cell. +FMX.Grid.TDateTimeColumnBase.ValueToString inherits from FMX.Grid.TColumn.ValueToString. All content below this line refers to FMX.Grid.TColumn.ValueToString. +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Represents a column in a TGrid grid. +FMX.Grid.TDateTimeColumnBase inherits from FMX.Grid.TColumn. All content below this line refers to FMX.Grid.TColumn. +Represents a column in a TGrid grid. +TColumn is the base class for classes declaring different types of columns in grids: + +TCheckColumn +TCurrencyColumn +TDateColumn +TGlyphColumn +TImageColumn +TPopupColumn +TProgressColumn +TStringColumn +TTimeColumn +If you need to create a new type of column, you should derive your subclass from TColumn. + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TTimeColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + +Represents a column in a grid, whose cells use an editor similar to TTimeEdit to edit cells in this column. +A really used editor depends on implementation of the styled presentation class of TCustomGrid. For example, see TStyledGrid. + + + + + + + + + +Creates an instance of TDateColumn. + + + +Represents a column in a grid, whose cells use an editor similar to TDateEdit to edit cells in this column. +A really used editor depends on implementation of the styled presentation class of TCustomGrid. For example, see TStyledGrid. + + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TPopupColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Grid.TPopupColumn.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Returns the items available for the pop-up column as strings. +The items of Items are displayed in a pop-up that appears when clicking one of the cells in the column. Choosing one of the items will set the item as the value of that cell. + + + +Represents a column in a grid, whose cells shows pop-up menus. + + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TImageColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + +Draws the default cell background. +FMX.Grid.TImageColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + + +Represents the maximum size of a thumbnail that can be displayed in cells of the column. +To improve performance, large pictures are reduced to the specified PreviewSize size. The obtained thumbnail is stored in internal cache and is drawn during repainting. + + + + +Represents a column in a grid, whose cells show images. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TCustomNumberColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + $FFFFFFFF + + + + + False + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Draws the value of the column cell. +FMX.Grid.TCustomNumberColumn.ValueToString inherits from FMX.Grid.TColumn.ValueToString. All content below this line refers to FMX.Grid.TColumn.ValueToString. +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + + + + + + + +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +FMX.Grid.TCustomNumberColumn.ValidChar inherits from FMX.Grid.TColumn.ValidChar. All content below this line refers to FMX.Grid.TColumn.ValidChar. +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +For example, if the column contains numeric values, only digits, sign symbols (+ and -) and digit separators (, and .) would be considered valid. + + + + + +The number of decimal places when displaying float numbers. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TCurrencyColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TFloatColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TIntegerColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +FMX.Grid.TIntegerColumn.ValidChar inherits from FMX.Grid.TColumn.ValidChar. All content below this line refers to FMX.Grid.TColumn.ValidChar. +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +For example, if the column contains numeric values, only digits, sign symbols (+ and -) and digit separators (, and .) would be considered valid. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Notifies its child controls that the parent of an ancestor of your control has changed. +Notifies its child controls that the parent of an ancestor of your control has changed. +FMX.Grid.TGlyphColumn.AncestorParentChanged inherits from FMX.Controls.TControl.AncestorParentChanged. All content below this line refers to FMX.Controls.TControl.AncestorParentChanged. +Notifies its child controls that the parent of an ancestor of your control has changed. + + See Also +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged + + + + +Initializes the component after the form file has been read into memory. +Initializes the component after the form file has been read into memory. +FMX.Grid.TGlyphColumn.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +Calls the OnGetImageIndex event handler and returns the image index. +DoGetImageIndex calls the OnGetImageIndex event handler (if it is set) and returns the ImageIndex index of the image corresponding to the specified Value. Index is in a list of images specified in TGrid.Images. You can override this method but you should not use it explicitly in your code. To retrieve the image index, use GetImageIndex. + + + + + + + + +Reference to a glyph interface supported by the PresentedControl using this glyph column and the current data model. + + + + +Returns the index of the image specified by Value. +GetImageIndex returns the index of the image corresponding to the specified Value. Index is in a list of images specified in TGrid.Images. + + + + + + + + + + + +Returns True if the column can show a value editor or False otherwise. +FMX.Grid.TGlyphColumn.CanEdit inherits from FMX.Grid.TColumn.CanEdit. All content below this line refers to FMX.Grid.TColumn.CanEdit. +Returns True if the column can show a value editor or False otherwise. + + See Also +FMX.Grid.TColumn.EditingCancelled +FMX.Grid.TColumn.EditingDone +FMX.Grid.TColumn.EditorModified +FMX.Grid.TColumn.PostEditorValue +FMX.Grid.TColumn.RefreshEditor + + + + + + + + + + + +Draws the default cell background. +FMX.Grid.TGlyphColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + + +Returns the rectangle in which to draw the Index image. Stretches and aligns the original rectangle of the Index image, preserving its rectangle proportions, to best fit into the Bounds rectangle. +GlyphPlaceIntoBounds implements algorithm like the following: + +If the Stretch property of the current TGlyphColumn object is False, then GlyphPlaceIntoBounds retrieves the biggest rectangle from all layers of the Index image in the destination collection stretched to the Scale = 1. Then GlyphPlaceIntoBounds stretch the obtained rectangle, preserving its rectangle proportions, to best fits into the specified Bounds rectangle. Then GlyphPlaceIntoBounds aligns this rectangle in the Bounds rectangle using the default alignment parameters of the current column. GlyphPlaceIntoBounds returns the obtained rectangle. +If the Stretch property of the current TGlyphColumn object is True, then GlyphPlaceIntoBounds retrieves the biggest rectangle from all layers of the Index image in the destination collection with the Scale used in the layer. Then GlyphPlaceIntoBounds stretch the obtained rectangle, preserving its rectangle proportions, to best fits into the specified Bounds rectangle. Then GlyphPlaceIntoBounds aligns this rectangle in the Bounds rectangle using the default alignment parameters of the current column. GlyphPlaceIntoBounds returns the obtained rectangle. + + + + + + + + + +Specifies whether to stretch the image shown in the glyph control. + + + + + + +Custom defined event handler that should return an index of the image corresponding to Value in a list of images specified in TGrid.Images. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This is the default grid Options which are used when + creating a new instance of the TGridModel class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The base class of all columns + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + This method create instance of Cache property + + + + + This sparse array to store the values of any cells + The class TGridValues are owner of objects. If value contains some object then this object can be + destroyed in methods SetCells, Clear, RemoveCell, etc + + + + + + + This virtual method is perform after IsUpdating is + changed from True to Talse + + + + + This virtual method returns default options of grid + + + + + + + + This virtual method is called from SelectCell before + changing current cell + + + + + + + + + + This virtual method is called from SelectCell after + changing current cell + + + + + This virtual method is called from TColumn.DrawCell. + By default this method perform OnDrawColumnCell event + handler + + + + + + + + + + + + + This virtual method must return the class which encapsulates the text settings + + + + + + + + + This virtual method is called after changing text settings + + + + + This virtual method specifies whether to save the StyledSettings value in fmx-file + True if value is not equal to default value otherwise False + + + + + + + + This is same as + ITextSettings.GetDefaultTextSettings + + + + + + + + + This is same as + ITextSettings.GetTextSettings + + + + + + + + + This is same as + ITextSettings.SetTextSettings + + + + + + + + + This is same as + ITextSettings.GetResultingTextSettings + + + + + + + + + This is same as + ITextSettings.GetStyledSettings + + + + + + + + + This is same as + ITextSettings.SetStyledSettings + + + + + + + + + The current value of cell editor + The cell editor value if EditorMode is True + otherwise TValue.Empty + + + + + + + + + + + + + Same as TTextSettingsInfo.Design + + + + + This virtual method perform OnGetValue event + handler + + + + + + + + + + + + + + This virtual method perform OnSetValue event + handler + + + + + + + + + + This virtual method perform + OnCallbackGetValue event handler + + + + + + + + + + This virtual method is called after new column was added + + + + + + + + This virtual method is called after column was deleted + + + + + + + + This virtual method is called after number of rows was changed + + + + + + + + + This event handler is used to get cell data from the some custom defined source + + + + + This property contains the cell values of grid. + See also CreateCache, + DataStored + + + + + This method should be used inside the Live Binding system to change current row. Use property + Row if you want change current row manually + + + + + + + + + + + + + + + + + Marks the start of an update session of this instance + See also IsUpdating, + EndUpdate + + + + + + Returns True if this instance is in the middle of one or more update sessions + See also BeginUpdate, + EndUpdate, + DoEndUpdate + + + + + + + + + Marks the finish of an update session of this instance + See also IsUpdating, + BeginUpdate + + + + + + This method notifies the presentation, that in the column with the specified number have been some + changes. If this method is executed between a BeginUpdate, + EndUpdate, the column is just marked as changed + You should not perform this method if size of column is changed. In this case use + ContentChanged + + + + + + + + This method notifies the presentation, that in the content of grid have been some changes (for example: + size, count, order of columns or rows). If this method is executed between a + BeginUpdate, + EndUpdate, the content is just marked as changed + See also InvalidateContentSize + + + + + + This method notifies the presentation, that previously calculated content size is no longer relevant + + + + + + This method notifies the presentation, that current row or column index is changed + + + + + Inserting a new column before the column with the specified number (with moving to right) + + + + + + + + + Deleting column with the specified order number + + + + + + + + Changing order number and moving of the column + + + + + + + + + + + + + + The height of the row. If 0, then use the automatic value which derived from the font size + See EffectiveRowHeight + + + + + Real used the row height. See RowHeight + + + + + The number of rows + + + + + Specifies whether the presentation responds to mouse, keyboard, etc + + + + + An array containing all the columns + + + + + The number of columns. See array Columns + + + + + Returns the column number. If the column is not found, then -1 + + + + + + + + + Select the cell with the specified indexes of column and rows. Before changing selection the method + DoSelectCell is called, after changing the method DoSelChanged is called + + + + + + + + + Displays the cell editor and sets the edit mode, if possible. See CanEdit, RefreshEditor + + + + + + Removes the cell editor and reset the edit mode. See EditingDone + If true, we need to take the data from cell editor, otherwise in grid should remain + old data + If the parameter is missing, the behavior is determined by the presence option + CancelEditingByDefault in Options + + + + + + + + Send the MM_POST_EDITOR_VALUE message to the + presentation. This method is used in LiveBinding + + + + + Send the MM_REFRESH_EDITOR_VALUE message to the + presentation. This method is used in LiveBinding + + + + + This method call HideEditor with parameter Accept which is True, in case if the + property Options don't contains CancelEditingByDefault + + + + + This method returns a column and row of the cell that can be select after the defined cell + True is if need search in the opposite direction. Usually the search is + performed from left to right and top to bottom + True if allowed to change only the row number + True if allowed go to only editable cells + Before calling the column number from which begun searching, then column of desired cell + + Before calling the row number from which begun searching, then row of desired cell + + True if found desired cell and ACol, ARow contain new correct values + + + + + + + + + + + + + True if the grid is in edit mode of one cell + + + + + This is various flags which responsible for the appearance and behavior of the grid + + + + + Determines whether the Cells are painted with using default methods. If False then is + using only user defined methods. See DoDrawColumnCell, OnDrawColumnCell + + + + + This property is set by Live Binding. You cannot change OnSetValue, OnCallbackGetValue + if this property is True + + + + + If True, then in the internal Cache stores all the + data, otherwise only the currently visible + + + + + Clear internal cache of values + + + + + Removes unused data from the cache. If the arguments are set, you will delete the data cells that are + outside the specified coordinates. If the arguments are not set, you will delete only the data cells outside + RowCount, ColumnCount. See also DataStored, IsUsedInBinding + + + + + + + + + + + + + Clears and moving values of other columns to left. + See also ClearColumnInCache + + + + + + + + Clears all values with the specified column number from the internal cache. The instances of objects + will disposed. + See also RemoveColumnFromCache + + + + + + + + + Clears and moving values of other rows to top. + See also ClearRowInCache + + + + + + + + Clears all values with the specified row number from the internal cache. The instances of objects + will disposed. + See also RemoveRowFromCache + + + + + + + + + Moving all values of internal cache with the specified column number (from the old index to the new + index) + + + + + + + + + Move to right all values of internal cache with column number that greater or equal to the specified + column number + + + + + + + + Removes from the cache the value of one cell and invalidates the area of the cell + + + + + + + + + Returns a value from a cell. See also OnGetValue, OnCallbackGetValue, + InvalidateCache + The column number of the cell + The row number of the cell + If False then in order to speed up, the data are taken from the internal + cache (if they are there). If InvalidateCache is true, then data are force taken from the data + source + + + + + + + + + + + + + + + The column number of selected cell. If -1 then cell isn't selected + + + + + The row number of selected cell. If -1 then row isn't selected + + + + + This object provide custom text properties + + + + + This object provide default text properties (style of system defined) + + + + + This property indicates whether the custom text settings is used or default + + + + + This property define a behavior after pressing key Return in cell editor + + + + + This event can by called from presentation (depends on the implementation) after + clicking in column header + + + + + This event can by called from presentation (depends on the implementation) when + clicking in grid cell after the selection was changed + + + + + This event can by called from presentation (depends on the implementation) when + double clicking in grid cell after the selection was changed + + + + + This event is called after successfully changing of column order + + + + + This event can by called from presentation (depends on the implementation) to + draw header of column + + + + + This event is called before changing of index selected row or column + + + + + This event is called after successfully changing of index selected row or column + + + + + This event can by called from presentation (depends on the implementation) to + draw background of cell + + + + + This event can by called from presentation (depends on the implementation) to + draw cell + + + + + In this event handler you should call ACallback procedure for define value of cell. + See also DoGetValue, + GetValue + It is used Live Binding + + + + + In this event handler you should setup value in some custom defined data after cell changing + + + + + + This event can by called from presentation (depends on the implementation) to create the custom + defined cell editors + + + + + This event can by called from presentation (depends on the implementation) to + create the custom defined cell editors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Removing all items + + + + + Removing all items except those who included in the rectangle AExcepRect + + + + + + + + Removing item by coordinates ACoord + + + + + + + + Removing all items in which the row or col is equals Index + The index of row or column + If True then Index contains Row index otherwise it contains Column index + If True then only the cells contents are cleared without moving + + + + + + + + + + Change index of Column or Row + The original value of row or column + The new value of row or column + If True then OldIndex, NewIndex contains Row indexes otherwise it contains Column + indexes + + + + + + + + + + Inserts one column or row with a shift of cells right or down + The order number of column or row + If True then Index contains Row indexes otherwise it contains Column + indexes + + + + + + + + + Removing all items in which the column is equals ACol + + + + + + + + + Removing all items in which the row is equals ARow + + + + + + + + + Change index of column + + + + + + + + + Change index of row + + + + + + + + + Inserts one column with a shift of cells right + + + + + + + + Inserts one row with a shift of cells down + + + + + + + + Check for equality of two values. This method is called in SetCells (see Cells) + + + + + + + + + + This virtual method is called after you change the property Cells. This method not is called after + other methods (Clear, RemoveRow, etc) + + + + + + + + The values of cells + + + + + + + + + + + + + + The value that have used in the constructor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The base class of data model for grids. This class contains the most properties to manage of grid + exterior + + + + + + + + + + + + + + + The base class of all columns + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.Grid.TCustomGrid.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.Grid.TCustomGrid.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.Grid.TCustomGrid.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + + + + +This method is invoked when you add a new Object into the Content children list. +FMX.Grid.TCustomGrid.ContentAddObject inherits from FMX.ScrollBox.TCustomPresentedScrollBox.ContentAddObject. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.ContentAddObject. +This method is invoked when you add a new Object into the Content children list. + + + + + + + +This method is invoked when you insert a new Object into the Content children list. +FMX.Grid.TCustomGrid.ContentInsertObject inherits from FMX.ScrollBox.TCustomPresentedScrollBox.ContentInsertObject. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.ContentInsertObject. +This method is invoked when you insert a new Object into the Content children list. + + + + + + +This method is invoked before removing an Object from the Content children list. +FMX.Grid.TCustomGrid.ContentBeforeRemoveObject inherits from FMX.ScrollBox.TCustomPresentedScrollBox.ContentBeforeRemoveObject. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.ContentBeforeRemoveObject. +This method is invoked before removing an Object from the Content children list. + + + + + + Container for the child controls of the scroll box. + + + + +Creates scroll content. +FMX.Grid.TCustomGrid.CreateScrollContent inherits from FMX.ScrollBox.TCustomPresentedScrollBox.CreateScrollContent. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.CreateScrollContent. +Creates scroll content. +You can override it for creating custom content. It allows to add custom information to the content. + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.Grid.TCustomGrid.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + +Setter of Enabled. +FMX.Grid.TCustomGrid.SetEnabled inherits from FMX.Controls.TControl.SetEnabled. All content below this line refers to FMX.Controls.TControl.SetEnabled. +Setter of Enabled. + + + + + + + + +Getter of DefaultSize. +FMX.Grid.TCustomGrid.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +It notifies the Grid that the attached TImageList or related ImageIndex was changed. So, the Grid have to refresh all cells that use images from this ImageList. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + +Restores Canvas properties after the painting process. +FMX.Grid.TCustomGrid.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.Grid.TCustomGrid.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + +Destroys this instance of TPresentedControl. +FMX.Grid.TCustomGrid.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + +Performs any necessary actions before the first destructor is called. +Performs any necessary actions before the first destructor is called. +FMX.Grid.TCustomGrid.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + +Unloads the previously-loaded presentation of your control. +FMX.Grid.TCustomGrid.UnloadPresentation inherits from FMX.Controls.Presentation.TPresentedControl.UnloadPresentation. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.UnloadPresentation. +Unloads the previously-loaded presentation of your control. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.Presentation.TPresentedControl.ReloadPresentation + + + + + + + + + +Removes and destroys all columns. + + + + + + +Returns the column with the given index. +If the column does not exist, ColumnByIndex returns nil. + + + + + + The base class of all columns + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Fills ACol and ARow with the column and row numbers that identify the cell located at the specified X and Y coordinates, and returns True on success or False otherwise. + + + + + + + + + + + + + + + + The base class of all columns + + + + +Returns the column at the given left and top coordinates. +If the column does not exist, ColumnByPoint returns nil. + + + + + + + + +Returns the index of row at the given left and top coordinates. +If the row does not exist, RowByPoint returns -1, otherwise a positive numerical value is returned. Keep in mind that 0 is the first row, 1 is the second row, and so on. + + + +Returns the coordinates of the cell at the specified row and column. +ACol and ARow are 0-based. You can specify values equal to ColumnCount or RowCount to get the coordinates of an non-existent cell that is next to an existing cell. +If the specified column or row numbers are not valid, CellRect returns coordinates (-1, -1, -1, -1). + + + + + + + + + +Selects the cell with the specified index of column and rows. +The DoSelectCell method occurs before the change and the DoSelChanged method occurs after the change. + + + + + + + + +Selects the cell with the specified column index and old row index. + + + + + + + + + +Selects the cell with the specified row index and old column index. + + + + + + + + + +Determines whether the selected cell can be edited (True) or not (False) based on the current configuration of the corresponding column and the grid. + + + + + + + +Changes the viewport position so that the cell at the specified column number and row number is located on the top-left corner. + + + + + + + + +Determines the cells that are visible, either completely or partially, fills TopLeft with the coordinates of the top-left visible cell, fills BottomRight with the coordinates of the bottom-right visible cell, and returns True on success or False otherwise. + + + + + + + + + +Changes the viewport position so that the selected cell is visible. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + + + +Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + + +Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + + +Specifies the list of images associated with this grid control. +Images from the Images collection can be shown in cells of the TGlyphColumn type column. + + + + +Specifies the number of columns in the grid. +Read ColumnCount to determine the number of entries in the Columns array. + + + +Specifies the row where you are currently positioned within the grid. +Set the Selected property to any positive numerical value to make the specific row selected. Read Selected to obtain the index of the row where you are currently positioned within the grid. +The first row has an index of 0, the second one has an index of 1, and so on. + + + +Specifies the index of the first visible scrollable row in the grid. +Read TopRow to determine the index of the first row in the scrollable region that is visible. Set TopRow to scroll the rows in the grid so that the row with the TopRow index is the first row after the fixed rows. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Number of the first column that is visible, either completely or partially, from the left-hand side of the grid. + + + + +Number of the first column that is visible, either completely or partially, from the right-hand side of the grid. + + + +Specifies whether the cells in this grid can be modified or not. +Use ReadOnly at run time to determine whether the cells in this grid can be edited. If ReadOnly is True, then you can only read and view the contents of the cells without the ability to affect the grid in any way. + + +Specifies the index of the column that contains the selected cell. +Use ColumnIndex at run time to determine the current column in the grid. Setting ColumnIndex moves the focus to the cell in the current row that is in the new column. The first column has an index of 0, the second column has an index of 1, and so on. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates the number of scrollable rows that are visible in the grid. +Use VisibleRows to determine the number of scrollable rows that are fully visible in the grid. VisibleRows includes any partially visible rows on the top and bottom of the grid. + + + +This property is set by the LiveBinding. +If this property is True, you cannot change the OnSetValue and the OnCallbackGetValue. + + + + +Specifies the height of each row of this grid, in pixels. +Read RowHeight to determine the size of each row in the grid. If the underlying grid is too tall to appear in the control, then the user must scroll to see the entire content of the grid. + + + + +Specifies the number of rows in the grid. +The value of RowCount includes the scrollable rows in the grid, but not the fixed row with the headers. + +Read RowCount to determine the number of rows in the grid. +Set RowCount to add or delete rows at the bottom of the grid. + + + +Defines how grid controls look like and how they behave. + + + + +Determines whether cells are drawn using the default drawing method (True) or using a user-defined drawing method (False). + + + + + + +Determines whether the grid control is in the edit mode (True) or not (False). + + + + +The column number of the selected cell, or -1 if there is no cell selected. + + + + +Number of the selected row. + + + + +Occurs immediately when the left mouse button is clicked with the pointer over the header of a column. +Write an OnHeaderClick event handler to take specific actions when the left mouse button is clicked with the pointer over the header of a column in this grid. + + + + +Occurs when a user releases the mouse in one of the grid cells. +This event can be called from presentation (depends on the implementation) when clicking a grid cell. + + + + +Occurs when a user double-clicks one of the grid cells. +This event can be called from presentation (depends on the implementation) when double clicking a grid cell. + + + + +Occurs immediately after a column is moved. +Write an OnColumnMoved event handler to take specific actions when the column in this grid is moved. + + + + +Occurs when the grid needs to paint a header of a column. +Write an OnDrawColumnHeader event handler to provide customized drawing for the headers of the grid. + + + + +Occurs immediately after a cell in a column is selected. +Write an OnSelectCell event handler to take specific actions when the cell of a column in this grid is selected. +Events occur in the following order: + +OnTap +OnSelectCell +OnSelChanged + + + +Occurs when the selected row in the grid changes. +Events occur in the following order: + +OnTap +OnSelectCell +OnSelChanged + + + +Occurs when the background of a cell needs to be drawn. +You can use this event to draw the background of cells yourself, to override the default cell background. + + + + +Occurs when the grid needs to paint a cell. +Write an OnDrawColumnCell event handler to provide customized drawing for the data in the cells of the grid. +If the DefaultDrawing property is set to True, the cell will be drawn before the OnDrawColumnCell event. If it is set to False, the grid doesn't draw anything. +Also, in this event handler, it is possible to call the DefaultDrawCell method to process default drawing. It can be useful if DefaultDrawing is set to False and you need to draw something before the default drawing. + + + + +Occurs immediately when you update the contents of one of the cells in this grid. +Write an OnCallbackGetValue event handler to take specific actions when you update the contents of one of the cells in this grid. + + + + +Occurs when the grid needs to retrieve a value from an external repository to use as the content of one of the cells in this grid. +Write an OnGetValue event handler to take specific actions when you retrieve a value from an external repository to use as the content of one of the cells in this grid. + + + + +Occurs when you need to pass a content of one of the cells in this grid as a value to an external repository. +Write an OnSetValue event handler to take specific actions when you need to pass a content of one of the cells in this grid as a value to be set in an external repository. + + + + +Occurs before the creation of the editor for cells in a column. +Write an OnCreateCustomEditor event handler to take specific actions when a custom editor is created for this grid. +This event is called every time when the grid activates a cell editor. If a custom editor is not required, just do nothing in this event handler and the default editor is created. +The OnCreateCustomEditor event can by called from a presentation (depends on the implementation) to create a custom defined cell editors. Since the presentation does not know about a TCustomGrid object, the presentation calls TGridModel.OnCreateCustomEditor from the Model. For this reason, the TCustomGrid.OnCreateCustomEditor event handler +is always the same as the TGridModel.OnCreateCustomEditor event handler of the Model. + + + + +Occurs immediately when you accomplish editing of any of cells in this grid. +Write an OnEditingDone event handler to take specific actions when you edit cells in this grid. +For instance, when you paste a string into one of the cells, an OnEditingDone event immediately occurs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Grid.TGrid.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This virtual method is called from then + TGridValues.Changed method. + + + + + + + + + + + This sparse array to store the values of any cells + The class TGridValues are owner of objects. If value contains some object then this object can be + destroyed in methods SetCells, Clear, RemoveCell, etc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Same as TGridValues.Cells but converted to string + See also TGridModel.Cache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The model for the grid, which stores the string values. This class has + DataStored property is True + + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Grid.TStringGrid.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.Grid.TStringGrid.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + + + + Same as Model.Cells + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add several classes of columns to the list of registered classes + Also registers classes with the use of the procedure RegisterFmxClasses + + + + + + + + + + + + Remove several classes of columns from the list of registered classes. If some class was not + registered then it is ignored. + Also unregisters classes with the use of the procedure UnRegisterClass + + + + + + + + + + + + This function returns array of all registered column classes + + + + + + + + This function returns True if AClass is registered, otherwise it returns False + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Layouts.xml b/Modules/DelphiFMX/doc/FMX.Layouts.xml new file mode 100644 index 00000000..a697a908 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Layouts.xml @@ -0,0 +1,2724 @@ + + + + + + +Renders the control's surface. +FMX.Layouts.TLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A layout is a container for other graphical objects. +Use the layouts when you need to organize multiple graphical controls under the same parent. +For instance, you can use these layouts when you need to create rich FireMonkey applications with many graphical controls that are grouped on the same layer. You can set the visibility of all the controls on a layout at once by affecting the visibility of the layout. + + + + + + + + + + + + + + + + + + +Performs the alignment of a FireMonkey control. +FMX.Layouts.TScaledLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + + + +Returns the children transformation matrix. +FMX.Layouts.TScaledLayout.GetChildrenMatrix inherits from FMX.Controls.TControl.GetChildrenMatrix. All content below this line refers to FMX.Controls.TControl.GetChildrenMatrix. +Returns the children transformation matrix. +The AbsoluteMatrix is calculated as: + + AbsoluteMatrix = (LocalMatrix * Parent.GetChildrenMatrix) * Parent.AbsoluteMatrix + +TScaledLayout overrides GetChildrenMatrix to prescale layout contents. + + + + + + +Setter function for the Height property. +FMX.Layouts.TScaledLayout.SetHeight inherits from FMX.Controls.TControl.SetHeight. All content below this line refers to FMX.Controls.TControl.SetHeight. +Setter function for the Height property. Value specifies the new value of the Height property. + + + + + + +Setter function for the Width property. +FMX.Layouts.TScaledLayout.SetWidth inherits from FMX.Controls.TControl.SetWidth. All content below this line refers to FMX.Controls.TControl.SetWidth. +Setter function for the Width property. Value specifies the new value of the Width property. + + + +Renders the control's surface. +FMX.Layouts.TScaledLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TScaledLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Layouts.TScaledLayout.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + + + + + + + + + +Specifies the original width of the scaled layout control. The original width represents the unscaled X dimension of the scaled layout control. + + + +Specifies the original height of the scaled layout control. The original height represents the unscaled Y dimension of the scaled layout control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A FireMonkey scaled layout is a wrapper over TControl and acts like a layer for other objects with the possibility of scaling its content according to the physical dimensions of the layout. +A scaled layout is a container for other graphical objects that can scale its contents as shown in the following image. + +The label and the button are scaled according to the dimensions of the form that contains the layer aligned as the client so that the layer occupies the entire surface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This flag is set in the method ContentChanged. Used to optimize ScrollBox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the component after the form file has been read into memory. +FMX.Layouts.TCustomScrollBox.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +Applies the padding to the content of the TScrollBox. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Layouts.TCustomScrollBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TCustomScrollBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + +Performs the realignment of the children controls of the TScrollBox object within the object. +It is called internally every time visual properties of TScrollBox are changed. +The children are realigned taking into account their alignment properties, margins, and padding. +DoRealign calls the inherited TControl.DoRealign and then executes the realignment during the inertial scrolling. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Virtual method to be implemented in subclasses to provide further functionality when adding AObject to the scroll box. In TScrollBox, ContentAddObject has no implementation. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Virtual method to be implemented in subclasses to provide further functionality right before removing AObject from the scroll box. In TScrollBox, ContentBeforeRemoveObject has no implementation. + + + + + + +Virtual method to be implemented in subclasses to provide further functionality right after removing AObject from the scroll box. In TScrollBox, ContentRemoveObject has no implementation. + + + +Internally called when the horizontal scroll bar changes position. Do not call HScrollChange in applications. + + + +Internally called when the vertical scroll bar changes position. Do not call VScrollChange in applications. + + + + + + + + +Executed when the viewport position changes. +ViewportPositionChange receives the following parameters: + +OldViewportPosition is the value that the ViewportPosition property had before it changed. +NewViewportPosition is the new value of the ViewportPosition property. +ContentSizeChanged indicates whether the size of the content of the viewport has changed as well (True) or not (False). +ViewportPositionChange calls the handler of the OnViewportPositionChange event. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +OnPainting event dispatcher. +FMX.Layouts.TCustomScrollBox.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + +Restores Canvas properties after the painting process. +FMX.Layouts.TCustomScrollBox.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + +Customizes styles in complex objects. +FMX.Layouts.TCustomScrollBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.Layouts.TCustomScrollBox.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + + + + +Returns the rectangle that defines the scrolling area. The result value is of type TRectF. + + + + + + +Returns the position of the vertical scroll bar. +VScrollBarValue returns a value of 0 if the vertical scroll bar is not required by this scroll box or it is not visible. + + + + + + +Returns the position of the horizontal scroll bar. +HScrollBarValue returns a value of 0 if the horizontal scroll bar is not required by this scroll box or it is not visible. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Constructs a TScrollCalculations type object in which you can set properties and calculate parameters of the inertial scrolling. +CreateAniCalculations calls the TScrollCalculations.Create constructor to create a TScrollCalculations object. The created object is kept in the AniCalculations property of the current TScrollBox instance. Using this TScrollCalculations object you can set the Animation, DecelerationRate, BoundsAnimation, AutoShowing, and Shown properties of inertial scrolling. +TScrollCalculations is the descendant of the TAniCalculations class, which provides methods to calculate parameters of the inertial scrolling. +UpdateAniCalculations calls CreateAniCalculations to create a TScrollCalculations object and then calls +DoUpdateAniCalculations to set the default inertial scrolling properties under the current platform. + + + + + + +Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations is called from UpdateAniCalculations to set the default values to the Animation, +TouchTracking, BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + +Initializes the inertial scrolling and sets its properties. +UpdateAniCalculations calls +CreateAniCalculations to create a TScrollCalculations object handling calculations of the inertial scrolling and calls DoUpdateAniCalculations to update the +TouchTracking, BoundsAnimation, and AutoShowing properties of the inertial scrolling. + + + + + + +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + + + + +Changes the bounding rectangle of the content of the control to the specified rectangle, and realigns its child controls accordingly. + + + + + + +Returns the boundaries of the rectangle that defines the scrolling area. The result value is of type TRectF. + + + + + + + + + +Internally executed while a mouse button is pressed over the surface of this scroll box. +You can call MouseDown programmatically in applications to simulate a mouse button down event over this scroll box. +The Button parameter specifies the mouse button that has just been pressed (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + + + + + + +Internally executed while the mouse is moved over the surface of this scroll box. +You can call MouseMove programmatically in applications to simulate a mouse move event over this scroll box. +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + + + + + + + +Internally executed while a mouse button is released over the surface of this scroll box. +You can call MouseUp programmatically in applications to simulate a mouse button up event over this scroll box. +The Button parameter specifies the mouse button that has just been released (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + +OnMouseLeave event dispatcher. +FMX.Layouts.TCustomScrollBox.DoMouseLeave inherits from FMX.Controls.TControl.DoMouseLeave. All content below this line refers to FMX.Controls.TControl.DoMouseLeave. +OnMouseLeave event dispatcher. +DoMouseLeave is called automatically when the mouse pointer leaves the control's area. +DoMouseLeave starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to background the control. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the control's area. + + + + + + + + +Internally executed while the mouse wheel is used over the surface of this scroll box. +You can call MouseWheel programmatically in applications to simulate a mouse wheel spin event over this scroll box. +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The WheelDelta parameter specifies the position of the mouse wheel. +The Handled parameter specifies whether the mouse wheel events are handled by this scroll box control. + + +Protected read-only property that specifies the content layout of this scroll box. + + +Keeps an object that represents a scrollable content. +A TScrollBox object uses a TScrollContent object in order to provide an area onto which you can place any other graphical components. Content keeps this TScrollContent object. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the horizontal scroll bar attached to this scroll box. +Read the HScrollBar read-only property to obtain the horizontal scroll bar object attached to this scroll box component. + + +Specifies the vertical scroll bar attached to this scroll box. +Read the VScrollBar read-only property to obtain the vertical scroll bar object attached to this scroll box component. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TCustomScrollBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Layouts.TCustomScrollBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Allows you to set various parameters that control the inertial scrolling effect animation. +AniCalculations keeps a TScrollCalculations object created by CreateAniCalculations. Using properties of this object you can programmatically set values for inertial scrolling properties in order to emulate on the current platform the inertial scrolling behavior typical for other platforms. For example, you can select the emulation of the iOS scrolling behavior under Windows and vice-versa. +TScrollCalculations is the descendant of the TAniCalculations class, which provides methods to calculate parameters of the inertial scrolling. +By using AniCalculations you can set: + +Whether the scrolling is animated (via the TAniCalculations.Animation property). +The deceleration rate of the inertial scrolling (via the TAniCalculations.DecelerationRate property). +Whether the inertial scrolling is bound to the area (via the TAniCalculations.BoundsAnimation property). +Whether the scrolling bars appear automatically when the scroll action is initiated (via the TAniCalculations.AutoShowing property). +Whether the scrolling bars are hidden automatically when they are not needed (via the TAniCalculations.Shown property). +other properties of the TScrollCalculations object. + +Coordinates of the origin of the scrolling viewport specified as the offset from the origin of the content layout of this scroll box. +Coordinates are specified as the TPointF point defining the origin of the scrolling viewport in relation to the origin of the content layout of this scroll box. +A scrolling viewport (or viewport) is a rectangle bounding all controls placed on the content layout of this scroll box. + + + + + + +Sorts components of the layout based on the comparison function Compare. +TFmxObjectSortCompare is declared as: + +TFmxObjectSortCompare = function(item1, item2: TFmxObject): Integer; + + + + + +Scrolls to the center of the TScrollBox control. +Center only has an effect if the scroll box actually has content beyond the display area and the scroll bars are needed to scroll to view all the content held by this scroll box. + + + + + + + + + + + + + +Scrolls the view according to the given Dx and Dy offsets (relative to the current position) in the TScrollBox control. +The Dx and Dy parameters specify offsets to the values of the horizontal and vertical scroll bars assigned to the TScrollBox control. This means that the Dx parameter is the change in pixels horizontally (along the X axis), and the Dy parameter is the change in pixels vertically (along the Y axis). +ScrollBy has the effect of scrolling the view, in the TScrollBox control, to the new coordinates defined by the new values of the horizontal and vertical scroll bars. These new values are obtained from the current values of the vertical and horizontal scroll bars by decreasing them by Dx and Dy pixels, respectively. For example, if Dx is a negative value, ScrollBy scrolls the view to the left; if Dx is a positive value, ScrollBy scrolls the view to the right. +ScrollBy only has an effect if the scroll box actually has content beyond the display area, and the scroll bars are needed to view more of the content. + + + + + + +Internally used. + + + + + + +ClientWidth specifies the width of the components content (in dp). Use it to read or change the width of the component. + +Note: ClientWidth is the components width without decoration. The components could be scrollbars and paddings. + + + + + +ClientHeight specifies the height of the components content (in dp). Use it to read or change the height of the component. + +Note: ClientHeight is the components height without decoration. The components could be scrollbars and paddings. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Keeps a rectangle bounding all controls in the content of this scroll box. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. +The ContentBounds property is read-only. If the value returned by ContentBounds needs to be changed, you need to override DoCalcContentBounds or to assign the OnCalcContentBounds event handler. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Realigns the children controls of this scroll box in the scrolling area of this scroll box. +RealignContent can be overridden in subclasses to allow further functionality when performing the alignment of the objects inside the ContentBounds scrolling area of this scroll box. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Raises when the horizontal scrollbar value was changed. +When the scroll position is changing at the ViewportPosition change, this event does not raise. + + +Raises when the vertical scrollbar value was changed. +When the scroll position is changing at the ViewportPosition change, this event does not raise. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The base class for controls representing a scrolling area (scroll box). +One use of a scroll box is to group multiple graphical controls (such as buttons, list boxes, edit boxes, radio buttons, and so on) under the same scrollable parent (the scroll box itself). In this way, a smaller form can contain a lot of graphical objects organized in a scrollable manner in order to occupy less space on a graphical user interface (GUI). +Another use of scroll boxes is to create multiple scrolling areas (views) in a form. Views are common in commercial word-processor, spreadsheet, and project management applications. + +Note: Do not anchor the children of a scroll layout (TScrollBox, TVertScrollBox, TFramedScrollBox, and so on) to the right and bottom edges. If the Anchors property of a scroll layout child is set to akBottom, akRight, or both, the child will continue to stretch to keep constant the distance to the layout edges when the layout content size is being calculated. The children of a scroll layout should be anchored only to the left and top edges. +Note: When the size of the area occupied by the Content of a scroll box exceeds the control Size, and, therefore, all Content cannot be shown in the control at one moment, then you can use scroll bars to scroll the Content in the control. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll the Content using the mouse wheel. To enforce the scroll bar to be shown by default, you can use the code like following: +ScrollBox1.AniCalculations.AutoShowing := false; + + + + + +Renders the control's surface. +FMX.Layouts.TScrollBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Extends TCustomScrollBox declaring published properties. +TScrollBox extends TCustomScrollBox declaring published properties. TScrollBox does not extend the base class with any new functionality. +In difference to TFramedScrollBox, TScrollBox does not draw the edges (top, left, bottom, and right) and does not fill the control rectangle with any special color. Therefore, by default TScrollBox is not highlighted from the background of a parent control. + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Layouts.TVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +FMX.Layouts.TVertScrollBox.DoCalcContentBounds inherits from FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + +Renders the control's surface. +FMX.Layouts.TVertScrollBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations calls the inherited TCustomScrollBox.DoUpdateAniCalculations to set the default values to the Animation, TouchTracking, +BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. In the TVertScrollBox class, DoUpdateAniCalculations permits only vertical TouchTracking if vertical touch tracking is supported under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a TScrollBox restricted to vertical scrolling. + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Layouts.THorzScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +FMX.Layouts.THorzScrollBox.DoCalcContentBounds inherits from FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + +Renders the control's surface. +FMX.Layouts.THorzScrollBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations calls the inherited TCustomScrollBox.DoUpdateAniCalculations to set the default values to the Animation, TouchTracking, +BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. In the THorzScrollBox class, DoUpdateAniCalculations permits only horizontal TouchTracking if horizontal touch tracking is supported under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a TScrollBox restricted to horizontal scrolling. + + + + + + + + + +Indicates if the control should update effects when you scroll content. +FMX.Layouts.TFramedScrollBox.IsOpaque inherits from FMX.Layouts.TCustomScrollBox.IsOpaque. All content below this line refers to FMX.Layouts.TCustomScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Extends TCustomScrollBox declaring published properties. +TFramedScrollBox extends TCustomScrollBox declaring published properties. TFramedScrollBox does not extend the base class with any new functionality. +In difference to TScrollBox, TFramedScrollBox draws the edges (top, left, bottom, and right) and fills the control rectangle with some special color. Therefore, TFramedScrollBox scroll boxes are highlighted from the background of a parent control. + + + + + + + + + +Indicates if the control should update effects when you scroll content. +FMX.Layouts.TFramedVertScrollBox.IsOpaque inherits from FMX.Layouts.TCustomScrollBox.IsOpaque. All content below this line refers to FMX.Layouts.TCustomScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Layouts.TFramedVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + +Represents a TFramedScrollBox with an applied framedscrollboxstyle style lookup. + + + + + + + + + + + + + + + + + + + + + + + + +Performs the alignment of a FireMonkey control. +FMX.Layouts.TGridLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TGridLayout.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Renders the control's surface. +FMX.Layouts.TGridLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TGridLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + + + + + +Specifies the height of each cell that holds an item in a grid layout control. +Use ItemHeight in combination with ItemWidth in order to change the aspect ratio of the graphical objects that are part of this grid layout. + + + +Specifies the width of each cell that holds an item in a grid layout control. +Use ItemWidth in combination with ItemHeight in order to change the aspect ratio of the graphical objects that are part of this grid layout. + + + + +Specifies the orientation of the graphical controls that are part of this grid. +The Orientation property can be set to either Horizontal or Vertical in order to change the grid's orientation (and the position of the graphical objects in this grid) to either horizontal (left to right) or vertical (top to bottom). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A control that arranges child controls in a grid of equally sized cells. +A TGridLayout grid layout is a container for graphical objects that can arrange the objects it contains in a grid, as shown in the following image: + + +The children of a TGridLayout are resized to fit the sizes specified through the ItemHeight and ItemWidth properties. If the orientation is set to Horizontal, the child controls of a TGridLayout are lined one by one until the width of the layout is exceeded when a new line is added to the grid. If the orientation is set to Vertical, the child controls of a TGridLayout are positioned one under another until the height of the layout is exceeded when a new column is added to the grid. +However, you can customize sizes of child controls using the Margins properties of child controls. For example, the following image demonstrates the usage of different margins for Button5, Button6, Button7, and Button8 child controls: + + +Here we set: + +The Top and Bottom margins for Button5. +The Left margin for Button6. +All four Top, Left, Right, and Bottom margins for Button7. +The Top and Left margins for Button8. +Look how child controls are resized and positioned inside the respective grid cells. + +Note: The Align property of the controls within a TGridLayout is ignored. The Position, Height, and Width properties for child controls are automatically set, and explicitly changing their values has no effect. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Performs the alignment of a FireMonkey control. +FMX.Layouts.TGridPanelLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TGridPanelLayout.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Processes the painting of the control. +FMX.Layouts.TGridPanelLayout.DoPaint inherits from FMX.Controls.TControl.DoPaint. All content below this line refers to FMX.Controls.TControl.DoPaint. +Processes the painting of the control. +This method is called internally from PaintTo and PaintChildren. DoPaint defines the drawing area by clipping the Canvas to the areas occupied by the control and its children, paints the children and then the control itself. The call to DoPaint is always preceded by a call to Painting and succeeded by a call to AfterPaint. + + + +OnResize event dispatcher. +FMX.Layouts.TGridPanelLayout.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TGridPanelLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Layouts.TGridPanelLayout.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Keeps the TColumnCollection column collection in the TGridPanelLayout grid panel layout. +The Count property of ColumnCollection defines the number of columns in TGridPanelLayout. + + +Keeps the TControlCollection control collection of TControlItem control items. +Use ControlCollection to add, remove, or access control items in the collection of controls in a TGridPanelLayout grid panel layout. Each control item is identified by its Row and Column properties. + + +Specifies whether to add a row or column to a filled grid panel layout to accommodate additional controls. +The meanings of the options are: + + + +Value + +Meaning + + + +AddRows + + + +TGridPanelLayout is expanded vertically -- only rows are added. + + + + +AddColumns + + + +TGridPanelLayout is expanded horizontally -- only columns are added. + + + + +FixedSize + + + +TGridPanelLayout has a fixed number of rows and columns given by the Count property of both the ColumnCollection and RowCollection collections. + + +The property is used when a new control is added to the ControlCollection using +AddControl with the AColumn and ARow parameters set to -1. For example: + +GridPanelLayout1.ControlCollection.AddControl(AControl,-1,-1); + +where AControl is the control to add to the GridPanelLayout1 grid panel layout. + + +Keeps the TRowCollection row collection in the TGridPanelLayout grid panel layout. +The Count property of RowCollection defines the number of rows in TGridPanelLayout. + + + + + + + + + + + + + + + + + + + + + +Implements a grid panel layout control in which each component is placed within a cell on a grid panel. +In a TGridPanelLayout layout, you specify the number of rows and columns on the grid panel, then each component is placed into the next available cell in the grid panel, regardless of where you place it with the mouse. If each grid panel layout's cell already contains a control and you add more controls, the location for the new controls is determined by the ExpandStyle property. For example, using the default AddRows value of the ExpandStyle property, a new row is added to the grid panel, and each cell in this row can contain a new control. +TGridPanelLayout layouts provide the following behavior: + +You can explicitly set the Height, Width, Align, and Anchors properties of child controls to manually resize and align child controls placed inside cells on a TGridPanelLayout layout: + +You can specify that a child control can span on several merged cells. For example, look at the following figure: + +Here, the B4 button spans on two cells in the rightmost column, the B5 button occupies four cells in two rows and two columns and the B8 button occupies three cells in the bottom row. +To specify that a child control can span on several cells you can use the following trick: + +In the Structure view, locate the desired TGridPanelLayout layout node. +Under this node, locate the respective Control Collection node. +Among control items in this Control Collection, select the control item associated with the desired child control. The Object Inspector shows the properties of this control item. +In the ColumnSpan property, type the number of cells that can be occupied be the control item in the respective column (specified in the Column property). +In the RowSpan property, type the number of cells that can be occupied by the control item in the respective row (specified in the Row property). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Performs the alignment of a FireMonkey control. +FMX.Layouts.TFlowLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TFlowLayout.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Renders the control's surface. +FMX.Layouts.TFlowLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Setter function for the Justify property. Value specifies the new value of the Justify property. + + + + + + +Setter function for the JustifyLastLine property. Value specifies the new value of the JustifyLastLine property. + + + + + + +Setter function for the FlowDirection property. Value specifies the new value of the FlowDirection property. + + + + + + +Setter function for the HorizontalGap property. Value specifies the new value of the HorizontalGap property. + + + + + + +Setter function for the VerticalGap property. Value specifies the new value of the VerticalGap property. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TFlowLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies the justification of all the lines within TFlowLayout, except the last line. +If there is a single line, Justify has no effect, the line is treated as a last line, and is aligned according to JustifyLastLine. + + +Specifies the justification of the last line of a TFlowLayout. +If there is a single line, Justify has no effect, the line is treated as a last line, and is aligned according to JustifyLastLine. + + +Specifies the direction in which the controls are arranged within the TFlowLayout lines. +The direction of the controls flow can be from left to right or from right to left. Changing the direction does not change the line of the control, only the order of the controls on each line. + + + +Value + +Result + + + +LeftToRight + + + + + + + + +RightToLeft + + + + + + + +Specifies the minimum distance between two adjacent child controls of a TFlowLayout. +If HorizontalGap has a negative value, the child controls are overlapped following the direction specified by the FlowDirection property. + + + +Gap and direction + +Result + + + +Positive Gap + + + + + + + + +Negative Gap; Direction=LeftToRight + + + + + + + + +Negative Gap; Direction=RightToLeft + + + + + + + +Specifies the minimum distance between two adjacent lines of a TFlowLayout. +If the VerticalGap has a negative value, the lines are overlapped. + + + +Gap + +Result + + + +Positive Gap + + + + + + + + +Negative Gap + + + + + + + + + + + + + + + + + + + + + + + + + + + +A control that arranges its child controls as if they were words in a paragraph. +The children of a TFlowLayout are lined one by one. When the Width of the layout is exceeded, the remaining child controls are wrapped to the next line and so on until all of the controls are placed. To add a line break, like in a normal text, add a TFlowLayoutBreak to the current TFlowLayout. +The direction of the controls flow can be from left to right or from right to left. To change the direction, set the FlowDirection property. Changing the direction does not change the line of the control, only the order of the controls on each line. +The distance between controls from the same line and the distance between lines can be customized by setting the HorizontalGap and VerticalGap properties. +The TFlowLayout children can be aligned as words in a paragraph: left, right, center, or justified. The alignment can be customized through the Justify property. The alignment of the last line within the layout is treated separately, and can be set through the JustifyLastLine property. If there is a single line, Justify has no effect, the line is treated as a last line, and is aligned according to JustifyLastLine. + +Note: The Align property of the controls within a TFlowLayout is ignored. The Position property for child controls is automatically set, and explicitly changing its value has no effect. +The TFlowLayout can be used to obtain this kind of results: + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.ListBox.xml b/Modules/DelphiFMX/doc/FMX.ListBox.xml new file mode 100644 index 00000000..88ffff00 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.ListBox.xml @@ -0,0 +1,3616 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Notification method called after the creation order is changed. +FMX.ListBox.TListBoxItem.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + + + + +Returns the list box object that contains the item. +ListBox gets the list box parent of the item. If the parent of the item is not a TListBox, the method returns nil. + + + + + + +Returns the combo box object that contains the item. +ComboBox gets the combo box parent of the item. If the parent of the item is not a TComboBox, the method returns nil. + + + + + + +Getter of DefaultSize. +FMX.ListBox.TListBoxItem.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + +Customizes styles in complex objects. +FMX.ListBox.TListBoxItem.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.ListBox.TListBoxItem.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + + + + + +Checks whether the input is taken by the control or by its parent. +FMX.ListBox.TListBoxItem.EnterChildren inherits from FMX.Controls.TControl.EnterChildren. All content below this line refers to FMX.Controls.TControl.EnterChildren. +Checks whether the input is taken by the control or by its parent. +EnterChildren returns True if the input is taken directly by the control's parent, and False otherwise. +Usually, EnterChildren returns False. If the control is an item such as TListBoxItem, a TTreeViewItem, or TMenuItem, EnterChildren returns True. + + + + + + + + +OnDragOver event dispatcher. +FMX.ListBox.TListBoxItem.DragOver inherits from FMX.Controls.TControl.DragOver. All content below this line refers to FMX.Controls.TControl.DragOver. +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + +OnDragEnd event dispatcher. +FMX.ListBox.TListBoxItem.DragEnd inherits from FMX.Controls.TControl.DragEnd. All content below this line refers to FMX.Controls.TControl.DragEnd. +OnDragEnd event dispatcher. +A control calls DragEnd when a dragging session ends. +Override the protected DragEnd method to provide other responses when the dragging session ends. + + + +Renders the control's surface. +FMX.ListBox.TListBoxItem.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Getter function for the Height property. +FMX.ListBox.TListBoxItem.GetHeight inherits from FMX.Controls.TControl.GetHeight. All content below this line refers to FMX.Controls.TControl.GetHeight. +Getter function for the Height property. + + + + + + +Getter function for the Width property. +FMX.ListBox.TListBoxItem.GetWidth inherits from FMX.Controls.TControl.GetWidth. All content below this line refers to FMX.Controls.TControl.GetWidth. +Getter function for the Width property. + + + + + + +Setter function for the Height property. +FMX.ListBox.TListBoxItem.SetHeight inherits from FMX.Controls.TControl.SetHeight. All content below this line refers to FMX.Controls.TControl.SetHeight. +Setter function for the Height property. Value specifies the new value of the Height property. + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Retrieves whether any of the default values of font properties that are stored in the StyledSettings property is changed. +FMX.ListBox.TListBoxItem.StyledSettingsStored inherits from FMX.Controls.TTextControl.StyledSettingsStored. All content below this line refers to FMX.Controls.TTextControl.StyledSettingsStored. +Retrieves whether any of the default values of font properties that are stored in the StyledSettings property is changed. +StyledSettingsStored retrieves whether StyledSettings needs to be stored in the .fmx form file, keeping the description of the FMX form. +StyledSettingsStored returns True if StyledSettings <> DefaultStyledSettings. The DefaultStyledSettings property is set during the style loading in the ApplyStyle method. See also AllStyledSettings. + + +Specifies the alignment options (top, left, client, and so on) of this control. +Use Align to automatically set the alignment of the current control. Setting Align to a value different than None can affect the position, size (height and width), and anchors of the control. By default, Align is set to None. +Descendants of TControl typically set the visibility and value for the Align property. For example, for TToolBar, Align defaults to TAlignLayout.Top. +To see the possible values for Align and their visible effects over the control, see FMX.Types.TAlignLayout. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + +Specifies the amount (in degrees) by which the control is rotated from the x-axis. +Positive angles correspond to clockwise rotation. For counterclockwise rotation, use negative values. +To set the rotation center, use RotationCenter. + + +Specifies the position of the pivot point of the control. +The coordinates of the rotation center take values in the range from 0 through 1. The point with the coordinates (0,0) corresponds to the upper-left corner of the control, the point with the coordinates (1,1) corresponds to the lower-right corner of the control. The default center of rotation is (0.5, 0.5). +Values outside of [0,0] and [1,1] can be clipped in some descendant classes. +To set the rotation angle, use RotationAngle. + + + + + + +Returns the class type that instance represents the used text settings. +FMX.ListBox.TListBoxItem.GetTextSettingsClass inherits from FMX.Controls.TTextControl.GetTextSettingsClass. All content below this line refers to FMX.Controls.TTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.ListBox.TListBoxItem.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + + +Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + + + + + + + + +Setter for the Visible property. +This method also unselects any items that are not visible. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListBox.TListBoxItem.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListBox.TListBoxItem.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + +Stores a Tvalue, which is a data structure that can store different kinds of data types. +FMX.ListBox.TListBoxItem.Data inherits from FMX.Types.TFmxObject.Data. All content below this line refers to FMX.Types.TFmxObject.Data. +Stores a Tvalue, which is a data structure that can store different kinds of data types. +Data has no predefined meaning. Although Data is used for LiveBinding, any succesor override this behavior. Then, the behaviour of Data is based on the type of its value. + +Note: Do not use this member. It is for internal use only. + + + + + + + +Returns the containing component. +Returns the containing component. +FMX.ListBox.TListBoxItem.GetParentComponent inherits from System.Classes.TComponent.GetParentComponent. All content below this line refers to System.Classes.TComponent.GetParentComponent. +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + + + + + +Applies the specified mouse trigger effect to all the children of this FMX object that are of type TEffect. +FMX.ListBox.TListBoxItem.ApplyTriggerEffect inherits from FMX.Controls.TControl.ApplyTriggerEffect. All content below this line refers to FMX.Controls.TControl.ApplyTriggerEffect. +Applies the specified mouse trigger effect to all the children of this FMX object that are of type TEffect. +ApplyTriggerEffect iterates through all the children of this FMX object and, if one of them is of type TEffect, applies the mouse trigger given through the ATrigger parameter (which can be 'IsMouseOver', 'IsMouseOver', 'IsDragOver', and so on). +AInstance specifies the instance of the FMX object to which the trigger effect is applied. + + + +Processes the selection of an item. +Sets the value of the IsSelected property, triggers the selection animation and calls the ItemStateChanged method of the listbox selection controller. +The UserChange specifies whether the selection is initiated by an user action (as opposed to by a code call). + + + + + + + + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Specifies whether the check box associated with the item is checked. + + +Specifies whether the item is selected. +If IsSelected is True, the item appears as selected inside its parent component. + + +Specifies various data that can be attached to a TListBoxItem in order to be shown in the list box. +Use the ItemData property in order to attach various data to a list box item. This data can then be displayed in the list box. + +ItemData has four sub-properties: + +Accessory - lets you add to the selected list box item one of the following items: +Checkmark icon +Detail icon +More icon +No icon (this is the default) +Bitmap - lets you add a bitmap image to your item. +Detail - lets you add an additional text that describes your list box item. +Text - allows you to change the text displayed on your list box item. + +In the picture above, two list box items are present in the list: + +The first one has a bitmap image, additional text description and no accessory icon. +The second one has a bitmap image, additional text description and the Detail accessory icon. + + +Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A TListBoxItem is an item that is used in list box components. +The items in list boxes and combo boxes are of type TListBoxItem. To add an item to a list box or combo box, double-click the component or right-click the component and choose Add Item. + + + + + + + + + + + + + accessorymore.Visible + + + + + accessorydetail.Visible + + + + + accessorycheckmark.Visible + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.7 + + + + + 0.7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Aligns the style selection controls according to the passed areas. + + + + + + + + Clear all style selection controls for focused and unfocused states. + + + + + The reference on style object that is used to create controls for unfocused selection. + + + + + The reference on style object that is used to create controls for focused selection. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ListBox.TCustomListBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + + + +Gets the text of the selected item. +GetData returns the text of the item that is selected in the list box or an empty string, if no item is selected. + + + + + + +Sets the text of the selected item. +If no item is selected, nothing happens. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + +Generates an OnChangeCheck event. +DoChangeCheck is executed internally when the check box associated with one of the items in the list changes its state. Check boxes are visible when the ShowCheckboxes property is set to True. + + + + + + + + +Compares the given items. +CompareItems compares the text of the given TListBoxItem items. +It also generates an OnCompare event. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Sorts the items in the list box. + + + +Sets the index of the selected item in the list. +SetItemIndex is the protected setter method for the ItemIndex property. + + + + + + + +Returns the index of the currently selected item. + + + + + + + + + + + + + +Internally executed while a mouse button is pressed over the surface of this scroll box. +FMX.ListBox.TCustomListBox.MouseDown inherits from FMX.Layouts.TCustomScrollBox.MouseDown. All content below this line refers to FMX.Layouts.TCustomScrollBox.MouseDown. +Internally executed while a mouse button is pressed over the surface of this scroll box. +You can call MouseDown programmatically in applications to simulate a mouse button down event over this scroll box. +The Button parameter specifies the mouse button that has just been pressed (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + + + + + + +Internally executed while the mouse is moved over the surface of this scroll box. +FMX.ListBox.TCustomListBox.MouseMove inherits from FMX.Layouts.TCustomScrollBox.MouseMove. All content below this line refers to FMX.Layouts.TCustomScrollBox.MouseMove. +Internally executed while the mouse is moved over the surface of this scroll box. +You can call MouseMove programmatically in applications to simulate a mouse move event over this scroll box. +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + + + + + + + +Internally executed while a mouse button is released over the surface of this scroll box. +FMX.ListBox.TCustomListBox.MouseUp inherits from FMX.Layouts.TCustomScrollBox.MouseUp. All content below this line refers to FMX.Layouts.TCustomScrollBox.MouseUp. +Internally executed while a mouse button is released over the surface of this scroll box. +You can call MouseUp programmatically in applications to simulate a mouse button up event over this scroll box. +The Button parameter specifies the mouse button that has just been released (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + + + + + + + +Calls Click and starts the animation by calling StartTriggerAnimation. +FMX.ListBox.TCustomListBox.MouseClick inherits from FMX.Controls.TControl.MouseClick. All content below this line refers to FMX.Controls.TControl.MouseClick. +Calls Click and starts the animation by calling StartTriggerAnimation. +MouseClick receives the following parameters: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys -- SHIFT, CTRL, ALT, and CMD (only for Mac) -- were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. + See Also +FMX.Controls.TControl.Click +FMX.Controls.TControl.OnClick +FMX.Controls.TControl.OnMouseLeave +FMX.Controls.TControl.OnMouseEnter +FMX.Controls.TControl.OnMouseMove +FMX.Controls.TControl.OnMouseDown +FMX.Controls.TControl.OnMouseWheel +System.Classes.TShiftState +System.UITypes.TMouseButton +FMX.Ani.TAnimator.StartTriggerAnimation + + + + + + + + + +Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.ListBox.TCustomListBox.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + + + + + + +OnDragOver event dispatcher. +FMX.ListBox.TCustomListBox.DragOver inherits from FMX.Controls.TControl.DragOver. All content below this line refers to FMX.Controls.TControl.DragOver. +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + + + + + +OnDragDrop event dispatcher. +FMX.ListBox.TCustomListBox.DragDrop inherits from FMX.Controls.TControl.DragDrop. All content below this line refers to FMX.Controls.TControl.DragDrop. +OnDragDrop event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor, within the client area of the control. +A control calls DragDrop when a dragged object is dropped on the control area. +Override the protected DragDrop method to provide other responses when a dragged object is dropped on the control area. + + + + + + +Getter of DefaultSize. +FMX.ListBox.TCustomListBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + +Customizes styles in complex objects. +FMX.ListBox.TCustomListBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + +Frees the style of TStyledControl. +FMX.ListBox.TCustomListBox.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Responds when receiving input focus. +FMX.ListBox.TCustomListBox.DoEnter inherits from FMX.Controls.TStyledControl.DoEnter. All content below this line refers to FMX.Controls.TStyledControl.DoEnter. +Responds when receiving input focus. +DoEnter is called automatically when the control receives the input focus. + + + +OnExit event dispatcher. +FMX.ListBox.TCustomListBox.DoExit inherits from FMX.Controls.TControl.DoExit. All content below this line refers to FMX.Controls.TControl.DoExit. +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.ListBox.TCustomListBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +FMX.ListBox.TCustomListBox.DoCalcContentBounds inherits from FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + + + + +Initializes the component after the form file has been read into memory. +FMX.ListBox.TCustomListBox.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + + + + + + +Executes internally to render the content of the list box. + + + + + + + +OnPainting event dispatcher. +FMX.ListBox.TCustomListBox.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + + + +Restores Canvas properties after the painting process. +FMX.ListBox.TCustomListBox.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + + + + + + +Executed when the viewport position changes. +FMX.ListBox.TCustomListBox.ViewportPositionChange inherits from FMX.Layouts.TCustomScrollBox.ViewportPositionChange. All content below this line refers to FMX.Layouts.TCustomScrollBox.ViewportPositionChange. +Executed when the viewport position changes. +ViewportPositionChange receives the following parameters: + +OldViewportPosition is the value that the ViewportPosition property had before it changed. +NewViewportPosition is the new value of the ViewportPosition property. +ContentSizeChanged indicates whether the size of the content of the viewport has changed as well (True) or not (False). +ViewportPositionChange calls the handler of the OnViewportPositionChange event. + + + + + + + + +Sets the default inertial scrolling properties for the current platform. +FMX.ListBox.TCustomListBox.DoUpdateAniCalculations inherits from FMX.Layouts.TCustomScrollBox.DoUpdateAniCalculations. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoUpdateAniCalculations. +Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations is called from UpdateAniCalculations to set the default values to the Animation, +TouchTracking, BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Virtual method to be implemented in subclasses to provide further functionality when adding AObject to the scroll box. +FMX.ListBox.TCustomListBox.ContentAddObject inherits from FMX.Layouts.TCustomScrollBox.ContentAddObject. All content below this line refers to FMX.Layouts.TCustomScrollBox.ContentAddObject. +Virtual method to be implemented in subclasses to provide further functionality when adding AObject to the scroll box. In TScrollBox, ContentAddObject has no implementation. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Virtual method to be implemented in subclasses to provide further functionality right before removing AObject from the scroll box. +FMX.ListBox.TCustomListBox.ContentBeforeRemoveObject inherits from FMX.Layouts.TCustomScrollBox.ContentBeforeRemoveObject. All content below this line refers to FMX.Layouts.TCustomScrollBox.ContentBeforeRemoveObject. +Virtual method to be implemented in subclasses to provide further functionality right before removing AObject from the scroll box. In TScrollBox, ContentBeforeRemoveObject has no implementation. + + + + + + +Virtual method to be implemented in subclasses to provide further functionality right after removing AObject from the scroll box. +FMX.ListBox.TCustomListBox.ContentRemoveObject inherits from FMX.Layouts.TCustomScrollBox.ContentRemoveObject. All content below this line refers to FMX.Layouts.TCustomScrollBox.ContentRemoveObject. +Virtual method to be implemented in subclasses to provide further functionality right after removing AObject from the scroll box. In TScrollBox, ContentRemoveObject has no implementation. + + + + + + +Indicates if the control should update effects when you scroll content. +FMX.ListBox.TCustomListBox.IsOpaque inherits from FMX.Layouts.TCustomScrollBox.IsOpaque. All content below this line refers to FMX.Layouts.TCustomScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Updates the items that are selected in the list box. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Updates the layout of the "sticky" item in a list box. +For example, a "sticky" item can be a TSearchBox. "Sticky" means that it always stays on the top of the list, similar to a header. +To add a search box as a "sticky" item, right-click on a TListBox control and select Add Item > TSearchBox. + + + + + + +The setter for the GroupingKind property. +Sets the value of the GroupingKind property and updates and repaints the content of the ListBox. + + + +Performs the realignment of the children controls of the TScrollBox object within the object. +FMX.ListBox.TCustomListBox.DoRealign inherits from FMX.Layouts.TCustomScrollBox.DoRealign. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoRealign. +Performs the realignment of the children controls of the TScrollBox object within the object. +It is called internally every time visual properties of TScrollBox are changed. +The children are realigned taking into account their alignment properties, margins, and padding. +DoRealign calls the inherited TControl.DoRealign and then executes the realignment during the inertial scrolling. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether the current control can receive focus. +CanFocus is True if it can receive focus, and False otherwise. +If it is set to False, the control cannot be selected when using the TAB key. +A control can receive focus after it is created. + + +Specifies whether the parent of this control should be evaluated to receive focus. +CanParentFocus is True when the parent of this control should be evaluated to receive focus if this control cannot receive focus itself, and False otherwise. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.ListBox.TCustomListBox.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Getter for the FirstSelectedItem property. + + + + + + +Allows the dragging of items inside the list. +AllowDrag allows you to change the order of the list items by dragging them. + + +Specifies whether consecutive items should have different backgrounds. +Set AlternatingRowBackground to True so that the background of items alternates. + + + +Specifies the number of columns on which to display the items in the list box. +If Columns is set to 3, this is how the list box will display the items: + + + +Specifies the width of the items in the list box. +The default value is 0. If you set another value for ItemWidth, all the items will be re-dimensioned to that value and displayed on multiple columns. + + +Specifies the height of the items from the list box. +Use ItemHeight to specify the height, in pixels, of the items in the list box. + + +Specifies how the items are displayed in the list box. +ListStyle specifies whether the items in the list box are displayed vertically or horizontally. +ListStyle can be set to Vertical or Horizontal. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether the list of items is sorted. + + +Displays a check box next to every item in the list box. + + + +First item in the selection. +Returns nil if no item is selected. + + + +Occurs when the selection in the list box changes. +Write an OnChange event handler to take specific action immediately after a new item or items are selected in the list box. + + +Occurs when the check box attached to a list item changes its state. +Write an OnChangeCheck event handler to take specific action after the check box attached to an item changes its state from selected to cleared or vice versa. +To make the check boxes attached to the list items visible, set the ShowCheckboxes property to True. + + +Occurs when two list items are compared. +Write an OnCompare event handler to create your own comparing criteria. + + +Occurs after a drag-and-drop operation. +The OnDragChange event occurs after a drag-and-drop operation and allows you to make further changes to the list box. +If AllowDrag is set to True, you can write an event handler to specify the changes to the list box when a list box item is dragged inside the list. +See TOnListBoxDragChange for more details. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +The current selection controller. +The constructor initializes the MultiSelectStyle property which in turn defines the SelectionController. The default value of MultiSelectStyle is TMultiSelectStyle.None. + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListBox.TCustomListBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListBox.TCustomListBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Assigns the Source object to the current object. +Assign copies the elements from Source to the current object, if Source is a TStrings object. + + + +Deletes all the items from the list. +Clear removes the items from the list box and also frees the memory allocated for them. The items in the list box are stored as TListBoxItem objects. + + + + + + + + +Generates an OnDragChange event. +DragChange is called automatically after a drag-and-drop operation. + + + +Selects all the items in the list. +SelectAll works only if MultiSelect is set to True. + + + +Deselects all the selected items from the list box. +If no items are selected before calling ClearSelection, nothing happens. + + + + + + + +Selects all the items between two given items. +SelectRange selects the items between Item1 and Item2 (including Item1 and Item2) and deselects any other previously selected items. +SelectRange works only if MultiSelect is set to True. + + + +Scrolls the content so that the Item is visible. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Returns the item at the specified point. +Call ItemByPoint to get the item that contains in its bounds the point specified by X and Y. + + + + + + + +Returns the item at the index specified by Idx. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sorts components of the layout based on the comparison function Compare. +FMX.ListBox.TCustomListBox.Sort inherits from FMX.Layouts.TCustomScrollBox.Sort. All content below this line refers to FMX.Layouts.TCustomScrollBox.Sort. +Sorts components of the layout based on the comparison function Compare. +TFmxObjectSortCompare is declared as: + +TFmxObjectSortCompare = function(item1, item2: TFmxObject): Integer; + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Determines the number of items in the list box. + + +Returns the item that is currently selected. +If no item is selected, it returns nil. +To obtain the index of the item that is currently selected, use the ItemIndex property. + + +Specifies the items in the list box. +Use Items to get or set the list of items in the list box as strings. +Use the ListItems property to access an item by specifying its index. This property returns the item as a TListBoxItem object. + +Adding Items +To add items as TListBoxItem at design-time, see ListBox Items Editor. +To add items as TStrings at design-time, see String List editor. + +Embarcadero Technologies does not currently have any additional information. + + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +Specifies the index of the currently selected item. +Gets or sets the index of the item that is selected in the list box. +The first item in the list has index 0, the second item has index 1, and so on. If no item is selected, the value of ItemIndex is -1. +To get the actual item that is selected, use the Selected property. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether multiple items can be selected in the list. +If MultiSelect is set to True, you can select more than one item from the list, otherwise you are limited to one item. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs immediately after clicking an item from the listbox. +Write an OnItemClick event handler to respond to clicking on an item from the listbox component. +The event handler for the OnItemClick event receives two arguments: + +Sender: The TCustomListBox instance that holds the list box item that was clicked. +Item: The TListBoxItem instance that was clicked. +OnItemClick is an event of type TItemClickEvent. + + + +A TCustomListBox is the base class for list box components. +Inherits from TCustomListBox to create a control that represents a specialized list box. + +List Box Events +TCustomListBox has events that are generic to the list box control, and other events that are specific to the items: + +Events that are generic to the list box control: Events such as OnClick, OnDblClick, OnEnter, and OnMouseDown are inherited events, and they refer to the event that occurs in the list box control. +Events that are specific to the items of the list box: Events such as OnItemClick, OnChange, OnChangeCheck, OnCompare, and OnDragChange are specific to the list box item, and they refer to events that occur in the items of the list box. +Therefore it is important to see, for example, the difference between OnClick that occurs when the list box is clicked, and OnItemClick that occurs when a list box item is clicked. +See the full list of TCustomListBox events in FMX.ListBox.TCustomListBox_Events. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets default style for Group Header, which is used if TListBox.DefaultItemStyles.GroupHeaderStyle + is empty + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference to sticky TListBoxGroupHeader clone in Plain grouping mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference to TListBox that hosts this controller + + + + + Index of currently selected item, -1 if none + + + + + Index of first selected item, -1 if none + + + + + Timer used for DelayedMouseDown + + + + + Item that's going to be acted upon if DelayedMouseDown is employed + + + + + Flag used to prevent sending change notification + + + + + True during mouse selection + + + + + Create a new instance of TSelectionController + + + + + + + + Getter for MutliSelectStyle + + + + + + + + Make host TListBox update selection visuals + + + + + Initiate a delayed mouse down action + + + + + + + + + Abort delayed mouse down action, if any + + + + + + + + + + + + + + + + + + + Get first item index, -1 if none + + + + + + + + Get current item index, -1 if none + + + + + + + + Get current TListBoxItem, nil if none selected + + + + + + + + Clear selection + + + + + Attempt to copy selection from another selector + + + + + + + + Select everything + + + + + Select range between TListBoxItems Item1 and Item2 + + + + + + + + + + Mark TListBoxItem Item as Selected if Value is True, as not selected if Value is False. + No notification. Return true if Item.Selected has been changed. + + + + + + + + + + Set item with index Index as current. Return True if the value of Current has been changed. + + + + + + + + + Used to notify this TSelectionController when item state was changed externally. See DoItemStateChanged. + + + + + + + + + Start mouse selection + + + + + + + + + + Handle mouse move during selection + + + + + + + + + Before mouse selection is finished + + + + + + + + + + Finish mouse selection + + + + + + + + + + Select using keyboard, e.g. by pressing space. KeyAction is one of: Move or Toggle + + + + + + + + + + Invoked when item index is set programmatically by user + + + + + + + + Dispatch change notification + + + + + MouseSelectStart implementation + + + + + + + + + MouseSelectMove implementation + + + + + + + + + MouseSelectFinishing implementation + + + + + + + + + MouseSelectFinish implementation + + + + + + + + + KeyboardSelect implementation + + + + + + + + + + UserSetIndex implementation + + + + + + + + ItemStateChanged implementation + + + + + + + + + MultiSelectStyle that this selection controller implements + + + + + True during mouse selection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create TListBoxSelector for ListBox based on MultiSelectStyle + + + + + + + Base class for selection controllers. Selection controllers handle various types of selection. + Normally TListBox.MultiSelectStyle property selects one of the three predefined ones: + TSingleSelectionController, TMutiselectSelectionController, TExtendedSelectionController + + + + + + + + Register a selector that handles given MultiSelectStyle. Used during framework initialization + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ListBox.TCustomComboBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates the list box associated with the combo box. +Call CreateListBox to instantiate the list box component of the current combo box. The list box is of type TComboListBox. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + + + + +Enumerates all child components. +FMX.ListBox.TCustomComboBox.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + +Getter of DefaultSize. +FMX.ListBox.TCustomComboBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + +Customizes styles in complex objects. +FMX.ListBox.TCustomComboBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Performs the alignment of a FireMonkey control. +FMX.ListBox.TCustomComboBox.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + + + +Renders the content of the combo box. +DoContentPaint paints the content of the combo box when it is not expanded. +DoContentPaint is used internally. + + + +OnExit event dispatcher. +FMX.ListBox.TCustomComboBox.DoExit inherits from FMX.Controls.TControl.DoExit. All content below this line refers to FMX.Controls.TControl.DoExit. +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.ListBox.TCustomComboBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +OnMouseDown event dispatcher. +FMX.ListBox.TCustomComboBox.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + + +OnMouseUp event dispatcher. +FMX.ListBox.TCustomComboBox.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +OnMouseWheel event dispatcher. +FMX.ListBox.TCustomComboBox.MouseWheel inherits from FMX.Controls.TControl.MouseWheel. All content below this line refers to FMX.Controls.TControl.MouseWheel. +OnMouseWheel event dispatcher. +A control calls MouseWheel in response to any of mouse wheel messages, decoding the message parameters into the shift-key state, wheel rotation, and handle, which it passes in the Shift, WheelDelta, and Handled parameters, respectively: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +Handled indicates whether the scroll bar was already moved, depending on the WheelDelta value. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the rolling on the other scroll bar, if it exists. +Override the protected MouseWheel method to provide other responses when the mouse wheel is rotated while the cursor is over the control. + + + + + + + + +Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.ListBox.TCustomComboBox.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + +Initializes the component after the form file has been read into memory. +FMX.ListBox.TCustomComboBox.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +Initializes a list picker. +InitPicker initializes the list picker provided with the AListPicker parameter. + + + + + + + +Recalculates the pop-up size based on the items. + + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + +Gets the pop-up window that is used as a holder for the drop-down list. + + +Specifies whether the current control can receive focus. +CanFocus is True if it can receive focus, and False otherwise. +If it is set to False, the control cannot be selected when using the TAB key. +A control can receive focus after it is created. + + +Specifies whether the parent of this control should be evaluated to receive focus. +CanParentFocus is True when the parent of this control should be evaluated to receive focus if this control cannot receive focus itself, and False otherwise. + + +Specifies the height of the items from the drop-down list. +Use ItemHeight to specify the height, in pixels, of the items in the combo box list. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the maximum number of items displayed in the drop-down list. +By default, the drop-down list displays 8 items that are visible without requiring the user to scroll. To make the drop-down list smaller or larger, specify a number smaller or larger than eight as the DropDownCount value. +If the DropDownCount value is larger than the number of items, the drop-down list will be only large enough to display the existing items. If the DropDownCount value is smaller than the number of items, the drop-down list displays a scroll bar. + + +Specifies the position of the list box relative to the combo box button. +For example, if Placement is set to TPlacement.Right, the drop-down list is displayed to the right of the combo box. + + + +Specifies the position of the drop-down list of the combo box. +Use PlacementRectangle to specify the coordinates of the placement rectangle. The drop-down list will be displayed with the upper-left corner in the lower-left corner of the placement rectangle. The origin is considered to be the upper-left corner of the combo box button. + + + +Defines whether to use TCustomListPicker pickers providing platform-specific drop-down lists to select string items. +The TDropDownKind type is also used in the TComboEdit, +TComboBox, and TPopupBox controls to define whether to use the TCustomListPicker picker to provide platform-specific controls to select string items from drop-down lists. + + +Specifies the name of the resource object to which the drop-down list of the combo box is linked. +Use ListBoxResource to specify the style for the drop-down list component of the combo box. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs when the selected item in the combo box changes. +Write an OnChange event handler to take specific action immediately after a new item is selected from the list. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs just before the drop-drown list appears. +Write an OnPopup event handler to take specific action just before the drop-drown list appears. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListBox.TCustomComboBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListBox.TCustomComboBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.ListBox.TCustomComboBox.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + +Deletes all the items from the Items list. +Call Clear to empty the combo box at run time. + + + +Opens the list of items. +DropDown makes visible the list of items of the combo box. + + + + + + +Sorts the children in the children list using the specified sorting procedure. +FMX.ListBox.TCustomComboBox.Sort inherits from FMX.Types.TFmxObject.Sort. All content below this line refers to FMX.Types.TFmxObject.Sort. +Sorts the children in the children list using the specified sorting procedure. + + +Gets the drop-down list component of the combo box. +The returned object is a TComboListBox. + + +Returns the total number of items in the drop-down list associated with the combo box. + + +Gets the item that is currently selected in the combo box. +Selected returns the selected item in the combo box as a TListBoxItem instance. + + +Specifies the items in the drop-down list. +Use Items to get or set the list of items in the drop-down as strings. +Use the ListItems property to access an item as a TListBoxItem object. + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +Specifies the index of the currently selected item. +Gets or sets the index of the item that is selected in the combo box. +The first item in the list has index 0, the second item has index 1, and so on. If no item is selected, the value of ItemIndex is -1. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +A TCustomComboBox is the base class for combo box components. +Inherit from TCustomComboBox to create a control that represents a specialized combo box. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A TComboBox is a button with a list box attached to it. +Click the button to display the list. +You can select an item from the list and it will appear as the button's text. You cannot type text directly into the combo box button. +To add items, right-click the combo box on the form and choose Add Item. This creates a new TListBoxItem object that appears in the Structure pane and can be edited individually. +You can also manage the items in the combo box by double-clicking the combo box control in the Form Designer. This opens the Items Designer dialog where you can add, delete, and change the order of the items. + +Note: When a number of items in a control is more than can be concurrently shown in the TListBoxItem list box, then you can use the scroll bar to scroll the items shown in the list box. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll items using the mouse wheel. To enforce the scroll bar to be shown by default, you can use the code like following: +ComboBox1.ListBox.AniCalculations.AutoShowing := false; +In Windows 8 style applications, you can create a Windows 8 style combo box by setting the value Native for the property DropDownKind. For more information, see Creating a Metropolis UI ComboBox. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.ListView.xml b/Modules/DelphiFMX/doc/FMX.ListView.xml new file mode 100644 index 00000000..0fdfe08a --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.ListView.xml @@ -0,0 +1,11034 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Called right after the adapter of the list view is set. + + + + + + +Setter of Adapter. + + + + + + + + + +Changes the value of HeightSumsNeedUpdate to True to indicate that the total height of the list view items has changed since the last time that the list view presentation calculated that height. +Subclasses of TAdapterListView that handle the presentation of the list view must change the value of HeightSumsNeedUpdate to False each time that they calculate the total height of the list view items and update the list view presentation accordingly. + + + + + + +Called after the items of the adapter change. + + + + +Called before the items of the adapter might change as a result of filtering or sorting. + + + + +Called after the items of the adapter might have changed as a result of filtering or sorting. + + + + +Called when the size of the items of the adapter has changed. + + + + +Called when the items of the adapter need to be painted again. + + + + +Called when the view of the specified item of the adapter needs to be recreated. + + + + + + + + + +Indicates whether the total height of the list view items has changed since the last time that the list view presentation calculated that height (True) or not (False). +Subclasses of TAdapterListView that handle the presentation of the list view must change the value of HeightSumsNeedUpdate to False each time that they calculate the total height of the list view items and update the list view presentation accordingly. + + + + + + +Object that handles all interactions between the list view control and its list view items. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.1 + + + + + $8 + + + + + $10 + + + + + $8 + + + + + $1 + + + + + 0.25 + + + + + 0.125 + + + + + 0.25 + + + + + $A + + + + + $28 + + + + + $48 + + + + + $1 + + + + + $2 + + + + + 0.25 + + + + + 0.1 + + + + + 0.15 + + + + + Delete + + + + + $10 + + + + + $C + + + + + $A + + + + + $B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + False + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + 0 + + + + + $0 + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + TListItem view is comprised of TListViewDrawables. These are the actual + view elements that are being painted in the item cells. + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TListItem is an element that comprises TListView. Each individual item contains a View, + which in turn is comprised of instances of TListItemDrawable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ListView.TListViewBase.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Returns True if in edit mode. + + + + + + + + + +Used internally by presentation hook. + + + + + + + + + +Used internally by presentation hook. + + + + + + + + + +Used internally by presentation hook. + + + + + + + + + +Invoked when the Edit mode is being changed. +If the Edit mode requires a different appearance, this is where an update of appearances needs to be initiated. + + + + + + + + + +Returns True if each list view item contains one or more buttons, or False otherwise. + + + + + + + +Returns True if the list view supports a mode where you can select list view items to delete, or False otherwise. + + + + + + + +Returns True if the list view supports a mode where you can select list view items using checkboxes, or False otherwise. + + + + + + + +Stops edit mode transition animation. + + + + + + +Initializes edit mode transition animation. + + + + + + +Stops delete mode transition animation. + + + + + + +Initializes delete mode transition animation. + + + + + + +Updates the layout to place a Delete button. + + + + + + +Deletes the item. + + + + + + +This method is invoked when the value of the ScrollStretchStrength property is changed (UpdateScrollStretchStrength). + + + + + + +Specifies the scroll stretch value when the PullToRefresh property is invoked. + + + + + + + + + +Setter function for the SelectionCrossfade property. + + + + + + + + +Getter for the DeleteButtonText property. + + + + + + + + +Setter function for the DeleteButtonText property. + + + + + + + + +Setter function for the PullToRefresh property. + + + + + + + + +Setter function for the ControlType property. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Setter function for the NativeOptions property. + + + + + + + + +Implements the IListViewController.GetEditModeTransitionAlpha method. +The GetEditModeTransitionAlpha method of TListViewBase implements the GetClientMargins method of IListViewController. + + + + + + +Implements the IListViewController.GetDeleteModeTransitionAlpha method. +The GetDeleteModeTransitionAlpha method of TListViewBase implements the GetDeleteModeTransitionAlpha method of IListViewController. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Implements the IListViewController.GetItemEditOffset method. +The GetItemEditOffset method of TListViewBase implements the GetItemEditOffset method of IListViewController + + + + + + + +Implements the IListViewController.GetItemDeleteCutoff method. +The GetItemDeleteCutoff method of TListViewBase implements the IListViewController.GetItemDeleteCutoff method of IListViewController. + + + + + + +Implements the IListViewController.GetClientMargins method. +The GetClientMargins method of TListViewBase implements the GetClientMargins method of IListViewController. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns list of images. +Can be nil. + + + + + + +Returns list of images. +Can be nil. + + + +Hook for the IListViewController.RequestReindexing. + + + + + + + +Hook for the IListViewController.ItemResized. + + + + + + + +Notifies the TListView that the item requires repainting. + + + + + + + + + +Notifies the TListView that a control inside of an item is clicked. + + + + + + + + + + +Notifies the TListView that an item is clicked. + + + + + + + + + + + + + +Declares the zero-based index of an image. +If you use a non-existent index to access an image in the images list, then no image is retrieved and no exception is raised. The usual default value is -1. + + + + + + +Declares the setter for ImageIndex. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + A container used for passing various style-defined properties used in TListView + + + + +Implements the IListItemStyleResources.GetStyleResources method. +The GetStyleResources method of TListViewBase implements the GetStyleResources method of IListItemStyleResources. + + + + + + +Implements the IListItemStyleResources.StyleResourcesNeedUpdate method. +The StyleResourcesNeedUpdate method of TListViewBase implements the StyleResourcesNeedUpdate method of FMX.ListView.Types.IListItemStyleResources. + + + + + + +Protected setter implementation for the ItemSpaces property. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + + +Renders the list view. + + + +Restores Canvas properties after the painting process. +FMX.ListView.TListViewBase.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + +Initializes the component after the form file has been read into memory. +FMX.ListView.TListViewBase.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.ListView.TListViewBase.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.ListView.TListViewBase.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.ListView.TListViewBase.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +OnMouseWheel event dispatcher. +FMX.ListView.TListViewBase.MouseWheel inherits from FMX.Controls.TControl.MouseWheel. All content below this line refers to FMX.Controls.TControl.MouseWheel. +OnMouseWheel event dispatcher. +A control calls MouseWheel in response to any of mouse wheel messages, decoding the message parameters into the shift-key state, wheel rotation, and handle, which it passes in the Shift, WheelDelta, and Handled parameters, respectively: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +Handled indicates whether the scroll bar was already moved, depending on the WheelDelta value. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the rolling on the other scroll bar, if it exists. +Override the protected MouseWheel method to provide other responses when the mouse wheel is rotated while the cursor is over the control. + + + + + + + + +Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.ListView.TListViewBase.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + + + + + +Returns the control in which a specified point can be found. +FMX.ListView.TListViewBase.ObjectAtPoint inherits from FMX.Controls.TControl.ObjectAtPoint. All content below this line refers to FMX.Controls.TControl.ObjectAtPoint. +Returns the control in which a specified point can be found. +P is the specified point in the object. +ObjectAtPoint returns the control in which the P point is found. +To start searching within the current control, the control must be visible and enabled. If P is within a child of the control and the child is also a control, the search continues inside the child. +If P is inside the control (not within a child) and the control can be hit, then ObjectAtPoint returns the control. +ObjectAtPoint is used internally. + + + +OnMouseLeave event dispatcher. +FMX.ListView.TListViewBase.DoMouseLeave inherits from FMX.Controls.TControl.DoMouseLeave. All content below this line refers to FMX.Controls.TControl.DoMouseLeave. +OnMouseLeave event dispatcher. +DoMouseLeave is called automatically when the mouse pointer leaves the control's area. +DoMouseLeave starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to background the control. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the control's area. + + + +OnResize event dispatcher. +FMX.ListView.TListViewBase.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.ListView.TListViewBase.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + +Customizes styles in complex objects. +FMX.ListView.TListViewBase.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.ListView.TListViewBase.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Forces the repainting of the surface of the rectangle holding this list view component. + + + +Realigns and repaints the ListView. + + + +OnExit event dispatcher. +FMX.ListView.TListViewBase.DoExit inherits from FMX.Controls.TControl.DoExit. All content below this line refers to FMX.Controls.TControl.DoExit. +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + +Responds to changing the visibility or appearance of the list view component and also to changing the indexes of list items. +The DoChange method also fires an OnChange event. + + + + +Handles the TDelayedIncident.ChangeRepainted incident. + + + + + + +Invokes the OnItemChange handler. + + + + + + + + + +Invokes the OnListItemClick handler. + + + + + + + + + +Invokes the OnEditModeChange handler. + + + + + + +Responds to entering of the list view into edit mode. +The DoEditModeChanging method also fires an OnEditModeChanging event. + + + + + + + +Called at the end of the animation that plays when the edit mode is toggled. + + + + + + +Updates the scrolling limits and animation boundaries. + + + + + + +Called before the items of the adapter might change as a result of filtering or sorting. +FMX.ListView.TListViewBase.DoItemsMayChange inherits from FMX.ListView.TAdapterListView.DoItemsMayChange. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsMayChange. +Called before the items of the adapter might change as a result of filtering or sorting. + + See Also +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsInvalidate +FMX.ListView.TAdapterListView.DoItemsResize + + + + +Called after the items of the adapter might have changed as a result of filtering or sorting. +FMX.ListView.TListViewBase.DoItemsCouldHaveChanged inherits from FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged. +Called after the items of the adapter might have changed as a result of filtering or sorting. + + See Also +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsResize +FMX.ListView.TAdapterListView.DoItemsInvalidate + + + + +Called when the items of the adapter need to be painted again. +FMX.ListView.TListViewBase.DoItemsInvalidate inherits from FMX.ListView.TAdapterListView.DoItemsInvalidate. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsInvalidate. +Called when the items of the adapter need to be painted again. + + See Also +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsResize +FMX.Controls.TControl.Repaint + + + + +Called after the items of the adapter change. +FMX.ListView.TListViewBase.DoItemsChange inherits from FMX.ListView.TAdapterListView.DoItemsChange. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsChange. +Called after the items of the adapter change. + + See Also +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsInvalidate +FMX.ListView.TAdapterListView.DoItemsResize + + + + + +Called right after the adapter of the list view is set. +FMX.ListView.TListViewBase.DoAdapterSet inherits from FMX.ListView.TAdapterListView.DoAdapterSet. All content below this line refers to FMX.ListView.TAdapterListView.DoAdapterSet. +Called right after the adapter of the list view is set. + + + + + +Deletes an item. + + + + + + + + + + +Delets a specific item. +It is called from DeleteItem + + + + + + + +Returns the area available for item layout. + + + + + + + True + + + + + + + +Returns the size of the item. + + + + + + + True + + + + + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + +Notify observers about the selection change. + + + + + + + + + +Returns True if this ListView should handle input events. + + + + + + + + + +Dispatches the OnUpdatingItemView event. +DoUpdatingItemView receives the following parameters: + +AListItem is the target list view item. +AHandled determines whether the event handler of OnUpdatingItemView takes care of updating the appearance of the list view item (True) or DoUpdatingItemView must update the appearance of the list view item instead (False). +DoUpdatingItemView passes itself (as the Sender parameter) and the received AListItem and AHandled parameters to the event handler of OnUpdatingItemView. + + + + + + + + + + + +Dispatches the OnUpdateItemView event. +DoUpdateItemView receives a single parameter, AItem, which is the target list view item. +DoUpdateItemView passes itself (as the Sender parameter) and the received AItem to the event handler of OnUpdateItemView. + + + +Gets the glyph button for item Index. + + + + + + + + Glyph button is an additional control usually used in Edit mode. It can be an Add/Plus sign, + a Delete button or a Checkbox + + + + + + +Occurs before the item view is updated (before calling ResetObjects). + + + + + + +Occurs after the item view is updated (after calling ResetObjects). + + + + + + +Occurs immediately after the list view component enters the edit mode. +Write an OnEditModeChange event handler to provide additional functionality after entering the edit mode. +OnEditModeChange is an event of type TNotifyEvent. + + + + +Occurs immediately before the list view component enters the edit mode. +Write an OnEditModeChanging event handler to provide additional functionality before entering the edit mode. +OnEditModeChanging is an event of type TNotifyEvent. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListView.TListViewBase.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListView.TListViewBase.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Marks the end of an update session of the control and its children. +FMX.ListView.TListViewBase.EndUpdate inherits from FMX.Controls.TControl.EndUpdate. All content below this line refers to FMX.Controls.TControl.EndUpdate. +Marks the end of an update session of the control and its children. +The update session must be started first by calling BeginUpdate. +EndUpdate decreases the FUpdating semaphore. If all update sessions end and FUpdating is 0, EndUpdate invokes Realign to process layout changes. + + See Also +FMX.Controls.TControl.FUpdating +FMX.Controls.TControl.BeginUpdate +FMX.Controls.TControl.IsUpdating +FMX.Controls.TControl.Realign + + + + +Re-creates the list and updates visible item content when using native presentation. + + + + +Scrolls the view instantly (without scrolling effect) to the desired item, placing it in the view. +Use the ScrollTo method in order to immediately scroll, without a slow scrolling graphical effect, to the item specified through its index (the AItemIndex parameter), and place it in the view. + + + + + + + +Specifies the index of the selected item in this list view component. + + + + +List item that is currently selected on the list view. +This property is nil if no item is selected. +To use Selected as an instance of Appearances.TListViewItem, you must cast it as such: + + +Delphi: + +SelectedItemText := TListViewItem(TListView1.Selected).Text; + + + +C++: + +SelectedItemText = ((TListViewItem*)(TListView1->Selected))->Text; + + + + + +Specifies the position of the vertical scroll in the list. Setting ScrollViewPos to 0 scrolls the list view to its top. + + + + +Returns a TRectF that surrounds the specified item. +The GetItemRect method returns a rectangle with floating-point coordinates (TRectF) that surrounds the item specified through its index (the AItemIndex parameter). + + + + + + + + +StopPullRefresh is a boolean method. It should be called when the "pull to refresh" mode has been triggered to stop the spinning wheel. +StopPullRefresh can be set to + +True, as result the spinning wheel does not disappear automatically and StopPullRefresh method needs to be called after the refresh operation is done. +False (default value), as result the spinning wheel disappears automatically shortly after triggering the effect. +Note: This works only in native IOS control and only when the PullRefreshWait property is set to True. + + + +Specifies the space in logical units around the content of each list item. + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +Specifies the space in logical units on all sides around the list box, encompassing the items. + + + + +Specifies whether this list view control is transparent or not. When the control is transparent (Transparent is set to True), its background will not be drawn. + + + + +Specifies whether the items are selectable or not. +The AllowSelection property specifies whether the items are selectable or not. + +Tip: If items are not selectable, you will still be able to click on the embedded controls. + + +Specifies whether the fill colors for odd and even elements are rendered as alternating or not. +The AlternatingColors property specifies whether the background of the individual items in the list should appear rendered in alternating colors. + + + +Determines whether the selection is visible when selecting list view items. The ShowSelection property can be disabled when the list view has check boxes. + + + + +Sets the swipe-to-delete feature on list view items. +CanSwipeDelete specifies that a swipe gesture on individual list view items enables the end user to choose either to delete or retain the item. +When this feature has been enabled in the Object Inspector, and the end user swipes an item in a listview, the user has the opportunity to delete the item: a Delete button temporarily appears on the item. The user can then click the Delete button to delete the item from the listview, or can release the swipe to retain the item in the list view. + +Tip: When you swipe an item, this item shows the same behavior and appearance as a list item selected when your list view is in edit mode. For a preview of this appearance, see TPublishedAppearance.ItemEditAppearance. +The swipe-to-delete feature is supported on mobile apps (iOS and Android), as well as desktop apps (Windows and OS X) when touch input is available. + + + + +Specifies whether tapping on the topmost side of this list view automatically scrolls to the top of the list. +Set the AutoTapScroll property to True in order to allow for automatically scrolling to the top of the list when tapping with your finger on the topmost region of this list view component. Set AutoTapScroll to False in order to disable this feature. + + + + +Specifies the threshold value for the auto tap scrolling. + + + + +Specifies whether scrolling this list view using the mouse wheel works or not. +Set the DisableMouseWheel property to False to allow scrolling this list view using the mouse wheel. Set DisableMouseWheel to True to disable this feature. + + + + +Specifies the number of items in this list view component. ItemCount is a read-only property. +Read the ItemCount property in order to obtain the number of list items in this list view component. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Occurs immediately after clicking an item from the list view. OnItemClickEx also receives mouse coordinates inside the clicked item. +Write an OnItemClickEx event handler to respond to clicking an item from the list view component. +It is safe to modify the contents of the list view in the OnItemClickEx event handler (you may add, remove, update or change the order of list view items). If you do not need to do that, you can also use OnItemClick event handler. It is safe to modify the content of the items themselves in both of those handlers. +The OnItemClickEx event handler receives the following parameters: + + + +Parameter + +Description + + + +Sender + + + +The instance of TCustomListView to which the clicked item belongs. + + + + +ItemIndex + + + +The index of the clicked item. + + + + +LocalClickPos + + + +The coordinates of the click. + + + + +ItemObject + + + +The instance of TListItemObject that you click on. + + + + + +Occurs immediately after changing the selected item from the list view. +Write an OnItemChange event handler to respond when changing the selected item in the list view component. +OnItemChange is an event of type TItemEvent. + + + + +Occurs when the ItemIndex property changes as a result of a user selecting a different item. +Write an OnChange event handler to respond to changes of the ItemIndex property. OnChange allows a response once the list has been successfully changed. +OnChange is an event of type TNotifyEvent. If you want to wait for the list to be repainted to reflect the change, see OnChangeRepainted. + +Note: The OnChange event does not occur when you change the ItemIndex property from code. That is the intended functionality. If you want to replicate the behaviour of a user selecting a different item, call OnChange explicitly. + + + +Occurs when the ItemIndex property changes as a result of a user selecting a different item. +Write an OnChangeRepainted event handler to respond to changes of the ItemIndex property. OnChangeRepainted allows a response once the list has been successfully changed and repainted. +OnChangeRepainted is an event of type TNotifyEvent. If you do not need to wait for the list to be repainted to reflect the change, see OnChange. + +Note: The OnChangeRepainted event does not occur when you change the ItemIndex property from code. That is the intended functionality. If you want to replicate the behaviour of a user selecting a different item, call OnChangeRepainted explicitly. + + + +Event that occurs after a list of items has been changed. + + + + +This method is called when ScrollViewPos has changed as a result of scrolling a list or doing it manually in the code. + + + + +Occurs when a user requests the deletion of a list view item, before this deletion takes place. You can define an event handler for this event to prevent the deletion from actually happening based on your own criteria. +Event handlers for this event must expect the following parameters: + +Sender, the list view. +AIndex, the index of the list view item to be deleted. +ACanDelete, variable that determines whether the list view item is to be deleted or not. +To prevent the deletion from happening, set ACanDelete to False in your event handler. +The code snippet below shows a dialog box asking for confirmation before deleting an item. If you click Cancel, ACanDelete is set to False, canceling the list view item deletion: + + +Delphi: + +procedure TMainForm.ListViewDeletingItem(Sender: TObject; AIndex: Integer; var ACanDelete: Boolean); +var + Input: Integer; +begin + Input := TDialogServiceSync.MessageDialog( + 'Are you sure that you want to remove "' + + (Sender as TListView).Items[AIndex].Text + '" from the list?', + TMsgDlgType.mtConfirmation, mbOKCancel, TMsgDlgBtn.mbOK, 0); + if Input = 2 then // Cancel + ACanDelete := False; +end; + + + +C++: + +void __fastcall TMainForm::ListViewDeletingItem(TObject *Sender, int AIndex, bool &ACanDelete) +{ + TListView* list = reinterpret_cast<TListView*>(Sender); + int input = TDialogServiceSync::MessageDialog( + "Are you sure that you want to remove \"" + + list->Items->Item[AIndex]->Text + "\" from the list?", + TMsgDlgType::mtConfirmation, mbOKCancel, TMsgDlgBtn::mbOK, 0); + if (input == 2) { // Cancel + ACanDelete = false; + } +} + + + + + +Occurs when a user requests the deletion of a list view item, after this deletion takes place. To catch the deletion before it takes place and be able to prevent it from actually happening, write an event handler for OnDeletingItem instead. +Event handlers for this event must expect the following parameters: + +Sender, the list view. +AIndex, the index of the list view item that has been deleted. +Note: You cannot access the data of the deleted item at this point, since a different item is now using that index in the list view. Write an event handler for OnDeletingItem instead if you need to access information about the deleted item. +The code snippet below updates the text in a status bar after an item is deleted to show the position of the deleted item, as well as the number of remaining items in the list: + + +Delphi: + +procedure TMainForm.ListViewDeleteItem(Sender: TObject; AIndex: Integer); +begin + StatusBar.Text := 'Item ' + IntToStr(AIndex+1) + ' has been removed from the list. ' + + IntToStr((Sender as TListView).Items.Count) + ' items remaining.'; +end; + + + +C++: + +void __fastcall TMainForm::ListViewDeleteItem(TObject *Sender, int AIndex) +{ + TListView* list = reinterpret_cast<TListView*>(Sender); + MainForm->StatusBar->Text = "Item " + UnicodeString(AIndex+1) + " has been removed from the list. " + + UnicodeString(list->Items->Count) + " items remaining."; +} + + + + + +Occurs when the visibility of the Delete button of a list item changes. +This event only works when you hide or show the Delete button displayed after a swipe gesture. It does not work when you hide or show the Delete button of a list item when your list view is in edit mode and your list uses an edit mode item appearance of type "Delete". +Sender is the list view and AValue determines whether the Delete button was hidden (False) and now is visible, or it was visible (True) and now is hidden. +For example, the following event handler fills a status bar with a tip when a Delete button is shown on a list item, and removes that tip from the status bar as soon as the Delete button is hidden again: + + +Delphi: + +procedure TMainForm.ListViewDeleteChangeVisible(Sender: TObject; AValue: Boolean); +begin + if (AValue = False) then + StatusBar.Text := 'Click "Delete" to remove the target item from the list.' + else + StatusBar.Text := ''; +end; + + + +C++: + +void __fastcall TMainForm::ListViewDeleteChangeVisible(TObject *Sender, bool AValue) +{ + if (AValue) { + MainForm->StatusBar->Text = "Click \"Delete\" to remove the target item from the list."; + } else { + MainForm->StatusBar->Text = ""; + } +} + + + + + +Occurs when the search box in a list view loses the focus and its content has changed since it gained the focus. This event exposes the OnChange event of the TSearchBox that implements the search box of a list view. +For example, the code snippet below updates the text in a status bar on this event to show the number of items left in the list after the specified filter is applied: + + +Delphi: + +procedure TMainForm.ListViewSearchChange(Sender: TObject); +var + I: Integer; + SearchBox: TSearchBox; + List: TListView; +begin + List := Sender as TListView; + for I := 0 to List.Controls.Count-1 do + if List.Controls[I].ClassType = TSearchBox then + begin + SearchBox := TSearchBox(List.Controls[I]); + Break; + end; + StatusBar.Text := IntToStr(List.Items.Count) + ' list items match ' + QuotedStr(SearchBox.Text) + '.'; +end; + + + +C++: + +void __fastcall TMainForm::ListViewSearchChange(TObject *Sender) +{ + TSearchBox* searchBox; + TListView* list = reinterpret_cast<TListView*>(Sender); + for (int i = 0; i < list->Controls->Count; i++) { + searchBox = dynamic_cast<TSearchBox*>(list->Controls->Items[i]); + if (searchBox) break; + } + MainForm->StatusBar->Text = UnicodeString(list->Items->Count) + " list items match " + QuotedStr(searchBox->Text) + "."; +} + + + + + +Occurs when a search box filters. +Write an event handler for OnFilter to set a custom search filter for TSearchBox. +The OnFilter event with the TFilterEvent type has the following parameters: + + + +Parameter + +Description + + +Sender + +The object whose event handler is called. + + +AFilter + +The string being filtered among the different items (AValue parameter). + + +AValue + +The string of the item where the search of AFilter is being performed. + + +Accept + +Boolean parameter to use when there is a filter condition. +Use Accept to add a filter condition; if a value is filtered by the filter condition, Accept must be True. + + + +For example, the below code snippet adds a custom filter to force the item (AValue) to start with the string being filtered (AFilter): + + +Delphi: + +procedure TForm2.ListView1Filter(Sender: TObject; const AFilter, AValue: string; + var Accept: Boolean); +begin + Accept := AValue.StartsWith(AFilter, True); +end; + + + +C++: + +void __fastcall TForm1::ListView1Filter(TObject *Sender, const UnicodeString AFilter, + const UnicodeString AValue, bool &Accept) +{ + Accept = StartsStr(AFilter.LowerCase(), AValue.LowerCase()); +} + + +Note: Enable the SearchVisible property to show the search box on top of your list view. + + + + +Occurs when a user pulls down the item list. +Write an event handler for OnPullRefresh to specify what happens when you pull down the list of items. + +Note: For this event to occur, you should set the PullToRefresh property to true. + + + +Specifies the name of the Delete button designed to delete the TListView items. +This button can be displayed if the CanSwipeDelete property is set True. + + + + +Specifies whether this list view component is in the edit mode (True) or in the regular mode (False). +On some platforms, the list view shows an animation when the value of the EditMode property changes at run time. + + + + + Set SearchVisible to True to show a search box on top of your list view +Shows a search box on top of your list view that can filter the content of the list. +To access the search box control from code, simply loop trough the controls of your list view until you find an instance of TSearchBox. For an example, see the code snippet at FMX.ListView.TListViewBase.OnSearchChange. + + + + + Search box partially hidden in a list view where SearchAlwaysOnTop is False +Your list view component keeps the search box on top as you scroll. If SearchAlwaysOnTop is False, the search box behaves as a list item: scrolling down the list hides the search box, and you must scroll up to show the search box again. +SearchAlwaysOnTop has no effect if SearchVisible is False. +SearchAlwaysOnTop is supported only on the iOS platform. + + + + +Enables the selection of Crossfade animation . + + + + + + +Determines whether the "pull list to refresh" feature is enabled. +When this property is set to true, the Pull-to-Refresh feature is enabled and the end user can pull down a list view to refresh the contents. +To enable the Pull-to-Refresh feature, select the TListView component in the Form Designer, and do the following: + +On the Properties page of the Object Inspector, set the PullToRefresh property to true. +Open the Events page, and double-click the right-hand column for OnPullRefresh. +When the Code Editor opens, you can implement the OnPullRefresh event handler. In this event handler, you can specify how to refresh the list view. For example, you might update existing list items, add new items, or delete specified items. +Note: In the case of native iOS controls, you can use the PullRefreshWait property to set whether the animated spinning indicator disappears automatically, or if it disappears when you call StopPullRefresh. + + + +Determines if the spinning wheel disappears automatically or not. +When set to True, the spinning wheel does not disappear automatically and you have to call the StopPullRefresh method after doing a refresh operation. If PullRefreshWait is set to False (default), then the spinning wheel disappears automatically shortly after triggering the effect. This option only works in native iOS controls and does not have effect otherwise. + +Note: You must set the PullToRefresh property to True to use PullRefreshWait. + + + +Describes if the Control type is Styled or Native. + + + + + + +Set of properties to customize the appearance and behavior of the list view when ControlType is Platform. +This group of properties provides the subproperties described in the following table. All subproperties are disabled by default. + + + +Subproperty + +Description + + + +Grouped + + + +Make cells use a grouped style. The grouped style is the style that the list of iOS settings uses. + + + +False + +True + + + + + + + + + +Indexed + + + +Shows an index on the right-hand side of the list with the first letter of each header. You may tap a letter to navigate to the header that the letter represents. +If you want to display something other than the first letter of each header, use the IndexTitle of each header item to define a custom text to show for that header. Long index titles may hide important information behind them, use no more than few characters. + + + +False + +True + + + + + + + + + +Styled + + + +Make the native presentation use the style settings defined in your list view control for the following aspects of your list view: + +Font +Text color and selected text color +Text alignment, both vertical and horizontal +Word wrapping and trimming +You cannot customize any other aspects of the native presentation of a list view. If you need to customize your list view further, change ControlType to Styled to use the regular FireMonkey presentation instead. + + + +False + +True + +ControlType: Styled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Executes the specified procedure as long as there is no other call to ExecuteInterlocked in progress called from a separate thread. If there is a call to ExecuteInterlocked in progress, the specified procedure is never executed. + + + + + + + + + +Returns True if the underlying data model allows the presentation layer to select the specified item; it returns False otherwise. + + + + + + + + +Returns True if the underlying data model allows the presentation layer to unselect the specified item; it returns False otherwise. + + + + + + + + +The presentation layer executes this method to indicate that it has selected the specified item. + + + + + + + +The presentation layer executes this method to indicate that it has unselected the specified item. + + + + + + + + + +Notification method called after the creation order is changed. +FMX.ListView.TPresentedListView.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + +Executed right after the value of the Parent property changes. +FMX.ListView.TPresentedListView.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + +Renders the child controls. +FMX.ListView.TPresentedListView.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + + + + +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. +FMX.ListView.TPresentedListView.AncestorVisibleChanged inherits from FMX.Controls.TControl.AncestorVisibleChanged. All content below this line refers to FMX.Controls.TControl.AncestorVisibleChanged. +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged + + + + + + + +Used internally by presentation hook. + +Used internally by presentation hook. + + + + + +Responds to entering of the list view into edit mode. +The DoEditModeChange method also fires an OnEditModeChange event. + + + +This virtual method is called inmediately after a list of items has been changed. + + + + + +Called when the items of the adapter need to be painted again. +FMX.ListView.TPresentedListView.DoItemsInvalidate inherits from FMX.ListView.TAdapterListView.DoItemsInvalidate. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsInvalidate. +Called when the items of the adapter need to be painted again. + + See Also +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsResize +FMX.Controls.TControl.Repaint + + + + + + + +Notifies the TListView that the item requires repainting. +FMX.ListView.TPresentedListView.DoItemInvalidated inherits from FMX.ListView.TListViewBase.DoItemInvalidated. All content below this line refers to FMX.ListView.TListViewBase.DoItemInvalidated. +Notifies the TListView that the item requires repainting. + + + + + + + + + +Notifies the TListView that a control inside of an item is clicked. +FMX.ListView.TPresentedListView.DoCheckStateChanged inherits from FMX.ListView.TListViewBase.DoCheckStateChanged. All content below this line refers to FMX.ListView.TListViewBase.DoCheckStateChanged. +Notifies the TListView that a control inside of an item is clicked. + + + + + + + + +Used internally by presentation hook. + +Used internally by presentation hook. + + + + + + + + +Used internally by presentation hook. + +Used internally by presentation hook. + + + + + + + + +Delets a specific item. +FMX.ListView.TPresentedListView.DoDeleteItem inherits from FMX.ListView.TListViewBase.DoDeleteItem. All content below this line refers to FMX.ListView.TListViewBase.DoDeleteItem. +Delets a specific item. +It is called from DeleteItem + + + +Called at the end of the animation that plays when the edit mode is toggled. +FMX.ListView.TPresentedListView.DoResetEditModeAnimation inherits from FMX.ListView.TListViewBase.DoResetEditModeAnimation. All content below this line refers to FMX.ListView.TListViewBase.DoResetEditModeAnimation. +Called at the end of the animation that plays when the edit mode is toggled. + + + + + +Updates the scrolling limits and animation boundaries. +FMX.ListView.TPresentedListView.DoUpdateScrollingLimits inherits from FMX.ListView.TListViewBase.DoUpdateScrollingLimits. All content below this line refers to FMX.ListView.TListViewBase.DoUpdateScrollingLimits. +Updates the scrolling limits and animation boundaries. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Notification that indicates that the ancestor of the TPresentedControl class loaded the presentation. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns True if this ListView should handle input events. + +FMX.ListView.TPresentedListView.ShouldHandleEvents inherits from FMX.ListView.TListViewBase.ShouldHandleEvents. All content below this line refers to FMX.ListView.TListViewBase.ShouldHandleEvents. +Returns True if this ListView should handle input events. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + IListViewAdapter provides interface between the data and their representation. + The essential part of this interface is implemented in FMX.ListView.Adapters.Base.TAbstractListViewAdapter + + + + + +Implements the IListViewPresentationParent.GetAdapter method. +The GetAdapter method of TPresentedListView implements the GetAdapter method of IListViewPresentationParent. + + + + + + + +Implements the IListViewPresentationParent.GetItemText method. +The GetItemText method of TPresentedListView implements the GetItemText method of IListViewPresentationParent. + + + + + + + +Implements the IListViewPresentationParent.GetItemIndexTitle method. +The GetItemIndexTitle method of TPresentedListView implements the GetItemIndexTitle method of IListViewPresentationParent. + + + + + + +Implements the IListViewPresentationParent.ItemButtonClicked method. +The ItemButtonClicked method of TPresentedListView implements the ItemButtonClicked method of IListViewPresentationParent. + + + +Implements the IListViewPresentationParent.InvokePullRefresh method. +The InvokePullRefresh method of TPresentedListView implements the InvokePullRefresh method of IListViewPresentationParent + + + + + + +Implements the IListViewPresentationParent.SetSearchFilter method. +The SetSearchFilter method of TPresentedListView implements the SetSearchFilter method of IListViewPresentationParent. + + + + + + Set of boolean flags used internally + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + View options specific to native iOS presentation. + IListViewPresentationParent + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sets a Boolean flag that indicates a native view is being created. It is used as a guard condition to prevent TListView logic from interfering with the presentation while a view is being initialized. + + + + + + + + +It is True if the TListView is transparent. + + + + + + + + +Gets to control opacity. + + + + + + + + +Gets the background color defined by the TListView style. + + + + + +Called when the size of the items of the adapter has changed. +FMX.ListView.TPresentedListView.DoItemsResize inherits from FMX.ListView.TAdapterListView.DoItemsResize. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsResize. +Called when the size of the items of the adapter has changed. + + See Also +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsInvalidate + + + + + + + +It is True if a design presentation is attached. + + + + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListView.TPresentedListView.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Performs any necessary actions before the first destructor is called. +Performs any necessary actions before the first destructor is called. +FMX.ListView.TPresentedListView.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + +Forces the current control to recalculate its enabled state. +FMX.ListView.TPresentedListView.RecalcEnabled inherits from FMX.Controls.TControl.RecalcEnabled. All content below this line refers to FMX.Controls.TControl.RecalcEnabled. +Forces the current control to recalculate its enabled state. RecalcEnabled also forces the control's children to recalculate their enabled state. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +OnResize event dispatcher. +FMX.ListView.TPresentedListView.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Renders the list view. + + + +Recreates the list and updates the visible items content in native presentation. +When using native presentation, RebuildList recreates the list and updates the visible items content. +To use the native presentation, you must set the ControlType property to Platform. + + + +This method should be called when 'pull to refresh' mode has been triggered to stop the spinning wheel. +StopPullRefresh has only effect in native iOS control and only when the PullRefreshWait property is set to True. + + + +Forces the current control to recalculate its Opacity property. +FMX.ListView.TPresentedListView.RecalcOpacity inherits from FMX.Controls.TControl.RecalcOpacity. All content below this line refers to FMX.Controls.TControl.RecalcOpacity. +Forces the current control to recalculate its Opacity property. RecalcOpacity also forces the control's children to recalculate their Opacity property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents appearance items (collections of objects comprising appearances) + in the object inspector + + + + + + + + + + + + + + + + + + + Represents properties of Item Appearance that define geometric properties of the entire ListViewItem, + specify AppearanceClass and AppearanceClassName that define Item Appearance Objects that comprise item's view. + + + + + + + + + + Represents properties of Item Appearance that define geometric properties of the entire ListViewItem, + specify AppearanceClass and AppearanceClassName that define Item Appearance Objects that comprise item's view. + + + + + + + + + + Represents properties of Item Appearance that define geometric properties of the entire ListViewItem, + specify AppearanceClass and AppearanceClassName that define Item Appearance Objects that comprise item's view. + + + + + + + + + + Represents properties of Item Appearance that define geometric properties of the entire ListViewItem, + specify AppearanceClass and AppearanceClassName that define Item Appearance Objects that comprise item's view. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.ListView.TAppearanceListView.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Handler of the TAppearanceListViewItems.OnNotify property. + + + + + + + + + + + +The TAppearanceListView needs adapter to be the TAppearanceListViewItems or derivative. +If the TAppearanceListView is used with a custom adapter, use the Items property to set it instead of the Adapter property of the base class. + + + + + + + + + + + + +Called when the view of the specified item of the adapter needs to be recreated. +FMX.ListView.TAppearanceListView.DoResetView inherits from FMX.ListView.TAdapterListView.DoResetView. All content below this line refers to FMX.ListView.TAdapterListView.DoResetView. +Called when the view of the specified item of the adapter needs to be recreated. + + + + + + + + +Returns True if each list view item contains one or more buttons, or False otherwise. +FMX.ListView.TAppearanceListView.HasButtonsInCells inherits from FMX.ListView.TListViewBase.HasButtonsInCells. All content below this line refers to FMX.ListView.TListViewBase.HasButtonsInCells. +Returns True if each list view item contains one or more buttons, or False otherwise. + + See Also +FMX.ListView.TListViewBase.CanSwipeDelete +FMX.ListView.TListViewBase.EditMode +FMX.ListView.TListViewBase.HasCheckboxMode +FMX.ListView.TListViewBase.HasDeletionEditMode +FMX.ListView.TListViewBase.PullRefreshWait +FMX.ListView.TListViewBase.PullToRefresh +FMX.ListView.TListViewBase.SearchAlwaysOnTop +FMX.ListView.TListViewBase.SearchVisible +FMX.Controls.TControl.Enabled +FMX.Controls.TControl.Visible + + + + + + + +Returns True if the list view supports a mode where you can select list view items to delete, or False otherwise. +FMX.ListView.TAppearanceListView.HasDeletionEditMode inherits from FMX.ListView.TListViewBase.HasDeletionEditMode. All content below this line refers to FMX.ListView.TListViewBase.HasDeletionEditMode. +Returns True if the list view supports a mode where you can select list view items to delete, or False otherwise. + + See Also +FMX.ListView.TListViewBase.CanSwipeDelete +FMX.ListView.TListViewBase.EditMode +FMX.ListView.TListViewBase.HasButtonsInCells +FMX.ListView.TListViewBase.HasCheckboxMode +FMX.ListView.TListViewBase.PullRefreshWait +FMX.ListView.TListViewBase.PullToRefresh +FMX.ListView.TListViewBase.SearchAlwaysOnTop +FMX.ListView.TListViewBase.SearchVisible +FMX.Controls.TControl.Enabled +FMX.Controls.TControl.Visible + + + + + + + +Returns True if the list view supports a mode where you can select list view items using checkboxes, or False otherwise. +FMX.ListView.TAppearanceListView.HasCheckboxMode inherits from FMX.ListView.TListViewBase.HasCheckboxMode. All content below this line refers to FMX.ListView.TListViewBase.HasCheckboxMode. +Returns True if the list view supports a mode where you can select list view items using checkboxes, or False otherwise. + + See Also +FMX.ListView.TListViewBase.CanSwipeDelete +FMX.ListView.TListViewBase.EditMode +FMX.ListView.TListViewBase.HasButtonsInCells +FMX.ListView.TListViewBase.HasDeletionEditMode +FMX.ListView.TListViewBase.PullRefreshWait +FMX.ListView.TListViewBase.PullToRefresh +FMX.ListView.TListViewBase.SearchAlwaysOnTop +FMX.ListView.TListViewBase.SearchVisible +FMX.Controls.TControl.Enabled +FMX.Controls.TControl.Visible + + + + + + + +Setter of ItemHeight. + + + + + + +Setter of ItemEditHeight. + + + + + + +Setter of HeaderHeight. + + + + + + +Setter of FooterHeight. + + + + + + + Extension of TListItem that supports Appearances. + Forms content of TAppearanceListViewItems + + + + +Returns the list view item that is located at the specified index of the list of items. + + + + + +Returns the height of the list view item that has the specified index in the list of items, or the value of ItemHeight if you do not specify any index. + + + + + + + + + + + +Returns the height of the list view item that has the specified index in the list of items, or the value of ItemHeight if you do not specify any index. + + + + + + +Getter of ItemEditHeight. + + + + + + +Getter of HeaderHeight. + + + + + + +Getter of FooterHeight. + + + + + + +Invoked when the Edit mode is being changed. + +FMX.ListView.TAppearanceListView.WillEnterEditMode inherits from FMX.ListView.TListViewBase.WillEnterEditMode. All content below this line refers to FMX.ListView.TListViewBase.WillEnterEditMode. +Invoked when the Edit mode is being changed. +If the Edit mode requires a different appearance, this is where an update of appearances needs to be initiated. + + + + + +Called at the end of the animation that plays when the edit mode is toggled. +FMX.ListView.TAppearanceListView.DoResetEditModeAnimation inherits from FMX.ListView.TListViewBase.DoResetEditModeAnimation. All content below this line refers to FMX.ListView.TListViewBase.DoResetEditModeAnimation. +Called at the end of the animation that plays when the edit mode is toggled. + + + + + + + +Called right after the adapter of the list view is set. +FMX.ListView.TAppearanceListView.DoAdapterSet inherits from FMX.ListView.TAdapterListView.DoAdapterSet. All content below this line refers to FMX.ListView.TAdapterListView.DoAdapterSet. +Called right after the adapter of the list view is set. + + + + + + + + +Hook for the IListViewController.RequestReindexing. +FMX.ListView.TAppearanceListView.DoRequestReindexing inherits from FMX.ListView.TListViewBase.DoRequestReindexing. All content below this line refers to FMX.ListView.TListViewBase.DoRequestReindexing. +Hook for the IListViewController.RequestReindexing. + + + + + + + + +Hook for the IListViewController.ItemResized. +FMX.ListView.TAppearanceListView.DoItemResized inherits from FMX.ListView.TListViewBase.DoItemResized. All content below this line refers to FMX.ListView.TListViewBase.DoItemResized. +Hook for the IListViewController.ItemResized. + + + + + + + + + + + +Notifies the TListView that a control inside of an item is clicked. +FMX.ListView.TAppearanceListView.DoCheckStateChanged inherits from FMX.ListView.TListViewBase.DoCheckStateChanged. All content below this line refers to FMX.ListView.TListViewBase.DoCheckStateChanged. +Notifies the TListView that a control inside of an item is clicked. + + + + + + + + + +Notifies the TListView that an item is clicked. +FMX.ListView.TAppearanceListView.DoControlClicked inherits from FMX.ListView.TListViewBase.DoControlClicked. All content below this line refers to FMX.ListView.TListViewBase.DoControlClicked. +Notifies the TListView that an item is clicked. + + + + + +Returns an array with the objects of appearance properties of list view items. +The array contains the objects of appearance properties in the following order: + +Appearance of regular items in edit mode. +Appearance of regular items. +Appearance of header items. +Appearance of footer items. + + + + + + + + +Refresh items with specified purposes. +Refresh all items if the set is empty. + + + + + [] + + + + + + +Refresh items with specified purposes. + + + + + + +Called when the appearance of the items is changed. + + + + + + + +Notifies the owner of the change in the appearance view. + + + + + + + + + +Called when the heights of the items are changed. + + + + + + + +Prepares the appearance of the list view items for the animation that plays when the list view enters the edit mode. +The list view calls EditModeAppearances when the EditMode property of the list view changes from False to True and the run-time platform supports edit mode animations, provided that the event handler of OnEditModeChanging did not prepare the appearance already. + + + + + + +Fills the AppearanceClass property of the specified instance of TItemAppearanceProperties with a default value. + + + + + + + + + + +Dispatches the OnItemClick event. +DoListItemClick receives a single parameter, AItem, which is the clicked list view item. +If AItem is an instance of TListViewItem, DoListItemClick passes itself (as the Sender parameter) and the received AItem to the event handler of OnItemClick. + + + + + + + + + +Dispatches the OnUpdatingItemView event. +DoUpdatingItemView receives the following parameters: + +AListItem is the target list view item. +AHandled determines whether the event handler of OnUpdatingItemView takes care of updating the appearance of the list view item (True) or DoUpdatingItemView must update the appearance of the list view item instead (False). +DoUpdatingItemView passes itself (as the Sender parameter) and the received AListItem and AHandled parameters to the event handler of OnUpdatingItemView. +If AListItem is an instance of TListViewItem, DoUpdatingItemView also passes itself (as the Sender parameter) and the received AListItem and AHandled parameters to the event handler of OnUpdatingObjects. + + + + + + +Dispatches the OnUpdateItemView and OnUpdateObjects events. +DoUpdateItemView receives a single parameter, AItem, which is the target list view item. +DoUpdateItemView passes itself (as the Sender parameter) and the received AItem to the event handler of OnUpdateItemView. +If AItem is an instance of TListViewItem, DoUpdateItemView also passes itself (as the Sender parameter) and the received AItem to the event handler of OnUpdateObjects. + + + +Height in pixels of each regular list view item. + + + + +Height in pixels of each regular list view item when the list view is in edit mode. + + + + +Height in pixels of each header list view item. + + + + +Height in pixels of each footer list view item. + + + + +Name of the appearance class of regular list view items in edit mode. + + + + +Name of the appearance class of regular list view items. + + + + +Name of the appearance class of header list view items. + + + + +Name of the appearance class of footer list view items. + + + + +Name of the appearance of regular list view items. +When your list view switches between display mode and edit mode, the item appearance switches between the appearance defined in the ItemAppearanceName property (display mode) and the appearance defined in the ItemEditAppearanceName property (edit mode). Items may display an animation as their appearance changes. +Possible values are: + + + +ItemAppearanceName + +ItemEditAppearanceName + +List Item Preview + + +Not Selected + +Selected + + +Custom + +Custom + + + + + + +ImageListItem + +ImageListItemDeleteImageListItemShowCheck + + + + + + +ImageListItemBottomDetail + +ImageListItemBottomDetailShowCheck + + + + + + +ImageListItemBottomDetailRightButton + +ImageListItemBottomDetailRightButtonShowCheck + + + + + + +ImageListItemRightButton + +ImageListItemRightButtonDeleteImageListItemRightButtonShowCheck + + + + + + +ListItem + +ListItemDeleteListItemShowCheck + + + + + + +ListItemRightDetail + +ListItemRightDetailDeleteListItemRightDetailShowCheck + + + + + + + + +Name of the appearance of regular list view items in edit mode. +When your list view switches between display mode and edit mode, the item appearance switches between the appearance defined in the ItemAppearanceName property (display mode) and the appearance defined in the ItemEditAppearanceName property (edit mode). Items may display an animation as their appearance changes. +You can find the possible values in the table below. + + + +ItemEditAppearance + +ItemAppearanceName + +Editing Mode + +List Item Preview + + +Not Selected + +Selected + + +Custom + +Custom + +Custom + + + + + + +ImageListItemBottomDetailShowCheck + +ImageListItemBottomDetail + +Select + + + + + + +ImageListItemBottomDetailRightButtonShowCheck + +ImageListItemBottomDetailRightButton + +Select + + + + + + +ImageListItemDelete + +ImageListItem + +Delete + + + + + + +ImageListItemRightButtonDelete + +ImageListItemRightButton + +Delete + + + + + + +ImageListItemRightButtonShowCheck + +ImageListItemRightButton + +Select + + + + + + +ImageListItemShowCheck + +ImageListItem + +Select + + + + + + +ListItemDelete + +ListItem + +Delete + + + + + + +ListItemRightDetailDelete + +ListItemRightDetail + +Delete + + + + + + +ListItemRightDetailShowCheck + +ListItemRightDetail + +Select + + + + + + +ListItemShowCheck + +ListItem + +Select + + + + + +Each edit mode item appearance matches a display mode item appearance (ItemAppearanceName). The type of editing mode described in the table above determines how list items behave. + + + +Item + +Behavior + + +Delete + +Tap a list item to show a Delete button. Tap Delete to delete the item, tap anywhere else to hide the Delete button. + + +Select + +Tap a list item to select it. Tap again to unselect it. You can select more than one item (multiselect). + + +Custom + +Your custom implementation of the edit mode item appearance determines the behavior of list items. + + + + +Name of the appearance of header list view items. +Possible values are: + + + +Item + +Description + + +Custom + +Custom appearance. + + +ListHeader + +Default appearance. + + + + +Name of the appearance of footer list view items. +Possible values are: + + + +Item + +Description + + +Custom + +Custom appearance. + + +ListHeader + +Default appearance. + + + +Specifies the various options that are used when rendering the list view items. + +Note: This is a design-time property. At run time access the relevant properties of the list view instead. See TPublishedAppearance for more information. +Use the ItemAppearance property in order to control how an item from this list view component is displayed. The ItemAppearance property controls the footer, header, and list item appearance and height, and also the list item appearance and height when in edit mode. + + + +Allows you to specify properties of individual item appearance objects. These objects include footer, header, item, and item in edit mode objects. +Use the ItemAppearanceObjects property in order to control various properties of the objects that might be part of this list view component. For instance, you can specify accessory and text settings for the items or you can affect text settings for the footer and header items. + + + + +Occurs immediately when you check a glyph button (such as a check box or a delete button) inside a list view item. +Write an OnButtonChange event handler to provide additional functionality when checking a glyph button (such as a check box or a delete button) inside a list view item. + + + + +Occurs immediately when you click on a text button or a glyph button inside a list view item. +Write an OnButtonClick event handler to provide additional functionality when clicking on a text button or a glyph button inside a list view item. + + + + + + + +Creates an instance of TAppearanceListView with the specified component as its owner. + + + + + +Destroys this instance of TAppearanceListView. + + + +Marks the start of an update session of the control and its children. +FMX.ListView.TAppearanceListView.BeginUpdate inherits from FMX.Controls.TControl.BeginUpdate. All content below this line refers to FMX.Controls.TControl.BeginUpdate. +Marks the start of an update session of the control and its children. +It increases the value of the FUpdating semaphore. A call to BeginUpdate must be complemented by calls to EndUpdate after the update is finished. +FUpdating is an internal semaphore used to mark the process of control updating. Painting of a control is disabled while FUpdating is higher than 0. + + See Also +FMX.Controls.TControl.FUpdating +FMX.Controls.TControl.EndUpdate +FMX.Controls.TControl.IsUpdating + + + + +Marks the end of an update session of the control and its children. +FMX.ListView.TAppearanceListView.EndUpdate inherits from FMX.Controls.TControl.EndUpdate. All content below this line refers to FMX.Controls.TControl.EndUpdate. +Marks the end of an update session of the control and its children. +The update session must be started first by calling BeginUpdate. +EndUpdate decreases the FUpdating semaphore. If all update sessions end and FUpdating is 0, EndUpdate invokes Realign to process layout changes. + + See Also +FMX.Controls.TControl.FUpdating +FMX.Controls.TControl.BeginUpdate +FMX.Controls.TControl.IsUpdating +FMX.Controls.TControl.Realign + + + + + + + + +OnResize event dispatcher. +FMX.ListView.TAppearanceListView.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Provides access to individual items in this list view component. +Use the Items property in order to access each individual item stored in this list view component. The Items property is also used if you want to add items to the list view, in a programmatic manner. Otherwise, you would normally add the items automatically via LiveBindings. + + + + +Occurs immediately after clicking an item from the list view. +Write an OnItemClick event handler to respond to clicking on an item from the list view component. +OnItemClick is an event of type TItemEvent. +Do not modify the contents of the list view in the OnItemClick event handler (do not add, remove, update or change the order of list view items). If you need to do that, use OnItemClickEx event handler instead. It is safe to modify the content of the items themselves in both of those handlers. +The OnItemClick event handler receives the following parameters: + + + +Parameter + +Description + + + +Sender + + + +The instance of TCustomListView to which the clicked item belongs. + + + + +AItem + + + +The instance of Appearances.TListViewItem that you click on. + + + + + +Occurs immediately before the list view component is updated. +Write an OnUpdatingObjects event handler to provide additional functionality before updating the list view component. +OnUpdatingObjects is an event of type TItemEvent. + + + + +Occurs immediately after the list view component is updated. +Write an OnUpdateObjects event handler to provide additional functionality after updating the list view component. +OnUpdateObjects is an event of type TItemEvent. + + + + + + + + + + + + + + + +Fills the AppearanceClass property of the specified instance of TItemAppearanceProperties with a default value. +FMX.ListView.TListView.InitializeItemAppearance inherits from FMX.ListView.TAppearanceListView.InitializeItemAppearance. All content below this line refers to FMX.ListView.TAppearanceListView.InitializeItemAppearance. +Fills the AppearanceClass property of the specified instance of TItemAppearanceProperties with a default value. + + See Also +FMX.ListView.TAppearanceListView.Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a FireMonkey list view component that you can use to hold and present various types of items. +The TListView displays a collection of items in a list that is optimized for LiveBindings and for fast and smooth scrolling. +The items in the list view can have one or more of the following appearance features: + +A caption or detail text (for example, using the Item.Text bindable member of TListView) +An associated image (for example, using the Item.Bitmap bindable member of TListView) +An accessory icon (for example, using the ItemEditAppearance property in the Object Inspector) +A graphic or a text button attached (for example, using the Item.ButtonText bindable member of TListView) +You can customize the appearance of a list view by modifying the layout of the list items, including the caption, the associated image, text details, or the accessory icon. +TListView has the edit mode in which you can select several items. + +Example +You can add items to a TListView either by binding to a data source, or by code (TListView.Items.Add). +Here is a code example that shows how to add items to a TListView: + + +Delphi: + +var + LItem: TListViewItem; + I: Integer; +begin + for I := 1 to 10 do + begin + LItem := ListView1.Items.Add; + LItem.Text := IntToStr(I); + end; +end; + +// To achieve the best performance use BeginUpdate and EndUpdate. + +var + LItem: TListViewItem; + I: Integer; +begin + ListView1.BeginUpdate; + try + for I := 1 to 10 do + begin + LItem := ListView1.Items.Add; + LItem.Text := IntToStr(I); + end; + finally + ListView1.EndUpdate; + end; +end; + + + +C++: + +for (int i = 1; i <= 10; i++) { + TListViewItem* item = ListView1->Items->Add(); + item->Text = IntToStr(i); +} + +// To achieve the best performance use BeginUpdate and EndUpdate. + +ListView1->BeginUpdate(); +try { + for (int i = 1; i <= 10; i++) { + TListViewItem* item = ListView1->Items->Add(); + item->Text = IntToStr(i); + } +} catch (...) { +} +ListView1->EndUpdate(); + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Media.xml b/Modules/DelphiFMX/doc/FMX.Media.xml new file mode 100644 index 00000000..558c921e --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Media.xml @@ -0,0 +1,6436 @@ + + + + $989680 + + + + + + + + + Is a record used to convert the time of a media player into + conventional formats. + + + + + Return time of player in TDateTime format + + + + + + + + Return time of player in text format. Used system settings of time format + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Enumerates the priorities to sort the video capture settings of a + camera. + + + + + + + Record that stores information of one camera frame configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Creates a new record with default parameters. + + + + + Record that stores information of one camera frame configuration + + + + + + + Creates a new record with the given configuration. + This function also initialices the min and max frame rates with AFrameRate value. + + + + + + + + Record that stores information of one camera frame configuration + + + + + + + Configures the frame rates. + Value for the frame rate and the minimum frame rate. + Value for the maximum frame rate. + + + + + + + + + Configures the frame rates. + Value for the frame and the minimum and maximum frame rate as well. + + + + + + + + Get the frame(width and height) size. + + + + + + + + Function to compare two configurations with a priority. + + + + + + + + + + Width of the frame + + + + + Height of the frame + + + + + Frame rate of the frame + + + + + Maximum allowed frame rate for a configuration + + + + + Minimum allowed frame rate for a configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Method subclasses should override to configure the desired quality. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns the current frame configuration. + + + + + Record that stores information of one camera frame configuration + + + + + + + Configures the capture frame with the given settings. + True if this operation was successful, and false otherwise. + + + + + + + + + Returns the available capture settings. + The array cannot be sorted. + + + + + + + + Returns a new capture settings configuration with given parameters. + This function exists to allow this class subclasses to access to private fields of the frame configuration. + + + + + + + + + + + Record that stores information of one camera frame configuration + + + + + + + Constructor. + Manager who is managing this device. + True is this is the default device for the manager, False otherwise. + + + + + + + + + + + + + + + Configures the capture frame with the given settings. + True if this operation was successful, and false otherwise. + + + + + + + + + Returns the available capture settings taking in account the canvas class bitmap size limitations. + The returning array is sorted with the CaptureSettingPriority criteria. + + + + + + + + + Returns the available capture settings using the default canvas class to keep the limitation of the + bitmap size. + The returning array is sorted with the CaptureSettingPriority criteria. + + + + + Current frame configuration. + + + + + Current settings sort priority. + When you retrieve the available frame settings, the are sorted by one priority criteria. This criteria is + this property + + + + + + Current frame configuration. + You can use this property to assign a preset for the capture frame. If the platform has its own presets, + this property manage them directly. If not, this property manages the available capture settings to configure + the capture frame from the worse configuration (low quality) to the best one (photo). To get a more sophisticated + control, you can manage available capture settings directly instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Defines a video capturing device. + + + + + + + Default constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Defines a video capturing device. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sets the priority to sort the result of available frame settings. + + + + + + + + Gets the priority criteria to sort the result of available frame settings. + + + + + Enumerates the priorities to sort the video capture settings of a + camera. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Media.TCameraComponent.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Media.TCameraComponent.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + +Displays the captured data on a bitmap. +The SampleBufferToBitmap method displays the captured video data on a bitmap. + +The ABitmap parameter is the bitmap where the image is displayed. +The ASetSize parameter specifies whether the video samples are resized to fit the current size of ABitmap, or whether ABitmap is resized to the windows sizes. + + +Getter of CaptureSetting. + + + + + Record that stores information of one camera frame configuration + + + + + + +Setter of CaptureSetting. + + + + + + + + +It returns the available capture settings. + +Note: The returning array is sorted with the CaptureSettingPriority criteria. + + + + + + +Returns an array of available video capture settings. + + + + + + + + +Array with the available capture settings. +You can use CaptureSettingPriority to set the criterion to sort the Array. +Use the CaptureSetting property to set the capture data resolution. +See the Quality property for further details. + + + + +Current frame capture configuration. +Use the CaptureSetting property to set the capture data resolution from the available ones. +See the Quality property for further details. + + + + +Priority criterion for sorting the result of the available frame settings. +See the Quality property for further details. + + + +States the quality of the video capture. +The Quality property of type TVideoCaptureQuality can take one of the following values: + + + +Value + +Meaning + + + +PhotoQuality + + + +The captured data has high-resolution photo quality. + + + + +HighQuality + + + +The captured data has high resolution (depending on the device). + + + + +MediumQuality + + + +The captured data has medium resolution (depending on the device). + + + + +LowQuality + + + +The captured data has low resolution (depending on the device). + + + + +CaptureSettings + + + +This option allows you to set a customized capture data resolution. + + +By default, Quality is set to CaptureSettings and it uses the best available camera quality (best resolution and best frame rate) prioritizing first the Resolution. +For example, to change the Quality of the CameraComponent1 TCameraComponent to LowQuality, you can use the following line: + + +Delphi: + +CameraComponent1.Quality := TVideoCaptureQuality.LowQuality; + + + +C++: + +CameraComponent1->Quality = TVideoCaptureQuality::LowQuality; + + +Setting a Custom Quality Capture Setting +By setting the Quality to TVideoCaptureQuality.CaptureSettings you can set a customized capture data resolution: + +Use the AvailableCaptureSettings property to see the Array with the different supported configurations. +You can use CaptureSettingPriority to set the criterion to sort the Array of the AvailableCaptureSettings to prioritize Resolution or FrameRate when sorting the Array. See TVideoCaptureSettingPriority for further information. +Use the CaptureSetting property to set the capture data resolution from the available ones. +To set the best available capture settings prioritizing the frame rate, you could for example use the following: + + +Delphi: + +procedure TForm1.SetMaxFrameRateClick(Sender: TObject); +var + LSettings: TArray<TVideoCaptureSetting>; +begin + CameraComponent1.CaptureSettingPriority := TVideoCaptureSettingPriority.FrameRate; + LSettings := CameraComponent1.AvailableCaptureSettings; + CameraComponent1.CaptureSetting := LSettings[0]; +end; + + + +C++: + +void __fastcall TForm1::SetMaxFrameRateClick(TObject *Sender) +{ + DynamicArray<TVideoCaptureSetting> LSettings; + CameraComponent1->CaptureSettingPriority = TVideoCaptureSettingPriority::FrameRate; + LSettings = CameraComponent1->AvailableCaptureSettings; + CameraComponent1->CaptureSetting = LSettings[0]; +} + + +Note: When you set a specific CaptureSetting, the Quality property is automatically set to TVideoCaptureQuality.CaptureSettings. + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates whether the camera device has torch. +Use the HasTorch property to see whether the camera device has torch. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Selects the different modes for the torch: on, off, or auto. +The TorchMode property can take one of three values enumerated by TTorchMode: ModeOff, ModeOn, and ModeAuto. +For example, to turn on the torch of the CameraComponent1 TCameraComponent, you can use the following line: + + +Delphi: + +CameraComponent.TorchMode := TTorchMode.ModeOn; + + + +C++: + +CameraComponent->TorchMode = TTorchMode::ModeOn; + + +Use the HasTorch property to see whether the camera device has a torch. + + +Enables and disables the camera device. +Set the Active property to True to enable the camera device, and set Active to False to disable it. + + +Selects the kind of camera device: default, front, or back camera. +The Kind property can take one of three values enumerated by TCameraKind: Default, FrontCamera, and BackCamera. +For example, to select the back camera of the CameraComponent1 TCameraComponent you can use the following line: + + +Delphi: + +CameraComponent1.Kind := TCameraKind.BackCamera; + + + +C++: + +CameraComponent1->Kind = TCameraKind::BackCamera; + + + +Occurs when the sample buffer is ready. +Write an event handler for the OnSampleBufferReady event to specify what happens when the sample buffer is ready. + + + + + + + + + + + + + + + + + + + + + + + + + + +Getter function for the Duration property. + + + + + + +Getter function for the CurrentTime property. + + + + + + +Setter function for the CurrentTime property. +Value specifies the new value for CurrentTime. + + + + + + +Getter function for the VideoSize property. + + + + + + +Getter function for the State property. + + + + + + +Getter function for the Volume property. + + + + + + +Setter function for the Volume property. +Value specifies the new value of Volume. + + + +Updates the current Media, depending on the TMediaPlayerControl associated with it. +UpdateMediaFromControl is used to keep the current Media, which has been updated after being manipulated by the TMediaPlayerControl associated with it. +The TMediaPlayerControl associated with the current media is specified through the Control property. + + + +Plays the current media file. +To start playing the current media, call the Play method. + + + +Stops the current media from being played. +To stop playing the current media, call the Stop method. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Constructs an object and initializes its data before the object is first used. +FMX.Media.TMedia.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + +Starts the playback of the current media file. +Call the Play method to playback the current media file. To pause or stop the current media file from playing, call the Stop method. + + + +Stops the playback of the current media file. +Call the Stop method to stop or to pause the current played media file. To play the current media file, call the Play method. + + +Specifies the media player control that plays the current media file. +Set Control to specify the media player control that plays the current media file. + +Tip: For easy access to media files and easy playing, use the TMediaPlayer or TMediaPlayerControl visual components. Giving the name of the file to be played will automatically create the TMedia objects and set the Control to the current used media player control. + +Specifies the name of the current used media file. +FileName specifies the name of the media file used to create the current TMedia object. FileName includes the path, name, and extension of the media file. + + +Specifies the total play time of the current media file. +Duration is measured in 100ns. To obtain s, divide Duration by MediaTimeScale. + + +Specifies the current playback position. +CurrentTime is measured in 100ns. To obtain s, divide Duration by MediaTimeScale. +Set CurrentTime to control the current position to be played. + + +Specifies the resolution of the current video file. +VideoSize specifies the native width and height of the current media file, in pixels. +VideoSize is a TPointF. The X coordinate of the point represents the width of the window, and the Y coordinate of the point represents the height of the window. If the media file is audio only and does not have a window to be displayed, VideoSize is (0,0). + + +Specifies the audio volume of the current media file. +Volume takes values in the range from 0 through 1. If Volume is 1, then the media file is played at the maximum native volume. If Volume is 0, then the media file is mute. + + +Specifies whether the current media file is playing or is stopped. +If the current media file is not assigned or supported, then State is set to Unavailable. +If the current media file is playing, then State is set to Playing, otherwise it is set to Stopped. + + + +Base class to access media files. +TMedia is an abstract class that defines an interface for media files. Platform-specific subclasses provide concrete implementations for Windows and OS X platforms. +TMedia exposes media file properties such as file name, size, dimension, state, or duration. +The supported media files formats are the native formats for each platform: + +For Windows: +Audio formats: .wma, .mp3, .wav +Video formats: .avi, .wmv +For OS X: +Audio formats: .mp3 +Video formats: .mov, .m4v, .mp4 +Using TMediaCodecManager, it is possible to register custom media codecs to extend the audio/video feature support. +For easy access to media files, use the TMediaPlayer and TMediaPlayerControl components. + + + + + + + + + + +Creates a TMedia from a specified file. +The AFileName parameter specifies the name of the file from which the TMedia is created. +Do not use CreateFromFile explicitly in applications. Use TMediaCodecManager to access and manage media codecs. + + + +Base class for media codecs. +TCustomMediaCodec is an abstract class that defines a media codec. +Use TMediaCodecManager to register custom media codecs to extend FireMonkey audio/video features. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Returns a reference to a specified interface if the current component supports that interface. +FMX.Media.TMediaPlayer.QueryInterface inherits from System.Classes.TComponent.QueryInterface. All content below this line refers to System.Classes.TComponent.QueryInterface. +Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Media.TMediaPlayer.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Media.TMediaPlayer.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Starts playing the current Media. +Call the Play method to play the current Media. If Media is not assigned, Play does nothing. +To stop or pause the current media file from playing, call the Stop method. + + + +Stops or pauses playing the current Media. +Call Stop to stop or to pause the current Media. If Media is not assigned, Stop does nothing. +To start playing the current media file, call the Play method. + + + +Clears the current media player. +Call Clear to clear the current Media attached to the media player. Clear also empties the FileName property. + + +Specifies the current TMedia attached to this media player. +Call the Play and Stop methods to start playing, or to stop or pause the current Media file, respectively. +Media is assigned and created when the FileName property is set. +TMediaPlayer exposes the Media properties through the following properties: Duration, VideoSize, CurrentTime, Volume, and State. +To empty the current Media attached to the media player, call the Clear method. +If Media type is audio, then calling Play will start playing the audio file. If Media type is video, then calling Play will just play the audio component of the specified video file. To display a video file, use a TMediaPlayerControl, and link the current TMediaPlayer to it by setting the MediaPlayer property of the TMediaPlayerControl. + + +Specifies the total play time of the current media file attached to the media player. +Duration is measured in 100ns. To obtain s, divide Duration by MediaTimeScale. + + +Specifies the current playback position. +CurrentTime is measured in 100ns. To obtain s, divide CurrentTime by MediaTimeScale. +Set CurrentTime to control the current position to be played. + + +Specifies the resolution of the current video file. +VideoSize specifies the native width and height of the current media file, in pixels. +VideoSize is a TPointF. The X coordinate of the point represents the width of the window, and the Y coordinate of the point represents the height of the window. If the media file is audio only and does not have a window to be displayed, or if no media file is attached to the media player, then VideoSize is (0,0). + + +Specifies the audio volume of the current media file. +Volume takes values in the range from 0 through 1. If Volume is 1, then the media file is played at the maximum native volume. If Volume is 0, then the media file is mute. +If there is no media file attached to the current media player, then Volume is 1. + + +Specifies whether the current attached Media is playing or is stopped. +If the current media file is not assigned or supported, then State is set to Unavailable. +If the current media file is playing, then State is set to Playing, otherwise it is set to Stopped. + + +Specifies the media file name played by the current media player. +Media is assigned and created when the FileName property is set. The file name must include the path of the file, so it can be localized on the memory, and the extension. +To empty the current Media attached to the media player, call the Clear method. + + + +Nonvisual component for media file playback. +Use a TMediaPlayer component for easy access to media files. +The currently accessed media file is specified through the Media property. +To specify the media file to be played by the current TMediaPlayer, set the FileName property. The file name must include the path of the file, so it can be localized on the memory, and the extension. +Call the Play and Stop methods to start playing a media file, or to stop or pause a running media file. The current position is specified through the CurrentTime property. TMediaPlayer also exposes media file properties such as Duration, VideoSize, Volume or State. +TMediaPlayer can play back audio files and the audio component of a video file. To display a video file, use a TMediaPlayerControl component. For more information, see Audio-Video in FireMonkey. + +Note: In order to play an audio file using TMediaPlayer, use the appropriate format: +.wav on Windows +.caf on iOS and OS X +.3GP on Android + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. +FMX.Media.TMediaPlayerControl.AncestorVisibleChanged inherits from FMX.Controls.TControl.AncestorVisibleChanged. All content below this line refers to FMX.Controls.TControl.AncestorVisibleChanged. +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged + + + + +Executed right after the value of the Parent property changes. +FMX.Media.TMediaPlayerControl.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Updates the currently manipulated TMedia. +Move extends the behavior inherited from TControl to update the TMedia attached to the TMediaPlayer with which the current TMediaPlayerControl is linked. + + + +OnResize event dispatcher. +Resize extends the behavior inherited from TControl to update the TMedia attached to the TMediaPlayer with which the current TMediaPlayerControl is linked. + + + +Renders the control's surface. +FMX.Media.TMediaPlayerControl.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Media.TMediaPlayerControl.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Media.TMediaPlayerControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Media.TMediaPlayerControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + +Specifies the TMediaPlayer to which this TMediaPlayerControl is linked. +Set MediaPlayer to link a TMediaPlayer to this TMediaPlayerControl, so the video file attached to the media player is displayed on a form. + + + + + + + +Visual component to display video media files. +TMediaPlayerControl is a native control used to display video media files at design time. It is an empty control that does not show any video data. TMediaPlayerControl can be placed anywhere on a form. To set the video to be displayed, link the current TMediaPlayerControl to a TMediaPlayer through the MediaPlayer property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Responds when components are created or destroyed. +FMX.Media.TCustomMediaPlayerAction.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + +Instantiates and initializes a TCustomMediaPlayerAction object. +Applications do not need to call Create directly. Actions are created automatically when you add them to a TActionList component using New > New Standard Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. + + + + + + + + + + + +Whether Target is appropriate for the action (True) or not (False). +HandlesTarget ignores the specified Target parameter, actually. Regardless of the specified target, HandlesTarget returns True provided that: + +The platform where your application is running supports this action. +Your action does not have any event handler assigned to its OnExecute event. +You have an instance of TMediaPlayer in the MediaPlayer property of your action. + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TCustomMediaPlayerAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + +Instance of TMediaPlayer that is target of the action. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action: "Play". +TMediaPlayerStart calls CustomTextChanged when you change the value of the MediaPlayer property of your action, and when the action updates. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerStart.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + +Executes the action on the media player of the MediaPlayer property. The specified Target is ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action: "Stop". +TMediaPlayerStop calls CustomTextChanged when you change the value of the MediaPlayer property of your action, and when the action updates. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerStop.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + +Executes the action on the media player of the MediaPlayer property. The specified Target is ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action: "Pause" if the state of the media player is Playing, or "Play" otherwise. +TMediaPlayerPlayPause calls CustomTextChanged when you change the value of the MediaPlayer property of your action, and when the action updates. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerPlayPause.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + +Executes the action on the media player of the MediaPlayer property. The specified Target is ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Responds when components are created or destroyed. +FMX.Media.TMediaPlayerValue.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + + + + +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. + + + +State of the value. +The state of the value may be any of the following: + +Normal, which is the default state. +ActionUpdating, the action is being updated. +ValueUpdating, the value is being updated. + + + +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. + + + + +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. + + + + +Creates an instance of TMediaPlayerValue. + + + + + + + + + + + +Whether Target is appropriate for the action (True) or not (False). +HandlesTarget is always False. + + + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerValue.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + +Instance of TMediaPlayer that is target of the value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. +FMX.Media.TMediaPlayerCurrentTime.CreateValueRange inherits from FMX.Media.TMediaPlayerValue.CreateValueRange. All content below this line refers to FMX.Media.TMediaPlayerValue.CreateValueRange. +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. + + See Also +FMX.StdActns.TCustomValueRangeAction +FMX.StdActns.TCustomValueRange + + + + +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. +FMX.Media.TMediaPlayerCurrentTime.UpdateValueAction inherits from FMX.Media.TMediaPlayerValue.UpdateValueAction. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValueAction. +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. + + + +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. +FMX.Media.TMediaPlayerCurrentTime.UpdateValuePlayer inherits from FMX.Media.TMediaPlayerValue.UpdateValuePlayer. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValuePlayer. +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. + + + +Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action, which is the current time of the media player. For example: "00:12:34". +If you define a value for CustomText, you may include time specifiers in your value, which TMediaPlayerCurrentTime replaces by actual time values based on the current time of the media player. For a list of time specifiers, see FormatDateTime. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $64 + + + + + + + +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. +FMX.Media.TMediaPlayerVolume.CreateValueRange inherits from FMX.Media.TMediaPlayerValue.CreateValueRange. All content below this line refers to FMX.Media.TMediaPlayerValue.CreateValueRange. +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. + + See Also +FMX.StdActns.TCustomValueRangeAction +FMX.StdActns.TCustomValueRange + + + + +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. +FMX.Media.TMediaPlayerVolume.UpdateValueAction inherits from FMX.Media.TMediaPlayerValue.UpdateValueAction. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValueAction. +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. + + + +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. +FMX.Media.TMediaPlayerVolume.UpdateValuePlayer inherits from FMX.Media.TMediaPlayerValue.UpdateValuePlayer. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValuePlayer. +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. + + + +Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action, which is the volume of the media player in percentage. For example: "74%". +If you define a value for CustomText, your string must be a format string ready for a single, floating-point value (f). For example: %f%%. + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Memo.xml b/Modules/DelphiFMX/doc/FMX.Memo.xml new file mode 100644 index 00000000..e46c2698 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Memo.xml @@ -0,0 +1,3644 @@ + + + + $1710 + + + + + $1711 + + + + + $1712 + + + + + $1713 + + + + + $1714 + + + + + $1715 + + + + + $1716 + + + + + $1717 + + + + + $1718 + + + + + $1719 + + + + + $171A + + + + + $171B + + + + + $171C + + + + + $171D + + + + + $171E + + + + + $171F + + + + + $1720 + + + + + $1721 + + + + + $1722 + + + + + $1723 + + + + + $1724 + + + + + $1725 + + + + + $1726 + + + + + $172E + + + + + $172F + + + + + $1730 + + + + + $100B + + + + + $100C + + + + + $100D + + + + + $100E + + + + + $100F + + + + + $1010 + + + + + $1011 + + + + + $1012 + + + + + $1013 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + ecNormal + + + + + True + + + + + Default + + + + + $0 + + + + + False + + + + + $802A8ADF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Validate inputing text. Calling before OnChangeTracking + + + + + + + + + Validate inputed text. Calling before OnChange + + + + + + + + + Call OnChangeTracking event + + + + + Call OnChange event + + + + + Method is calling when some parameter of text settings was changed + + + + + Returns class type that represent used text settings. Could be overridden in descendants to modify + default behavior + + + + + + + + + + + + + + + + + + Does memo has selected text + + + + + + + + Returns current selected text + + + + + + + + If there were made any changes in text OnChange will be raised + + + + + Convert absolute platform-dependent position in text to platform independent value in format + (line_number, position_in_line) + + + + + + + + + Convert platform-independent position to absolute platform-dependent position + + + + + + + + + Insert text in memo after defined position + + + + + + + + + + Delete fragment of the text from the memo after defined position + + + + + + + + + + Replace fragment of text from the memo in the specifeid range. + + + + + + + + + + Select ALength characters in memo's text starting from AStartPosition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns caret position by specified hittest point. + Works only for TMemo.ControlType=Styled. + + + + + + False + + + + + + + + Select all text when control getting focus + + + + + Contains component that represent current caret for control + + + + + Defines character case for text in component + + + + + Switch on/off spell checking feature + + + + + Defines the types of information that can be detected in text + (for native presentation on iOS only) + + + + + Do not draw selected text region when component not in focus + + + + + Text is in read-only mode + + + + + Default IME text input mode + + + + + Defines visual type of on-screen-keyboard + + + + + Lines of text + + + + + Available maximum length of text (0 - no length limitation). + + + + + Brush that is using to draw text selection region + + + + + Current position of cursor in the text + + + + + Text selection starting position + + + + + Length of selected text + + + + + Container for current text visualization attributes + + + + + Event that raises when control losing focus or user pressing ENTER key (but onlt if some changes were + made) + + + + + Event that raises on any change in text + + + + + Event that raises to validate any change in text (raises before OnChangeTracking event) + + + + + Event that raises to validate changes in text (raises before OnChange event) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Data model for the TMemo control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Memo.TCustomMemo.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.Memo.TCustomMemo.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + +Returns the name of the default presentation proxy that your presented control uses. +FMX.Memo.TCustomMemo.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + + + + + + + + +Returns the text from the memo control. + + + + + + + +Modifies the value of the Text property. +Sets the Text property to Value. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.Memo.TCustomMemo.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + Delete selected text + + + + +Removes the selected text from the memo control. +Use DeleteSelection to delete the selected text from the memo control. If the ReadOnly property is True or if no text is selected, DeleteSelection does nothing. + + + + +Copies the selected text from the memo control to the system Clipboard. +Use CopyToClipboard to replace the contents of the system Clipboard with the selected text. If no text is selected, CopyToClipboard does nothing. + + + + +Copies the selected text to the system Clipboard and then deletes the selected text. +Use CutToClipboard to replace the contents of the system Clipboard with the selected text and then to delete the selected text from the memo control. If no text is selected, CutToClipboard does nothing. + + + + +Copies the contents of the system Clipboard to the memo control. +PasteFromClipboard copies the contents of the system Clipboard, if possible, to the memo control, at the position of the cursor. If there is text selected in the memo control, the selected text will be removed. If the content of the system Clipboard is not a string, PasteFromClipboard does nothing. + + + + +Selects all the text in the memo control. +Use SelectAll to select all the text in the memo control. If there is no text in the memo control, SelectAll does nothing. + + + + +Selects the word that contains the cursor. +In the memo's text, SelectWord selects a delimited by word dividing characters (space characters, punctuation marks, and others) substring (word) that contains the cursor. Here word dividing characters are space characters, line feeds, and punctuation marks. + + + + +Cancel the text selection if it exists. +The ResetSelection method internally sets the SelLength property to 0. + + + + +Moves the cursor to the end of the text in the memo control. + + + + +Moves the cursor to the beginning of the text in the memo control. + + + + +Replaces the ALength number of characters, beginning from the AStartPos position, with the AStr string. +The caret is moved to the position of the last inserted character. + + + + + + + + + +Moves the cursor to the end of the current visual line. +When WordWrap is True, then each line (in the memo text) can be separated into several 'visual lines'. +GoToLineEnd moves the cursor to the end of the current (pointed by the cursor) visual line. + + + + +Moves the cursor to the beginning of the current visual line. +When WordWrap is True, then each line (in the memo text) can be separated into several 'visual lines'. +GoToLineBegin moves the cursor to the beginning of the current (pointed by the cursor) visual line. + + + + +Undoing the latest text change made in the memo control. +UnDo backs out, if possible, the latest change made to the text in the memo control. If no change has been made, UnDo does nothing. + +Note: Remove TDeleteOptions.CanUndo from Options calling DeleteFrom or TInsertOptions.CanUndo from Options calling InsertAfter when modifying the text in the memo control, so that the changes cannot be backed out. + + + +Converts APos into a Line/Pos coordinate in the memo control. +TextPosToPos returns the TCaretPosition format position of a character indicated by APos. TextPosToPos calculates the TCaretPosition.Line line number and TCaretPosition.Pos horizontal shifting, corresponding to the APos character count coordinate of a character in the text of the memo control. +Keep in mind that APos counts end-of-line characters. +For example, if the first line of a memo's text contains 'Hello' and the second line contains 'Goodbye', then the following code: + + OldPosition.Line := 1; //Zero-based + OldPosition.Pos := 2; //Zero-based + NewPosition := TextPosToPos(PosToTextPos(OldPosition) + 2); + +sets the NewPosition.Line to 1 and NewPosition.Pos to 4. +TextPosToPos internally calls Model.TextPosToPos. + + + + + + + + +Converts a Line/Pos coordinate of a character into a number of this character in the text of the memo. +PosToTextPos returns an integer an integer representing a position of the character specified by APosition in the memo control. The APosition position is specified in the TCaretPosition format which uses the Line number and Pos horizontal shifting of the character in the memo control. Keep in mind that PosToTextPos calculates the character number counting end-of-line characters. +For example, if the first line of a memo's text contains 'Hello' and the second line contains 'Goodbye', then the following code: + + MyPosition.Line := 1; //Zero-based + MyPosition.Pos := 1; //Zero-based + MyString := Copy(Text, PosToTextPos(MyPosition) + 1, 3); + +sets MyString to 'odb', which are the three characters starting from the third character of the second line. +PosToTextPos internally calls Model.PosToTextPos. + + + + + + + + +Inserts the AFragment string into the memo's text, at APosition. +InsertAfter inserts in the memo's text the string specified by AFragment at the position specified by APosition. Options represent a set of insert options. + +Note: InsertAfter does not insert a newline character. If the Pos field of the APosition parameter is greater than the width of the specified line, then AFragment is inserted on the next line. +Note: If in a call of InsertAfter one removes TInsertOptions.CanUndo from Options, then the implemented changes cannot be backed out. +InsertAfter internally calls Model.InsertAfter. + + + + + + + + + +From the memo's text, deletes the fragment of text that has the ALength number of characters and begins at APosition. +Options specifies the delete options. + +Note: If in a call of DeleteFrom, one removes TDeleteOptions.CanUndo from Options, then the implemented changes cannot be backed out. +DeleteFrom internally calls Model.DeleteFrom. + + + + + + + + + +Holds the data model of the memo control. + + + + +Represents the entire text displayed in the memo control. + +Note: The visibility for Text is Public. Thus, Text is not available in the Object Inspector at design time. +For manipulating the text in a TMemo, you should use FMX.Memo.TMemo.Lines, which is available at design time in the Object Inspector. + + + +Defines whether the system selects all the memo's text when the control receives focus. +AutoSelect defines whether the system selects all the Text included in the TCustomMemo memo when the control receives focus. If AutoSelect is True, then all text is selected when the memo receives focus. +In TMemo, AutoSelect is set to False. + + + + +Provides access to the TCaret attached to the memo control. + + + + +Defines the character case for the text within the memo control. +Modify the CharCase|CharCase property's value in order to change the case of the text in the memo control. +Options are: ecNormal, ecUpperCase and ecLowerCase. + + + + +Defines whether the spell-checking feature of the memo control is on or off. +This property enables spell checking on the TMemo component. When set to True a red squiggly line appears underlining the words misspelled. +The spell checking is performed by an operating system service. It is only supported on iOS and OS X. + + + + +The types of information that can be detected in the memo text. +DataDetectorTypes is used on native presentation for iOS only. + + + + +Determines whether to cancel the visual indication of the selected text region when the memo control does not have the focus. +If HideSelectionOnExit is False, then the memo keeps highlighting the selected text using the SelectionFill brush, even when the focus moves from the memo to another control. + + + + +For internal use only. +Do not use this member. It is for internal use only. +Specifies the TImeMode input mode for the memo control. + + + + +Specifies the type of on-screen keyboard to be displayed for the memo control. +Use KeyboardType to specify the type of on-screen keyboard that appears for the memo when ShowVirtualKeyboard is called. + + + + +Provides access to the individual lines in the memo text. +The memo text can contain several line break symbols that separate the whole memo text into several lines. Depending on the current platform, a line break symbol can be a LF 'line feed' character (MacOS) or a CRLF 'carriage return' plus 'line feed' pair (Windows). Lines holds the memo text separated line by line. +When WordWrap is True then each line (specified in the Lines property) can be wrapped into several 'visual lines' to fit to the memo width. However these several 'visual lines' are still represented by a single string element in the Lines property. + +Notice that GoToLineBegin and GoToLineEnd move the cursor to the beginning or the end of the current (pointed by the cursor) visual line. +Lines is a TStrings object, so you can use TStrings methods to work with the Lines property. +For example, you can count the number of lines: + +ShowMessage('The number of lines:' + IntToStr(Memo1.Lines.Count)); + +You can add new lines: + +Memo1.Lines.Append('New text to append at the end of memo'); + +You can delete lines: + +Memo1.Lines.Delete(0); // Deletes the fist line from memo + +You can replace a line with a new string: + +Memo1.Lines[8] := 'Replace 9th line with this string'; + +To work with all the memo's text at once, one can use the Text property. + + + + +Specifies the maximum number of characters that can be kept in the memo control. +If the text in the memo control contains more characters than the MaxLength, then the text is truncated to the MaxLength characters. +If the memo control already contains a number of characters equal to MaxLength, then the user cannot enter any more characters. +MaxLength counts end-of-line characters. +If MaxLength is 0, then no explicit length limitation is set. + +Note: Even when MaxLength is 0, there may be limitations imposed by a platform on the number of characters that may be entered into a memo control. + + + +Specifies whether the memo's text can be changed. +ReadOnly equals to True forbids any modification of the text in the memo control. + + + + +Provides access to the current cursor position in the memo's text. +Use CaretPosition to determine the coordinates of the cursor (insertion point) in the memo control. The TCaretPosition type has Line and Pos integer fields: + +Line represents the number of the line containing the cursor, indexed from zero. +Pos represents the horizontal character coordinate of the cursor, indexed from zero. +Modify the value of the CaretPosition property in order to change the position of the cursor within the memo control. In order for the cursor to be visible, the memo control must have focus. +Thus, if Line = 3 and Pos = 5, then the cursor is at the fourth line and at the sixth character from the start of the line. + + + + +Represents the brush to draw the selected text region in the memo control. +Use SelectionFill to change the brush characteristics for the selected text region in the memo control. For example, to change the background color of the selected text region, use: + + Memo1.SelectionFill.Color := System.UIConsts.claCoral; + + + + +Specifies the family, size, and style properties of the text font in the memo control. + + + + +Specifies the font color of the text in this memo. +Use the FontColor property to read or change the font color of the text in this memo component. The default value of the FontColor property is TAlphaColorRec.Black. + + + + +Specifies the horizontal alignment of the text in the memo control. +Use the TextAlign property to change the horizontal alignment of the text in the memo control. TextAlign can be one of the Center, Leading, or Trailing values defined in TTextAlign. +When you use text representation properties stored in the +TextSettings property, remember that TextAlign corresponds to HorzAlign. + + + + +Specifies whether to wrap the text in the memo when its length is greater than the memo width. +Set WordWrap to True to wrap the text in the memo control. Wrapping implies the division of the text string that is wider than the memo control onto several lines that fit to the memo control's width. + + + + +Specifies the zero-based number of the first character selected in the memo's text. +Read SelStart to determine the number of the first selected character, where 0 indicates the first character. If there is no selected text, then SelStart returns the cursor position. Keep in mind that the SelStart character count includes end-of-line characters at the end of each line. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. The memo component must have focus (call SetFocus) before you attempt to use SelStart; otherwise the selection is invisible. + + + + +Specifies the number of characters that are selected in the memo control. +Read SelLength to determine the length, in characters, of the selected text. +Set the value of the SelLength property in order to specify the length of the selected text, starting at SelStart. Keep in mind that the character count from SelLength will include end-of-line characters at the end of each line. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. The memo component must have focus (call SetFocus) before you attempt to use SelStart; otherwise the selection is invisible. + +Note: Setting SelLength to a value greater than the number of characters from SelStart to the end of the text results in the selection of all characters from SelStart to the end of the text. Reading SelLength immediately after setting it to a value greater than the number of available characters returns the number of characters actually selected, not the value that was just set. + + + +Represents the currently selected fragment of the memo's text. +Use SelText in order to retrieve the text that is selected, from the TCustomMemo control. If there is no selection, SelText is an empty string. If the memo control does not have the focus, SelText represents the previous selected portion of the text. + + + + +Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + + +Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + + +Occurs when the focus leaves the memo or the user presses ENTER. The event occurs only when the text has changed. +OnChange is raised when the following situations occur: + +Text is cleared in the memo +Text is set in the memo +The memo loses focus +The user presses the ENTER key +Write an OnChange event handler to check the modified text data. + + + + +Occurs on any change in the memo's text. +Write an OnChangeTracking event handler to respond immediately to any changes made in the memo control's text. The OnChangeTracking event provides the first opportunity to respond to modifications that the user makes by typing into the memo control. +The Text property of the memo control is already updated and reflects any changes when OnChangeTracking is raised. +The difference between OnChangeTracking and OnChange is that OnChangeTracking occurs at each modification of text in the memo control. + +Note: OnChangeTracking does not occur when only text representation characteristics are changed (for example, when changing TextAlign). + + + +Raises to validate any change has been made in the memo's text. Occurs before the OnChangeTracking event. +In descendent classes, to change when to raise the OnValidating event, redefine the virtual TCustomMemoModel.DoValidating method. + + + + +Raises to validate changes have been made in the memo's text when the memo has lost the focus or the user has pressed ENTER. The OnValidate event occurs before the OnChange event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TMemo is a multiline text editing control, providing text scrolling. +Use TMemo to place a standard multiline edit control on a form. Multiline edit boxes allow the user to enter more than one line of text. They are appropriate for representing large amounts of text. +The text in the memo control can be edited as a whole or line by line. +The characteristics of the text in the memo control can be modified by using, for example, Font, FontColor, or CharCase. +To limit the changes made to the memo control, use properties such as ReadOnly, Enabled, or MaxLength. +When not in focus, TMemo does not draw a selection rectangle even though the user has selected the text. You can verify whether the text is selected by using the SelText property. + +Note: When a number of lines in a control is more than can be concurrently shown in the control, then you can use a scroll bar to scroll the text in the control. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll a text using the mouse wheel. To enforce the scroll bar to be shown by default, in the Object Inspector, select the memo control and set the AutoHide to False. + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Menus.xml b/Modules/DelphiFMX/doc/FMX.Menus.xml new file mode 100644 index 00000000..0c47e4c2 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Menus.xml @@ -0,0 +1,4662 @@ + + + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + + + + + + + + + This class implements the principal menu of an application. On + Windows is situated on the most top level of the application form. On MAC + this menu appear outside the application form in the main menu of the OS + with respect to the application. + + + + + + + + + + + + +Filters the string contained in the Text property. +FMX.Menus.TMenuItem.DoFilterControlText inherits from FMX.Controls.TTextControl.DoFilterControlText. All content below this line refers to FMX.Controls.TTextControl.DoFilterControlText. +Filters the string contained in the Text property. +For example, you can use DoFilterControlText to filter the ampersand symbol of the accelerator key character. +If the control is registered as an accelerator key receiver, you can override this method to do your own filtering to the accelerator keys. + + See Also +FMX.Controls.TTextControl.Text +Specifying Accelerator Keys + + + + + + + + + +Determines whether the object reacts to the accelerator key or not. +FMX.Menus.TMenuItem.CanTriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. +Determines whether the object reacts to the accelerator key or not. +Use CanTriggerAcceleratorKey for objects that are not intended to react to the accelerator key, for example: a hidden tab page or a hidden submenu. The object triggers the action if CanTriggerAcceleratorKey is True. Otherwise, the object cannot trigger the action. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey + + + + + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TMenuItem.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +OnMouseDown event dispatcher. +In addition to FMX.Controls.TControl.MouseDown, if the left mouse button is clicked and the current TMenuItem object has a pop-up menu, MouseDown displays the pop-up menu. + + + +Responds to the click of the left mouse button. +In addition to FMX.Controls.TControl.Click, Click triggers an OnMouseLeave and, if the AutoCheck property is True, negates the IsChecked property. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Menus.TMenuItem.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Protected setter implementation for the Text property. +FMX.Menus.TMenuItem.SetText inherits from FMX.Controls.TTextControl.SetText. All content below this line refers to FMX.Controls.TTextControl.SetText. +Protected setter implementation for the Text property. +In descendants, override SetText to allow for further functionality when setting the text using the Text property. +Do not use SetText directly in applications. Use the Text property instead. + + + + + + + +Checks whether the input is taken by the control or by its parent. +FMX.Menus.TMenuItem.EnterChildren inherits from FMX.Controls.TControl.EnterChildren. All content below this line refers to FMX.Controls.TControl.EnterChildren. +Checks whether the input is taken by the control or by its parent. +EnterChildren returns True if the input is taken directly by the control's parent, and False otherwise. +Usually, EnterChildren returns False. If the control is an item such as TListBoxItem, a TTreeViewItem, or TMenuItem, EnterChildren returns True. + + + + + + + +Specifies the behavior of a TMenuItem menu item when Action changes. +ActionChange calls the inherited TTextControl.ActionChange method and then, depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +IsChecked and GroupName properties of TMenuItem. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Determines the number of child TMenuItems that have the Visible property set to True. + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Menus.TMenuItem.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + +Realigns the parent of this TMenuItem. + + + +OnResize event dispatcher. +FMX.Menus.TMenuItem.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +CalcVisibleObjectsItemSize determines the render size of this TMenuItem. + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + + +Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + + + + + + + + +Protected setter implementation for the Parent property. +FMX.Menus.TMenuItem.SetParent inherits from FMX.Types.TFmxObject.SetParent. All content below this line refers to FMX.Types.TFmxObject.SetParent. +Protected setter implementation for the Parent property. + + + +Executed right after the value of the Parent property changes. +FMX.Menus.TMenuItem.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + +Customizes styles in complex objects. +FMX.Menus.TMenuItem.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.Menus.TMenuItem.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + + + + +Returns the number of the visible TMenuItems from the Children property. +GetItemsCount determines and returns the number of the TMenuItem objects from the Children property, for which the Visible property is True. + + + + + + + +Returns the specified TMenuItem child. +GetItem searches in the Children property for the TMenuItem object specified by the value of the AIndex parameter, and returns it. + +Note: Only TMenuItem objects are taken into account when iterating through the Children property. + + + + + +Setter function for the Visible property. +In addition to FMX.Controls.TControl.SetVisible, SetVisible realigns the children of the Parent property so that, if Visible is False, the TMenuItem object is not displayed. + + + + + + +Modifies the value of the Enabled property of this TMenuItem. + + + + + + + +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. If the pressed keys match the ShortCut property, an OnClick event is triggered. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + +It determines if the item is child of TMenuBar control. +The appearance of these menu items differs from all the others. For example: the default style is menubaritemstyle. + + + + + + +Represents the FireMonkey-specific handle of the TMenuItem. + + + +It is the additional text offset to the right, which is determined by the width of the picture. + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TMenuItem.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TMenuItem.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Clears this TMenuItem. +Clear removes all the children menu items of this menu item. + + + + + + +Calculates the size of a TMenuItem as a TPointF. +Use CalcSize to determine the size of a TMenuItem object as a TPointF. + +Note: The Y value of the TPointF returned is 8 for a separator, and 23 for a regular TMenuItem. + + + + + + + +CalcRenderSize determines the render size of this TMenuItem as a TPointF. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +It returns the parent menu item. + + + + + + +It returns the main menu to which the menu item is attached. + + + + + + +Creates and displays the TMenuItem's pop-up menu. +Popup creates and displays a pop-up menu containing all the visible TMenuItem children of the current object. + +Note: The TMenuItem children for which the Visible property is False are not displayed. + + +Displays the pop-up menu of the current TMenuItem object, after a short delay. +Use NeedPopup to display the pop-up menu of the current TMenuItem object, after a short delay. + + + + + + +Decides whether the current TMenuItem needs a pop-up menu. +A TMenuItem object needs a pop-up menu if at least one of the object's children is a TMenuItem. + + +For internal use. +Do not use this property. It is for internal use. + + + + +Represents the number of child TMenuItems of this menu item. + + + +Specifies whether the TMenuItem is selected. IsSelected is True if the TMenuItem is selected, and False otherwise. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +A bitmap that is drawn on the TMenuItem menu item. +Use Bitmap to provide a custom image that appears next to the text of the TMenuItem. +Bitmap is an obsolete feature. We recommend to show images stored in a centralized collection of images. Such image is specified with the ImageIndex property from the image list specified with Images. If an image specified with ImageIndex and Images is not empty, the TMenuItem object shows this image. Otherwise, the TMenuItem object shows the image specified in Bitmap. + + + + + + + + +Controls whether the IsChecked property toggles when the TMenuItem is clicked. +Set the AutoCheck property to True if the toggling of the IsChecked property is desired when the TMenuItem is clicked, and to False otherwise. + + +Identifies the group of TMenuItems to which this TMenuItem belongs. +A group of TMenuItems represents a set of TMenuItem objects belonging to the same pop-up menu, out of which only one TMenuItem, having the RadioItem property set to True, can be selected. + +Note: TMenuItems belonging to different pop-up menus (that do not have the same value for the Parent property) can be simultaneously selected, even if their RadioItem property is True. +Note: By default, all TMenuItems belonging to the same pop-up menu have the same value for the GroupIndex property. + +Specifies whether the TMenuItem is mutually exclusive with other menu items in its group. +Use RadioItem to make the menu item behave like a radio button with a group of other menu items. The group of menu items is the set of all menu items in a pop-up menu that have the same value of GroupIndex. When RadioItem is True, only one menu item in the group that contains the menu item can be selected at a time. The single selected menu item in the group is indicated by a check mark beside its text. + +Note: RadioItem does not work for the top-level items in a main menu. + +Specifies whether a check mark is displayed beside the text of the TMenuItem. +Use IsChecked to allow the TMenuItem to work like a check box. The menu item appears selected if IsChecked is True, and cleared otherwise. + +Note: If AutoCheck is False, the menu item remains cleared even if IsChecked is True. + +Shortcut that opens the menu item. + + + + + + + +Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + + + + + + +Represents a pop-up menu. +Use TPopupMenu to describe a menu that appears only when the Popup procedure is called. TPopupMenu appears at the coordinates indicated by the parameters of the Popup procedure. +TPopupMenu is composed of TMenuItems. You can add menu items in several ways: + +To add a menu item at design time, do any of the following: +Right-click the component and select Add Item from the context menu. +Double-click the component and click the Add Item button on the Items Designer. +Right-click the component, select Items Editor from the context menu, and then click the Add Item button. +To add a menu item at run time, use the AddObject procedure of TPopupMenu. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TPopupMenu.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the component after the form file has been read into memory. +FMX.Menus.TPopupMenu.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TPopupMenu.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TPopupMenu.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Clears this TPopupMenu. +Clear removes all the child menu items of this pop-up menu. + + + +TPopupMenu descendants may implement CloseMenu to define actions made when the pop-up menu closes. +CloseMenu does nothing. It is meant to be implemented by TPopupMenu descendants to describe actions made when the pop-up menu closes. + + + + + + + +Displays the pop-up menu onscreen. +Call Popup to bring up the pop-up menu. The menu appears at the screen coordinates indicated by the values (in pixels) of X and Y. + + +The point where the pop-up menu opens. + + + + + + + +Processes a dialog key for each of the TPopupMenu's TMenuItems. +DialogKey is called during the message preprocessing to handle dialog characters. If the pressed keys match the ShortCut property of one of the TPopupMenu's TMenuItems, the OnClick event of that TMenuItem is triggered. + + +Represents the number of child TMenuItems of this pop-up menu. + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + + + + +Represents an editable menu bar. +TMenuBar describes the structure of a menu bar that can be moved, resized, and edited. TMenuBar is composed of TMenuItems. +Menu items can be added in several ways: + +To add a menu item at design time, do any of the following: +Right-click the component and select Add Item from the context menu. +Double-click the component and click the Add Item button on the Items Designer. +Right-click the component, select Items Editor from the context menu, and then click the Add Item button. +To add a menu item at run time, use the AddObject procedure of the TMenuBar. +Use Items and ItemsCount to retrieve information about menu items. +TMenuBar: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class describe the role and functionality of a menu item. + This object is used to populate different types of menus defined in FMX: + main menu, menu bar, popup menu. + + + + + +Retrieves the TMenuItem specified by AIndex from the menu's list of children menu items. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Menus.TMenuBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Performs the alignment of a FireMonkey control. +FMX.Menus.TMenuBar.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TMenuBar.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Processes a dialog key. +FMX.Menus.TMenuBar.DialogKey inherits from FMX.Controls.TControl.DialogKey. All content below this line refers to FMX.Controls.TControl.DialogKey. +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + + + + + + +Updates the structure of the menu bar, if possible. + + + + + + +Setter function for the Visible property. +FMX.Menus.TMenuBar.SetVisible inherits from FMX.Controls.TControl.SetVisible. All content below this line refers to FMX.Controls.TControl.SetVisible. +Setter function for the Visible property. Value specifies the new value of the Visible property. + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + + +Initializes the component after the form file has been read into memory. +FMX.Menus.TMenuBar.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.Menus.TMenuBar.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + +Customizes styles in complex objects. +FMX.Menus.TMenuBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.Menus.TMenuBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TMenuBar.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TMenuBar.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Starts the menu loop for this menu bar. There is no need to manually call StartMenuLoop in applications. + + + + + +Clears this TMenuBar. +Clear removes all the children of this menu bar. + + +Returns the total number of menu items in this menu bar. + + + + + + + + + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Describes the structure of the form's main menu. +Use TMainMenu to describe the structure of the form's main menu. TMainMenu is composed of TMenuItems. +Menu items can be added in several ways: + +To add a menu item at design time, do any of the following: +Right-click the component and select Add Item from the context menu. +Double-click the component and click the Add Item button on the Items Designer. +Right-click the component, select Items Editor from the context menu, and then click the Add Item button. +To add a menu item at run time, use the AddObject procedure of the TMainMenu. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Notification method called after the parent is changed. +FMX.Menus.TMainMenu.ParentChanged inherits from FMX.Types.TFmxObject.ParentChanged. All content below this line refers to FMX.Types.TFmxObject.ParentChanged. +Notification method called after the parent is changed. ParentChanged is a virtual method to be implemented in subclasses to allow for changing the parent of this FMX object. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TMainMenu.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the component after the form file has been read into memory. +FMX.Menus.TMainMenu.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TMainMenu.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TMainMenu.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + +Performs any necessary actions before the first destructor is called. +FMX.Menus.TMainMenu.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + +Recreates the OS specific menu. + + + + + + + +Exchanges two objects from the children list. +FMX.Menus.TMainMenu.Exchange inherits from FMX.Types.TFmxObject.Exchange. All content below this line refers to FMX.Types.TFmxObject.Exchange. +Exchanges two objects from the children list. Exchange exchanges AObject1 with AObject2. + + + + + + + +Processes a dialog key for every item in the menu. +Do not call DialogKey in an application. It is for internal use only. + + +Represents the number of child menu items of this menu. + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.MultiView.xml b/Modules/DelphiFMX/doc/FMX.MultiView.xml new file mode 100644 index 00000000..9b34aba8 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.MultiView.xml @@ -0,0 +1,1183 @@ + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + Returns multi view parent width. + + + + + + + + Returns multi view parent height. + + + + + + + + Sets size of MultiView in opened state. + + + + + + + + If controls supports opening and closing, returns size of multiview in opened state. + + + + + + + + If controls supports opening and closing, returns size of multiview in closed state. + + + + + + + + Invokes MultiView.OnShown. Should be called, when multi view is opened. + + + + + Invokes MultiView.OnStartShowing. Should be called, when multi view is beginning to open. + + + + + Invokes MultiView.OnStartHiding. Should be called, when multi view is beginning to close. + + + + + Invokes MultiView.OnStartShowing. Should be called, when multi view is closed. + + + + + Used for making initialization of presentation and storing previous state of MultiView. + + + + + Used for making finalization of presentation and restoring previous state of MultiView. + + + + + Defines logic of opening MultiView. Parameter can define speed of opening, if presentation supports it. + + + + + 0 + + + + + + + Defines logic of closing MultiView. Parameter can define speed of opening, if presentation supports it. + + + + + 0 + + + + + + + Used for defining when multi view is beginning to open. if presentation supports animation. + + + + + 0 + + + + + + + Used for defining when multi view is ending moving. if presentation supports animation. + + + + + Changes state of multi view and includes TPresentationState.Moving also notifies presentation + about starting of moving + + + + + 0 + + + + + + + Changes state of multi view and excludes TPresentationState.Moving also notifies presentation + about ending of moving + + + + + Returns should be master button hidden or not + + + + + + + + Returns badge title of current presentation, which is displayed in design time in right bottom + corner of TMultiView + + + + + + + + Begins internal process of realign. + + + + + Ends internal process of realign. + + + + + Are we in a internal process of realign? + + + + + + + + + + + + + + + + + Installs presentation + + + + + Uninstalls presentation + + + + + Opens MultiView, if presentation supports it. + + + + + 0 + + + + + + + Closes MultiView, if presentation supports it. + + + + + 0 + + + + + + + Is MultiView opened? + + + + + + + + Is MultiView moving? + + + + + + + + Refresh position and size of MultiView + + + + + Notifies about changing MultiView.TargetControl + + + + + + + + + Notifies about updating MultiView settings + + + + + Notifies about updating MultiView style + + + + + Notification about changed ControlType of MultiView + + + + + Notification about changed Parent of MultiView + + + + + Notification about changed Enabled of TMultiView + + + + + + + + + + Does presentation supports openning and closing MultiView? + + + + + + + + Returns badge title of current presentation, which is displayed in design time in right bottom + corner of TMultiView + + + + + Size of MultiView in opened state + + + + + Size of MultiView in closed state + + + + + Link on MultiView + + + + + + Returns should be master button hidden or not + + + + + + + + + + + + + + + + + + + + + + + + $FA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Returns the current device. +The GetDevice method returns the current device with TDeviceInfo type. +At design-time, the GetDevice method returns the device of the view that is selected in IDEs View Selector. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.MultiView.TCustomMultiView.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. +FMX.MultiView.TCustomMultiView.ParentChanged inherits from FMX.Controls.Presentation.TPresentedControl.ParentChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ParentChanged. +Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.ParentChanged +FMX.Controls.Presentation.TPresentedControl.AncestorParentChanged + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.MultiView.TCustomMultiView.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + +OnResize event dispatcher. +FMX.MultiView.TCustomMultiView.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Sends a PM_ABSOLUTE_CHANGED message to the presentation layer through its presentation proxy. +FMX.MultiView.TCustomMultiView.DoAbsoluteChanged inherits from FMX.Controls.Presentation.TPresentedControl.DoAbsoluteChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoAbsoluteChanged. +Sends a PM_ABSOLUTE_CHANGED message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoAbsoluteChanged. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoAbsoluteChanged + + + + +Executed right after the value of the Enabled property changes. +FMX.MultiView.TCustomMultiView.EnabledChanged inherits from FMX.Controls.TControl.EnabledChanged. All content below this line refers to FMX.Controls.TControl.EnabledChanged. +Executed right after the value of the Enabled property changes. +The control does not execute EnabledChanged if you assign Enabled the same value that it already has. +EnabledChanged is never executed for effects, which execute EffectEnabledChanged instead. + + See Also +FMX.Controls.TControl.BeforeEffectEnabledChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Notifies about the changes of ControlType. +FMX.MultiView.TCustomMultiView.ControlTypeChanged inherits from FMX.Controls.Presentation.TPresentedControl.ControlTypeChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ControlTypeChanged. +Notifies about the changes of ControlType. + + + + + + + +Writes the state of the component. +FMX.MultiView.TCustomMultiView.WriteState inherits from System.Classes.TComponent.WriteState. All content below this line refers to System.Classes.TComponent.WriteState. +Writes the state of the component. +WriteState is used internally in the component streaming system. It is not necessary to call it directly. +This method expects a TWriter object that is used for storing the state of the component. + + + + + + +Reads the state of the component. +FMX.MultiView.TCustomMultiView.ReadState inherits from System.Classes.TComponent.ReadState. All content below this line refers to System.Classes.TComponent.ReadState. +Reads the state of the component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Customizes styles in complex objects. +FMX.MultiView.TCustomMultiView.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.MultiView.TCustomMultiView.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + +Renders the child controls. +FMX.MultiView.TCustomMultiView.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + + + + + + +Ensures that AComponent is notified that the component is going to be destroyed. +FMX.MultiView.TCustomMultiView.FreeNotification inherits from System.Classes.TComponent.FreeNotification. All content below this line refers to System.Classes.TComponent.FreeNotification. +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.MultiView.TCustomMultiView.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + +Destroys this instance of TPresentedControl. +FMX.MultiView.TCustomMultiView.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + +Verifies whether the component has a master button. +A master button is a UI element that allows you to view or hide the master pane. + + + + + + +Verifies whether the component has the detail pane. + + + + + + +Retrieves whether the master pane of the current MultiView component has the Presenter. + + + +Hides the master pane. +Use this method to hide the master pane. + + + +Displays the master pane. +Use this method to display the master pane. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Verifies whether the master pane is displayed. +Use this method to verify whether the master pane is displayed. The IsShowed method returns the following values: + +true: the master pane is displayed. +false: the master pane is hidden. + + +Removes all controls from the content. + + + +Holds the content (child controls) of the MultiView. +MasterContent lists child controls in the master pane and does not list the detail pane. + +Note: The detail pane is referenced by the TargetControl property. + +Keeps the object providing the presentation of the master pane of the current MultiView component. + + +Refers the custom class for presentations of master panes in MultiView controls. +The user can customize the master pane presentation. You need to set the MultiView control to Custom and declare your own class that descends from TMultiViewPresentation or from other classes declared in the FMX.MultiView.Presentations.pas unit (such as MyPresentationClass). +The custom presentation class should be set in the CustomPresentationClass property. See the Custom Mode subsection in Mobile Tutorial: Using a MultiView Component to Display Alternate Views of Information (iOS and Android). + + +Specifies a datail pane container (such as TPanel) showing elements described in the master pane. +For more information about the master-detail interface, see Mobile Tutorial: Using a MultiView Component to Display Alternate Views of Information (iOS and Android). + +Limitations +See FireMonkey Native iOS Controls: Combining Native iOS Controls With Non-native Controls for more information about the limitations when using native controls. + +Exceptions +Setting TargetControl may raise the following exception: + + + +Exception + +Exception.Message + +Scenarios + + + +EComponentError + + + +TargetControl cannot be a child of TMultiView. + + + +You set a child control of a TMultiView as the TargetControl of that TMultiView. +You set a TMultiView as the TargetControl of itself. + + + +Handles appearance options of the master pane in the Popover presentation mode. +In the Popover presentation mode, the master pane is a pop-up menu, which can be displayed or hidden using the master button. +The PopoverOptions property allows you to handle the following options: + +AppearanceDuration: specifies the duration of the pop-up window appearance (in seconds). By default, this property is set to 0.25 s. +PopupHeight: specifies the height of the pop-up window (in pixels). By default, this property is set to 400px. +StyleLookup: specifies the name of the resource object (style) to which this pop-up window is linked. +TintColor: specifies the tint applied to this pop-up window. + + +Allows you to hide or show the master pane. +If your application has no master button, leave the MasterButton property empty. + +Limitations +The master button cannot be used when: + +The button is invisible and if the Mode property is set to Panel presentation mode. That is, the master pane is a "docked panel". +The onClick event handler is not supported. + +Specifies the presentation mode of the master pane. +The TMultiViewMode type provides the following presentation modes: + + + +Mode + +Master Pane Presentation + + +Drawer + +In the Drawer mode, the master pane can be whether hidden or can slide to overlap the detail pane. + + +Panel + +Master and detail panels are always displayed, independently of a device type and orientation. The master panel is docked to the left or right of the MultiView component. + + +PlatformBehaviour + +An application automatically selects the master pane presentation mode depending on the device type and orientation, as described in the tables in the Platform Dependent Behavior Mode subsection below. + + +Popover + +Pop-up menu. + + +NavigationPane + +Navigation pane. + + +Custom + +The user can customize the master pane presentation. The custom presentation class should be set in the CustomPresentationClass property. For details, see Custom Mode description. + +For detailed information about the presentation modes, see Master Pane Presentation Modes. + +Platform Dependent Behavior Mode +In the PlatformBehaviour mode, you let the application automatically select the master pane presentation mode. In this scenario, the application behavior depends on the device type, orientation, and the operation system version (only for desktop applications) as described in the following tables: +Mobile Applications + + + +Device Type + +Device Orientation + +Master Pane Presentation + + +Phone + +Landscape, Portrait + +Drawer (push/overlap) + + +Tablet + +Landscape + +Docked panel + + +Tablet + +Portrait + +Drawer (push/overlap) + +Desktop Applications + + + +OS Version + +Master Pane Presentation + + +Windows 10 + +Navigation pane + + +Windows 8 or earlier + +Docked panel + + +OS X + +Docked panel + + +Handles appearance options of borders for MultiView components. +TMultiViewBorderOptions defines the Color and Visible properties. + + +Handles appearance options of a shadow that the master pane casts on the detail pane. +With ShadowOptions property, you can handle the following appearance options of the shadow: + +Color: specifies the shadow color. +Enabled: enables or disables the shadow. +Opacity: specifies the opacity level of the shadow. + + +Handles appearance options of the master pane in the Panel presentation mode. +With SplitViewOptions property, you can handle the Placement option. Placement specifies the docked master pane location (left, right, top, or bottom). + + + + +Handles appearance options of the master pane in the Drawer presentation mode. +The DrawerOptions property handles the following options: + +DurationSliding: specifies the duration of the master pane sliding (in seconds). +Mode: specifies the master pane sliding mode. +Placement: specifies the master pane location (left or right). +TouchAreaSize: specifies the touch area size (in pixels). + + + +Handles the appearance options of the master pane in the NavigationPane presentation mode. +With NavigationPaneOptions, you can manage the CollapsedWidth property of the master pane appearance of the current MultiView component. CollapsedWidth specifies the width (in pixels) of the master pane in the NavigationPane presentation mode when it is collapsed. + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +The base class for MultiView components. +If you need to create a custom MultiView component, derive it from TCustomMultiView. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The class for MultiView components that allows providing the master-detail interface. +With TMultiView, you can implement a master-detail interface, which can be used for any target platform (such as an iOS, Android, or desktop application). +The TMultiView component provides the interface between the master and detail panes: + +In the master pane, you can display a collection of visual controls, such as edit boxes, labels, lists, and so on. These controls may be linked to the concrete views on the detail pane. +The detail pane displays information about the objects selected in the master pane. Whenever you change the selection in the master pane, the detail pane is updated to show details of the new selection. +For more information, see Mobile Tutorial: Using a MultiView Component to Display Alternate Views of Information (iOS and Android) and FMX.MultiViewDemo sample application. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Objects.xml b/Modules/DelphiFMX/doc/FMX.Objects.xml new file mode 100644 index 00000000..28c9494c --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Objects.xml @@ -0,0 +1,3146 @@ + + + + + + + + + + + + + + + + + + +Calls the inherited Painting method, which calls the event handler of the OnPainting event. Then Painting initializes the fill and stroke properties of the current canvas. +Painting initializes the Fill and Stroke properties of the current canvas with values defined for the proper properties of the shape object. + + + + + + +Forces the shape to repaint its image on the screen. +FillChanged is the event handler of the FMX.Graphics.TBrush.OnChanged event of the Fill property. + + + + + + + + +Forces the shape to repaint its image on the screen. +StrokeChanged is the event handler of the FMX.Graphics.TBrush.OnChanged event of the Stroke property. + + + + + + + + +Retrieves the ShapeRect rectangle for drawing the shape. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates an instance of TShape with the specified component as owner. + + + + + +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + +Determines the color and pattern used to fill the shape background. +The value of Fill is an FMX.Graphics.TBrush object. It can define the gradient, brush pattern, brush color, opacity, and other parameters to fill the shape background. + + +Determines the color and pattern of the drawing pen used to draw lines and shape contours of the graphical primitives. +The value of Stroke is an FMX.Graphics.TStrokeBrush object. To customize the outline pen, change the Thickness, Cap, Dash, and Join properties of the TStrokeBrush object. + + +Specifies the rectangle for drawing the shape. +The coordinates of the upper-left corner of the rectangle are (0,0), and the coordinates of the lower-right corner are (Width, Height). + + + +The base class for 2D graphic primitives--TLines, TRectangles, TPaths, and others. All these primitives inherit TControl and can be used in styles to construct controls. +TShape is the ancestor class to most other classes defined in the Objects unit. It defines the common behavior--methods and properties--for 2D graphic primitives. TShape objects cannot be used as stand-alone 2D components. + + + + + + + + + + + + + Specifies the way a line is drawn. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns True if the control rect is empty. +FMX.Objects.TLine.IsControlRectEmpty inherits from FMX.Controls.TControl.IsControlRectEmpty. All content below this line refers to FMX.Controls.TControl.IsControlRectEmpty. +Returns True if the control rect is empty. + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TLine.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + +Renders the control's surface. +FMX.Objects.TLine.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + + + + + + + + +Specifes the way a line is drawn. +The available values are: + +Boundary: Default. If you increase the thickness of a Boundary line, the line grows inside and outside of the control symmetrically. The central point of the growth depends on the TLineType. If TLineType is Diagonal, the line goes from the top-left corner to the bottom-right corner. If the thickness of the line is greater than the size of the control, a Boundary line may grow beyond the control. +Inner: If you increase the thickness of an Inner line, the line grows inside the control. If the thickness of the line is greater than the size of the control, an Inner line may grow beyond the control. +InnerWithin: If you increase the thickness of an InnerWithin line, the line grows inside the control. The thickness of an InnerWithin line is limited by the size of the control (it never grows beyond the control). + + +Specifies how to place the line inside the shape rectangle. +The LineType value should be one of the constants defined in the TLineType type: Diagonal, Top, or Left. +The default is Diagonal. +The TLineType type defines the following constants: + + + +Constant + +Meaning + + + +Diagonal + + + + Draw the line as the diagonal of the shape rectangle. + + + + +Top + + + + Draw the line as the top side (width) of the shape rectangle. + + + + +Bottom + + + + Draw the line as the bottom side (width) of the shape rectangle. + + + + +Left + + + + Draw the line as the left side (height) of the shape rectangle. + + + + +Right + + + + Draw the line as the right side (height) of the shape rectangle. + + + + + + + + + + + + + +Indicates whether to shorten the line. +If True, the width of the line is reduced symmetrically by half of the thickness, while the value of Width stays the same. + + + + + + + + + + + + + + + + + + + + + + + + + + + +TLine defines 2D lines. It inherits TControl and can be used in styles to construct controls. +The end points of the line to draw are defined by the following properties of the TLine object: + +The shape rectangle and the LineType define the straight-line segment to draw: +LineType defines the orientation of the line segment. +The intersection points of this line segment with the local rectangle define the end points of the straight-line segment. +RotationCenter defines the rotation axis and RotationAngle defines the rotation angle on which the straight-line segment is rotated to obtain the line to draw. +Note: Scaling not only scales the line length proportionally to scaling the factors. It also changes the thickness of the stroke that draws the line. That change is proportional to the scaling factor for each axis. +The parent TControl draws TLine with the Paint method. +To draw TLine, the Paint method uses the drawing pen with the Stroke property defined for the TLine object. + + + + + + + + + + + + + + + + + + + + + + + + +Setter for the XRadius property. + + + + + + +Setter for the YRadius property. + + + + + + +Setter for the Corners property. +Value is a set of constants defined in TCorner: TopLeft, TopRight, BottomLeft, and BottomRight. + + + + + + +Setter for the CornerType property. +Value should be one of the constants defined in TCornerType: Round, Bevel, InnerRound, and InnerLine. + + + + + + +Setter for the Sides property. +Value is a set of constants defined in TSide: Top, Left, Bottom, and Right. + + + +Renders the control's surface. +FMX.Objects.TRectangle.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TRectangle.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + + + + +Specifies shapes of which corners in the TRectangle rectangle object are customized according to the CornerType, XRadius, and YRadius properties. +By default, all four corners are customized. +Corners can contain a set of constants defined in the TCorner type: TopLeft, TopRight, BottomLeft, and BottomRight. Use the AllCorners constant to select all corners. +If Corners is an empty set or any of the XRadius and YRadius properties is zero, then no corner shape customization is used. + + +Specifies the type of the corner shape's customization in the rectangle. +Values of CornerType are defined in TCornerType. These Round, Bevel, InnerRound, and InnerLine values define the following types of corner shape customizations: + + +CornerType applies to corners specified in the Corners set. +XRadius and YRadius specify the distance from a corner to the start point of the corner shape customization, on the horizontal and vertical sides. + +Note: If Corners is an empty set or any of the XRadius and YRadius properties is zero, then no corner shape customization is used. + + + + + + + + + + + + + + + + + + +Specifies which sides of the TRectangle rectangle to display. +A side is a rectangle boundary between two adjacent corners or end points of corner customizations. End points of corner customizations are defined by XRadius and YRadius. A corner customization applies to corners included into the Corners set. +By default, all sides of the rectangle are displayed. +Sides can contain a set of constants defined in TSide: Top, Left, Bottom, and Right. +Use the AllSides constant to select all sides. +If Sides is empty, then no side is displayed. + + + + + +Specifies the distance from a corner to the start point of the corner shape customization, on the horizontal sides of TRectangle. +During design time, the maximum possible value of XRadius is limited by the half of the smallest side. +If XRadius=0, then no corner shape customization is used. + + +Specifies the distance from a corner to the start point of the corner shape customization, on the vertical sides of TRectangle. +During design time, the maximum possible value of YRadius is limited by the half of the smallest side. +If YRadius=0, then no corner shape customization is used. + + + + + + + + + + + + + + + + + + + + + + + +TRectangle defines 2D rectangles with customized corners. It inherits TControl and can be used in styles to construct controls. +The CornerType, XRadius, and YRadius properties define how to customize shapes of rectangle corners: + + +Corners specifies which corners to be customized. +Notice that, if Corners is an empty set or any of the XRadius or YRadius properties is zero, then no corner shape customization is used. +The rectangle size and position are defined by the following properties of the TRectangle object: + +The shape rectangle ShapeRect defines the initial size and position of the rectangle. +You can use the rotation axis RotationCenter and rotation angle RotationAngle of the TRectangle object to rotate and move the rectangle. +You can use the scaling factors of the TRectangle object to proportionally scale rectangle coordinates along local coordinate axes. Scaling moves the rectangle and changes its size. +Note: Scaling not only scales the shape of an object proportionally to the scaling factors. It also changes the thickness of the stroke that draws the contour proportionally to the scaling factor for each axis. +TRectangle draws the contour and fills the background with the Paint method. Paint uses the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.Objects.TCaretRectangle.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Represents the default width for the caret of this TCaretRectangle. + + + + + + +Represents the default color of the caret. +Use DefaultColor to retrieve the default color for the caret of this TCaretRectangle. + + + + + + +Specifies whether the caret color of this TCaretRectangle is specified. +This information is retrieved from the system information. + + + + + + +Represents the default interval of time, in milliseconds, at which the caret flashes. +The default interval of time is 500 milliseconds. + + + + + + +Getter of DefaultSize. +FMX.Objects.TCaretRectangle.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TCaretRectangle.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + + + +Destroys the object instance and frees its memory. +FMX.Objects.TCaretRectangle.Destroy inherits from FMX.Objects.TShape.Destroy. All content below this line refers to FMX.Objects.TShape.Destroy. +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + +Updates the state of this TCaretRectangle. + + +Caret is a TCustomCaret that describes the caret of this TCaretRectangle. + + + +TCaretRectangle is a TRectangle descendant that can additionally hold caret (cursor) information. + + + + + + + + + + + + + + + +Setter for the Corners property. +Value is a set of constants defined in TCorner: TopLeft, TopRight, BottomLeft, and BottomRight. + + + +Renders the control's surface. +FMX.Objects.TRoundRect.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TRoundRect.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + + + + +Specifies which corners in the TRoundRect object are to be rounded. +The rounding radius is equal to the half of the smallest side. +By default, all four corners are rounded. +Corners is a set of TCorner values that specify which of the corners are rounded. +If Corners is an empty set, then no corner is rounded. +Use the AllCorners constant to select all corners. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TRoundRect defines 2D rectangles with rounded corners. It inherits TControl and can be used in styles to construct controls. +The rectangle size and position are defined by the bounding rectangle of the TRoundRect object. You can use the scaling factors Scale of the TRoundRect object to proportionally change rectangle coordinates along local coordinate axes. This will move the rectangle and change its shape. The rotation axis RotationCenter and rotation angle RotationAngle of the TRoundRect object can be used to rotate the rectangle. + +Note: Scaling not only scales the shape of an object proportionally to the scaling factors. It also changes the thickness of the stroke that draws the contour proportionally to the scaling factor for each axis. +The Corners property defines which rectangle corners are to be rounded. The Radius of the rounding is defined by the following formula: + +Radius := Min(RectHeight(GetShapeRect),RectWidth(GetShapeRect)) / 2; + +TRoundRect draws the contour and fills the shape background with the Paint method. +Paint draws the contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TRoundRect object. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Setter for the XRadius property. +FMX.Objects.TCalloutRectangle.SetXRadius inherits from FMX.Objects.TRectangle.SetXRadius. All content below this line refers to FMX.Objects.TRectangle.SetXRadius. +Setter for the XRadius property. + + + + + + +Setter for the YRadius property. +FMX.Objects.TCalloutRectangle.SetYRadius inherits from FMX.Objects.TRectangle.SetYRadius. All content below this line refers to FMX.Objects.TRectangle.SetYRadius. +Setter for the YRadius property. + + + + + + +Setter for the Corners property. +FMX.Objects.TCalloutRectangle.SetCorners inherits from FMX.Objects.TRectangle.SetCorners. All content below this line refers to FMX.Objects.TRectangle.SetCorners. +Setter for the Corners property. +Value is a set of constants defined in TCorner: TopLeft, TopRight, BottomLeft, and BottomRight. + + + + + + +Setter for the CornerType property. +FMX.Objects.TCalloutRectangle.SetCornerType inherits from FMX.Objects.TRectangle.SetCornerType. All content below this line refers to FMX.Objects.TRectangle.SetCornerType. +Setter for the CornerType property. +Value should be one of the constants defined in TCornerType: Round, Bevel, InnerRound, and InnerLine. + + + + + + +Setter for the Sides property. +FMX.Objects.TCalloutRectangle.SetSides inherits from FMX.Objects.TRectangle.SetSides. All content below this line refers to FMX.Objects.TRectangle.SetSides. +Setter for the Sides property. +Value is a set of constants defined in TSide: Top, Left, Bottom, and Right. + + + +OnResize event dispatcher. +FMX.Objects.TCalloutRectangle.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Initializes the component after the form file has been read into memory. +FMX.Objects.TCalloutRectangle.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + True + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Generates the contour of TCalloutRectangle. +CreatePath uses parameters of the current TCalloutRectangle object to generate a series of connected curves and lines (in the FMX.Graphics.TPathData type) that form the TCalloutRectangle contour to draw. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Renders the control's surface. +FMX.Objects.TCalloutRectangle.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TCalloutRectangle.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + + + +Destroys the object instance and frees its memory. +FMX.Objects.TCalloutRectangle.Destroy inherits from FMX.Objects.TShape.Destroy. All content below this line refers to FMX.Objects.TShape.Destroy. +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + +The width of the callout pointer. +TCalloutRectangle renders its callout pointer as an isosceles triangle on one of its sides. +CalloutWidth is the length of the base of the triangle. + + +The length of the callout pointer. +TCalloutRectangle renders the callout pointer as an isosceles triangle on one of its sides. CalloutLength is the height of this triangle. The triangle is included in the bounding rectangle ShapeRect of the TCalloutRectangle object; therefore, the longer CalloutLength is, the smaller the height (or width) of the callout rectangle itself is, and vice versa. Keeping the bounding rectangle the same size while changing the length of the triangle CalloutLength requires changing the height or width of the callout rectangle TCalloutRectangle itself, depending on which side the triangle appears. + + +Specifies the side of the rectangle where the callout pointer appears. +TCalloutRectangle renders its callout pointer as an isosceles triangle on one of its four sides. +Set CalloutPosition to one of the Top, Left, Bottom, or Right constants predefined in TCalloutPosition to define the side on which the callout pointer should appear. +By default, the callout pointer appears on the top side CalloutPosition = Top. + + +The position of the callout pointer, relative to the center or edges of the side on which it appears. +TCalloutRectangle renders the callout pointer as an isosceles triangle on one of its sides. The CalloutPosition defines the side on which the triangle appears. +CalloutOffset is the triangle offset implemented according to the following conditions: + +If CalloutOffset is zero, then the triangle is centered on the specified side. +If CalloutOffset is positive, then the closest point of the callout pointer to a corner of the triangle has the CalloutOffset offset on the following sides: +Top--offset to the right from the upper-left corner. +Left--offset to the bottom from the upper-left corner. +Right--offset to the bottom from the upper-right corner. +Bottom--offset to the right from the lower-left corner. +If CalloutOffset is negative, then the closest point of the callout pointer to a corner of the triangle has the CalloutOffset offset on the following sides: +Top--offset to the left from the upper-right corner. +Left--offset to the top from the lower-left corner. +Right--offset to the top from the lower-right corner. +Bottom--offset to the left from the lower-right corner. + + + + + +A rectangle with a triangular "peak" on one of four sides, used primarily to render a TCalloutPanel. +Because TCalloutRectangle inherits from TRectangle, TCalloutRectangle provides all the properties (Corners, CornerType, Sides, XRadius, YRadius, and others) and methods to define the shape of the rectangle itself. +A call-out often takes the form of a pull-quote, in which a particular snippet of text in a document is duplicated to attract attention: in a larger size, with a different typeface, in a colored box, with stylized quote marks, and so on. With illustrations, boxed text will refer to different elements of interest, and each box will be drawn with extra lines that point to its element. +TCalloutRectangle is a rectangle with an isosceles triangle on one of its four sides, used to point at something else. The triangle is included in the bounding rectangle of the object: the longer its length, the shorter the rectangle shape will be, and vice versa. Keeping the rectangle the same size while changing the length of the triangle requires changing the height or width of the object, depending on which side the triangle appears. + + + + + + +Renders the control's surface. +FMX.Objects.TEllipse.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + +Checks whether the point specified by local coordinates belongs to the control area. +FMX.Objects.TEllipse.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TEllipse defines 2D ellipses. It inherits TControl and can be used in styles to construct controls. +The following TEllipse properties define the ellipse shape and position: + +Initially the ellipse is inscribed into the bounding rectangle ShapeRect of the TEllipse object. +Then the rotation axis RotationCenter is moved along the local coordinate axes proportionally to the Scale factors. +Then this ellipse is rotated around the obtained pivot on the RotationAngle angle. +Note: Scaling not only scales the shape of an object proportionally to the scaling factors. It also changes the thickness of the stroke that draws the contour proportionally to the scaling factor for each axis. +TEllipse draws the contour and fills the background with the Paint method. +Paint draws the contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TEllipse object. + + + + + + + + +Renders the control's surface. +FMX.Objects.TCircle.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +TCircle defines 2D circles. It inherits TControl and can be used in styles to construct controls. +The following TCircle properties define the circle size and position: + +The bounding rectangle ShapeRect of TCircle defines the bounding square for the circle: +The length of the bounding square sides equals to Min(Width, Height) of the ShapeRect bounding rectangle. +The bounding square center coincides with the center of the bounding rectangle. +The TCircle shape is inscribed into the obtained bounding square. +You can use the Scale scaling factors of the TCircle object to proportionally scale circle coordinates along local coordinate axes. Scaling moves the circle and changes its size. +You can use the rotation axis RotationCenter and rotation angle RotationAngle of the TCircle object to modify the circle shape and position. +TCircle draws the contour and fills the shape background with the Paint method. +Paint draws the contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TCircle object. + + + + + + + + + + + + + + + + + + + + +Renders the control's surface. +FMX.Objects.TPie.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + +Checks whether the point, specified by the absolute coordinates, belongs to the control area. +FMX.Objects.TPie.PointInObject inherits from FMX.Controls.TControl.PointInObject. All content below this line refers to FMX.Controls.TControl.PointInObject. +Checks whether the point, specified by the absolute coordinates, belongs to the control area. +PointInObject returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the absolute coordinates (relative to the main form) of the point to be checked (compare with PointInObjectLocal): + +X is the X coordinate. +Y is the Y coordinate. +The points of the control boundary specified by BoundsRect belong to the control and PointInObject returns True for them. + +Note: PointInObject simply converts absolute coordinates of the point to local coordinates and calls PointInObjectLocal. + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TPie.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + +Specifies the start angle for this pie object. +The StartAngle start angle is measured clockwise from the x-axis. +Use StartAngle in conjunction with EndAngle to specify how to draw and fill this pie. +Notice that FMX.Controls.TControl.RotationAngle rotates the x-axis. + + +Specifies the end angle for this pie object. +The EndAngle end angle is measured clockwise from the StartAngle start angle. +Use EndAngle in conjunction with StartAngle to specify how to draw and fill this pie. + + + +TPie defines 2D pies. +TPie is drawn as part of TEllipse. It inherits TControl and can be used in styles to construct controls. +The TPie object is the part of the TEllipse object enclosed between radiuses with the StartAngle and EndAngle angles. +The ShapeRect bounding rectangle, scaling factors specified by Scale, RotationCenter rotation axis, and RotationAngle rotation angle of the TEllipse object should be used to define the general size, shape, and position of TPie. +TPie draws the contour and fills the shape background with the Paint method. +Paint draws the contour using the drawing pen with the properties, color, and opacity defined by the Stroke property of the TPie object. +Paint fills the background using the drawing brush with the properties, color, and opacity defined by the current Fill property of the TPie object. + + + + + + + + + + + + + + + + + + + + +Renders the control's surface. +FMX.Objects.TArc.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TArc.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + +Specifies the start angle for this arc object. +The StartAngle start angle is measured clockwise from the x-axis. +Use StartAngle in conjunction with EndAngle to specify how to draw this arc. +Notice that FMX.Controls.TControl.RotationAngle rotates the x-axis. + + +Specifies the end angle for this arc object. +The EndAngle end angle is measured clockwise from the StartAngle start angle. +Use EndAngle in conjunction with StartAngle to specify how to draw this arc. + + + +TArc defines 2D arcs. +TArc is drawn as part of TEllipse's contour. It inherits TControl and can be used in styles to construct controls. +The TArc object is the part of the TEllipse's contour enclosed between radiuses with the StartAngle and EndAngle angles. +To define the general size, shape, and position of TArc, use the ShapeRect bounding rectangle, the scaling factors specified by Scale, the RotationCenter rotation axis, and the RotationAngle rotation angle of the TEllipse object. +TArc draws the contour and fills the shape background with the Paint method. +The Paint method draws the TArc contour using the drawing pen having the Stroke property of the TArc object. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Forces the shape to repaint its image on the screen. +FMX.Objects.TCustomPath.StrokeChanged inherits from FMX.Objects.TShape.StrokeChanged. All content below this line refers to FMX.Objects.TShape.StrokeChanged. +Forces the shape to repaint its image on the screen. +StrokeChanged is the event handler of the FMX.Graphics.TBrush.OnChanged event of the Stroke property. + + + + + + + + +Forces the repainting of the TCustomPath image on the screen. + + + +Renders the control's surface. +FMX.Objects.TCustomPath.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +Resize is called when TCustomPath is resized. +Resize calls the inherited FMX.Controls.TControl.Resize method and then sets that the TCustomPath image needs to be updated. + + + +Makes required initializations by calling the inherited TControl.Loaded procedure and then sets that the TCustomPath image needs to be updated. +For additional details, see TControl.Loaded and TComponent.Loaded. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates an instance of TShape with the specified component as owner. +FMX.Objects.TCustomPath.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + + + +Destroys the object instance and frees its memory. +FMX.Objects.TCustomPath.Destroy inherits from FMX.Objects.TShape.Destroy. All content below this line refers to FMX.Objects.TShape.Destroy. +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + + + + + + +Checks whether the specified point belongs to the path Data of the TCustomPath object. +PointInObject calls the FMX.Graphics.TCanvas.PtInPath method of the TCanvas object to check whether the specified point belongs to the path Data of the TCustomPath object. +X and Y are absolute pixel coordinates of the point to be checked: + +X is the x-coordinate. +Y is the y-coordinate. + +Specifies the SVG data used to build graphic shapes. +The Data property supports only a comma-separated list of instructions defined for the d attribute of the path element in SVG 1.0. +In SVG 1.0, the d attribute contains the moveto, line, curve, arc, and closepath instructions. All instructions are expressed as one character (for example, a moveto is expressed as an M). +For more information, see Scalable Vector Graphics (SVG) 1.0 Specification. + +Example +To clarify, consider the following code snippets that specify the SVG instructions at run time: + + +Delphi: + +Path1.Data.Data := 'M 1,0, L 2,1, L 1,2, L 0,1, L 1,0'; + + +C++Builder: + + +Path1->Data->Data = "M 1,0, L 2,1, L 1,2, L 0,1, L 1,0"; + + +An application that uses the above mentioned SVG instructions displays a rhomb: + + + +Specifies whether and how to resize, replicate, and position the graphical path representation for painting the area. +The WrapMode property should be one of the constants defined in the TPathWrapMode type: + +Stretch--stretches the path representation to fill the entire area. Default. +Original--keeps the original path size. +Fit--resizes the path representation (keeping proportions) to best fit the area. +Tile--renders the path representation repeatedly to tile the area. + + +TCustomPath is the base class for all 2D path-type shapes representing groups of connected curves and lines. +TCustomPath renders the path Data graphics with the Paint method. Paint scales and positions the path graphics according to the WrapMode parameter. Paint draws the path contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TCustomPath object. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TPath defines 2D path-type shapes representing groups of connected curves and lines. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Method to indicate that the underline needs to be redrawn. + + + + + Draws the underline unside the character that holds the accelerator. + + + + + + + + + + + + + Index of the accelerator key. + + + + + True if the underline is already generated. + + + + + This brush is used to draw the underline down the accelerator key character. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Objects.TText.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Computes the size of the TText control, based on the font used, then re-renders it with the new dimensions. +The FontChanged method recalculates the physical dimensions (height and width) of the TText control according to the font used to display the text, and re-renders it with the new dimensions. +FontChanged is used internally for auto-sizing purposes. For more information on how to make TText auto-resize according to its display text, refer to the AutoSize API help topic. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsClass class reference to the TTextSettingsClass class (or its descendant). An instance of such class provides Font, FontColor, HorzAlign, VertAlign, Trimming, WordWrap, and other text representation properties of a control. Some of these properties can be declared as published to be editable in the Object Inspector. +You can override the method in descendant classes to modify the default behavior. + + + +Renders the control's surface. +FMX.Objects.TText.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + + + +Getter method for the Text property. + + + + + + +Setter method for the Text property. + + + +Computes the new size of the TText control and re-renders it with the new dimensions. + + + +Computes the new size of the TText control and re-renders it with the new dimensions. +The AdjustSize method recalculates the physical dimensions (height and width) of the TText control according to the text it displays, and re-renders it with the new dimensions. +AdjustSize is used internally for auto-sizing purposes. For more information on how to make TText auto-resize according to its display text, refer to the AutoSize API help topic. + + + +OnResize event dispatcher. +FMX.Objects.TText.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Initializes the component after the form file has been read into memory. +FMX.Objects.TText.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Removes the accelerator keys drawing information. + + + + +Indicates the accelerator keys drawing information. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TText.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TText.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Responds after the last constructor has executed. +FMX.Objects.TText.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + + + + + + + +Sets the boundaries of the current control. +FMX.Objects.TText.SetBounds inherits from FMX.Controls.TControl.SetBounds. All content below this line refers to FMX.Controls.TControl.SetBounds. +Sets the boundaries of the current control. +Use SetBounds to change all of the boundary properties of the control at one time. +X specifies the X coordinate of the Position of the control. +Y specifies the Y coordinate of the Position of the control. +AWidth specifies the value of the Width of the control. +AHeight specifies the value of the Height of the control. +The same effect can be achieved by setting the Position, Width, and Height properties separately, but SetBounds changes all properties at once, ensuring that the control will not repaint between changes. +After setting the boundary properties, SetBounds specifies to the control to maintain the alignment of the control within its parent and of its children within it. The given parameter does not necessarily reflect in the Position, Width, and Height properties. The properties can be updated when the alignment is applied. + + +Specifies the attributes of text written on or in the control. +To change to a new font, specify a new TFont object. To modify a font, change the value of the Family, Size, or Style of the TFont object. + + +Specifies the color of the Text. +Use Color to set and get the color used to display Text within TText. + + +Specifies how the text will be displayed in terms of horizontal alignment. +The HorzTextAlign property specifies how the TText control will display the text in terms of horizontal alignment. HorzTextAlign can have one of the following values: + +Center (default)--aligns the text on a horizontal axis, at the middle of the TText control. +Leading--aligns the text on a horizontal axis, at the topmost position inside the TText control. +Trailing--aligns the text on a horizontal axis, at the bottommost position inside the TText control. + +Specifies the behavior of the text, when it overflows the area for drawing the text. +Trimming may take the following values defined in the TTextTrimming type: None, Character, and Word. +If the value of this property is not None and the text does not fit in the drawing area, then it is trimmed to fit the area and an ellipsis sign is printed after the trimmed text. + +Note: For Android and iOS platforms, Trimming works only when WordWrap = False. + +Specifies how the text will be displayed in terms of vertical alignment. +The VertTextAlign property specifies how the TText control will display the text in terms of vertical alignment. VertTextAlign can have one of the following values: + +Center (default)--aligns the text on a vertical axis, at the middle of the TText control. +Leading--aligns the text on a vertical axis, at the topmost position inside the TText control. +Trailing--aligns the text on a vertical axis, at the bottommost position inside the TText control. + +Specifies whether the text inside the TText control wraps when it is longer than the width of the control. +Set WordWrap to True to allow the TText control to display multiple lines of text. When WordWrap is True, text that is too long to fit in the TText control wraps at the right margin and continues in additional lines. +Set WordWrap to False for the text to span onto a single line of the TText control. However, in this case, the text that is too long to fit in the TText control appears truncated. + + + + +Specifies whether TText control is auto-sized based on the length of the text. +Set the AutoSize property to True to automatically resize the TText control according to the length of the Text. +Set the AutoSize property to False to lock autoresize of the TText control. + +Tip: The size of the TText control readjusts when the Font property changes. +When both AutoSize and WordWrap are set to True, the height of the TText control increases to show the full text, while the width does not change. +When AutoSize is set to True and WordWrap is False the width of the TText control changes to display the text in one line, while the height does not change. + + + + + + + + + + + + + + + + + + + + +Specifies whether the text in the control will be displayed as stretched over the entire client area. +Set the Stretch property to True to display the text stretched over the entire client area of the TText control. Set the Stretch property to False to display the text normally, without the stretch effect. The default value for the Stretch property is False. + +Tip: Setting the Stretch property to True cancels the effect of the WordWrap property. + +Specifies the text that will be displayed in the TText control. +The Text property sets or reads the text that is displayed by the TText control. Text is a string. + + +Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + +It determines the way to portray a single character, such as "&". + + + + + + + + + + + + + + + + + + + + + + + + + + + +TText defines 2D text objects. It inherits TControl and can be used in styles to construct controls. +TText implements the ITextSettings interface. Therefore, TText objects provide all declared in ITextSettings methods and properties to manage the text appearance parameters declared in TTextSettings. + + + + + + + + + + + + + + + + + + + + + + + + Specifies whether and how to resize, replicate, and position the image for rendering the control surface. + + + + Display the image with its original dimensions. + + + + + Stretches image into the LocalRect, preserving aspect ratio. When LocalRect + is bigger than image, the last one will be stretched to fill LocalRect + + + + + Stretch the image to fill the entire control's rectangle. + + + + + Tile (multiply) the image to cover the entire control's rectangle. + + + + + Center the image to the control's rectangle. + + + + + Places the image inside the LocalRect. If the image is greater + than the LocalRect then the source rectangle is scaled with aspect ratio. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Forces the current TImage control to repaint its image on the screen and update the effects of the control and of the control's parent. +DoChanged is called every time the current TImage control is changed. + + + +Renders the control's surface. +FMX.Objects.TImage.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + + 1 + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Tries to find the item in MultiResBitmap that has the most suitable scale. +If the IncludeEmpty parameter is True, the returned item can be empty. Otherwise, the returned item cannot be empty. Empty items are ignored. +If the search is successful, ItemForCurrentScale returns the TCustomBitmapItem, otherwise ItemForCurrentScale returns nil. + + + + + + + + + + + + + + + +Protected getter implementation for the Data property. +If the Data property is empty, GetData returns the value of the Bitmap property. + + + + + + +Protected setter implementation for the Data property. +Additionally, if Value is a TPersistent descendant, the Bitmap property is also set to Value. + + + + + + +Creates the MultiResBitmap multi-resolution bitmap image of the TFixedMultiResBitmap type that will be used by this TImage component to display a picture. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Objects.TImage.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Retrieves whether some properties of MultiResBitmap are stored. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TImage.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TImage.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + + 1 + + + + +Draws a TBitmap image after scaling it to a specified area of the TCanvas. +Use this method to display a whole bitmap image into a specified area of the TCanvas. To display a specified area of the bitmap image, use the FMX.Graphics.TCanvas.DrawBitmap method. + +Parameters +This method defines the following parameters: + +Canvas: specifies a canvas. +ARect: specifies the rectangle area of Canvas to be drawn. +ABitmap: specifies a TBitmap image. +AOpacity: specifies the transparency to be applied to the ABitmap. +Notes +When using the DrawBitmap method, pay attention to the following: + +When drawing a bitmap image, this method uses the following properties of TImage: +FMX.Objects.TImage.BitmapMargins: Specifies the margins of the bitmap image to draw. +FMX.Objects.TImage.WrapMode: Specifies whether and how to resize, replicate, and position the bitmap image. +It is recommended to use this method within the onPaint event handlers, such as FMX.Controls.TControl.OnPaint or FMX.Forms.TCustomForm.OnPaint. + +Specifies the bitmap picture that will be displayed by this TImage component. +Set the Bitmap property to the bitmap picture that you want to be displayed by this TImage component. Reading Bitmap provides a TBitmap image that you can assign to other TImage components or you can save to a stream or a file. +The Bitmap getter retrieves the Bitmap image from the appropriate bitmap item of the multi-resolution bitmap stored in MultiResBitmap. When you set a new value to the bitmap, the Bitmap setter saves this bitmap in this bitmap item of the MultiResBitmap multi-resolution bitmap. If you change this bitmap item in MultiResBitmap by any way, this will change the Bitmap image. For example, you can edit MultiResBitmap in the MultiResBitmap Editor from the Object Inspector. +For a list of image formats supported by this component, please refer to the TBitmapCodecManager API help topic. +You can also assign an image programmatically, as exemplified in the following code snippet: + + Image1.Bitmap.LoadFromFile('MyImage.jpg'); + +Note: The Bitmap getter uses the following algorithm to retrieve the Bitmap property's value: +Using the GetSceneScale function for the Scene in which the control is drawn, the Bitmap getter retrieves the Scale for the current device. If Scene is not defined, then the 1.0 value for Scale is accepted. +If MultiResBitmap is assigned, then the getter gets the Bitmap from the bitmap item having the scale best matching to the obtained Scale (not including empty bitmap items.) +If the getter does not find any not empty bitmap item, then the getter tries to retrieve an empty bitmap item having the scale exactly matching to the obtained Scale. +If the getter cannot find an empty bitmap item having the obtained Scale, then the getter creates a new bitmap item with the obtained Scale and returns the bitmap from the created bitmap item. +If the obtained Scale <= 0 or MultiResBitmap is not assigned, the exception is raised. + +Keeps the TFixedMultiResBitmap multi-resolution bitmap. + + + + +Specifies the margins of the bitmap displayed by this TImage component. +Set or read the BitmapMargins property in order to affect the margins of the image that is displayed by this TImage component. + + + + + +Enables or disables the interpolation of the bitmap image displayed by this TImage component. +The DisableInterpolation property specifies whether the interpolation is used while rendering the bitmap image displayed by this TImage component. By default, DisableInterpolation is set to False. +The following picture shows the same image rendered once with DisableInterpolation set to False and once with DisableInterpolation set to True. + + + + + + + + + + + +Specifies how the margins of the Bitmap are resized, replicated, and positioned. +Use MarginWrapMode property to set and get how the margins of the Bitmap are displayed within the TImage. By default the margins are stretched to fill the entire TImage. To see the possible values of MarginWrapMode, go to TImageWrapMode. +If BitmapMargins property is not set, then MarginWrapMode has no effect over the image. + + + + + + + + + + + + +Specifies whether and how to resize, replicate, and position the bitmap image for rendering the TImage surface. +The WrapMode property should be one of the constants defined in the TImageWrapMode type: + +Original displays the image with its original dimensions. +Fit provides the best fit, keeping image proportions (the ratio between the width and height) for the TImage rectangle. If needed, the image is scaled down or stretched to best fit the rectangle area. This is the default option. +Stretch stretches the image to fill the entire rectangle of the TImage component. +Tile tiles the TImage image to cover the entire rectangle of the TImage component. +Center centers the image to the rectangle of the TImage component. The image is never resized, regardless the size of the rectangle of the TImage component. +Place fits the image into the TImage rectangle. If the width or height of the image is greater than the corresponding dimension of the TImage rectangle, then the image is scaled down keeping image proportions (the ratio between the width and height) to fit in the TImage rectangle. The obtained image is centered in the TImage rectangle. Place only makes images smaller, never larger. + + + + + + + + + + + + + + + + + + + + + +TImage defines 2D image components. It inherits TControl and can be used in styles to construct controls. +Use TImage to display a graphical image on a control. +Use the MultiResBitmap property to specify the multi-resolution set of bitmaps the most appropriate of which will be displayed as the picture on this TImage control. The TImage control shows the bitmap item with the scale best matching to the device resolution. See in the Bitmap property which algorithm is used to define the most appropriate bitmap item. +You can find the list of supported picture formats in TBitmapCodecManager. +Use the WrapMode property to specify whether and how to resize, replicate, and position the bitmap image for rendering the TImage surface. +Notice that if any BitmapMargins is defined, then WrapMode is ignored. + + + + + + + + + +Renders the control's surface. +FMX.Objects.TPaintBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TPaintBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TPaintBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs when the control is redrawn. +FMX.Objects.TPaintBox.OnPaint inherits from FMX.Controls.TControl.OnPaint. All content below this line refers to FMX.Controls.TControl.OnPaint. +Occurs when the control is redrawn. +OnPaint also occurs when DoPaint is called. +Write an event handler for OnPaint to change the way the control renders itself. + +Tip: Notice that calling BeginScene in the OnPaint event handlers has no effect, because BeginScene is called before the OnPaint event handler runs. This guarantees that painting always occurs in OnPaint without requiring extra and probably unexpected code to allow drawing to have an effect. + + + + +TPaintBox defines a 2D image component providing a canvas that an application can use for rendering an image. It inherits TControl and can be used in styles to construct controls. +Unlike TImage, which displays a picture that is stored in a file, TPaintBox requires an application to draw the image directly on a canvas. Use the OnPaint event handler to draw on the paint box's FMX.Graphics.TCanvas, the drawing surface of the paint box. + + + + + + + + + $FF1072C5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Renders the control's surface. +FMX.Objects.TSelection.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +It draws a grip handle. + + + + + + + + + + + +It draws a frame rectangle. + + + + + + + + + + + + + + + +Checks whether the point specified by local coordinates belongs to the control area. +FMX.Objects.TSelection.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TSelection.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TSelection.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + + +Handles the pressing of a mouse button inside the TSelection object. +MouseDown calls FMX.Controls.TControl.MouseDown, checks whether any of the grip controls (small circles in the selection rectangular corners) are pointed to resize the selection shape and activate resizing by moving this control or activates moving of the TSelection object by moving the mouse pointer. +MouseDown has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the TShiftState type and passes additional information such as: whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were pressed when the mouse button was clicked; whether the mouse button was double-clicked (ssDouble). +X and Y--are the local pixel coordinates of the mouse pointer within the TSelection object. +The TForm form, owner of the TSelection object, calls MouseDown in response to mouse-down messages. +Override the public MouseDown method to provide a customized response when a mouse button is pressed when the mouse pointer is over the TSelection object. + + + + + + + + +Handles moving of the mouse pointer over a TSelection object. +As the mouse pointer moves over a TSelection object, this method is called repeatedly. It is called each time with the new mouse pointer coordinates that reflect the continuous path of the mouse pointer. + +Parameters +MouseMove has the following parameters: + +Shift--belongs to the TShiftState type and passes additional information, such as: which mouse button was pressed (ssLeft--left, ssRight--right) or whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were pressed when the mouse button was clicked. +X and Y--are the local pixel coordinates of the mouse pointer within the TSelection object. +Functionality +MouseMove executes the following operations: + +MouseMove calls the inherited FMX.Controls.TControl.MouseMove method. Then: +If the mouse button is not pressed down: +Check whether the mouse pointer hovers over a grip control: +When the mouse pointer moves over a grip control--shows the resizing arrow on the grip control over which the mouse pointer is moving. +When the mouse pointer moves outside a grip control--clears the resizing arrows, if any. +Force repaint of the selection shape. +If the left mouse button is pressed inside the TSelection object: +Moves the shape of the TSelection object on the vector with the start point having the coordinates where the mouse button was pressed and the end point having the current coordinates of the mouse. +If ParentBounds is True, the TSelection object shape is moved inside the boundaries of the parent control. +If ParentBounds is False, the TSelection object shape is moved inside the boundaries of the current TCanvas object. +Calls the customer event handler of the OnTrack event. +If the left mouse button is pressed down on one of the grip controls of the TSelection object: +The shape of the TSelection object is resized to reflect the moving of the selected grip control. +If ParentBounds is True, the TSelection object shape is resized to fit the boundaries of the parent control. +If ParentBounds is False, the TSelection object shape is resized to fit the boundaries of the current TCanvas object. +If Proportional is True, the object shape is resized keeping the Width/Height proportion. +Call the customer event handler of the OnTrack event. +Force the repaint of the selection shape. + +Override the public MouseMove method to provide a customized response when the mouse pointer is moved over the TSelection object. + + + + + + + + + +Handles the release of a mouse button pressed inside the TSelection object. +MouseUp calls the inherited FMX.Controls.TControl.MouseUp. If the TSelection object is being moved or resized by the mouse, MouseUp calls the OnChange event handler, and then stops moving or resizing by the mouse. +MouseUp has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the TShiftState type and passes additional information, such as whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were down when the pressed mouse button was released. +X and Y--are the local pixel coordinates of the mouse pointer within the TSelection object. +The TForm form (owner of the TSelection object) calls MouseUp in response to mouse-up messages. +Override the public MouseUp method to provide a customized response if the mouse button is released when the mouse pointer is over the TSelection object. + + + +DoMouseLeave is called automatically when the mouse pointer leaves the TSelection object. +DoMouseLeave of the TSelection object calls the inherited FMX.Controls.TControl.DoMouseLeave method which starts animation by calling StartTriggerAnimation, applies effects by calling ApplyTriggerEffect, and calls the FMX.Controls.TControl.OnMouseLeave event handler. Then DoMouseLeave frees the grip controls. Finally, DoMouseLeave initializes the TSelection shape repaint operation. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the TSelection object. + + + +It grips the handle where the mouse is hovered. + + + + + + + + + + + +Selection frame and handle's border color. + + + + + + + + +Defines the size of the grip controls used to resize the TSelection object. + + + + +Defines whether to hide the selection rectangle when the TSelection object is not selected. +When HideSelection is True and the TSelection object is not selected, the rectangle and grip controls are invisible. + +See also +FMX.Objects.TSelection.GripSize + + + + + + +Defines the minimum possible values for the width and height of the TSelection object. + + + + +Defines whether the shape of the TSelection object should be inside the boundaries of the parent control. +When ParentBounds is True, the shape of the TSelection object cannot be moved outside the boundaries of the parent control. + + +Defines whether the width/height proportion should be kept during the resizing of the TSelection object. + + + + + + + + + +It indicates the visibility of the handles. + + + + + + + + + +The event handler of the OnChange event is called from the MouseUp method whenever the shape of a TSelection object changes. +Write a custom OnChange event handler to perform a specific action when the TSelection object changes. + + + + + + + + + + + + + + + + + + + +The event handler of the OnTrack event is called cyclically from the MouseMove method while the TSelection object is in the process of moving or resizing. +Write a custom OnTrack event handler to perform a specific action when TSelection is in the process of moving or resizing. + + + +TSelection defines 2D rectangle object that can be moved and resized. It inherits TControl and can be used in styles to construct controls. +You can use scaling factors Scale of the TSelection object to proportionally change coordinates of a selection object's rectangle along local coordinate axes. Scaling moves the selection rectangle and change its size. The rotation axis RotationCenter and rotation angle RotationAngle of the selection object can also be used to modify the selection rectangle's size and position. +The Paint method renders the TSelection image. Paint internally defines the properties of the drawing pen to draw the selection contour and the brush to fill the background depending on whether the control is enabled, the zone is hot, and other conditions. +To resize the TSelection rectangle you can use four grip controls. Grip controls appear as small circles at the selection rectangle corners when the mouse pointer hovers over the grip controls. + + + + + + + + + + + + + + + + + + + + + + + + + +Renders the control's surface. +FMX.Objects.TSelectionPoint.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Setter function for the Height property. +Value specifies the new value of the Height property. +If no style is applied to the TSelectionPoint object, then SetHeight sets Height = 2*GripSize. The specified Value is ignored. + + + + + + +Setter function for the Width property. +Value specifies the new value of the Width property. +If no style is applied to the TSelectionPoint object, then SetWidth sets Width = 2*GripSize. The specified Value is ignored. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +DoMouseEnter is called when the mouse pointer enters the TSelectionPoint object. +DoMouseEnter calls the inherited FMX.Controls.TControl.DoMouseEnter method and then initializes repainting of the TSelectionPoint shape. +Override the protected DoMouseEnter method to provide other responses when the mouse pointer enters the TSelectionPoint object. + + + +DoMouseLeave is called when the mouse pointer leaves the TSelectionPoint object. +DoMouseLeave calls the inherited FMX.Controls.TControl.DoMouseLeave method and then initializes repainting of the TSelectionPoint shape. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the TSelectionPoint object. + + + + + + + + + +Handles the pressing of a mouse button on the TSelectionPoint object. +MouseDown calls the FMX.Controls.TControl.OnMouseDown event handler and sets that the left mouse button is pressed. +MouseDown has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the TShiftState type and passes additional information, such as whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were pressed when the mouse button was clicked, or whether the mouse button was double-clicked (ssDouble). +X and Y--are the local pixel coordinates of the mouse pointer within the TSelectionPoint object. +The TForm form (owner of the TSelectionPoint object) calls MouseDown in response to mouse-down messages. +Override the public MouseDown method to provide a customized response when a mouse button is pressed when the mouse pointer is over the TSelectionPoint object. + + + + + + + + +Handles moving of the mouse pointer over a TSelectionPoint object. +As the mouse pointer moves over a TSelectionPoint object, this method is called repeatedly. Each time it is called with the new mouse pointer coordinates that reflect the continuous path of the mouse pointer. +MouseMove has the following parameters: + +Shift--belongs to the TShiftState type; it can pass additional information. +X and Y--are the local pixel coordinates of the mouse pointer within the parent control. +The MouseMove method has the following implementation: + +MouseMove calls the inherited FMX.Controls.TControl.MouseMove method. +If the TSelectionPoint object is pressed with the left mouse button, the TSelectionPoint is dragged by the mouse pointer: +If ParentBounds is True and the parent is a control, the TSelectionPoint object is moved only inside the boundaries of the parent control. +If ParentBounds is True and the parent is not a control, the TSelectionPoint object is moved inside the boundaries of the current TCanvas object. +If ParentBounds is False, the TSelectionPoint object is moved to the specified X and Y coordinates. +Then, it calls the customer event handler of the OnTrack event. +Override the public MouseMove method to provide a customized response when the mouse pointer is moved over the TSelectionPoint object. + + + + + + + + + +Handles release of the left mouse button pressed inside the TSelectionPoint object. +MouseUp calls the FMX.Controls.TControl.OnMouseUp and the OnChange event handlers, and releases mouse capturing from the TSelectionPoint object. +MouseUp has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the [[System.Classes.TShiftState|TShiftState] type and passes additional information, such as whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were down when the pressed mouse button was released. +X and Y--are the local pixel coordinates of the mouse pointer within the TSelectionPoint object. +The TForm form, owner of the TSelectionPoint object, calls MouseUp in response to mouse-up messages. +Override the public MouseUp method to provide a customized response when the mouse button is released while the mouse pointer is over the TSelectionPoint object. + + + + + + + +OnTrack event dispatcher. +DoChangeTracking is automatically called when the mouse is moved while the left mouse button is pressed. +DoChangeTracking fires an OnTrack event. + + + +OnChange event dispatcher. +DoChange is automatically called when the left mouse button is released. +DoChange fires an OnChange event. + + + +Customizes styles in complex objects. +FMX.Objects.TSelectionPoint.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.Objects.TSelectionPoint.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TSelectionPoint.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TSelectionPoint.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + +Checks whether the point specified by local coordinates belongs to the control area. +FMX.Objects.TSelectionPoint.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + + + + + +Defines the radius of the shown selection point object. +When an application style book does not contain a style-resource for selection points, a selection point in this application is drawn as a circle having radius equal to GripSize. The used GripSize is truncated to 1<= GripSize<=20. When an application style book contains a style-resource for selection points, then all selection point properties are loaded from the style-resource; property values set in the Form Designer or programmatically are ignored. Under some platforms, selection points use predefined platform-specific values. For example, on some mobile platforms GripSize is 16 or 17 and this value cannot be changed programmatically. + + +Defines an offset between the position of the mouse pointer and the shown selection point object when the pressed mouse pointer is moved. +The X and Y values of GripCenter define an offset between the mouse pointer position and the shown selection point object when the pressed mouse pointer is moved. +By default, X and Y equal 0. + + + + + + + + + +Defines whether the shape of the TSelectionPoint object should be within the boundaries of the parent control. +When ParentBounds is True, the shape of the TSelectionPoint object cannot be moved outside the boundaries of the parent control. + + + + + + + + + + + + + + +The event handler of the OnChange event is called from the MouseUp method whenever the TSelection object changes. +Write a custom OnChange event handler to perform a specific action when the TSelectionPoint object changes. + + + + + + + + + + + + + + + + + + + +The event handler of the OnTrack event is called cyclically from the MouseMove method while the TSelectionPoint object is being moved. +Write a custom OnTrack event handler to perform a specific action while the TSelectionPoint object is being moved. + + + +TSelectionPoint defines a 2D point object that can be moved. It inherits TControl and can be used in styles to create controls. +The TSelectionPoint class implements operations of moving of a 2D point object with a mouse or another pointing device. +The behavior of selection point objects depends upon the existence of a corresponding style-resource in an application style book: + +When an application style book does not contain a style-resource for selection points: +A selection point in this application is drawn as a circle having a radius equal to GripSize. +The used GripSize is truncated to 1<= GripSize<=20. +A selection point is drawn as a white circle having the blue circumference. +When a selection point is selected, its circle is shown red. +To select a selection point, place the mouse pointer over the circle shape or the bounds rectangle of the selection point (having the Width and Height dimensions). +When an application style book contains a style-resource for selection points, then all selection point properties are loaded from the style-resource; property values are set in the Form Designer or are ignored programmatically. On some platforms, selection points use predefined platform-specific values. For example, on some mobile platforms GripSize is 16 or 17 and this value cannot be changed programmatically. +Notice that the GripCenter property has the following implementation. The X and Y values of GripCenter define an offset between the mouse pointer position and the shown selection point when the pressed mouse pointer is moved. +You can use scaling factors Scale of the TSelectionPoint object to proportionally change a selection point and a grip sizes along coordinate axes. The rotation axis RotationCenter and rotation angle RotationAngle of the selection point object can also be used to modify the position of the selection point. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.ScrollBox.xml b/Modules/DelphiFMX/doc/FMX.ScrollBox.xml new file mode 100644 index 00000000..56dfabca --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.ScrollBox.xml @@ -0,0 +1,21168 @@ + + + + $1701 + + + + + $1702 + + + + + $1703 + + + + + $1704 + + + + + $1705 + + + + + $1706 + + + + + $1707 + + + + + $1708 + + + + + $1709 + + + + + $170A + + + + + $170B + + + + + $170C + + + + + $170D + + + + + $170E + + + + + $170F + + + + + $1001 + + + + + $1002 + + + + + $1003 + + + + + $1004 + + + + + $1005 + + + + + $1006 + + + + + $1007 + + + + + $1008 + + + + + $1009 + + + + + $100A + + + + + Event type for notification about ScrollBox changed position of content + + + + + Event type for correcting content size, which was calculated automatically. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notifies abount changed size (Width, Height) + + + + + Copies the data to destination TScrollContentSize + + + + + + + + Returns owenr of the Data + + + + + + + + Sets size without checks on AutoCalculateContentSize. Ignores IsReadOnly + + + + + + + + Constructs object, extract from AOwner TCustomScrollBox and sets internal event handler + OnChange + + + + + + + + + Checks can we set size or not. It depends on TPresentedScrollBox.AutoCalculateContentSize + + + + + + + + Link on Owner ScrollBox + + + + + Size of content + + + + + Event, which is invoked, when size was changed + + + + + Width of content + + + + + Height of content + + + + + + + Directions of content scroll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PlatformDefault + + + + + True + + + + + PlatformDefault + + + + + True + + + + + True + + + + + PlatformDefault + + + + + Both + + + + + PlatformDefault + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Invoked, when ScrollBox changed content position or size + + + + + + + + + + Need ScrollBox updates effects, when content is scrolled? (False by default) + + + + + + + + Returns current content bounds. If content bounds size is calculati + + + + + Defines that scrollbars are automatically hiding when scroll is done + + + + + Indicates that the size of scrolling content calculates automatically according to the size of + components in content. Otherwise content size defines by the value of ContentSize property + + + + + Whether it is possible to scroll of content abroad + + + + + Current content size + + + + + Defines that control has no reaction on MouseWheel event + + + + + Enable or disabled scroll + + + + + Enable or disabled scrolling animation + + + + + Defines avaiable scroll directions + + + + + Defines scrollbars visibility + + + + + Shows small control in the right-bottom corner that represent size changin control + + + + + Defines that control reacts on touch events + + + + + Position of top-left point of view port at the ScrollBox's content. It is set in local coordinates of Content + + + + + Returns the size of displaing area + + + + + Event that raises after control calculates its content size + Raises only when AutoCalculateContentSize is true + + + + + Raises when the value of ViewportPosition was changed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Link to the ScrollBox that owns currect content instance + + + + + The handler for this event should return the clip rectangle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Model of TScrollBox data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stores the size of the ScrollBox content. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Directions of content scroll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Event type for correcting content size, which was calculated automatically. + + + + + + + + + + + + + + Event type for notification about ScrollBox changed position of content + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.ScrollBox.TCustomPresentedScrollBox.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + +Applies the padding to the content of the TPresentedScrollBox. + + + +Creates scroll content. +You can override it for creating custom content. It allows to add custom information to the content. + + + + + Container for the child controls of the scroll box. + + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.ScrollBox.TCustomPresentedScrollBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Renders the child controls. +FMX.ScrollBox.TCustomPresentedScrollBox.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + +Calculates content bounds by building convex shell of all children controls of Content. +If ScrollBox uses Horizontal or Vertical +ScrollDirections mode, it restricts the content size by height or width. + + + + + + + +Defines, if necessary, to add AObject to the Content or not. + + + + + + + + +This method is invoked when you add a new Object into the Content children list. + + + + + + + +This method is invoked when you insert a new Object into the Content children list. + + + + + + + + +This method is invoked before removing an Object from the Content children list. + + + + + + + +This method is invoked when you remove an Object from the Content children list. + + + + + + + +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ScrollBox.TCustomPresentedScrollBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + +Returns the instance to the class that provides scrolling physics calculations. +AniCalculations is only available for style presentation. For native presentation, it returns null/nil. + + + + +OnMouseWheel event dispatcher for TCustomPresentedScrollBox. +MouseWheel accepts the following parameters: + +Shift: Specifies which keys are pressed when a mouse button is released. See TShiftState for possible values. +WheelDelta: The distance that the wheel rotates. WheelDelta is positive if the wheel rotates upward, negative otherwise. +Handled: Indicates whether the scroll bar was already moved. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the action on the other scroll bar (if the other scroll bar exists). +Unlike the parent method, TControl.MouseWheel, this method also handles the mouse wheel events in design-time. + + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.ScrollBox.TCustomPresentedScrollBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + + +Sends initialization data to the presentation layer through its presentation proxy. +FMX.ScrollBox.TCustomPresentedScrollBox.InitPresentation inherits from FMX.Controls.Presentation.TPresentedControl.InitPresentation. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.InitPresentation. +Sends initialization data to the presentation layer through its presentation proxy. +After LoadPresentation creates a new presentation proxy, it calls InitPresentation. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.ScrollBox.TCustomPresentedScrollBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +Changes the scroll position by the offset defined in ADX and ADY. + + + + + + + True + + + + + + +Changes the scroll position to the value defined by AX and AY. +ScrollTo uses the value of the ViewportPosition property to calculate the offset and then calls ScrollBy. + + + + + + + True + + + + + + +Changes the scroll position to the top. + + + + + True + + + + + + +Changes the scroll position to the center of the content size. + + + + + True + + + + + + +Scrolls the content to the rectangle defined in ARect. + + + + + + True + + + + + + +Sorts the children in the children list using the specified sorting procedure. +FMX.ScrollBox.TCustomPresentedScrollBox.Sort inherits from FMX.Types.TFmxObject.Sort. All content below this line refers to FMX.Types.TFmxObject.Sort. +Sorts the children in the children list using the specified sorting procedure. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Recalculates content bounds of a scroll box. +This method does not calculate content bounds if AutoCalculateContentSize is False or if the state of the scroll box is csLoading or csDestroying. +See also ContentBounds. + + + + +Forces the update of the content size calculation. + + + + +Container that can hold scrollable content of the scroll box. +Contains controls placed into the scroll box. Content does not contain a style object, any kind of Animation or effect objects. + + + + +The content bounds. +This property is read-only if AutoCalculateContentSize is True. To update the content bounds when AutoCalculateContentSize is True, call UpdateContentSize. + + + + +Removes all controls from the content. + + + + +Data model that represents the data used by the presentation of the current control. + +The constructor of your presented control creates a data model. The class of the data model is the class that DefineModelClass returns. + + + + +Position of the view port of the ScrollBox content. +ViewportPosition is set in local coordinates of the Content. + + + + +Size of the view port of the ScrollBox content. + + + + +Returns the vertical scrollbar component. +VScrollBar is only available for style presentation. For native presentation, it returns null/nil. + + + + +Returns the horizontal scrollbar component. +HScrollBar is only available for style presentation. For native presentation, it returns null/nil. + + + + +Returns the control from style that will wrap its scrolling content. +ContentLayout is used by internal methods to get the list of components in the scrollbox and represents the parent for all of them. + + + + +Indicates that the size of the scrolling content is calculated automatically according to the size of the components in content. +Otherwise, the value of the ContentSize property defines the content size. + + + + +Defines that scrollbars hide automatically when you scroll. AutoHide can be used to force the scrollbars to display. + + + + +Indicates if it is possible to scroll content abroad. + + + + +Current content size. + + + + +Defines that the control does not have reaction to Mouse-Wheel event. + + + + +Enables or disables scrolling. + + + + +Enables or disables scrolling animation. + + + + +Defines the available scroll directions. + + + + +Defines scrollbars visibility. + + + + +Shows a small control in the right-bottom corner that represents the size of the changing control. + + + + +Defines if the control reacts to touch events. + + + + +Event that raises after the control calculates its content size. +It is raised only when AutoCalculateContentSize is True. + + + + +Raises when the value of ViewportPosition was changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.ScrollBox.TCustomPresentedVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.ScrollBox.TCustomPresentedVertScrollBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.ScrollBox.TCustomPresentedHorzScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.ScrollBox.TCustomPresentedHorzScrollBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Indicates if the control should update effects when you scroll content. +FMX.ScrollBox.TCustomPresentedFramedScrollBox.IsOpaque inherits from FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Indicates if the control should update effects when you scroll content. +FMX.ScrollBox.TCustomPresentedFramedVertScrollBox.IsOpaque inherits from FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.ScrollBox.TCustomPresentedFramedVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.SearchBox.xml b/Modules/DelphiFMX/doc/FMX.SearchBox.xml new file mode 100644 index 00000000..59a83107 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.SearchBox.xml @@ -0,0 +1,179 @@ + + + + Type of event handler for filtering of string value. If value is filtered by the filter condition, + Accept should be True, Otherwise - false + + + + + + + + + + + + + + + + + Event handler for setting custom filter on text of TSearchBox. + + + + + + + + + + + + + + + Type of event handler for filtering of string value. If value is filtered by the filter condition, + Accept should be True, Otherwise - false + + + + + + + + + + + + + + + + + + + + + +Returns the name of the default presentation proxy that your presented control uses. +FMX.SearchBox.TSearchBox.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.SearchBox.TSearchBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + +Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. +FMX.SearchBox.TSearchBox.ParentChanged inherits from FMX.Controls.Presentation.TPresentedControl.ParentChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ParentChanged. +Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.ParentChanged +FMX.Controls.Presentation.TPresentedControl.AncestorParentChanged + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.SearchBox.TSearchBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + +The data model representing the data used by the presentation of the current control. +FMX.SearchBox.TSearchBox.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + + +Event handler for setting the custom filter on the text of TSearchBox. + + + + +A search edit control. +TSearchBox is an edit control that provides search capabilities such as filtering the result in the parent. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.SpinBox.xml b/Modules/DelphiFMX/doc/FMX.SpinBox.xml new file mode 100644 index 00000000..e03bfdfb --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.SpinBox.xml @@ -0,0 +1,234 @@ + + + + $1720 + + + + + $1721 + + + + + + + + Center + + + + + False + + + + + + + + + + + + + + + + + + + + + Need makes several clicks until the user didn't raise a finger from the screen. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Returns a class reference to a data model of this presented control. +FMX.SpinBox.TSpinBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + + + + + + + + +Returns the name of the default presentation proxy that your presented control uses. +FMX.SpinBox.TSpinBox.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + + +Returns the Model of the TSpinBox with TSpinBoxModel type. + + + + + + + + + +Specifies the numerical value that will be used as an increment or decrement factor for this spin box. +For instance, if you set the Increment value to 5, then pressing the plus (increment) button will increase the display value by 5. Pressing the minus (decrement) button will decrease the display value by 5. +However, if, for instance, Value is 4, Increment is 5, and Min is 0 and you press the minus (decrement) button, the value will become 0. In a similar manner, if, for instance, Value is 8, Increment is 5, and Max is 10 and you press the plus (increment) button, the value will become 10. + + + + +Determines whether the TSpinBox does several clicks when the user keeps the button held down. +When RepeatClick is True, the user can hold the button down to do several clicks until the button is released. +By default the RepeatClick property is set to False. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A special presented edit box equipped with buttons to increment or decrement the displayed numeric value. +TSpinBox is a special edit box that can display only numerical values and is equipped with the Increase and Decrease buttons for incrementing or decrementing the displayed value. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.StdActns.xml b/Modules/DelphiFMX/doc/FMX.StdActns.xml new file mode 100644 index 00000000..4718f6e7 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.StdActns.xml @@ -0,0 +1,3336 @@ + + + + 100 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.THintAction.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + + + +Responds when a client control "fires". +FMX.StdActns.THintAction.Execute inherits from FMX.ActnList.TCustomAction.Execute. All content below this line refers to FMX.ActnList.TCustomAction.Execute. +Responds when a client control "fires". +Execute is called automatically when a client control "fires" (for example, when the user clicks a button or selects a menu item). +Execute first ensures that the action is updated. Then Execute calls the inherited System.Classes.TBasicAction.Execute method. System.Classes.TBasicAction.Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called and the action is Enabled. Otherwise, Execute returns False. + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TSysCommonAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + + + + + + + + +The event handler of this event can be used for confirmation that the user really wants to accomplish an action. +In descendant classes, the OnCanActionExec event handler can be used to get the user confirmation about executing the corresponding action. For example, in TFileExit, the event handler of this event can be used for confirmation that the user really wants to close an application. You can analyze the value of the ShortCutPressed property to define whether the event is activated by pressing a keyboard key or by mouse clicking. + + + + + +A base class for standard actions that provides system functionality. +TSysCommonAction extends the TCustomAction class redeclaring properties and events, used in system actions, with the published visibility. +These are the following: CustomText, Enabled, HelpContext, HelpKeyword, HelpType, Hint, SecondaryShortCuts, ShortCut, Visible, UnsupportedArchitectures, OnCanActionExec, OnUpdate. +The published scope of properties and events provides the possibility to use the Object Inspector for editing values of these properties and defining event handlers at design time. +Standard actions descending from TSysCommonAction are the following: + +TFileExit +TWindowClose +TFileHideApp +TFileHideAppOthers. + + + + + + + + +Returns True if this action can be realized on the current platform. +FMX.StdActns.TFileExit.IsSupportedInterface inherits from FMX.ActnList.TCustomAction.IsSupportedInterface. All content below this line refers to FMX.ActnList.TCustomAction.IsSupportedInterface. +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TFileExit.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.StdActns.TFileExit.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TFileExit.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + +Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TFileExit.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + + + +The standard action for shutting down the current application. +Add TFileExit to an action list to let users shut down the application using a menu, control, toolbar button, or shortcut. Clients (controls, menu commands, toolbar buttons) linked to this action cause the application to shut down. +TFileExit is not immediate, it calls the method like Terminate that closes the main form. +The default ShortCut for TFileExit is CMD+Q. + + + + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.StdActns.TWindowClose.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TWindowClose.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + +Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TWindowClose.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + + + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TWindowClose.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TWindowClose.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + + +The standard action for closing an active modeless form. +TWindowClose is not immediate, it calls the Close method that closes the active modeless form. +The default ShortCut for TWindowClose is CMD+W. + + + + + + + + + + +Returns True if this action can be realized on the current platform. +FMX.StdActns.TFileHideApp.IsSupportedInterface inherits from FMX.ActnList.TCustomAction.IsSupportedInterface. All content below this line refers to FMX.ActnList.TCustomAction.IsSupportedInterface. +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.StdActns.TFileHideApp.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TFileHideApp.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + +Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TFileHideApp.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + + + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TFileHideApp.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TFileHideApp.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + + +The standard action for hiding and showing (if hidden) a running macOS application. +TFileHideApp hides all windows of the receiver application, and the next application in line is activated. If the windows of the receiver application are hidden, then TFileHideApp restores the hidden windows to the screen and makes the receiver active. +The default ShortCut for TFileHideApp is CMD+H. + +In the current version, TFileHideApp is implemented only for macOS. + + + + + + + + + + +Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TFileHideAppOthers.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + +Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TFileHideAppOthers.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TFileHideAppOthers.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + +The standard action for hiding all macOS applications, except the receiver. +The default ShortCut for TFileHideApp is ALT+CMD+H. + +In the current version, TFileHideAppOthers is implemented only for macOS. + + + + + + + + + + + + + + + + + + +Setter for the Component property. +FMX.StdActns.TObjectViewAction.SetComponent inherits from FMX.ActnList.TCustomViewAction.SetComponent. All content below this line refers to FMX.ActnList.TCustomViewAction.SetComponent. +Setter for the Component property. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Keeps an FMX object (of the component) that executes an action and whose image becomes visible during the execution of the action. + + + +A base class for actions that show a specified component when executed. +FMX.StdActns.TObjectViewAction inherits from FMX.ActnList.TCustomViewAction. All content below this line refers to FMX.ActnList.TCustomViewAction. +A base class for actions that show a specified component when executed. +Descendants of TCustomViewAction can be associated with a component that is made visible when the action executes. +TCustomViewAction extends TCustomAction declaring the component that the action shows when it executes. +TObjectViewAction extends the TCustomViewAction class that defines the FmxObject property and keeps the component value that should be the TFmxObject type object in this case. +Descendants of TObjectViewAction are associated with the TFmxObject type component that is made visible when the action executes. +TVirtualKeyboard and TViewAction are standard actions that descend from TObjectViewAction. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TCustomViewAction (and its descendants) does not distribute changes in values of Caption, Enabled, Checked, GroupIndex, ShortCut, Visible, and OnExecute properties to the respective properties of clients linked with action links. + + See Also +FMX.ActnList.TCustomViewAction.Component +FMX.Types.TFmxObject +FMX.StdActns.TObjectViewAction +FMX.ActnList.TActionLink +System.Actions.TContainedAction.Caption +System.Actions.TContainedAction.Enabled +System.Actions.TContainedAction.Checked +System.Actions.TContainedAction.GroupIndex +System.Actions.TContainedAction.ShortCut +System.Actions.TContainedAction.Visible +System.Classes.TBasicAction.OnExecute + + + + + + + + + + + +Returns True if this action can be realized on the current platform. +FMX.StdActns.TVirtualKeyboard.IsSupportedInterface inherits from FMX.ActnList.TCustomAction.IsSupportedInterface. All content below this line refers to FMX.ActnList.TCustomAction.IsSupportedInterface. +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TVirtualKeyboard.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TVirtualKeyboard.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + + + + + + + + + + + +Shows a component stored in the FmxObject property and shows the on-screen virtual keyboard over the surface of this component. +TVirtualKeyboard standard action is executed by clients (controls, menu commands, toolbar buttons) linked to this action, and it shows the component stored in the FmxObject property. TVirtualKeyboard shows the on-screen virtual keyboard over the surface of the shown component. +TVirtualKeyboard extends TCustomViewAction by redeclaring some public properties and events as having published visibility, which makes them editable in the Object Inspector. +The following properties are the most important: Enabled, FmxObject, ImageIndex, SecondaryShortCuts, ShortCut, Text, ShortCut, and Visible. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TVirtualKeyboard, as a descendant of TCustomViewAction, does not distribute changes of Visible, Enabled, Checked, GroupIndex, and OnExecute to the linked clients. +Virtual keyboard components are supported by so-called Platform Services. Therefore, this standard action might not be supported for some platforms. For more information, see UnsupportedArchitectures and UnsupportedPlatforms. +To display the on-screen keyboard provided by the TVirtualKeyboard component, do the following: + +Add a TActionList and a TButton to the form. +Double-click the TActionList to open the Action List editor. +Click the arrowhead beside the icon, select New Standard Action > Edit > TVirtualKeyboard, and then click OK. +In the Object Inspector, set the Action property of the TButton to be the TVirtualKeyboard you just added to the TActionList. +Run the project. +The type of the TVirtualKeyboard is set by the KeyboardType property. + +Code Examples +FMX.ScrollableForm Sample +FMX.KeyboardTypes Sample +FMX.KeyboardToolbar Sample + + + + + + + + + + +Setter for the Component property. +FMX.StdActns.TViewAction.SetComponent inherits from FMX.ActnList.TCustomViewAction.SetComponent. All content below this line refers to FMX.ActnList.TCustomViewAction.SetComponent. +Setter for the Component property. + + + + + + + + +Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TViewAction.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TViewAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + + + + + + + + + + + + + + +Shows a component stored in the FmxObject property. +TViewAction standard action is executed by clients (controls, menu commands, toolbar buttons) linked to this action and it shows the TFmxObject type component stored in the FmxObject property. +TViewAction extends TCustomViewAction by redeclaring some public properties and events as having published visibility, which makes them editable in the Object Inspector. +The following properties are the most important: Enabled, FmxObject, ImageIndex, SecondaryShortCuts, ShortCut, Text, ShortCut, and Visible. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TViewAction, as the TCustomViewAction descendant, does not distribute changes in Visible, Enabled, Checked, GroupIndex, and OnExecute to the linked clients. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Minimum permissible value of the floating-point Value range. + + +Maximum permissible value of the floating-point Value range. + + +A changeable floating-point parameter. +The TBaseValueRange class associates a floating-point number Value to its Min and Max ranges. + + +The step of possible Value variations. +Value can be multiple of Frequency, Min, or Max. For example, if + +Min = 0.1 +Max = 2.1 +ViewportSize = 0 +Frequency = 1 + +then Value can be: + +0.1 +1 +2 +2.1 + +but it cannot be: + +Value = 1.1 + + +Used by controls such as TScrollBar to define the thumb size. +Note that the effective maximum value of Value decreases according to Max - ViewportSize. + + + + + + +Copies the contents of another similar object. +FMX.StdActns.TBaseValueRange.Assign inherits from System.Classes.TPersistent.Assign. All content below this line refers to System.Classes.TPersistent.Assign. +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + + + + +Checks whether the current instance and the Obj parameter are equal. +FMX.StdActns.TBaseValueRange.Equals inherits from System.TObject.Equals. All content below this line refers to System.TObject.Equals. +Checks whether the current instance and the Obj parameter are equal. +The function has one Obj parameter of the TObject type. +By default, the Equals method shows whether the addresses corresponding to the current object and the Obj object are identical. The method returns a boolean value that represents the equality between the two addresses. + + +Note: Equals is supposed to be overridden in user-derived classes, to provide consumer objects with an equality determining function. +For example, in the FMX.Types.TBounds class, Equals also returns True if the Rect properties of the current object and of the Obj object are equal. In the FMX.StdActns.TBaseValueRange class, Equals also returns True if all the properties of the current object and of the Obj object are equal. + + + + + + + + +Checks whether the values of all properties of the current object are close to the values of the corresponding properties of the specified Obj object. +This function is similar to Equals, but it uses the SameValue function to compare values. That is, if between the values there is a difference that is less than the possible rounding error, then the SameValue function estimates the values as equal and Same returns True. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +This virtual method fires the BeforeChange event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned BeforeChange event handler. + + + +This virtual method fires the OnChanged event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned OnChanged event handler. + + + +This virtual method fires the AfterChange event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned AfterChange event handler. + + + +This virtual method fires the OnTrackingChange event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned OnTrackingChange event handler. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the owner of an object. +FMX.StdActns.TCustomValueRange.GetOwner inherits from System.Classes.TPersistent.GetOwner. All content below this line refers to System.Classes.TPersistent.GetOwner. +Returns the owner of an object. +GetOwner is used by the GetNamePath method to find the owner of a persistent object. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. As implemented in TPersistent, GetOwner returns nil (Delphi) or NULL (C++). +For TOwnedCollection, GetOwner returns the owner of the collection. For TCollectionItem collection items, GetOwner returns the collection object into which the collection item has been inserted. For TComponent, GetOwner returns the value of the Owner property. + + + + + + +Returns True if the corresponding property value differs from the default. +The MaxStored virtual function returns True if the Max property value differs from the default. That is, if Max <> DefaultMaxValue. The StdActns unit declares this constant as: + +DefaultMaxValue = 100.0 + + + + + + +Returns True if the corresponding property value differs from the default. +The MinStored virtual function returns True if the Min property value differs from the default. That is, if Min <> 0. + + + + + + +Returns True if the corresponding property value differs from the default. +The ValueStored virtual function returns True if the Value property value differs from the default. That is, if Value <> 0. + + + + + + +Returns True if the corresponding property value differs from the default. +The FrequencyStored virtual function returns True if the Frequency property value differs from the default. That is, if Frequency <> 0. + + + + + + +Returns True if the corresponding property value differs from the default. +The ViewportSizeStored virtual function returns True if the ViewportSize property value differs from the default. That is, if ViewportSize <> 0. + + + + + + +Constructs an object and initializes its data before the object is first used. +FMX.StdActns.TCustomValueRange.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + + + +Destroys the TPersistent instance and frees its memory. +FMX.StdActns.TCustomValueRange.Destroy inherits from System.Classes.TPersistent.Destroy. All content below this line refers to System.Classes.TPersistent.Destroy. +Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + + + + + + +Copies the contents of another similar object. +FMX.StdActns.TCustomValueRange.Assign inherits from System.Classes.TPersistent.Assign. All content below this line refers to System.Classes.TPersistent.Assign. +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + + + +Returns the name of the object as it appears in the Object Inspector. +FMX.StdActns.TCustomValueRange.GetNamePath inherits from System.Classes.TPersistent.GetNamePath. All content below this line refers to System.Classes.TPersistent.GetNamePath. +Returns the name of the object as it appears in the Object Inspector. +GetNamePath is for internal use only. It determines the text that the Object Inspector displays for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. Do not call GetNamePath directly. +For components, GetNamePath returns the component name. For TCollectionItem objects it returns the name of the hosting component, the name of the property, and the index into the collection surrounded by brackets. + + + +Checks whether any of the current object properties has an assigned value. +Returns True if any of the Value, Min, Max, ViewportSize, and Frequency properties of the current object has an assigned value. + + + + + + + +Assigns the default values to all properties (Value, Min, Max, and so on). +In TCustomValueRange, Clear assigns the following default values: + +Value = 0, +Min = 0, +Max = 100.0, +ViewportSize = 0, +Frequency = 0. + + + +Controls whether the BeforeChange and AfterChange events are fired on each property change. +If Tracking = True, then the BeforeChange and AfterChange events are fired on each property change. If Tracking = False, then the BeforeChange and AfterChange events are not fired. + +Note: The OnChanged and OnTrackingChange events are fired independently from the Tracking value. + + + +Recalculates values of properties, fires proper events, and sets IsChanged to False. +Changed is called immediately after the value of any property (Value, Min, Max, ViewportSize, and Frequency) of the current object has been changed. It recalculates values, raises the proper events (if needed), and sets IsChanged to False. If the Owner component of the action is loading (csLoading) or UpdateCount > 0, then no operations are performed and IsChanged is set to True. After loading the Owner component is finished, the component should check the IsChanged property's value and call the Changed method (if needed). +If IgnoreLoading = True, then Changed does not check the loading state (csLoading). + + + + + False + + + + + +Handles whether some properties have been changed, but values are still not recalculated. + + + +Keeps the new values of ValueRange properties. +New is the TBaseValueRange type property that keeps the new values of the Value, Min, Max, ViewportSize, and Frequency properties of the current object, declared in the TBaseValueRange class. It can be used in the BeforeChange event handler. + + + +Minimum permissible value of the floating-point Value range. +FMX.StdActns.TCustomValueRange.Min inherits from FMX.StdActns.TBaseValueRange.Min. All content below this line refers to FMX.StdActns.TBaseValueRange.Min. +Minimum permissible value of the floating-point Value range. + + +Maximum permissible value of the floating-point Value range. +FMX.StdActns.TCustomValueRange.Max inherits from FMX.StdActns.TBaseValueRange.Max. All content below this line refers to FMX.StdActns.TBaseValueRange.Max. +Maximum permissible value of the floating-point Value range. + + +A changeable floating-point parameter. +FMX.StdActns.TCustomValueRange.Value inherits from FMX.StdActns.TBaseValueRange.Value. All content below this line refers to FMX.StdActns.TBaseValueRange.Value. +A changeable floating-point parameter. +The TBaseValueRange class associates a floating-point number Value to its Min and Max ranges. + + +The step of possible Value variations. +FMX.StdActns.TCustomValueRange.Frequency inherits from FMX.StdActns.TBaseValueRange.Frequency. All content below this line refers to FMX.StdActns.TBaseValueRange.Frequency. +The step of possible Value variations. +Value can be multiple of Frequency, Min, or Max. For example, if + +Min = 0.1 +Max = 2.1 +ViewportSize = 0 +Frequency = 1 + +then Value can be: + +0.1 +1 +2 +2.1 + +but it cannot be: + +Value = 1.1 + + +Used by controls such as TScrollBar to define the thumb size. +FMX.StdActns.TCustomValueRange.ViewportSize inherits from FMX.StdActns.TBaseValueRange.ViewportSize. All content below this line refers to FMX.StdActns.TBaseValueRange.ViewportSize. +Used by controls such as TScrollBar to define the thumb size. +Note that the effective maximum value of Value decreases according to Max - ViewportSize. + + +The Value-based position of the thumb in the scrollable control. +The RelativeValue property is calculated relatively to Value, according to the following expression: + +RelativeValue = (Value-Min)/(Max-Min-ViewportSize) + +It can be in the range from 0 through 1. It can be used for positioning a thumb in a scrollable control, whose parameters are defined by the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency). + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +The owner component of this class instance. + + + + + +Called when the ValueRange properties start to update. +The BeginUpdate method is called when the object starts to change values of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency). +BeginUpdate increments the UpdateCount property's value by 1. + + + +Called when the ValueRange properties have finished updating. +The EndUpdate method is called when the object accomplishes to change values of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency). +EndUpdate decrements the UpdateCount property value by 1. + + +Counter of how many times update changes of the ValueRange properties have been started and not accomplished. +If UpdateCount > 0, then no update changes will be actually implemented, and +all (Value, Min, Max, ViewportSize, and Frequency) properties will have old values. Update changes will be actually implemented only after calls to the EndUpdate method decrement UpdateCount to 0. +To set new values to these properties, use the New property. + + + +This property identifies that the TCustomValueRange type object is recalculating property values. + + + + +This event is fired before new values of the ValueRange properties become effective. +The BeforeChange event is fired before new values of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency) become effective. For example, Min still contains an old value, while the new value is kept only in the New.Min parameter. The BeforeChange event is fired if Tracking = True. + + + + +This event is fired after a value of any ValueRange property has changed. +The OnChanged event is fired independently from the Tracking value, after a value of any of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency) has changed. + + + + +This event is fired after a value of any ValueRange property has changed, but only if Tracking = True. +The AfterChange event is fired after a value of any of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency) has changed, but only if Tracking = True. + + + + +This event is fired after a value of the Tracking property has changed, independently from UpdateCount. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + + + + + + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Initializes the component after the form file has been read into memory. +FMX.StdActns.TCustomValueRangeAction.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + + +Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TCustomValueRangeAction.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + +Destroys the instance of the contained action. +FMX.StdActns.TCustomValueRangeAction.Destroy inherits from System.Actions.TContainedAction.Destroy. All content below this line refers to System.Actions.TContainedAction.Destroy. +Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + + +Provides access to a floating-point value and its permitted ranges. +ValueRange provides access to the Value, Min, Max, Frequency, ViewportSize, and +RelativeValue properties and to the methods handling consistency of these properties. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This interface declares methods for setting and getting the + ValueRange property. + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.StdCtrls.xml b/Modules/DelphiFMX/doc/FMX.StdCtrls.xml new file mode 100644 index 00000000..304a8079 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.StdCtrls.xml @@ -0,0 +1,10855 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + + + + + + + + + + This class combines some of properties that relate to the text + + + + + + + +DoRootChanging is executed when the root container (typically a form) is defined or changes. +For example, DoRootChanging is executed when this control is added to a form or moved from one form to another. +When this control works as an accelerator key receiver, DoRootChanging overrides TControl.DoRootChanging to: + +Register this control to a specific form when the text control is added to the form. +Unregister and register this control from one form to another when this control is moved between forms. + + + + + + +Filters the string contained in the Text property. +For example, you can use DoFilterPresentedText to filter the ampersand symbol of the accelerator key character. +If the control is registered as an accelerator key receiver, you can override this method to do your own filtering to the accelerator keys. + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TPresentedTextControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Customizes styles in complex objects. +FMX.StdCtrls.TPresentedTextControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TPresentedTextControl.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Indicates that the control needs to update the style and calls Repaint. +FMX.StdCtrls.TPresentedTextControl.DoStyleChanged inherits from FMX.Controls.TStyledControl.DoStyleChanged. All content below this line refers to FMX.Controls.TStyledControl.DoStyleChanged. +Indicates that the control needs to update the style and calls Repaint. +FMX calls DoStyleChanged after the style was changed. + + + + + + +This property is used to change the displayed text. + + + +Sets a new value to the Text property in TPresentedTextControl. +Use SetTextInternal to set a value to the text property without calling DoTextChanged. + + + + + + + + + + +Sets the value of the Name property. +FMX.StdCtrls.TPresentedTextControl.SetName inherits from System.Classes.TComponent.SetName. All content below this line refers to System.Classes.TComponent.SetName. +Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TPresentedTextControl.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TPresentedTextControl.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TPresentedTextControl.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TPresentedTextControl.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + +Returns the resource object that is linked to the current text object. + + + + + + + +Updates the text of the TextObject. +UpdateTextObject accepts the following parameters: + +TextControl: TextObject. +Str: Text. +DoChanged calls UpdateTextObject. + + + + + + + + +The control that displays the data of the control. + + + + +Executed when text is changed. +SetText calls DoTextChanged. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Sets the bounds of the TextObject according to the current alignment values of that TextObject. +The parameters serve as variables where CalcTextObjectSize puts the calculated bounds: + +MaxWidth: The maximum width of the text object. +Size: The actual width and height of the text object. + + + + + + + + + + + +Setter method for the TextSettings property. + + + + + + +Setter method for the StyledSettings property. + + + +Updates the representation of the text that is displayed on the control. +Call this method to apply your changes to the text representation. + + + + +Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +StyledSettingsStored returns True when the set of styled text representation properties stored in +StyledSettings differs from the default set of styled text representation properties for this control. +When StyledSettingsStored returns True, then values of text representation properties of this control are stored in the corresponding FMX file. + + + + + + + +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + + + + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TPresentedTextControl.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + +Determines whether the object reacts to the accelerator key or not. +FMX.StdCtrls.TPresentedTextControl.CanTriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. +Determines whether the object reacts to the accelerator key or not. +Use CanTriggerAcceleratorKey for objects that are not intended to react to the accelerator key, for example: a hidden tab page or a hidden submenu. The object triggers the action if CanTriggerAcceleratorKey is True. Otherwise, the object cannot trigger the action. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey + + + + + + + + +Returns the index of the accelerator character within the text string of the receiver object. +FMX.StdCtrls.TPresentedTextControl.GetAcceleratorChar inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. +Returns the index of the accelerator character within the text string of the receiver object. +Use GetAcceleratorCharIndex to highlight the accelerator character when the text string contains several times the same character. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar + + + + + + + + +Returns the character key that serves as the keyboard accelerator for the receiver object. +FMX.StdCtrls.TPresentedTextControl.GetAcceleratorCharIndex inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. +Returns the character key that serves as the keyboard accelerator for the receiver object. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TPresentedTextControl.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TPresentedTextControl.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + +Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TPresentedTextControl.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + + + + +Returns a string containing the class name. +FMX.StdCtrls.TPresentedTextControl.ToString inherits from System.TObject.ToString. All content below this line refers to System.TObject.ToString. +Returns a string containing the class name. +By default, the ToString returns a string containing the class name of the instance that is being called. +For example, calling ToString on a TButton instance returns a string containing "TButton". + +Note: ToString is intended to be overridden in user-derived classes, to provide consumer objects with a string representation. + + +Specifies the text that will be displayed over the surface of this control. +In the Text property you can define an accelerator key. On Windows platforms, an accelerator key is shown as an underlined letter. To specify an accelerator key, precede an <accelerator_letter> with an ampersand & character. The letter after the ampersand appears underlined. For example, to set the S character as an accelerator key for a Save button, type &Save. On Windows platforms, accelerator keys enable the user to access controls pressing Alt+<accelerator_letter> key combination. When run on not Windows platforms, a single ampersand is simply stripped from the text. To show a single ampersand & character in a Text property specify doubled ampersand && characters. + + + + +Stores a TTextSettings type object that keeps the default values of the text representation properties. +DefaultTextSettings is set during the loading of the style in the ApplyStyle method. + + + + +Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + + +Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + + +Keeps final values of text representation properties. These values are really used to draw texts in a control. +ResultingTextSettings keeps a TTextSettings object that manages the final values of the text representation properties. These values are really used to draw texts in a control. +To obtain values stored in ResultingTextSettings, a control uses the StyledSettings property. For example, if StyledSettings contains the TStyledSetting.Family value, then the TFont.Family value is taken from the DefaultTextSettings. (That is the font family name defined in the loaded style is used. The font family name defined by the programmer in the Object Editor is ignored.) Oppositely, if StyledSettings does not contain TStyledSetting.Family, then the font family name defined by the programmer in the Object Editor is used and the font family name defined in the loaded style is ignored. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +RecalculateTextSettings updates the ResultingTextSettings. + + + + +Calls DoChanged when any of the styled text representation properties of the control changes. + + + + +Specifies the font to use when displaying the text. + + + + +Specifies the font color to use when displaying the text. +This property sets or returns a value of the TAlphaColor type. + + + + +Specifies the vertical alignment of the text in this control. +This property can take values of the TTextAlign enumeration. + + + + +Specifies the horizontal alignment of the text in this control. +This property can take values of the TTextAlign enumeration. + + + + +Specifies whether to wrap the text inside the control when the text length exceeds the text area width. + + + + +Specifies how the text is trimmed when it exceeds the edges of the text area in this control. +This property sets or returns a value of the TTextTrimming type. + + + + +Determines whether the ampersand character (&) is considered as a special prefix character. +The default value is TPrefixStyle.HidePrefix, which means that the (first) ampersand is hidden at run-time. + + + + + + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TPanel.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TPanel.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TPanel.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a generic general-purpose panel used to hold multiple controls for organizing purposes. +Use TPanel components when you need to provide the user with a way of placing multiple graphical components on a surface for organizing purposes. +Panels have methods to help manage the placement of child controls embedded in the panel. You can also use panels to group controls together, similarly to the way you can use a group box. Panels are typically used for groups of controls within a single form. Panels with no borders are useful as docking sites when writing applications that use drag-and-dock. + + + + + + + Top + + + + + $17 + + + + + $B + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TCalloutPanel.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TCalloutPanel.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Updates the properties of the CalloutRectangle. +UpdateCallout updates the following properties of the CalloutRectangle: + +CalloutLength +CalloutWidth +CalloutPosition +CalloutOffset + + + +Updates the padding based on the values of CalloutLength and CalloutPosition. + + + + +Saves the current padding. + + + + +Restores a previously-saved padding. + + + + +Executed right after the value of the Padding property changes. +FMX.StdCtrls.TCalloutPanel.PaddingChanged inherits from FMX.Controls.TControl.PaddingChanged. All content below this line refers to FMX.Controls.TControl.PaddingChanged. +Executed right after the value of the Padding property changes. +The control does not execute PaddingChanged if you assign Padding the same value that it already has. + + See Also +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCalloutPanel.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +A reference to a TCalloutRectangle style object. + + + +The width of the visual element that points at the area of interest. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer as an isosceles triangle on one of its sides. +CalloutWidth is the length of the base of the triangle. + + +The length of the visual element that points at the area of interest. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer as an isosceles triangle on one of its sides. CalloutLength is the height of this triangle. +The triangle is included in the bounding rectangle ShapeRect of the TCalloutPanel object; therefore, the longer CalloutLength is, the smaller the height (or width) of the callout panel itself is, and vice versa. Keeping the bounding rectangle the same size while changing the length of the triangle CalloutLength requires changing the height or width of the callout panel TCalloutPanel itself, depending on which side the triangle appears. + + +Defines the side where the callout pointer appears. +Set CalloutPosition to one of the Top, Left, Bottom, or Right constants predefined in TCalloutPosition to define the side on which the callout pointer should appear. +By default, the callout pointer appears on the top side CalloutPosition = Top. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer--the visual element that points at the area of interest--as an isosceles triangle on one of its four sides. + + +The position of the callout pointer, relative to the center or edges of the side on which it appears. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer--visual element that points at the area of interest--as an isosceles triangle on one of its sides. The CalloutPosition defines the side on which the triangle appears. +CalloutOffset is the offset of the callout pointer implemented according to the following conditions: + +If CalloutOffset is zero, then the callout pointer is centered on the specified side. +If CalloutOffset is positive, then the closest point to a corner of the callout pointer has the CalloutOffset offset on the following sides: +Top--offset to the right from the upper-left corner. +Left--offset to the bottom from the upper-left corner. +Right--offset to the bottom from the upper-right corner. +Bottom--offset to the right from the lower-left corner. +If CalloutOffset is negative, then the closest point to a corner of the callout pointer has the CalloutOffset offset on the following sides: +Top--offset to the left from the upper-right corner. +Left--offset to the top from the lower-left corner. +Right--offset to the top from the lower-right corner. +Bottom--offset to the left from the lower-right corner. + + + + +A container for extra information relevant to another item, with a visual indicator pointing to that item. +A call-out often takes the form of a pull-quote, in which a particular snippet of text in a document is duplicated to attract attention: in a larger size, with a different typeface, in a colored box, with stylized quote marks, etc. With illustrations, boxed text will refer to different elements of interest, and each box will be drawn with extra lines that point to its element. +Use TCalloutPanel to create a call-out for elements in the user interface. The call-out may be transient, like a heavy-duty tool tip. +The default style is a TCalloutRectangle, a rectangle with a triangular "peak" on one of four sides. A custom style that is not a TCalloutRectangle at the root should contain one with the ResourceName "background", so that the size and position properties for the triangle can be applied. The bounds of the control includes that peak: the longer the peak, the shorter the rectangle, and vice versa. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.StdCtrls.TLabel.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TLabel.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TLabel.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TLabel.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TLabel.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TLabel.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + +OnResize event dispatcher. +FMX.StdCtrls.TLabel.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Updates the representation of the text that is displayed on the control. +FMX.StdCtrls.TLabel.DoChanged inherits from FMX.StdCtrls.TPresentedTextControl.DoChanged. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.DoChanged. +Updates the representation of the text that is displayed on the control. +Call this method to apply your changes to the text representation. + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TLabel.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + +Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TLabel.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TLabel.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TLabel.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + +Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TLabel.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Specifies whether TLabel control is auto-sized based on the length of the text. +Set the AutoSize property to True to automatically resize the TLabel control according to the length of the Text. +Set the AutoSize property to False to lock autoresize of the TLabel control. + +Tip: The size of the TLabel control readjusts when the Font property changes. +When both AutoSize and WordWrap are set to True, the label's width does not change, and the height increases to show the full Text. So, the text might occupy several lines. +When AutoSize is set to True and WordWrap is set to False, the label's width changes to display the text in one line, while the height does not change. + + + + + + + + + + + + +Keeps the control that receives the focus when the accelerator key of the current label control is used. +Links the label control with another control. +If the Text property includes an accelerator key, the control specified by FocusControl receives focus when the accelerator is pressed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a graphical control used to display text in FireMonkey forms. +A TLabel control shows a text. The user cannot edit this text. A TLabel control can be used to label another control and can set focus to this control when the user presses an accelerator key assigned to the TLabel control. +TLabel controls cannot receive focus. +The Text property can be used to set an accelerator key to a TLabel control. The FocusControl property keeps the control that receives the focus when the accelerator key is pressed. +To add an object to a form that displays text that a user can scroll or edit, use a TEdit. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of images. Base class that used in fire monkey without published properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TCustomButton.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Responds to user clicks. +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. +Call Click in applications to simulate a mouse OnClick event. +If ModalResult is defined, the ModalResult property of its parent form is set to the same value as the button's ModalResult property. + + + +Responds to user double-clicks. +DblClick is an event handler for the OnDblClick event. It is automatically called when the left mouse button is pressed and released twice consecutively with the pointer over the control. +Call DblClick in applications to simulate a mouse OnDblClick event. +If ModalResult is defined, the ModalResult property of its parent form is set to the same value as the button's ModalResult property. + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TCustomButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TCustomButton.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TCustomButton.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + + + + + +Internally executes every 100 milliseconds to perform the OnClick event, if the RepeatClick property is True. +If the RepeatClick property is True, each time 100 milliseconds pass, DoRepeatDelayTimer is executed and the DoRepeatTimer method is internally called to perform this button's OnClick event. + + + + + + +Internally executes every 100 milliseconds if the RepeatClick property is True. +If the RepeatClick property is True, each time 100 milliseconds pass, DoRepeatDelayTimer is executed and the DoRepeatTimer method is internally called to perform the button's OnClick event. + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TCustomButton.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TCustomButton.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TCustomButton.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TCustomButton.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TCustomButton.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TCustomButton.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TCustomButton.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TCustomButton.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + +Allows you to apply a tint to a button component. +This property is a value of the TAlphaColor type. + +Note: Some buttons might not have the tint support. In the Object Inspector, the RAD Studio IDE automatically displays/hides the TintColor property when you change the button's StyleLookup property. Currently, the TintColor property is only available for mobile platforms (iOS and Android). For more information, see Using Styled and Colored Buttons on Target Platforms. + +Embarcadero Technologies does not currently have any additional information. + + + + +Allows you to apply a tint to a button icon. +This property is a value of the TAlphaColor type. + +Note: Some buttons might not have the tint support. In the Object Inspector, the IDE automatically displays/hides the IconTintColor property as appropriate when you change the button's StyleLookup property. Currently, the IconTintColor property is only available for mobile platforms (iOS and Android). For more information, see Using Styled and Colored Buttons on Target Platforms. + +Embarcadero Technologies does not currently have any additional information. + + + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + +Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + + + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TCustomButton.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TCustomButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + +Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TCustomButton.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + +Specifies whether this button remains in a pressed state once you click it. +Set the StaysPressed property to True to force this button to remain in a pressed state once you click it. The button comes back to its initial depressed state once you click it again. +If StaysPressed is set to False, then this button behaves like a standard push button that comes back to its initial state once you release the mouse button over its surface. + + +Specifies whether the default state of this button is pressed or not. +Set the IsPressed property to True in order to force this button's default state to be pressed. The button comes back to its initial unpressed state once you click it. + +Tip: Setting the IsPressed property only has an effect if the StaysPressed property is set to True. + +Determines whether and how the button closes its (modal) parent form. +Setting the ModalResult property of a button is an easy way to make clicking the button to close the parent modal form. When a button is clicked, the ModalResult property of its parent form is set to the same value as the ModalResult property of a button. +For example, if a dialog box has OK and Cancel buttons, their ModalResult properties could be set at design time to mrOk and mrCancel, respectively. At run time, clicking the OK button changes the ModalResult property of the dialog box to mrOk, and clicking the Cancel button changes the ModalResult property of the dialog box to mrCancel. Unless further processing is required, no OnClick event handlers are required for the buttons. +The following table lists the constants defined in the System.UITypes unit to be used for the ModalResult property of the TModalResult type. + + + +Constant + +Value + +Meaning + + + +mrNone + + + +0 + + + +None. Used as a default value before the user exits. + + + + +mrOk + + + +idOK = 1 + + + +The user exited with the OK button. + + + + +mrCancel + + + +idCancel = 2 + + + +The user exited with the CANCEL button. + + + + +mrAbort + + + +idAbort = 3 + + + +The user exited with the ABORT button. + + + + +mrRetry + + + +idRetry = 4 + + + +The user exited with the RETRY button. + + + + +mrIgnore + + + +idIgnore = 5 + + + +The user exited with the IGNORE button. + + + + +mrYes + + + +idYes = 6 + + + +The user exited with the YES button. + + + + +mrNo + + + +idNo = 7 + + + +The user exited with the NO button. + + + + +mrClose + + + +idClose = 8 + + + +The user exited with the CLOSE button. + + + + +mrHelp + + + +idHelp = 9 + + + +The user exited with the HELP button. + + + + +mrTryAgain + + + +idTryAgain = 10 + + + +The user exited with the TRY AGAIN button. + + + + +mrContinue + + + +idContinue = 11 + + + +The user exited with the CONTINUE button. + + + + +mrAll + + + +mrContinue + 1 (12 or $C) + + + +The user exited with the ALL button. + + + + +mrNoToAll + + + +mrAll +1 (13 or $D) + + + +The user exited with the NO TO ALL button. + + + + +mrYesToAll + + + +mrNoToAll +1 (14 or $E) + + + +The user exited with the YES TO ALL button. + + +You can check a ModalResult value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions, and use the StripAllFromResult function to convert ModalResult values that refer to "ALL" buttons to identifying values corresponding to simple buttons (Ok, No, or Yes). + + +Specifies whether to automatically repeat the button click after a preset time. +Set the RepeatClick property to True to make the button automatically repeat the clicking event, thus executing its OnClick event cyclically, after a preset time has passed since the last OnClick execution. +The timer interval starts with 500 milliseconds for the first wait and then moves to 100 milliseconds per wait cycle. This interval cannot be modified by the user. +Each time 100 milliseconds pass, DoRepeatDelayTimer is executed. DoRepeatDelayTimer internally calls the DoRepeatTimer method to perform the button's OnClick event. + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + +Represents the base class for all buttons. +TCustomButton is the base class for all button components such as TButton. If you need to create a custom button for your application, then you should consider deriving your component from TCustomButton, as it already implements basic button drawing and operating functionality. + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the font to use when displaying the text. + + +Specifies the horizontal alignment of the text in this control. +This property can take values of the TTextAlign enumeration. + + +Specifies how the text is trimmed when it exceeds the edges of the text area in this control. +This property sets or returns a value of the TTextTrimming type. + + +Specifies whether to wrap the text inside the control when the text length exceeds the text area width. + + + + + + + +Determines whether the button's OnClick event handler executes when the ESCAPE key is pressed. +If Cancel is True, the button's OnClick event handler executes when you press the ESCAPE key. Although an application can have more than one Cancel button, the form calls the OnClick event handler only for the first visible button in the tab order. + + + + + + + + +Determines whether the button's OnClick event handler executes when the ENTER key is pressed. +If Default is True, the button's OnClick event handler executes when the you press the ENTER key. Although an application can have more than one Default button, the form calls the OnClick event handler only for the first visible button in the tab order. Moreover, any button that has focus becomes the Default button temporarily; hence, if you select another button before pressing ENTER, the selected button's OnClick event handler executes instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a push button that contains a text caption. +A TButton is a general-purpose push button for use in applications. Buttons can be enabled, disabled, pressed, and can respond to control keys such as ESCAPE and ENTER. These buttons can receive TAB focus. +Buttons can have a modal result attached, which is useful if these buttons are the main validating controls for a dialog box, for instance OK -- save and close; Cancel -- quit, no save; and so on. +The Text property can be used to define an accelerator key to a control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TSpeedButton.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TSpeedButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TSpeedButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a push button that contains a text caption, for usage in various toolbars that you might employ into your applications. +A TSpeedButton is a general-purpose push button for use in an application's toolbar. These buttons can be enabled, disabled, pressed, and can respond to control keys such as ESCAPE and ENTER. +These speed buttons can also have a modal result attached to them. +Their distinctive appearance differentiates them from other buttons. Also, speed buttons cannot receive TAB focus. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TCustomCornerButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomCornerButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TCustomCornerButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + +Specifies the distance from a corner to the start point of the corner shape customization, on the horizontal sides of the button. +How corners are customized is defined by the Corners, +CornerType, XRadius, and YRadius properties. + + +Specifies the distance from a corner to the start point of the corner shape customization, on the vertical sides of the button. +How corners are customized is defined by the Corners, +CornerType, XRadius, and YRadius properties. + + +Specifies which corners are customized by the CornerType, XRadius, and YRadius properties. +By default, all four corners are customized. +Corners contains a set of values defined in the TCorner type: TopLeft, TopRight, BottomLeft, and BottomRight. Use the AllCorners constant to select all corners. +If Corners is an empty set, then no corner shape customization is used. + + +Specifies the type of the corner customization in the TCustomCornerButton control. +Values of CornerType are defined in the TCornerType: Round, Bevel, InnerRound, and InnerLine. These values define the following types of corner shape customizations: + + +CornerType applies to corners specified in the Corners set. +XRadius and YRadius specify the distance from a corner to the start point of the corner customization, on the horizontal and vertical sides. + +Note: If Corners is an empty set, or any of the XRadius and YRadius properties is zero, modifying the CornerType property has no visual effect. + +Specifies which sides of the control to display. +A side is a button boundary between two adjacent corners or end points of corner customizations. End points of corner customizations are defined by XRadius and YRadius. A corner customization applies to corners included into the Corners set. +By default, all sides of the control are displayed. +Sides can contain a set of values defined in TSide: Top, Left, Bottom, and Right. +Use the AllSides constant to select all sides. + + + +Represents a TCustomButton control and, additionally, provides the tools to customize shapes of TCustomCornerButton control's corners. +Use Corners to specify the corners to be customized. Use CornerType, XRadius, and YRadius to customize corners. See also TRectangle. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a button with customizable corners. +Use the Corners property to choose the corners to be customized and the CornerType, XRadius, and YRadius properties to customize the corners. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sends a PM_RESET_FOCUS message to the presentation layer through its presentation proxy, followed by a PM_DO_EXIT message. +FMX.StdCtrls.TCheckBox.DoExit inherits from FMX.Controls.Presentation.TPresentedControl.DoExit. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoExit. +Sends a PM_RESET_FOCUS message to the presentation layer through its presentation proxy, followed by a PM_DO_EXIT message. +For details about the circumstances that trigger this procedure, see TControl.DoExit. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoExit + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TCheckBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TCheckBox.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + + + + + +Protected getter implementation for the Data property. +GetData overrides FMX.Types.TFmxObject.GetData and returns the value of IsChecked. + + + + + + +Protected setter implementation for the Data property. +SetData overrides FMX.Types.TFmxObject.SetData and sets the value of IsChecked. +Value may be any of the following: + +A Boolean value. IsChecked is assigned that value. +A String Boolean. IsChecked is assigned that value. +An event handler to be assigned to OnChange. IsChecked remains unchanged. + + + + + + +Specifies the behavior of a TCheckBox menu item when Action changes. +ActionChange calls the inherited TTextControl.ActionChange method and then, depending on the CheckDefaults value, ActionChange uses the Checked property of the Sender action to set the new value of the +IsChecked property. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TCheckBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TCheckBox.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + + + + + + +Checks whether the provided Value is a Boolean or a Boolean String. +TryValueIsChecked returns True if Value is a Boolean or a Boolean String, False otherwise. +The out parameter IsChecked is assigned the the value of Value or False if Value is not a Boolean or a Boolean String. + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TCheckBox.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCheckBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + +Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TCheckBox.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TCheckBox.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TCheckBox.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TCheckBox.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TCheckBox.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + +Reads the pressed state of this check box. +The IsPressed read-only property is True when this check box is pressed, False otherwise. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies whether the default state of this check box is selected or cleared. +Set the IsChecked property to True in order to force this check box's default state to be selected. The check box becomes cleared once you click it again. + + + + + + + + + + + + + + + + + + + + + + +Occurs when the state of TCheckBox is changed. +Usually, the OnChange event happens when the check box's state is changed. This can happen: + +When the state is altered programmatically by setting the IsChecked property. +By user interaction, after the box is clicked by mouse. +When the control has keyboard focus, by pressing SPACE or ENTER. +Write an OnChange event handler to customize what happens when the box is selected. + +Tip: The OnClick event happens before the OnChange event. + + + + + + + + + + + + + + + + + + + + + + + + +Represents a FireMonkey styled check box that can be either on (selected) or off (cleared). +TCheckBox represents a FireMonkey styled check box that can be either on (selected) or off (cleared). A TCheckBox component presents you an option. Select the box to turn on the option, or clear it to turn off the option. +A FireMonkey TCheckBox control supports linking to a Boolean database field. The Boolean field can be null, so there are actually three states: True, False, Null. The TCheckBox control treats the Null state as False. +The Text property can be used to define an accelerator key to a control. The accelerator key behavior for TCheckBox is to check and uncheck the box control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TRadioButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TRadioButton.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + + + + +Protected getter implementation for the Data property. +GetData overrides FMX.Types.TFmxObject.GetData and returns the value of IsChecked. + + + + + + +Protected setter implementation for the Data property. +SetData overrides FMX.Types.TFmxObject.SetData and sets the value of IsChecked. +Value is the new Boolean value of IsChecked, or an event handler to be assigned to OnChange. + + + + + + + +Specifies the behavior of a TRadioButton menu item when Action changes. +ActionChange calls the inherited TTextControl.ActionChange method and then, depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +IsChecked and GroupName properties of TRadioButton. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TRadioButton.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TRadioButton.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TRadioButton.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TRadioButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TRadioButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + +Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TRadioButton.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TRadioButton.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TRadioButton.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TRadioButton.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TRadioButton.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + +Reads the pressed state of this radio button. +The IsPressed read-only property is True when this radio button is pressed, False otherwise. + + + + + + + + + + + + + + + + + + + + +Specifies the name of the group this radio button is part of. +Set the GroupName property to the name of the group this radio button belongs to. If multiple radio buttons are part of the same group, that is, all of them have the same GroupName, when you click one of them, it becomes selected, while the others in this group become cleared. + + + + + + + + + +Specifies whether the default state of this radio button is selected or cleared. +Set the IsChecked property to True to force this radio button's default state to be selected. The button comes back to its initial cleared state once you click it. + + + + + + + + + + + + + + + + + + + + + + +Occurs when the state of TRadioButton is changed. +Usually, an OnChange event happens when the radio button state is changed. +This can happen: + +When the state is altered programmatically by setting the IsChecked property. +By user interaction, after the radio button is clicked. +When the control has keyboard focus, by pressing SPACE or ENTER. +Selecting the state of a radio button will clear all the other radio buttons within the defined GroupName, causing their respective OnChange events. OnChange will not occur on those TRadioButtons whose state would not have changed. +TRadioButtons that have their GroupName undefined form a default group of radio buttons. + +Tip: The OnClick event happens before the OnChange event. + + + + + + + + + + + + + + + + + + + + + + + + +Represents a radio (option) button. +TRadioButton, also called option button, presents a set of mutually exclusive choices. You can create individual radio buttons using TRadioButton or use a group to automatically arrange radio buttons into groups. You can group radio buttons to let the user select one from a limited set of choices. +A selected radio button is displayed as a circle filled in the middle. When not selected, the radio button shows an empty circle. Assign the value True or False to the IsChecked property to change the visual state of the radio button. +The Text property can be used to define an accelerator key to the control. The accelerator key behavior for TRadioButton is to select the radio button. + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TGroupBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TGroupBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +FMX.StdCtrls.TGroupBox.StyledSettingsStored inherits from FMX.StdCtrls.TPresentedTextControl.StyledSettingsStored. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.StyledSettingsStored. +Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +StyledSettingsStored returns True when the set of styled text representation properties stored in +StyledSettings differs from the default set of styled text representation properties for this control. +When StyledSettingsStored returns True, then values of text representation properties of this control are stored in the corresponding FMX file. + + + + + + +Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TGroupBox.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TGroupBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a graphical control used to arrange multiple related graphical controls on the surface of a form. +Use TGroupBox whenever you need to arrange multiple related controls on a form (for instance, multiple radio buttons or check boxes). The most commonly grouped controls are radio buttons. After placing a group box on a FireMonkey form, select components from the Tool Palette and place them in the group box. The Text property contains text that labels the group box at run time. + +Similar components are: + +TPanel (without the frame and text caption) +TExpander (additionally provides collapse/expand functionality) + + + + + + + + + + + + + + + + +Applies the style to this status bar component. +Do not call ApplyStyle explicitly in an application. It is called when a style specified by StyleLookup is applied or when the control is visually changed. To check whether a style exists, use the FindStyleResource method. +For an example of the ApplyStyle implementation, see Style Contracts. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TStatusBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TStatusBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + +A reimplementation of TFmxObject.DoRootChanging. +Allows the control to be unregistered from the old root and registered to the new root. This is useful for a control to be registered on unregistered as a hint receiver. + + + + + + + +Triggers the hint event. +TriggerOnHint calls DoHint + + + + +Triggers the OnHint event. + + + + + + + + + + +Creates an instance of the TStatusBar class and places a status bar component on the form. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies whether the status bar displays its size grip or not. + + + + + + + + + + + + +Indicates whether the OnHint event is enabled. +Set this property to False to disable the OnHint event. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs when a hint is triggered. +See Using Hints to Show Contextual Help in a FireMonkey Application for more information on how to use hints. + + + + +Represents a status bar component for use in FireMonkey forms. +The status bar is usually aligned at the bottom of a form, and displays information about an application as it runs. A status bar can display a size grip, so if your form is sizable, there is no need to add a TSizeGrip component as long as you have a status bar already. +The status bar can also intercept hints. See Using Hints to Show Contextual Help in a FireMonkey Application for more information on how to use hints. + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TToolBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TToolBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TToolBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TToolBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TToolBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Allows you to apply a tint to a toolbar. +This property is a value of the TAlphaColor type. + +Note: Currently, the TintColor property is only available for mobile platforms (iOS and Android). For more information, see Using Styled and Colored Buttons on Target Platforms. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a toolbar component for use in FireMonkey forms. +The toolbar is usually aligned at the top of a form, and has a bunch of buttons that represent shortcuts or ways to access the functionality embedded into your application. A toolbar holds essentially speed buttons, but any other FireMonkey control can sit inside a toolbar. All tool buttons on a toolbar should maintain a uniform width and height for consistency. +Typically, the tool buttons correspond to items in an application's menu and give the user more direct access to the application's commands, but they can access other functionality implemented into your application. + + + + + + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TSizeGrip.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TSizeGrip.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a graphical control used to dynamically resize FireMonkey forms. +Use a TSizeGrip component in a FireMonkey form to add a custom-placed size grip used to dynamically resize the form. + +It is better that you position this size grip control in the bottom-rightmost position of the form, for consistency. If your FireMonkey form already contains a TStatusBar component, there is no need to add a TSizeGrip, because the status bar can display the size grip for your resizable form. + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TSplitter.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TSplitter.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Renders the control's surface. +FMX.StdCtrls.TSplitter.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + +Setter function for the Align property. +FMX.StdCtrls.TSplitter.SetAlign inherits from FMX.Controls.TControl.SetAlign. All content below this line refers to FMX.Controls.TControl.SetAlign. +Setter function for the Align property. Value specifies the new value of the Align property. + + + + + + +Internally used to locate the controls that are about to be resized. + + + + + + + + + +Internally used for calculating the new dimensions of the controls that are being split. + + + + + + + +Internally called whenever you change the position of this splitter. +UpdateSize internally calls CalcSplitSize to update the dimensions of the controls that are being split by this splitter. + + + + + + + +Internally used to know whether the controls that are about to be resized can actually be resized. + + + +Internally used for updating the size of the controls that are being split. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TSplitter.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TSplitter.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TSplitter.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TSplitter.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TSplitter.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + + + + + + + + + + + +Specifies the minimum size, in pixels, of the controls that are being split in case of sliding the splitter to the maximum of one of the left, right, top, or bottom margins. +Use MinSize to set the minimum width or height of the controls that are being split using this splitter. + + + + + + + + + +Specifies whether to show the grip control of the TSplitter. +Set the ShowGrip property to False to hide the grip control from the TSplitter component. The default value is True so the TSplitter shows the grip by default. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TSplitter divides the client area of a FireMonkey form into resizable panes. +Add a splitter to a form between two aligned controls to allow users to resize the controls at run time. The splitter sits between a control aligned to one edge of the form and the controls that fill up the rest of the client area. Give the splitter the same alignment as the control that is anchored to the edge of the form. When the user moves the splitter, it resizes the anchored control. This, in turn, changes the client area of the form, and the controls that fill up the rest of the client area resize accordingly. +Use each control on the form as a separate pane. After each pane is placed, place a splitter with the same alignment to allow that pane to be resized. The last pane to be placed on the form should be client-aligned, so that it resizes automatically to fill up the remaining space after all other panes are resized. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Returns an adjust type based on the provided FixedSize. +FMX.StdCtrls.TProgressBar.ChooseAdjustType inherits from FMX.Controls.TStyledControl.ChooseAdjustType. All content below this line refers to FMX.Controls.TStyledControl.ChooseAdjustType. +Returns an adjust type based on the provided FixedSize. +FixedSize is the value of the FixedSize property of the control that is passed to AdjustFixedSize. + + See Also +System.Types.TSize +FMX.Controls.TControl.FixedSize +FMX.Types.TAdjustType +FMX.Controls.TStyledControl.AdjustFixedSize + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TProgressBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TProgressBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TProgressBar.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TProgressBar.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TProgressBar.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + + + + + + + +Returns the associated action link class. +FMX.StdCtrls.TProgressBar.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + + + +Specifies the behavior of a TProgressBar control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +value range property of TProgressBar. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TProgressBar.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TProgressBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TProgressBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TProgressBar.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TProgressBar.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + + + + + + + + + + + + + + + +Specifies the maximum value for this progress bar. As you place a TProgressBar component on a form, the default value for the Max property is set to 100. + + +Specifies the minimum value for this progress bar. The default value for the Min property is 0. + + + +Specifies the orientation (Horizontal or Vertical) for the progress bar. + + + + + + + + + + + +Specifies the current position of the progress bar. +You can read Value to determine the progress from Min to Max. +Set a needed value for the Value property, and the progress bar will display a position between Min and Max. For example, when the process completes, set Value to Max so that it appears completely filled. +By default, the Min and Max values of the progress bar are represented in percentage terms, where Min is 0 (0% complete) and Max is 100 (100% complete). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents an animated progress bar indicator for general progress indication. +Use a TProgressBar in applications where you need to inform the user about the progress of one or multiple tasks effectuated by your application. A TProgressBar control can display its progress (Value) in the range specified by Min and Max. + +Metropolis UI ProgressBar: + +When a task with an indefinite amount of time or operations is in progress, we recommend that you use a TAniIndicator to illustrate the progress. + + + + + + + + + + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TThumb.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TThumb.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TThumb.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TThumb.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the state of this thumb component (pressed or unpressed). +Use the IsPressed property to specify the status of this thumb (pressed - True; unpressed - False). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a thumb control for use with track bars. + + + + + + + + + + + + + + $A + + + + + $1F4 + + + + + $14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TCustomTrack.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TCustomTrack.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + +Protected setter implementation for the Orientation property. + + + + + + + +Returns a TRectF with the coordinates of the area that the thumb has access to. + + + + + + +Returns a TRectF with the coordinates of the area that the thumb has access to. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TCustomTrack.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TCustomTrack.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TCustomTrack.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TCustomTrack.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TCustomTrack.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + +Returns an adjust type based on the provided FixedSize. +FMX.StdCtrls.TCustomTrack.ChooseAdjustType inherits from FMX.Controls.TStyledControl.ChooseAdjustType. All content below this line refers to FMX.Controls.TStyledControl.ChooseAdjustType. +Returns an adjust type based on the provided FixedSize. +FixedSize is the value of the FixedSize property of the control that is passed to AdjustFixedSize. + + See Also +System.Types.TSize +FMX.Controls.TControl.FixedSize +FMX.Types.TAdjustType +FMX.Controls.TStyledControl.AdjustFixedSize + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Executes internally each time the OnClick event of the attached TThumb component fires. + + + + + + +Executes internally each time the OnDblClick event of the attached TThumb component fires. + + + + + + + +Returns the size of the thumb. The thumb size represents the percentage of the viewport relative to the content size. + + + +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TCustomTrack.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + +Indicates whether the Thumb that is associated with this TCustomTrack is pressed. +This is a read-only property. +The following table shows the value of IsTracking in some common scenarios: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + + + + + + + + +Returns the associated action link class. +FMX.StdCtrls.TCustomTrack.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + + + +Specifies the behavior of a TCustomTrack control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +ValueRange property of TCustomTrack. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TCustomTrack.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TCustomTrack.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + Extends the TCustomValueRange class declaring Value, Min, Max, + and some other properties to be published. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +OnResize event dispatcher. +FMX.StdCtrls.TCustomTrack.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + + + + + + + + + + + +Forwards notification messages to all owned components. +FMX.StdCtrls.TCustomTrack.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomTrack.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TCustomTrack.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + +Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TCustomTrack.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + +Provides access to the Value value, to its Min and Max boundaries, and to the Frequency and ViewportSize properties. + + +Specifies the minimum value of this track bar, for the minimum position of the slider. +Use the Min property to set a minimum value down to which the slider of this track bar can go. For instance, if Min is set to 0 (a default value), then attempting to move the slider to the minimum will result in a Value of 0. + + +Specifies the maximum value of this track bar for the maximum position of the slider. +Use the Max property to set a maximum value up to which the slider of this track bar can go. For instance, if Max is set to 100 (a default value), then attempting to move the slider to the maximum will result in a Value of 100. + + +Specifies the number of positions the slider advances with each move. +Use the Frequency property to specify how many steps at once the slider advances with each move. For instance, if you set Frequency to 10, Min to 0, and Max to 100, then there are only 10 steps for this slider to move within the 0 to 100 range; Value is incremented or decremented with 10 divisions. +Frequency is a floating-point Single value; setting Frequency to 0 enables this track bar to increment or decrement by 0.01 divisions by step. Setting Frequency to any integer value (for instance 1, or 5, and so on) will enable this track bar to increment or decrement by the specified value. +However, please take into consideration that if you set Frequency to any value greater than 0 and you try to programmatically assign a value to Value, then your value will be converted to the nearest multiple of Frequency. +For instance, setting Frequency to 5 and then attempting to programmatically set Value to 12 will actually set Value to 10. + + MyTrackBar.Frequency := 5; + MyTrackBar.Value := 12; { actually sets Value to 10 } + + MyTrackBar->Frequency = 5; + MyTrackBar->Value = 12; /* actually sets Value to 10 */ + + + +Controls the number of positions that the Thumb of the TCustomTrack moves each time the user presses on a free area. + + + +Specifies the current value of this track bar. +Set or get Value to specify or obtain the current value of this track bar. You can set Value programmatically or visually at run time, with any value within the interval delimited by Min and Max. + + +Specifies the size, in pixels, of the area that the slider cannot span to the left or right of this track bar. +Use the ViewportSize property to specify the size of the view port of this track bar, that is, the area, in pixels, that the slider of this track bar cannot span. As an example, the picture below shows two track bars, one with ViewportSize set to 0 and the other with ViewportSize set to 50. + + +Tip: Changing the ViewportSize property does not affect the limits (Min or Max) or the Value of this track bar. + +Specifies the orientation of this track bar (from left to right or from bottom to top). +Use the Orientation property to specify how this track bar will be displayed in terms of left-to-right orientation or bottom-to-top orientation. Orientation can have one of the following values: + + + +Value + +Meaning + + + +Vertical + + + +The track bar is rendered with the bottom-to-top orientation. + + + + +Horizontal + + + +The track bar is rendered with the left-to-right orientation. + + + +Indicates whether thumb tracking is active or not. The default value of Tracking is True. +The following table shows how the value of Tracking impacts the behavior of a track bar and the related events: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + +The part of a track bar that you move to change the value of the track bar. +The default appearance of the Thumb depends on the platform: + +Windows: The Thumb is a rectangle. +OS X: The Thumb is a circle. +iOS: The Thumb is a circle. +Android: The Thumb is a circle. + +Occurs immediately after the position of the slider of this track bar changes. +Write an OnChange event handler to provide additional functionality when changing the position of the slider of this track bar component. +The OnTracking is very similar to OnChange. The following table shows the difference in the behavior of these events in certain scenarios: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + +Occurs immediately after the position of the slider of this track bar changes. +Write an OnTracking event handler to provide additional functionality when changing the position of the slider of this track bar component. +The OnTracking is very similar to OnChange. The following table shows the difference in the behavior of these events in certain scenarios: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +Base class for all track bar components. +TCustomTrack is the base class for all track bar components such as TTrackBar. +If you need to create your own custom track bar, then you should derive your component from TCustomTrack, as it already implements functionality for drawing and manipulating the track bar. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Is a TCustomTrack with a set of published properties. +TTrack publishes a set of properties from the TCustomTrack base component, but is not registered to the Tool Palette, so it cannot be added directly to a FireMonkey form. +You can derive your own custom track bar component from TTrack. + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TTrackBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a general-purpose track bar for use in applications where tracking is required. +TTrackBar represents a FireMonkey styled track bar that can be used for various types of tracking operations; for instance, it is useful for adjusting properties such as color, volume, and brightness. Move the slide indicator by dragging it to a particular location or click in the bar to change its Value. Adjust this track bar's view port by affecting the value of the ViewportSize property. + +Use the Max and Min properties to set the upper and lower range of the track bar. The Orientation property determines whether this track bar is vertical or horizontal. + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TBitmapTrackBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TBitmapTrackBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TBitmapTrackBar.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.StdCtrls.TBitmapTrackBar.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + +Internally executed whenever there is a need to update this component's bitmap image. The bitmap image is updated when it is changed, when the orientation of this bitmap track bar control changes, or when it needs a repaint. + + + +Draws the bitmap behind this track bar. +The FillBitmap virtual method is provided in order to be overridden in derived classes to allow for custom drawing of the bitmap image behind this track bar. + + + + + + +Protected setter implementation for the Orientation property. +FMX.StdCtrls.TBitmapTrackBar.SetOrientation inherits from FMX.StdCtrls.TCustomTrack.SetOrientation. All content below this line refers to FMX.StdCtrls.TCustomTrack.SetOrientation. +Protected setter implementation for the Orientation property. + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TBitmapTrackBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TBitmapTrackBar.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + +Represents a track bar similar to that implemented by TTrackBar. +TBitmapTrackBar is not registered to the IDE, thus it cannot be dragged and dropped from the tool palette. You can manually instantiate such component, override the constructor, and create a track bar that can display bitmaps. +TBitmapTrackBar is intended for component designers as a base component for other custom track bars. +Use TTrackBar in applications, instead. + + + + $1701 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Invokes OnSwitch event handler + + + + + Invokes OnSwitch event handler + + + + + Property representing the boolean value of the switch. When the switch is On, the boolean value is + True. When the switch is Off, the boolean value is False. + + + + + Event handler is called, when TSwitch changed IsChecked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Data model for the TSwitch control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TCustomSwitch.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + + + + + + + +Returns the associated action link class. +FMX.StdCtrls.TCustomSwitch.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TCustomSwitch.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TCustomSwitch.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TCustomSwitch.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + +Responds to user clicks, key pressing, and input on touch devices (gestures). +FMX.StdCtrls.TCustomSwitch.Click inherits from FMX.Controls.TControl.Click. All content below this line refers to FMX.Controls.TControl.Click. +Responds to user clicks, key pressing, and input on touch devices (gestures). +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. Click also can be called in DialogKey and other methods handling an input from keyboards and touch devices. +Call Click in applications to simulate an OnClick mouse event. +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise executes the OnClick event handler. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + Class reference of TDataModel. + + + + +Returns a class reference to a data model of this presented control. +FMX.StdCtrls.TCustomSwitch.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + + +Updates the action of the switch and calls the handler of the OnSwitch event. +Called by the DoChanged procedure of the data model of the control when the value of the switch control changes. + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TCustomSwitch.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomSwitch.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + +A data model for this control. + + + + +Indicates if the Switch is turned on or off. +IsChecked is True if the Switch is turned on, False otherwise. + + + + +Event handler that is invoked when Switch changes the value of IsChecked. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a two-way on-off switch for use in applications. +Use a TSwitch whenever you need to provide the user with a two-way on-off switch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extends the TCustomValueRange class declaring Value, Min, Max, + and some other properties to be published. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Executes internally each time the min button is pressed. + + + + + + +Executes internally each time the max button is pressed. + + + +Customizes styles in complex objects. +FMX.StdCtrls.TScrollBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TScrollBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TScrollBar.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TScrollBar.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + + +Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.StdCtrls.TScrollBar.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + + + + + + +Returns the associated action link class. +FMX.StdCtrls.TScrollBar.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Specifies the behavior of a TScrollBar control when Action changes. +ActionChange uses the Action property of the Sender object to set Action for the Track control of TScrollBar. +Do not call ActionChange explicitly in an application. It is for internal use. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TScrollBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TScrollBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + +Initializes the component after the form file has been read into memory. +FMX.StdCtrls.TScrollBar.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TScrollBar.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TScrollBar.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Responds after the last constructor has executed. +FMX.StdCtrls.TScrollBar.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + +Provides access to the Value value, to its Min and Max boundaries, and to the ViewportSize property. + + + + + + + + + + + + + + + + + + + + + +Specifies the maximum value of this scroll bar for the maximum position of the slider. +Use the Max property to set a maximum value up to which the slider of this scroll bar can go. For instance, if Max is set to 100 (a default value), then attempting to move the slider to the maximum will result in a Value of 100. + + +Specifies the minimum value of this scroll bar for the minimum position of the slider. +Use the Min property to set a minimum value down to which the slider of this scroll bar can go. For instance, if Min is set to 0 (a default value), then attempting to move the slider to the minimum will result in a Value of 0. + + +Specifies the current value of this scroll bar. +Set or get Value to specify or obtain the current value of this scroll bar. You can set Value programmatically or visually, at run time, with any value within the interval delimited by Min and Max. + + +Specifies the size, in pixels, of the slider of this scroll bar. +Use the ViewportSize property to specify the size of the viewport of this scroll bar, that is, the area, in pixels, of the slider of this scroll. As an example, the picture below shows two scroll bars, one with ViewportSize set to 0 and the other with ViewportSize set to 50. + + +Tip: Changing the ViewportSize property does not affect the limits (Min or Max) of the Value of this scroll bar. + +Controls the number of positions this scroll bar's slider moves on each pressing of the min or max button. +Use the SmallChange property to control the number of positions the slider of this scroll bar forwards or backwards in respect to pressing the max or min buttons. +For instance, setting SmallChange to 10 causes each push of the max or min button make the slider move with exactly 10 positions forwards or backwards. + +Tip: If the current position of the slider (reflected by Value) is a number lower than SmallChange, then pressing the min button will bring Value to 0. + +Specifies the orientation of this scroll bar (left to right or bottom to top). +Use the Orientation property to specify how this scroll bar will be displayed (left to right or bottom to top). Orientation can have one of the following values: + + + +Value + +Meaning + + + +Vertical + + + +The scroll bar is rendered with the bottom-to-top orientation. + + + + +Horizontal + + + +The scroll bar is rendered with the left-to-right orientation. + + + + + + + + + + + + + + + + + + + + +Occurs immediately after the position of the slider on this scroll bar changes. +Write an OnChange event handler to provide additional functionality when changing the position of the slider on this scroll bar component. + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a standard scroll bar that is used to scroll the contents of a window, form, or a control. +TScrollBar adds a free-standing scroll bar to a form. Many controls have properties that add scroll bars that are an integral part of the control. However, TScrollBar allows controls that do not have integrated scroll bars or groupings of controls to be scrolled when the user manipulates the TScrollBar object. + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TSmallScrollBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TSmallScrollBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TSmallScrollBar.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + +Represents a variation of a standard scroll bar. +A TSmallScrollBar component is a trimmed-down standard TScrollBar without the min and max buttons. Otherwise the behavior is the same. + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TAniIndicator.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TAniIndicator.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + +Setter of Enabled. +FMX.StdCtrls.TAniIndicator.SetEnabled inherits from FMX.Controls.TControl.SetEnabled. All content below this line refers to FMX.Controls.TControl.SetEnabled. +Setter of Enabled. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TAniIndicator.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + +Renders the control's surface. +FMX.StdCtrls.TAniIndicator.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TAniIndicator.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TAniIndicator.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies the way this animated indicator looks (either linear or circular). +Use the Style property to specify how this animated indicator looks. You can set its look as a linear indicator (Linear) or a circular indicator (Circular). The following picture illustrates the two rendering modes. + +Enable or disable the rotating effect by setting the Enabled property to either True or False. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents an animated spinning indicator used for illustrating an indefinite waiting time for application processes. +Use a TAniIndicator in applications where you need to inform the user that a task that takes an indefinite amount of time is in progress. Enable or disable the spinning effect by controlling the state of the Enabled property (True or False). +An animated spinning indicator can be rendered as lines or as circles: + +You can also style TAniIndicator to be a Metropolis UI indeterminate ring progress bar (Windows 8 style): + +For more information about the Metropolis UI indeterminate ring progress indicator, see Creating an Animated Indeterminate Progress Ring and Developing Metropolis UI Applications. + +Note: +When a task with a definite amount of time or operations is in progress, we recommend that you use a TProgressBar to illustrate the progress. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Extends the TBaseValueRange class providing methods and + properties used to control the correctness of the Value handling within + its Min to Max range. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Used internally to determine the rotation angle. + + + + + + +Used internally to render the text that displays the value of this arc dial component. + + + +Customizes styles in complex objects. +FMX.StdCtrls.TArcDial.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TArcDial.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TArcDial.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + +Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TArcDial.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + + + + + + + +Returns the associated action link class. +FMX.StdCtrls.TArcDial.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + + + + + +Specifies the behavior of a TArcDial control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +ValueRange property of TArcDial. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TArcDial.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TArcDial.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + +Destroys this instance of TPresentedControl. +FMX.StdCtrls.TArcDial.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + +Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TArcDial.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + +Provides access to the Value and Frequency properties. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.StdCtrls.TArcDial.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + +OnMouseMove event dispatcher. +FMX.StdCtrls.TArcDial.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.StdCtrls.TArcDial.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies whether this arc dial component displays a text with the current value. +Use the ShowValue property to enable or disable the display of a text in the middle of this arc dial component that contains the current value (in degrees) of this arc dial component. + + + + + + + +Specifies whether thumb tracking is active or not. + + +Specifies the value (in degrees) of this arc dial component. +Read or write the Value property to get or set the value (in degrees) of this arc dial component. Use the ShowValue property to enable or disable the display of this value inside the surface of this arc dial component. + + +Specifies the number of positions this arc dial advances with each move. +Use the Frequency property to specify how many steps at once this arc dial advances (rotates) with each move. For instance, if you set Frequency to 10, then rotating the arc dial to either the left or the right produces an advancement of only 10 divisions at a time (0 degrees, 10 degrees, 20 degrees, and so on). + + + + + + + +Occurs immediately after the position of this arc dial control changes. +Write an OnChange event handler to provide additional functionality when changing the position of this arc dial component. + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a general-purpose knob-style rotating button. +Use a TArcDial button in applications wherever you need to provide the user with a rotating button that resembles a knob. This arc dial control variates its Value in degrees, so if you want to use it as a linear control for varying the progress of a progress bar, for instance, you need to programmatically make a conversion from degrees to linear movement. + +Control whether this arc dial component displays the value or not using the FMX.StdCtrls.TArcDial.ShowValue property. + + + + + + + + + + + + + +Creates a new instance of TPresentedControl. +FMX.StdCtrls.TExpanderButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a collapse/expand button used exclusively by the TExpander component. + + + + + + + Default header height + + + $19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TExpander.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TExpander.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + +Performs the alignment of a FireMonkey control. +FMX.StdCtrls.TExpander.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + +Calls the inherited TStyledControl.DoStyleChanged, then tries to translate the Text. +FMX.StdCtrls.TExpander.DoStyleChanged inherits from FMX.Controls.TTextControl.DoStyleChanged. All content below this line refers to FMX.Controls.TTextControl.DoStyleChanged. +Calls the inherited TStyledControl.DoStyleChanged, then tries to translate the Text. +DoStyleChanged calls the inherited TStyledControl.DoStyleChanged to set that the control needs to update the style, then calls Repaint to redraw the control, and then tries to translate the control's Text calling Translate. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TExpander.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Protected method that sets the vertical size (height) of the content display area of this expander, based on what is read from the given Reader. + + + + + + +Protected method that writes the vertical size (height) of the content display area of this expander to the given Writer. + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.StdCtrls.TExpander.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TExpander.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + + +DoExpandedChanging is called when the expanded state is changing. + + + + +DoExpandedChanged is called when the expanded state just has changed. + + + + +DoCheckedChanged is called when the checked state just has changed. + + + + + + + +Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TExpander.GetTextSettingsClass inherits from FMX.Controls.TTextControl.GetTextSettingsClass. All content below this line refers to FMX.Controls.TTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + + + + +It allows to set the header height. + + + + + + + + +Returns the calculated header height. +Default value is -1. +When the value is -1, if the style defines a header element style, the element height will be taken for default. If style element is not defined, it takes the FMX.StdCtrls.TExpander.cDefaultHeaderHeight value. + + + + + +Evaluates the header height that will be used based on style availability and property value. + + + + + + + + + +Evaluates the default header height based on style availability. + + + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TExpander.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + +Allows to customize header height. Default value is -1. +When the value is -1, if the style defines a header element style, the element height will be taken for default. If style element is not defined, it takes the FMX.StdCtrls.TExpander.cDefaultHeaderHeight value. + + + + + + +Specifies whether the expander's check box is selected or not. +Set the IsChecked property to True to select the expander's check box. Set IsChecked to False in order to clear the expander's check box. +The default value for the IsChecked property is True. + + + + +Specifies whether the expander control is expanded or not. +Set the IsExpanded property to True to expand the contents of the expander in order to show all the items it contains. Set IsExpanded to False in order to collapse the expander. +The default value for the IsExpanded property is True. +You can programatically expand and collapse the expander as shown in the following code snippet: + +var + Expander1: TExpander1; + +begin + { expand the expander control } + Expander1.IsExpanded := True; + + { collapse the expander control } + Expander1.IsExpanded := False; +end; + + + + + + + + + + + + +Specifies whether the expander control shows a check box in the upper-right corner. +Set the ShowCheck property to True to show a check box in the upper-right corner of the expander object. Set ShowCheck to False to hide the check box. + + + + + + + + + + + + + + + + +Occurs every time this expander's check box changes its state. +Write an OnCheckChange event to specify what happens every time the check box attached to this expander changes its state from True to False and vice versa. + + + + + + + + + + + + + + + + + + + + + + + + + + +OnExpandedChanging is called when the checkbox state is about to change. +You can cancel OnExpandedChanging with EAbort. + + + + +Occurs when IsExpanded value has changed. + + + + +Represents a graphical control used to hold multiple graphical controls with the possibility to expand or contract its display area. +Use TExpander components when you need to provide the user with a way of placing graphical components on a surface that can be expanded or collapsed in order to show or hide its contents. + +Collapse or expand this expander control by clicking its collapse/expand button. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter implementation for the Data property. +FMX.StdCtrls.TImageControl.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. +FMX.StdCtrls.TImageControl.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + + + + + +For internal use only. +Do not use this member. It is for internal use only. + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TImageControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TImageControl.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Responds to user clicks, key pressing, and input on touch devices (gestures). +FMX.StdCtrls.TImageControl.Click inherits from FMX.Controls.TControl.Click. All content below this line refers to FMX.Controls.TControl.Click. +Responds to user clicks, key pressing, and input on touch devices (gestures). +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. Click also can be called in DialogKey and other methods handling an input from keyboards and touch devices. +Call Click in applications to simulate an OnClick mouse event. +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise executes the OnClick event handler. + + + + + + + + +OnDragOver event dispatcher. +FMX.StdCtrls.TImageControl.DragOver inherits from FMX.Controls.TControl.DragOver. All content below this line refers to FMX.Controls.TControl.DragOver. +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + + + + + +OnDragDrop event dispatcher. +FMX.StdCtrls.TImageControl.DragDrop inherits from FMX.Controls.TControl.DragDrop. All content below this line refers to FMX.Controls.TControl.DragDrop. +OnDragDrop event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor, within the client area of the control. +A control calls DragDrop when a dragged object is dropped on the control area. +Override the protected DragDrop method to provide other responses when a dragged object is dropped on the control area. + + + + + + +Executes internally each time the OnChange event fires. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of DefaultSize. +FMX.StdCtrls.TImageControl.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TImageControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TImageControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Specifies a TBitmap picture to be displayed onto the surface of this image control component. +Use Bitmap to specify the image for the TImageControl component. Bitmap is a reference to a FMX.Graphics.TBitmap object. +Setting Bitmap at design time brings up the Bitmap Editor, which can be used to specify the file that contains the image you want to display. + + + + + + + + + + +For future use only. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs immediately after the bitmap picture of this image control changes. +Write an OnChange event handler to provide additional functionality when changing the bitmap picture of this image control component. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a graphical control used to display images on a FireMonkey form. +Use a TImageControl whenever you need to put an image on a FireMonkey form. You can use the Bitmap property to specify the image that will be displayed. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Customizes styles in complex objects. +FMX.StdCtrls.TPathLabel.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.StdCtrls.TPathLabel.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TPathLabel.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TPathLabel.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TPathLabel.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + +Stores a Tvalue, which is a data structure that can store different kinds of data types. +FMX.StdCtrls.TPathLabel.Data inherits from FMX.Types.TFmxObject.Data. All content below this line refers to FMX.Types.TFmxObject.Data. +Stores a Tvalue, which is a data structure that can store different kinds of data types. +Data has no predefined meaning. Although Data is used for LiveBinding, any succesor override this behavior. Then, the behaviour of Data is based on the type of its value. + +Note: Do not use this member. It is for internal use only. + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies the way the contents of this path label will be drawn. +WrapMode can take one of the following values: + + + +Value + +Meaning + + + +Fit + + + +The graphical path contents fit the entire area of this path label. + + + + +Original + + + +The graphical path contents show at their original size in this path label. + + + + +Stretch + + + +The graphical path contents stretch to fit the entire area of this path label. + + + + +Tile + + + +The graphical path contents tile one or multiple times to fill the entire area of this path label. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents a graphical control used to display information contained in TPathData within FireMonkey forms. +Use TPathLabel components in FireMonkey forms to add TPathData display capabilities. +For instance, the following image displays three rectangles by using a TPathData object. + +var + PathData: TPathData; + +begin + PathData:= TPathData.Create; + PathData.AddRectangle(RectF(20, 20, 80, 80), 0, 0, AllCorners); + PathData.AddRectangle(RectF(10, 10, 90, 90), 0, 0, AllCorners); + PathData.AddRectangle(RectF(0, 0, 100, 100), 0, 0, AllCorners); + PathLabel1.Data := PathData; + + { ... other instructions ... } + + +To add an object to a form that displays text, use a TLabel. + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Styles.xml b/Modules/DelphiFMX/doc/FMX.Styles.xml new file mode 100644 index 00000000..f23c43c4 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Styles.xml @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of published properties used in streaming + + + + + Target's names that used in style file + + + + + Platform's names that used at framework + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Allows to check style for fitting for specified Platform + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Force to load all style's objects from binary stream. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + Indexed + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +This method tries to parse the style file and read the style description. +The TStyleDescription object specified by Description should be destroyed by the caller. + + + + + + + + + + + + + +Loads a style from the specified file. +LoadFromFile returns a style object that can be set as the active style using the SetStyle method. +Note that LoadFromFile does not automatically switch to the loaded style. To do that, call the SetStyleFromFile method. + + + + + + + +Loads a style from the specified stream. +LoadFromStream returns a style object that can be set as the active style using the SetStyle method. +Note that LoadFromStream does not automatically switch to the loaded style. To do that, call the SetStyleFromFile method. + + + + + + + + + +Loads a style from the specified resource. +LoadFromResource returns a style object that can be set as the active style using the SetStyle method. +Note that LoadFromResource does not automatically switch to the loaded style. To do that, call the SetStyleFromFile method. + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResourceType + +A string that identifies the type of resource. + + + + + + + +Loads a style from the specified file without raising an exception. +CanLoadFromFile searches for the style specified by FileName. +CanLoadFromFile returns True if the style is successfully loaded, and False otherwise. + + + + + + + +Loads a style from the specified stream without raising an exception. +CanLoadFromStream searches for the style specified by AStream. +CanLoadFromStream returns True if the style is successfully loaded, and False otherwise. + + + + + + + + +Loads a style from the specified resource without raising an exception. +In the first signature CanLoadFromResource searches for the specified ResourceName with type ResourceType in the instace handle indicated by Instance. +In the second signature CanLoadFromResource internally calls EnumModules in order to search for ResourceName in all modules of the application. +CanLoadFromResource returns True if the style is successfully loaded, and False otherwise. + + + + + + + + + +Loads a style from the specified resource without raising an exception. +In the first signature CanLoadFromResource searches for the specified ResourceName with type ResourceType in the instace handle indicated by Instance. +In the second signature CanLoadFromResource internally calls EnumModules in order to search for ResourceName in all modules of the application. +CanLoadFromResource returns True if the style is successfully loaded, and False otherwise. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + This procedure return correct resource name if more than one is registered for platform. + + + + + Anonymous method that EnumStyleResources calls in order to + enumerate all the registered style resources. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Removes the specified Style from the pool of styles. + + + +Updates the style for all the registered scenes. + + + +Enumetates all the registered style resource objects. + + + + + + + +Gets the style resource object. +GetStyleResource returns the style resource if it exits in cache. Otherwise it loads the style resource. +ResourceName specifies the style resource as per name. + + + + + + + + +Registers the style resource for the specified platform. + +ResourceName specifies the resource style. +APlatform specifies the target platform. + + + + + + + +Registers the style resource specified by selection. + +APlatform specifies the target platform. +ASelection specifies the style selection with type TPlatformStyleSelectionProc. + + + + + + + + + + + +Returns the style that is currently set. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Sets the active style to the instance specified by the Style parameter. +To set the active style to the native system style, for example Windows theme, pass nil as the Style parameter. + +Note: If you call the SetStyle function in the initialization section of a unit on the main project file, before Application.Initialize, then it is applied to all forms. + + + + + + +Sets the active style to the instance specified by the Style parameter. +To set the active style to the native system style, for example Windows theme, pass nil as the Style parameter. + +Note: If you call the SetStyle function in the initialization section of a unit on the main project file, before Application.Initialize, then it is applied to all forms. + + + + + + +Sets the style specified by FileName as the active style. +Do not place multiple lines calling SetStyleFromFile in a project, because you can have only one active style in the style manager. +You can call SetStyleFromFile either in the project source code (before calling Application.Initialize) or in the initialization section of one of the form units: + +If you call SetStyleFromFile in a form, the style is reapplied. +If you call SetStyleFromFile before the form is created, the custom style fully replaces the platform style. +Example +This Delphi code demonstrates how to use the StyleManager: + + +Delphi: + +procedure TForm1.FormCreate(Sender: TObject); + var + od : TOpenDialog; + begin + od := nil; + try + od := TOpenDialog.Create(self); + od.Filter := 'Style Files|*.style'; + if od.Execute() then + TStyleManager.SetStyleFromFile(od.FileName); + finally + od.Free(); + end; +end; + + + + + + + + + + + +Sets the style specified by FileName as the active style. +Do not place multiple lines calling SetStyleFromFile in a project, because you can have only one active style in the style manager. +You can call SetStyleFromFile either in the project source code (before calling Application.Initialize) or in the initialization section of one of the form units: + +If you call SetStyleFromFile in a form, the style is reapplied. +If you call SetStyleFromFile before the form is created, the custom style fully replaces the platform style. +Example +This Delphi code demonstrates how to use the StyleManager: + + +Delphi: + +procedure TForm1.FormCreate(Sender: TObject); + var + od : TOpenDialog; + begin + od := nil; + try + od := TOpenDialog.Create(self); + od.Filter := 'Style Files|*.style'; + if od.Execute() then + TStyleManager.SetStyleFromFile(od.FileName); + finally + od.Free(); + end; +end; + + + + + + +Loads the style from ResourceName and sets the style as the active style. +TrySetStyleFromResource sets the style without raising exceptions. + + + + + + + + + + +Uninitializes data about styles. + +Note: This function is reserved for internal use only. Do not call it directly. + + + + +Returns the style description of the specified style. +FindStyleDescriptor returns the TStyleDescription object associated with the style specified by AObject, if such a description is set. +You can set the style description fields using the Tools > Bitmap Style Designer dialog. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +TStyleManager handles styles-related operations. +Use TStyleManager to: + +Set and retrieve the active style. +Load styles from files or streams. + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.TabControl.xml b/Modules/DelphiFMX/doc/FMX.TabControl.xml new file mode 100644 index 00000000..521317e3 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.TabControl.xml @@ -0,0 +1,1908 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tabdotstyle + + + + + $8 + + + + + + The size of the style element layoutstyle. If it is not present then -1, -1 + + + + + + The autocalculated size of the tab title + + + + + Size which was set manually when AutoSize was False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Changes the size state from Calculated to Invalid so that the size is re-calculated later. +InvalidateSize returns False if the call is performed at the moment of calculation. That is, when the size state is Calculating. + + + + + + + +Calls TTabControl.RealignTabs. +RealignTabs returns False if the call to TTabControl.RealignTabs is not executed. For example, in the case of recursive calls. + + + + + + + + + + +Protected getter implementation for the DefaultStyleLookupName property. +FMX.TabControl.TTabItem.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + +Notification method called after the creation order is changed. +FMX.TabControl.TTabItem.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + +Holds information about the size of the tab title. +The CalcSize method initializes the Info property. + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.TabControl.TTabItem.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + +Updates the representation of the text on the control. +FMX.TabControl.TTabItem.DoChanged inherits from FMX.Controls.TTextControl.DoChanged. All content below this line refers to FMX.Controls.TTextControl.DoChanged. +Updates the representation of the text on the control. +DoChanged is called internally from the Change methods. +Do not call DoChanged explicitly; call the Change method. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.TabControl.TTabItem.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Protected setter implementation for the Text property. +FMX.TabControl.TTabItem.SetText inherits from FMX.Controls.TTextControl.SetText. All content below this line refers to FMX.Controls.TTextControl.SetText. +Protected setter implementation for the Text property. +In descendants, override SetText to allow for further functionality when setting the text using the Text property. +Do not use SetText directly in applications. Use the Text property instead. + + + + + + +Retrieves the resource object linked to the style of the current TTextControl object. +FMX.TabControl.TTabItem.FindTextObject inherits from FMX.Controls.TTextControl.FindTextObject. All content below this line refers to FMX.Controls.TTextControl.FindTextObject. +Retrieves the resource object linked to the style of the current TTextControl object. +In the current implementation, FindTextObject retrieves the resource object linked to the 'text' style. + + + + + +Customizes styles in complex objects. +FMX.TabControl.TTabItem.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.TabControl.TTabItem.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + + + +Initializes the component after the form file has been read into memory. +FMX.TabControl.TTabItem.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + + + + + + + +OnMouseDown event dispatcher. +FMX.TabControl.TTabItem.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + + + + + + + + +Calls Click and starts the animation by calling StartTriggerAnimation. +FMX.TabControl.TTabItem.MouseClick inherits from FMX.Controls.TControl.MouseClick. All content below this line refers to FMX.Controls.TControl.MouseClick. +Calls Click and starts the animation by calling StartTriggerAnimation. +MouseClick receives the following parameters: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys -- SHIFT, CTRL, ALT, and CMD (only for Mac) -- were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. + See Also +FMX.Controls.TControl.Click +FMX.Controls.TControl.OnClick +FMX.Controls.TControl.OnMouseLeave +FMX.Controls.TControl.OnMouseEnter +FMX.Controls.TControl.OnMouseMove +FMX.Controls.TControl.OnMouseDown +FMX.Controls.TControl.OnMouseWheel +System.Classes.TShiftState +System.UITypes.TMouseButton +FMX.Ani.TAnimator.StartTriggerAnimation + + + + +Responds to user double-clicks. +FMX.TabControl.TTabItem.DblClick inherits from FMX.Controls.TControl.DblClick. All content below this line refers to FMX.Controls.TControl.DblClick. +Responds to user double-clicks. +DblClick is an event handler for the OnDblClick event. It is automatically called when the left mouse button is pressed and released twice, consecutively, with the pointer over the control. +Call DblClick in applications to simulate a mouse OnDblClick event. + + + + + + + + + +OnMouseUp event dispatcher. +FMX.TabControl.TTabItem.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + + + + + + +Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.TabControl.TTabItem.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + + +Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + + + + + +Executed right after the value of the Parent property changes. +FMX.TabControl.TTabItem.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the alignment options (top, left, client, and so on) of this control. +Use Align to automatically set the alignment of the current control. Setting Align to a value different than None can affect the position, size (height and width), and anchors of the control. By default, Align is set to None. +Descendants of TControl typically set the visibility and value for the Align property. For example, for TToolBar, Align defaults to TAlignLayout.Top. +To see the possible values for Align and their visible effects over the control, see FMX.Types.TAlignLayout. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + +Specifies the amount (in degrees) by which the control is rotated from the x-axis. +Positive angles correspond to clockwise rotation. For counterclockwise rotation, use negative values. +To set the rotation center, use RotationCenter. + + +Specifies the position of the pivot point of the control. +The coordinates of the rotation center take values in the range from 0 through 1. The point with the coordinates (0,0) corresponds to the upper-left corner of the control, the point with the coordinates (1,1) corresponds to the lower-right corner of the control. The default center of rotation is (0.5, 0.5). +Values outside of [0,0] and [1,1] can be clipped in some descendant classes. +To set the rotation angle, use RotationAngle. + + +Aligns the component to the position points of other components (Bounds points). +Specifies the upper-left corner of the current control, relative to its parent. +The Position can be affected by the Padding of its parent and the Margins of the control. + + + + + + + +Returns the class type that instance represents the used text settings. +FMX.TabControl.TTabItem.GetTextSettingsClass inherits from FMX.Controls.TTextControl.GetTextSettingsClass. All content below this line refers to FMX.Controls.TTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Allows the object to perform an action when the accelerator key is pressed. +FMX.TabControl.TTabItem.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + + + +Renders the child controls. +FMX.TabControl.TTabItem.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + + + +OnPainting event dispatcher. +FMX.TabControl.TTabItem.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + +Renders the control's surface. +FMX.TabControl.TTabItem.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + +Processes the painting of the control. +FMX.TabControl.TTabItem.DoPaint inherits from FMX.Controls.TControl.DoPaint. All content below this line refers to FMX.Controls.TControl.DoPaint. +Processes the painting of the control. +This method is called internally from PaintTo and PaintChildren. DoPaint defines the drawing area by clipping the Canvas to the areas occupied by the control and its children, paints the children and then the control itself. The call to DoPaint is always preceded by a call to Painting and succeeded by a call to AfterPaint. + + + +Restores Canvas properties after the painting process. +FMX.TabControl.TTabItem.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + +Specifies the part of the page that needs to be painted. +The tab control sets the PaintPart property during painting. + + + + +Contains all the controls that you place on the TabItem. + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.TabControl.TTabItem.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.TabControl.TTabItem.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Returns a TTabControl object that holds this tab page. + + +Note: You cannot access this TTabControl using the TTabItem.Parent property. + + + + + + + + + +If ShowAsDot is true, then the StyleLookup property has the value tabdotstyle. + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + +Specifies whether TTabItem header (where the TabItem names appear) is auto-sized based on the length of the Text. +Set the AutoSize property to True to automatically resize the tab item header according to the length of the Text. +Set the AutoSize property to False to lock autoresize of the TTabItem header. + +Tip: The size of the TTabItem header readjusts when the Font property changes. + + + + + +Specifies custom multi-resolution icons for the tab. This property is of the TFixedMultiResBitmap type. +A TFixedMultiResBitmap multi-resolution bitmap represents a collection of TFixedBitmapItem bitmap items displayed at different scales. You can create a multi-resolution bitmap with the MultiResBitmap Editor. +Mobile applications need to have images of different scales defined for various devices, such as Retina and non-Retina iOS devices. + + + + + + + + + + + + + +Property that has the True value when the TTabItem object is selected. +IsSelected is a property of TTabItem that has the Boolean value True if the tab item is selected. Otherwise, it has the Boolean value False. + + + + + + +Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + + + + + + + +Name of the ressource object, to which the current TStyledControl is linked. +If ShowAsDot is True, the name of the ressource object is "tabdotstyle" and you cannot overwrite it. To use a custom resource object name, first ensure that the value of ShowAsDot is False. +For more information, see TStyledControl.StyleLookup. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TTabItem is a tab item in a TTabControl component. A TTabControl contains one or more TTabItem objects. +The Text property can be used to define an accelerator key to the control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Left..Right] + + + + + The styles names which used for the buttons in the header area + + + + + 0.3 + + + + + In + + + + + Linear + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $7FFFFFFF + + + + + + + + + + + + + + + + +Protected getter implementation for the Tabs property. + + + + + + +Protected read implementation for the TabCount property. + + + +Customizes styles in complex objects. +FMX.TabControl.TTabControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + +Frees the style of TStyledControl. +FMX.TabControl.TTabControl.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + +Initializes the component after the form file has been read into memory. +FMX.TabControl.TTabControl.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + +Renders the child controls. +FMX.TabControl.TTabControl.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + +Realigns tabs according to the number of visible tabs, their sizes and offsets. + + + +Performs the alignment of a FireMonkey control. +FMX.TabControl.TTabControl.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.TabControl.TTabControl.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Processes a dialog key. +FMX.TabControl.TTabControl.DialogKey inherits from FMX.Controls.TControl.DialogKey. All content below this line refers to FMX.Controls.TControl.DialogKey. +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + + + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.TabControl.TTabControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Used to determine whether the tab buttons take up all the space in the tabs band. +If the FullSize property is PlatformDefault, GetEffectiveFullSize returns True if the style element FullSize is found. Otherwise, GetEffectiveFullSize returns the same as the FullSize property. + + + + + + + +Tries to find a control using specific coordinates on the screen. +First, the search is performed among the additional buttons in the area of titles. Then, the search is performed among the tab titles. After that, the search goes to the general rules set by its ancestor TControl.ObjectAtPoint. + + + + + + + + + + + + + +Dispatcher for the OnMouseWheel event. +TTabControl calls MouseWheel in response to mouse wheel rotation while the cursor is over the control. +MouseWheel scrolls between the tab items when there is not enough space to display all tab items. +See TControl.MouseWheel for further details. + + + +OnResize event dispatcher. +FMX.TabControl.TTabControl.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + +Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + + +Called by UpdateTabBarButtons to update the state of the buttons in the area of the tabs titles. +You can override this method to change the location and the appearance of the buttons in the area of the tabs titles. + +Note: DoUpdateTabBarButtons is called from the UpdateTabBarButtons method; you should not call the DoUpdateTabBarButtons method manually. + + + + + + + + + +Executes when the value of the Enabled property changes. + + + +Forces to load all styles, measure sizes, build font-glyphs, etc. + + + + + + + + + +Disables automatically unloading style, when control is not visible on screen for tree with root AControl. + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.TabControl.TTabControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.TabControl.TTabControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Sets the focused tab using the specified transition. +SetActiveTabWithTransition sets the currently active tab to ATab using the specified ATransition and ADirection transition parameters. +ATransition specifies the type of transition used to switch the tab. When ATransition = Slide, then the tab control uses visual animation for the switching action. It means that moving of contents in the switched tabs is animated. +ADirection specifies the direction in which the content of the current active tab is replaced with the content of the specified ATab tab. ADirection is considered only when ATransition = Slide. If ADirection = Normal, then the forward left-to-right tab items switching transition animation is used. If ADirection = Reversed, then the backward right-to-left tab items switching transition animation is used. The default is Normal. +Compare with GotoVisibleTab. + +Note: SetActiveTabWithTransition Does not work on Android. + + + + + + Normal + + + + + + +Changes the currently active tab to a new ATab asynchronously. +When the animation ends, callback AOnFinish is called. + +Note: SetActiveTabWithTransitionAsync is required when working on Android. + + + + + + + + Normal + + + + + nil + + + + + + +Changes the currently active tab to a new ATab asynchronously. +When the animation ends, callback AOnFinish is called. + +Note: SetActiveTabWithTransitionAsync is required when working on Android. + + + + + + + + Normal + + + + + nil + + + + + + +Finishes current tabs transition. + + + + + + + + + + + +Returns the first visible tab from the current tab. +Use the FindVisibleTab method to get the first visible tab of type FindKind. +The first overloaded method calculates the index of the found tab in the Index parameter. Index represents: + +At input, the index of the tab where the search begins. +At output, if the returned value is True, the index of the found tab; otherwise, the old value. +The second overloaded method returns the index of the found tab. Searching starts with the current tab. If the tab is found, it return its index, otherwise it returns -1. + + + + + + + +Returns the first visible tab from the current tab. +Use the FindVisibleTab method to get the first visible tab of type FindKind. +The first overloaded method calculates the index of the found tab in the Index parameter. Index represents: + +At input, the index of the tab where the search begins. +At output, if the returned value is True, the index of the found tab; otherwise, the old value. +The second overloaded method returns the index of the found tab. Searching starts with the current tab. If the tab is found, it return its index, otherwise it returns -1. + + + +Moves the title area of the tabs so that the active tab is visible. +The movement of the tabs is asynchronous. + + + + + + + + Slide + + + + + Normal + + + + + +Sets the focused tab using the specified transition. Animation of the switch transition depends on mutual positions of the current focused tab and the specified tab. +GotoVisibleTab switches the active tab to the tab specified by the Index parameter if possible (the tab with the specified Index exists and it is visible). GotoVisibleTab switches the active tab using the switch transition specified by the ATransition and ADirection parameters and taking into account mutual positions of the current active tab and the tab specified by Index. +ATransition specifies the type of transition used to switch the tab. When ATransition = Slide, then the tab control uses visual animation for the switching action. That is, moving of contents in the switched tabs is animated. The default ATransition is Slide. +ADirection specifies the direction in which the content of the current active tab is replaced with the content of the specified Index tab. ADirection is taken into account only when ATransition = Slide. GotoVisibleTab animates switching transitions of tabs taking into account mutual positions of the current active tab and the tab specified by Index: + +When ADirection = Normal. If the destination tab is left of the current active tab (lower Index), then the forward left-to-right switching transition animation of tab items is used. If the tab to display is to the right of the active tab (upper Index), then the backward right-to-left switching transition animation of tab items is used. +When ADirection = Reversed, then the switching transitions uses the opposite animation directions to the described above. +The default ADirection is Normal. +In difference to SetActiveTabWithTransition, the +GotoVisibleTab method animates the switch transition depending on mutual positions of the current focused tab and the specified Index tab. +GotoVisibleTab returns True in case of success and False otherwise. + + + + + + Slide + + + + + Normal + + + + + +Moves the active tab to the next tab. +Use the Next method to move over to the following tab, if it exists. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the next tab. + + + + + + Slide + + + + + Normal + + + + + +Moves the active tab to the previous tab. +Use the Previous method to move over to the previous tab, if it exists. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the previous tab. + + + + + + Slide + + + + + Normal + + + + + +Moves to the first visible tab in the tab control. +Use the First method to set the active tab to the first visible tab in the tab control. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the first tab. + + + + + + Slide + + + + + Normal + + + + + +Moves to the last visible tab in the tab control. +Use the Last method to set the active tab to the last visible tab in the tab control. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the last tab. + + + + + + + +Deletes a tab from the tab control. +Use the Delete method to delete the tab specified by AIndex from the tab control. + + + + + + nil + + + + + +Adds a new tab to the tab control. +Use the Add method to create a new tab object and add it to the tab control. The type of the tab object is specified by the TabClass parameter. +If TabClass is nil, the created tab object will have the default type TTabItem. + + + + + + + nil + + + + + +Inserts a new tab on the specified position. +Use the Insert method to create a new tab object and insert it on the position specified by Index. +The type of the tab object is specified by the TabClass parameter. If TabClass is nil, the created tab object will have the default type TTabItem. +The Index parameter is 0-based. + + + + + + +Determines whether there is an active tab in the tab control. +HasActiveTab returns True if one of the tabs in the tab control is selected and False otherwise. +The tab control has an active tab if TabIndex is between 0 and TabCount-1. + + + + + + +Returns the list of tabs contained in this tab control. + + + +Updates the state of the buttons in the area of the tab titles. +UpdateTabBarButtons calls the DoUpdateTabBarButtons method. + + + +Specifies the number of tabs that are present on this tab control component. +Read the TabCount property to obtain the number of tab items that this tab control component has. If there are no tabs present, reading the TabCount property obtains 0. + + + + +Represents the settings for the inertial scrolling that controls the movement in the title area of the tabs. + + + + +The coordinates of the rectangle where all the tab titles are placed. + + + + +The size of the area that contains all the tab titles. + + + + +Offset of the area of the tab headers. + + + +Determines whether the transition between tabs is currently running. +TransitionRunning returns True if the transition between tabs is currently running and False otherwise. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Indicates whether the tab buttons take up all the space in the tabs band. +See its getter method GetEffectiveFullSize for further details. + + + + +Indicates whether the device the application runs on has a touch screen. +When HasTouchScreen is True the device where the application runs on has a touch screen. + + + + +Specifies the buttons to be displayed in the field names of the tabs. +The set of buttons displayed depends on various factors: the availability of the touch screen, the location of the headers, and the number of tabs. + + + + + +Specifies the currently active tab. +ActiveTab sets or gets the currently active (focused) tab item on the current tab control. + + + + + + + + +Specifies whether the tab buttons occupy all the space in the tabs band. +Set the FullSize property to True in order for the clickable tab buttons to take up all the space in the tabs band. For instance, if you have a tab control component of a fairly large width and only two tabs, then setting FullSize to True will make the two tab buttons span over the entire width of the tab control. +Set FullSize to False to let Delphi automatically adjust the way the tab buttons occupy the space. + + + + + + + + + + +Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + + + + + + + + + +Specifies the height, in pixels, of the clickable tabs' captions. +Use the TabHeight property to specify the height, in pixels, of the band that holds all the clickable tab buttons that correspond to individual tabs of this tab control component. + + +Specifies the index of the active tab. +Use the TabIndex property to set or get the index of the tab that is active (focused) on this tab control component. A value of 0 indicates that the first tab is active, while a value of -1 indicates that none of the tabs is active, or there are none present. + + + + +Specifies the position of the tabs on this TTabControl component. +The default value of the TTabPosition property is PlatformDefault. +Refer to the TTabPosition help topic for the description of the possible tab positions. + + + + + + +Occurs immediately after changing the active tab on this tab control component. +Write an OnChange event handler to provide additional functionality when changing the active tab of this tab control component. + + + + + + + + + + + + + + + + + + + + +TTabControl is a tab set that has the appearance of notebook dividers. +Use TTabControl to add a control with multiple tab settings to a FireMonkey form. When the current tab changes, the tab control must directly update its contents to reflect the change, in an OnChange event handler. +Disabling a TTabControl object disables all tabs at once. To enable or disable specific tabs, you can programmatically use the Tabs property as in the following code snippet where the tab with the index of 1 is rendered as disabled: + + TabControl1.Tabs[1].Enabled := False; + +Use TTabControl to create rich graphical interfaces with great functionality, such as options and configurations for a specific application. + +Code Examples +FMX.ControlsDemo Sample +FMX.MusicPlayer Sample +FMX.TabSlideTransition Sample + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/FMX.Types.xml b/Modules/DelphiFMX/doc/FMX.Types.xml new file mode 100644 index 00000000..0dfd4622 --- /dev/null +++ b/Modules/DelphiFMX/doc/FMX.Types.xml @@ -0,0 +1,5326 @@ + + + + $10E + + + + + + + + + + + + + The number of decimal digits for the rounding floating point + values. + + + + + + Allow using Metal for UI rendering + + + + + If this value is YES, draw loop is paused and updates are event-driven (Metal only) + + + + + The rate at which the draw loop update its contents (Metal only) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This method converts TTextAlign value to THorzRectAlign + + + + + + + + This method converts TTextAlign value to TVertRectAlign + + + + + + + + + + + + This method converts TVertRectAlign value to TTextAlign + + + + + + + + + + + + This method converts THorzRectAlign value to TTextAlign + + + + + + + + + + + + + + + A type that text controls use to specify whether to consider the + ampersand (&) as a special character + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A special polygon point marker typically used for converting paths to polygons and vice-versa, + usually indicating path closure. For the rendering methods, this marker has no meaning and the actual + interpretation may be platform-dependent. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns window scale factor. + + + + + + + + Returns True if Scale is integer value. + + + + + + + + Window scale factor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This method returns true if the control has an available hint to display. + + + + + + + + If HasHint is true, this method is invoked in order to know if the control has an available + string to swho as hint. + + + + + + + + If HasHint is true, this method is invoked in order to know if the control has a custom hint + object to manage the hint display. This usually returns an instance of THint to allow the form to manage + it. + + + + + + + + + + + + + + + + + + + + + + + This interface is used to acces to property ReadOnly of all classes which supports this property + + + + + + + + + + + + + + + The property to which we have access + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + When available, complete screen area in pixels, including status bars and button bars. Can be + the same as PhysicalScreenSize. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reads and writes otherwise unpublished data the same as a property. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Constructs a TBounds object and initializes its data before the object is first used. + + + + + + +Copies the contents of another similar object to the current instance. + + + + + + + +Checks whether the current instance and the Obj parameter are equal. +FMX.Types.TBounds.Equals inherits from System.TObject.Equals. All content below this line refers to System.TObject.Equals. +Checks whether the current instance and the Obj parameter are equal. +The function has one Obj parameter of the TObject type. +By default, the Equals method shows whether the addresses corresponding to the current object and the Obj object are identical. The method returns a boolean value that represents the equality between the two addresses. + + +Note: Equals is supposed to be overridden in user-derived classes, to provide consumer objects with an equality determining function. +For example, in the FMX.Types.TBounds class, Equals also returns True if the Rect properties of the current object and of the Obj object are equal. In the FMX.StdActns.TBaseValueRange class, Equals also returns True if all the properties of the current object and of the Obj object are equal. + + + + + + + + +Returns a rectangle defined by the current Rect property and the R parameter. +The PaddingRect function returns a rectangle calculated by adding the Left and Top values and subtracting the Right and Bottom values of the current Rect to or from the corresponding values of the specified R rectangle. +For example, if the current Rect is (10, 20, 50, 30) and R is (20, 10, 40, 50), the result of PaddingRect is (30, 30, -10, 20). See also Padding. + + + + + + + +Returns a rectangle defined by the current Rect property and the R parameter. +The MarginRect function returns a rectangle calculated by adding the Left and Top values and subtracting the Right and Bottom values of the current Rect to or from the corresponding values of the R rectangle. +For example, if the current Rect is (10, 20, 50, 30) and R is (20, 10, 40, 50), the result of MarginRect is (30, 30, -10, 20). See also Margins. + + + + + + +Returns the width of the Rect, as the difference between the Right and Left values. + + + + + + +Returns the height of the Rect, as the difference between the Bottom and Top values. + + +Specifies the bounds as a rectangle. +Use the Rect property to set and get the margins. + + +Specifies the default value for the margins. +DefaultValue is automatically set when creating the TBounds instance. + + + + + + + +Returns True if either the Width or Height of the Rect are empty, and False otherwise. + + + + + + +Returns True when the Left, Right, Top, and Bottom properties are simultaneously 0. + + + + + + +Returns a string containing the class name. +FMX.Types.TBounds.ToString inherits from System.TObject.ToString. All content below this line refers to System.TObject.ToString. +Returns a string containing the class name. +By default, the ToString returns a string containing the class name of the instance that is being called. +For example, calling ToString on a TButton instance returns a string containing "TButton". + +Note: ToString is intended to be overridden in user-derived classes, to provide consumer objects with a string representation. + +Specifies the left edge of the margin. +Use the Left property to set and get the left edge of the margin. + + +Specifies the top edge of the margin. +Use the Top property to set and get the top edge of the margin. + + +Specifies the right edge of the margin. +Use the Right property to set and get the right edge of the margin. + + +Specifies the bottom edge of the margin. +Use the Bottom property to set and get the bottom edge of the margin. + + + +Specifies the bounds for a control. +TBounds is used in the Margins and Padding properties of TControl and its descendants. TBounds help define the relative position between components on a form, and between the edges of the form and the component. For example, when you set the left bound for a component to 10 pixels, the component will not come closer than 10 pixels to the edge of the container, or to another component on the left edge. The number of pixels by which two components are separated is the sum of the pixels of both components. +You can define the amount of margin that should surround the component on the Top, Left, Bottom, or Right by changing the pixel value for the Margins and Padding properties in the Object Inspector. +Margins and Padding depend on the Align property. To see the effect, set the Margins property on a parent control and set the Align property for the child control to vaClient. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Provides methods to read and write unpublished data. +DefineProperties is implemented so that the position is written as a single string in the .fmx, not as separate X and Y values. +DefineProperties uses the methods of the filer passed as the Filer parameter to assign methods that can load and save the Point property. +Override DefineProperties to persist unpublished properties. Call the DefineBinaryProperty or DefineProperty method of the Filer parameter to assign methods that load or save property values. + +Note: When overriding this method, call the parent class' DefineProperties method first. + + + + + +Reads the coordinates of a point from the given Reader. +ReadPoint transforms the string data from the TReader given as a parameter into TPointF properties and assigns them to the Point property. + + + + + + +Writes the properties of the current Point into the given TWriter object. +WritePoint transforms the properties of Point into a string and writes the result in the TWriter given as a parameter. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates and initializes a TPosition instance. +Create generates a new TPosition instance. Create requires a default TPointF value as a DefaultValue for the position. The DefaultValue is usually (0,0), but can have other values also. If the position is the same as the default value, it is not stored in the .fmx file. + + + + + + +Copies the contents of another similar object to the current one. +Assign copies the properties from another TPosition instance. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns True if the components are the default ones, False otherwise. +Empty returns True if the X and Y coordinates are both the same as described by the DefaultValue property, False otherwise. + + + + + + +Returns the reflection of the current vector across a specified line. +Use the Reflect function to obtain the reflection of the current position across the perpendicular on the point given as parameter. + + + +Specifies the coordinates of the current object as a point. +Use the Point property to specify the coordinates of a TPosition object as a point. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the default coordinates of the current object. +Use the DefaultValue property to receive the default coordinates of a TPosition object. + + + +Specifies the horizontal coordinate of the object. +Use the X property to receive or to set the horizontal coordinate of the current TPosition object. + + +Specifies the vertical coordinate of the object. +Use the Y property to receive or to set the vertical coordinate of the current TPosition object. + + + +Used for specifying a control's position inside a form. +A TPosition object is used for representing the position of a control inside its parent, or anywhere related X and Y values are needed. The position can be specified through the X and Y values, as a Point. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Dispatcher of the OnChange event. + + + + + + +Creates an instance of TControlSize. + + + + + + +Copies the contents of another similar object. +FMX.Types.TControlSize.Assign inherits from System.Classes.TPersistent.Assign. All content below this line refers to System.Classes.TPersistent.Assign. +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + + + +Sets the value of the PlatformDefault property without triggering the OnChange notification. This method should be used only in cases where the OnChange notification is triggered by some other mechanism. + + + + + + +Sets the Size property to the height and width values of TSizeF and the PlatformDefault property to False. +These changes do not cause any notification. You can change instead the Size and PlatformDefault properties directly, what calls the OnChange event. +This method should be used only in cases where the OnChange notification is triggered by some other mechanism. + + +Represents the default values of the TControlSize Height, Width, and PlatformDefault variables. + + +Sets or gets the width and height of a control as a <TSizeF> record. +Using this method to set the Width and Height allows both dimensions to be updated while triggering only one OnChange notification. + +Note: Setting this property will set PlatformDefault to False. + + +Describes the width of a TControlSize. +Use this property to set or get the width for a TControlSize. + + +Describes the height of a TControlSize. +Use this property to set or get the height for a TControlSize. + + +When this property is set to True, the size and width of the control are set automatically based on pre-defined sizes for the active platform. +Explicitly setting the Width or Height properties automatically sets the PlatformDefault setting to False. + +Note: Changing the value of PlatformDefault triggers an OnChange notification. + + +Used for storing the size of FireMonkey components. +A TControlSize object is used for managing the size of the component. This can be specified through the Size, Width, Height, and PlatformDefault attributes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hide the caret + + + + + + + if possible (CanShow = True and Visible = True), the caret show. + + + + + + + This method is performed after changing the Displayed + + + + + + + + + + + + + + + + + + + + + + + The update of the "Flasher", if UpdateCount = 0. + + + + + + + This property controls the visibility of a caret, for the control in which the input focus. + + + + + + + The function returns true, if the control is visible, enabled, + has the input focus and it in an active form + + + + + + + + + + This property is set to True, after the successful execution of + method Show, and is set to False after method Hide + + + + + + + If this property is 'true', the blinking control is invisible + and does not take values of Visible, Displayed. + When you change the properties, methods DoShow, DoHide, DoDisplayChanged not met. + + + + + + + Blinking visual component is displayed. + Usually this line, having a thickness of one or two pixels. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Marks index for lazy update. + + + + + Updates index, if it's required only. + + + + + Finds style object by specified StyleLookup value and returns object in AObject. + + + + + + + + + + Clears index. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the first item in the children list. This value is usually 0, but for styled objects, which have a style as the first object in the children list, this value is 1. + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Types.TFmxObject.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Enumerates all child components. +FMX.Types.TFmxObject.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + +Sets the parent component. +FMX.Types.TFmxObject.SetParentComponent inherits from System.Classes.TComponent.SetParentComponent. All content below this line refers to System.Classes.TComponent.SetParentComponent. +Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + + + + + +Forwards notification messages to all owned components. +FMX.Types.TFmxObject.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + +Calls the action link's Update method if the control is associated with an action link. Override it to customize the way the styled control initiates its associated action. + + + + + + +TBasicAction.OnChange event dispatcher. +DoActionChange is called when a TBasicAction.OnChange event occurs. +Do not call DoActionChange explicitly in an application. It is for internal use. + + + + + + + +Specifies the behavior of a TFmxObject object when Action changes. +By default, ActionChange does nothing. +In descendant classes, for example in descendants of TControl, to customize the behavior of a control when Action changes, override TControl.ActionChange. +Do not call ActionChange explicitly in an application. It is for internal use. + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the action associated with the control. +Action allows an application to centralize the response to user commands. When a control is associated with an action, the action determines the appropriate properties and events of the control (such as whether the control is enabled or how it responds to an OnClick event). +If an object of the descendant from the TFmxObject class does not support actions, and when this object tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass that should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the containing component. +FMX.Types.TFmxObject.GetParentComponent inherits from System.Classes.TComponent.GetParentComponent. All content below this line refers to System.Classes.TComponent.GetParentComponent. +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + + + + +Verifies whether the component has a parent. +FMX.Types.TFmxObject.HasParent inherits from System.Classes.TComponent.HasParent. All content below this line refers to System.Classes.TComponent.HasParent. +Verifies whether the component has a parent. +Call HasParent to determine whether a specific component has a parent. +Derived classes override this method to implement proper handling for parenting. +Use GetParentComponent to retrieve the component reference. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Protected setter implementation for the Parent property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Notification method called after the parent is changed. ParentChanged is a virtual method to be implemented in subclasses to allow for changing the parent of this FMX object. + + + +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Ensures that AComponent is notified that the component is going to be destroyed. +FMX.Types.TFmxObject.FreeNotification inherits from System.Classes.TComponent.FreeNotification. All content below this line refers to System.Classes.TComponent.FreeNotification. +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Protected getter implementation for the Data property. + + + + + + +Protected setter implementation for the Data property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +FMX.Types.TFmxObject.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +FMX.Types.TFmxObject.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Performs any necessary actions before the first destructor is called. +FMX.Types.TFmxObject.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + + +Warning: Release is deprecated. + + +Marks this TFmxObject object for delayed deletion. + + + + + + + + + Describes the current state of this instance. Indicates that a component needs to avoid certain + actions. See also TComponent.ComponentState + + + + + + + + + + + +Sets the Root property of each child in the children list. + + + + + + + True + + + + +Sets the csDesigning in TComponentState. Used internally by the IDE. + + + + + + + +Returns a new cloned instance of this FMX object. +Clone internally creates and returns a new FMX object that is an exact copy of this object. + +Note: The class you want to clone must be registered and be a descendant of TFmxObject. Use RegisterClass or RegisterFMXClasses for your components. + + + + + + + +Adds the AObject object to the Children list of children attached to this parent object (self). +AddObject internally calls DoAddObject that implements all business functionality of AddObject. +AddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). AddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then AddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. + + + + + + + +Adds the object provided in the parameter to the FChildren TList of this object (self), at the specified position (index). +The InsertObject method is similar to the AddObject method, except that InsertObject inserts the given object to the given position specified by the Index parameter. + + + + + + +Removes a children object from its parent. Calling RemoveObject is equivalent to setting Parent to nil. +RemoveObject has two overloaded methods. The first one removes the object specified through the AObject parameter, which is of type TFmxObject. The second one removes the object whose index is specified through the Index parameter. + +Tip: If you want to use RemoveObject on an object, that object must have been added to the children list through the AddObject method. + + + + + +Removes a children object from its parent. Calling RemoveObject is equivalent to setting Parent to nil. +RemoveObject has two overloaded methods. The first one removes the object specified through the AObject parameter, which is of type TFmxObject. The second one removes the object whose index is specified through the Index parameter. + +Tip: If you want to use RemoveObject on an object, that object must have been added to the children list through the AddObject method. + + + + + + +Returns True if the specified object is a direct child. +ContainsObject returns True if the specified object (AObject) is a direct child of this TFmxObject (self). It returns False otherwise. +Unlike IsChild, ContainsObject only returns True when passed a direct child of this object as AObject. For example, if A is a direct child of this object, and B is a direct child of A, ContainsObject returns True when passed A as AObject, but it returns False when passed B. + + + + + + + +Exchanges two objects from the children list. Exchange exchanges AObject1 with AObject2. + + + +Deletes all the children of this FMX object. +DeleteChildren checks whether Children is assigned (children are present) and, if so, it deletes all of them. DeleteChildren also sets Children to nil. + + + + + + + +Returns True if the specified object is a child. +IsChild returns True if the specified object (AObject) is a child of this TFmxObject (self) or any of its children, grand-children, etc. It returns False otherwise. +Unlike ContainsObject, IsChild not only returns True when passed a direct child of this object as AObject, but also when the specified object is a grand-child, grand-grand-child, and so on of this object. For example, if A is a direct child of this object, and B is a direct child of A, IsChild returns True both when passed A as AObject and when passed B. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +You can call BringToFront at run time as in the following code snippet: + + Label1.BringToFront; + +or, at design time, by right-clicking the FMX visual control and selecting Control > Bring to Front from the pop-up menu. + + + +Sends this FMX visual object to the background letting other overlapping visual controls that are on the same form to be on top of it. +You can call SendToBack at run time as in the following code snippet: + + Label1.SendToBack; + +or, at design time by right-clicking the FMX visual control and selecting Control > Send To Back from the pop-up menu. + + + + + + +Adds the children of this object to the given list. +The AddObjectsToList method adds all objects that are owned by this object (stored in the Children field) and all of the objects owned by them to the TList provided in the AList parameter. + + + + + + + +Sorts the children in the children list using the specified sorting procedure. + + + +Loops through the children of this object, and runs the specified procedure once per object as the first parameter in each call. + + + + + + + + + + + + 0.2 + + + + + In + + + + + Linear + + + + + + + + + + + 0.2 + + + + + 0 + + + + + In + + + + + Linear + + + + + + + + + + + 0.2 + + + + + In + + + + + Linear + + + + + + + + + + + 0.2 + + + + + In + + + + + Linear + + + + + + + + + + + 0.2 + + + + + In + + + + + Linear + + + + + + + + + + + 0.2 + + + + + In + + + + + Linear + + + + + + + + + +Stops the animation of the specified property of this FMX object. +StopPropertyAnimation iterates through all the children of this FMX object and, if one of them is of type TFloatAnimation or TColorAnimation and is assigned to the specified property (APropertyName), stops the animation. + + + + + + +Adds AObject to the list of objects to be notified when this TFmxObject is destroyed. +The AObject parameter can be any object that implements the IFreeNotification interface, such as a TBrushResource, or a TBrushBitmap. + + + + + + +Removes the given object from the free notifications list. +The RemoveFreeNotify method removes the object specified through the AObject parameter, which is of type TFmxObject. + +Tip: If you want to use RemoveFreeNotify on an object, that object must have been added to the free notifications list using the AddFreeNotify method. + + + + + + False + + + + + +Returns the style resource object with the specified (AStyleLookup). +If AStyleLookup is empty, FindStyleResource returns nil. If no resource object is linked directly to the control, FindStyleResource looks for the styles of the control's children. If no resource object is found, it returns nil. +Clone determines whether the returned style resource object should be the original style object (False) or a copy of the original (True). + + +Specifies the root parent of this object. +The Root property is a link to the root parent of this object. +By default, the root object is the youngest parent in the hierarchy of the object parents, which supports the IRoot interface. If no parent supports IRoot, then Root = nil. +Notice that a Root object provides the Focused, Hovered, and Captured properties. Therefore, among the Children of the Root object, at each moment, there can only be one: + +Focused control. +Control that has captured the mouse. +Control over which the mouse is hovering. + +Specifies whether this object is stored in the .XFM file. +Set the Stored property to True to store the object in the .XFM file. Otherwise, set Stored to False. + + + + +Custom property that stores any object value. + + +Custom property that stores any floating-point value. + + +Custom property that stores any string value. + + +Read-only property that specifies the number of children in the children list. + + +Stores an array of children attached to this parent component. +Use the Children property to access each of the children attached to this parent component. + + +Stores a Tvalue, which is a data structure that can store different kinds of data types. +Data has no predefined meaning. Although Data is used for LiveBinding, any succesor override this behavior. Then, the behaviour of Data is based on the type of its value. + +Note: Do not use this member. It is for internal use only. + + + +Specifies the parent component of this FMX object. + +Tip: You cannot set the parent of this component as the component itself (Self (Delphi) or this (C++Builder)). + +Specifies the index of the child object in the children array attached to this object. + + +Specifies whether the component object has an associated action. +If ActionClient is True, this component object is the client of an associated action. +If ActionClient is False, this component object is not the client of an action. +This property can be checked before calling GetActionLinkClass. + + +Specifies the style name for this FMX component. +Read or set the StyleName property to obtain or to set the name of the style for this FireMonkey component. For instance, a TRectangle object can have StyleName set to 'backgroundstyle' or 'panelstyle'. + + + +The base class for FireMonkey components. +TFmxObject extends TComponent to provide low-level functionality to FireMonkey components, including: + +Creating, destroying, and releasing objects +Cloning, storing, and loading objects from a stream +Child object manipulations (add, remove, search) +Free notifications +Support for FireMonkey styles +Support for FireMonkey animations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs just before the pop-up menu appears. +Write an OnPopup event handler to take specific action just before the pop-up menu appears. For example, use an OnPopup event handler to set the Checked, Enabled, or Visible property of individual items in the menu so that they are appropriate to the PopupComponent. + + + + + + + +Displays the pop-up menu onscreen. +TCustomPopupMenu descendants implement Popup so that it brings up the pop-up menu onscreen. The menu appears at the screen coordinates indicated by the values (in pixels) of X and Y. + + +Specifies the control for which the current object is a context menu. +Set the PopupComponent value to a control so that the current object will be a context menu for that control. The context menu for a control will appear when you right-click that control. + + + +Represents a pop-up menu attachable to graphical controls that support pop-up menus. +The TTextService virtual abstract class represents a pop-up context menu that can be attached to any FireMonkey graphical control that support pop-up menus, such as TImageControl, TPanel, and so on. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Computes the ratio of used surface area to the total bin area. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + BestAreaFit + + + + + MinimizeArea + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provider a persistent object for the designer. A different TPersistent can be routed into the + designer using this interface. This can be used to expose properties of non-controls in the + Object Inspector. + + + + Return the provided persistent + + + + + + + + + Shim is a representative of a visual non-control object in the Designer. The shim needs to implement + this interface in order to let the Designer know about its bounding rectangles. + + + + + Return bounding rectangle of shim. + + + + + + + + + Extension of TPersistent directly exposed to the Designer. + + + + GetDesignParent should return a TPersistent known to the designer, e.g. its parent TControl. + + + + + + + + Bounding rectangle representing this TPersistent in the designer + + + + + + + + + Bind this persistent with its shim, thus enabling GetBoundsRect without using the host. + Example: TItemAppearanceProperties as IDesignablePersistent are bound to the TListItemShim + Their counterpart FmxReg.TListViewObjectsProperties are bound to the same TListItemShim + + + + + + + + + + Unbind this persistent. The implementation would normally clear its reference to IPersistentShim. + + + + + + True if this TPersistent is currently in Design mode and wants the Designer to create + IItem for itself. + + + + + + + + + Interface for TPersistent to receive bounding rectangle changes from the Designer. + + + + Set bounds rectangle. + + + + + + + + + Interface that allows binding a TPersistent with a TreeView Sprig in StructureView + + + + Set link to a TreeView sprig specified by APersistent. nil to break the link. + + + + + + + + Get link to a TreeView sprig. Returns nil if link does not exist. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Referece to the logger service. + + + + + + + + + + + + + + A short message + + + + + Timestamp + + + + + + + + + + + + + + + + + + + + + + + + + Mark time during timed execution of a procedure. + + + + + + + + Get a mark at Index. + + + + + Count of accumulated Marks. + + + + + + + Log a debug message. Same arguments as Format. + + + + + + + + + + + + + Log a simple debug message. + + + + + + + + Log a debug message with Tag, object data of Instance, Method that invokes the logger and message Msg. + + + + + + + + + + + + Log a debug message with Tag, object data of Instance and a message Msg + + + + + + + + + + Log a time stamp with message Msg + + + + + + + + Perform a timed execution of Func and print execution times, return function result. + Proc receives a parameter TLogToken which can be used to mark specific points where timestamps should be taken + in addition to complete procedure time. + + + + + + + $FFFFFFFF + + + + + + + + A convenience variant of Trace<TResult> when token is not needed. + + + + + + + $FFFFFFFF + + + + + + + + A convenience variant of Trace<TResult> for procedures. + + + + + + + $FFFFFFFF + + + + + + + A convenience variant of Trace<TResult> for procedures when token is not needed. + + + + + + + $FFFFFFFF + + + + + + + Get a basic string representation of an object, consisting of ClassName and its pointer + + + + + + + + + Get a string representation of array using MakeStr function to convert individual elements. + + + + + + + + + + Get a string representation of array using TObject.ToString to convert individual elements. + + + + + + + + + Dump complete TFmxObject with all its children. + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + nil + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about display. + + + + The unique id of display. + + + + + Index is the same as MonitorNum. Added for the sake of brevity. + + + + + Is this the main display in the system? + + + + + Screen size (dp) without taking into account the taskbar and other decorative elements. + The Windows platform doesn't allow to determinate logical position of screen definitely. + + + + + Screen size (px) without taking into account the taskbar and other decorative elements. + + + + + Screen size (dp) minus the taskbar, and other decorative items. + + + + + Screen size (px) minus the taskbar, and other decorative items. + + + + + Display scale. + + + + + It is the same as Bounds. + + + + + + + + It is the same as Workarea. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ignores the reference count and forces the object to be released. Sets nil to AObject. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Removes the ampersand '&' characters of the Text string. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Registers the flasher class for the TCustomCaret object specified + in the CaretClass parameter. + + + + + + + + + Returns the class of a flasher registered for the TCustomCaret + object specified in the CaretClass parameter. + + + + + + + + + Checks whether a flasher is registered for the TCustomCaret object + specified in the CaretClass parameter. + + + + + + + + + Returns the flasher object registered for the TCustomCaret object + specified in the CaretClass parameter. + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/System.Actions.xml b/Modules/DelphiFMX/doc/System.Actions.xml new file mode 100644 index 00000000..5ff4ef3e --- /dev/null +++ b/Modules/DelphiFMX/doc/System.Actions.xml @@ -0,0 +1,2225 @@ + + + + + Status invisible. The input fields are displayed as well as before the + new properties. + + + + saNone + + + + + + Displays the normal field in the normal state. + + + + saTrivial + + + + + + This field contains the default value + + + + saDefault + + + + + + Required field that has not yet filled. + + + + saRequiredEmpty + + + + + + Required field is already filled. + + + + saRequired + + + + + + Field been tested and it contains a valid value. + + + + saValid + + + + + + The field has been tested and it contains an invalid value. + + + + saInvalid + + + + + + Running some long operation. + + + + saWaiting + + + + + + Perhaps the field contains an invalid value. + + + + saWarning + + + + + + The field value is not used in this case. + + + + saUnused + + + + + + This field value is calculated. + + + + saCalculated + + + + + + The field value is incorrect + + + + saError + + + + + + Another state (user defined) + + + + saOther + + + + + asNormal + + + + + asSuspended + + + + + asSuspendedEnabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Current status of the input field. This value can be used in different + type-validators on your own. + + + + + + Status invisible. The input fields are displayed as well as before the + new properties. + + + + + + + Displays the normal field in the normal state. + + + + + + + This field contains the default value + + + + + + + Required field that has not yet filled. + + + + + + + Required field is already filled. + + + + + + + Field been tested and it contains a valid value. + + + + + + + The field has been tested and it contains an invalid value. + + + + + + + Running some long operation. + + + + + + + Perhaps the field contains an invalid value. + + + + + + + The field value is not used in this case. + + + + + + + This field value is calculated. + + + + + + + The field value is incorrect + + + + + + + Another state (user defined) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This is the base class that implements the operation with + a list of keyboard shortcuts. Should be established descendants + of this class (see TContainedAction.CreateShortCutList) for each platform (VCL, FMX), which should be overridden the method Add. + + + + + + + + + + + + + + + + + + + + + + + + +Reads the state of the action. +ReadState is used internally in the actions system. It is not necessary to call it directly. +ReadState calls the inherited System.Classes.TComponent.ReadState procedure. Then +ReadState checks whether the Parent of Reader (Reader.Parent) is an action list, then ReadState sets that the action belongs to this action list (ActionList). + + + +Retrieves whether the list stored in the SecondaryShortCuts property is created. +SecondaryShortCutsCreated returns True if the SecondaryShortCuts list is created. + + + + + + + + + + This is the base class that implements the operation with + a list of keyboard shortcuts. Should be established descendants + of this class (see TContainedAction.CreateShortCutList) for each platform (VCL, FMX), which should be overridden the method Add. + + + + +Introduces an interface for creating the ShortCutList object for the action. +As implemented in TContainedAction, CreateShortCutList does not create any shortcut list object and just returns nil. + + + + +Stores the value of the Enabled property when the action is suspended. +The System.Actions.TContainedActionList.SetState method uses SavedEnabledState internally: + +When System.Actions.TContainedActionList.SetState changes State from asSuspendedEnabled to asNormal, then the value stored in SavedEnabledState is used to set the Enabled property. +When System.Actions.TContainedActionList.SetState sets State to asSuspendedEnabled, then the value of the Enabled property is saved in SavedEnabledState and Enabled is set to True. + + + + + +Copies the properties of this action to a destination action. +Dest specifies the destination action. AssignTo ensures the correct assignment of property values. +If Dest is nil or Dest is not of the TContainedAction type, then an error is raised. + + + + + + +Executes the action when the user types one of its shortcuts. +HandleShortCut calls System.Classes.TBasicAction.Execute to cause the action to perform its function. HandleShortCut returns the value that System.Classes.TBasicAction.Execute returns. +Descendant classes can override HandleShortCut to respond in other ways when the user types the action's shortcut keys. + + + + + + + + +Sets the specified Value to the AutoCheck property of the action, and propagates this Value to all clients of the action. + + + + + + +Sets the specified Value to the Caption property of the action, and propagates this Value to all the clients of the action. + + + + + + +Sets the Name and Caption properties of the action. +SetName calls the inherited System.Classes.TComponent.SetName method to set the specified Value to the Name property of the action. If the action does not have any clients and the current values of the Name and Caption properties of the action are equal, then SetName sets Value to the Caption property of the action also. + +Warning: Using SetName to change the name of an action at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + + + +Sets the specified Value to the Checked property of the action, and propagates this Value to all clients of the action. +If the action has a GroupIndex value greater than 0, then setting Checked to True causes all other actions in the group to have their Checked property set to False. + + + + + + +Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +The behavior of SetEnabled depends upon the State of the ActionList action list: + +If the value of State is asSuspended, then SetEnabled sets to the specified Value only the Enabled property of the action. +If the value of State is asSuspendedEnabled, then SetEnabled sets to True the Enabled property of the action and of all clients of the action. +Otherwise, SetEnabled sets to the specified Value the Enabled property of the action and propagates this Value to all clients of the action. + + + + + +Sets the specified Value to the GroupIndex property of the action and properly handles the ON or OFF state of the Checked properties of all actions in the group specified by Value. +SetGroupIndex sets the specified Value to the GroupIndex property of the action. If the Checked property of this action is True, then SetGroupIndex sets the Checked property to False for all the other actions in the group defined by the specified Value. +When Value is greater than 0, the group of actions with the GroupIndex property having this Value forms a group of actions that act like a group of radio buttons. When the Checked property of any action in this group is True, the Checked properties of all other actions in the group are False. That is, one and only one action in the group is checked ON at a time. + +Note: All actions in a group must be listed by the same action list. + + + + + +Sets the Help context ID for the action and action's clients. +SetHelpContext sets the new Value of the integer help context ID, stored in the HelpContext property, for the action. +SetHelpContext always propagates this Value to all clients of the action. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help in your application, you need to enable Help in your application. + + + + + +Defines the Help keyword for the action and action's clients. +SetHelpKeyword sets the new Value of the string help keyword, stored in the HelpKeyword property, for the action. +SetHelpKeyword always propagates this Value to all clients of the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + + + + + + +Sets the HelpType property for the action and action's clients. +SetHelpType sets the new Value of the HelpType property for the action. +SetHelpType always propagates this Value to all clients of the action. + + + + + + +Sets the Hint property for the action and action's clients to a new Value. +SetHint sets the new Value of the Hint property for the action. +SetHint always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the Visible property for the action and action's clients. +SetVisible always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the ShortCut property for the action and action's clients. +SetShortCut always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the ImageIndex property for the action and action's clients. +SetImageIndex always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the StatusAction property for the action and action's clients. +SetStatusAction always propagates this Value to all clients of the action. + + + + + + +Instantiates and initializes a TContainedAction object. +Applications do not need to call Create directly. Actions are created automatically when you choose New Action in the Action List editor. +Create calls the inherited System.Classes.TBasicAction.Create constructor and then +initializes the Enabled (setting it to True), Visible (setting it to True), and ImageIndex (setting it to -1) properties. + + + + + +Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + + + + + + +Returns the action list containing the action. +GetParentComponent returns the action list containing the action. This action list is stored in the ActionList property. If ActionList stores nil, then GetParentComponent calls the inherited System.Classes.TComponent.GetParentComponent method. + + + + + + +Indicates whether the action is contained in an action list. +HasParent returns True if the action is contained in an action list stored in the ActionList property. If ActionList stores nil, then HasParent calls the inherited System.Classes.TComponent.HasParent method. + + + + + + +Sets the action list containing the action. +SetParentComponent sets the specified AParent action list as the action list containing the action. This action list is stored in the ActionList property. + + +Holds the action list to which the action belongs. + + + + + + +Returns True if the action list of the action is suspended. + + +Specifies the index of the action in its action list. +Index indicates the position of the action in its action list. You can change the action's Index at design time using one of the IDE editors to handle actions. +The index of actions determines the order in which they appear in user interface elements such as menus and tool bars. +Index is zero-based. When Index is -1, this means that the ActionList property does not contain any list. + + +Indicates whether the action's clients should be disabled if no OnExecute event handler is found. +DisableIfNoHandler defines whether to set the Enabled property of the action to False if no OnExecute event handler is set for the action. Setting Enabled to False disables all the action's clients. +See, for example, how FMX.Forms.TApplication.UpdateAction uses DisableIfNoHandler to define whether to set Enabled to False if the OnExecute event handler is not defined to the action. +For example, setting DisableIfNoHandler to False can be useful when managing submenus. In this case, pointing to a command on the main menu, which causes the submenu to open, does not need any OnExecute event handler. Then, if DisableIfNoHandler is True, this main menu command becomes disabled and the submenu cannot be opened. In such cases it can be convenient to use actions of types FMX.Controls.TControlAction and Vcl.Controls.TControlAction. Objects of these classes have the value of DisableIfNoHandler set to False, by default. + + +Controls whether the Checked property toggles when the action executes. +AutoCheck causes the Checked property to toggle when the action executes. This allows the Checked property of the action to remain in sync with the Checked property of the client (or an equivalent). +If the client has an AutoCheck property of its own, the AutoCheck property of the action is propagated to the AutoCheck property of the client. + + +Represents the caption of the action. +Caption holds the string that is used as the caption of the action, when it is set. The value of Caption can be propagated to all client controls and client menu items linked to the action. + + +Indicates whether client controls and menu items appear checked. +Checked specifies the checked state for the action. The value of Checked can be propagated to all client controls and client menu items linked to the action. + +Note: If the action has a GroupIndex value greater than 0, then setting Checked to True sets to False the Checked properties of all other actions in the GroupIndex group. +Tip: Use the AutoCheck property to ensure that the action's Checked property toggles when the action executes. + +Specifies the enabled state for the action. +The value of Enabled can be propagated to all client controls and client menu items linked to the action. + + +Indicates a group of actions in one action list. Actions in this group act like the group of radio buttons. +The value of GroupIndex is used to define groups of actions. Actions in each group act like groups of radio buttons. When GroupIndex is greater than 0, this value identifies the group to which some actions belong. The value of GroupIndex can be propagated to all client controls and client menu items linked to the action. +When the Checked property of any action in that group is set to True, the Checked properties of all other actions in the group are set to False. That is, only one action in the group can be checked at a time. + +Note: All actions in a group must be listed by the same action list. + +Keeps the integer context ID that identifies the Help topic for the action. +HelpContext specifies the integer context ID to identify the Help topic to show when invoking Help for the action. The value of HelpContext can be propagated to all client controls and client menu items linked to the action. See also IsHelpLinked. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the value of the HelpContext property to invoke the online Help that shows the topic with this context ID. The target topic is uniquely identified by a HelpContext context ID value. + +Contains the keyword string that identifies the Help topic for the action. +The value of HelpKeyword can be propagated to all client controls and client menu items linked to the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the HelpKeyword property's value to invoke the online Help showing the topic with this keyword. + +Keeps whether to use the HelpContext or HelpKeyword property to identify the Help topic. +The value of HelpType can be propagated to all client controls and client menu items linked to the action. +HelpType can keep one of the following constants: + +htContext instructs to use the HelpContext property to identify the Help topic to show when invoking Help. +htKeyword instructs to use the HelpKeyword property to identify the Help topic to show when invoking Help. + +Stores the Help hint text. +Hint holds the hint string indicating the hint text for the action. +Hint contains the text strings that appear in a pop-up box (or in a status bar) when the user moves the mouse over screen elements. +This hint string can be propagated to clients of the action to controls, menu items, and other GUI elements. + +Note: VCL controls support hint strings containing three parts that can be shown in separate locations (see Vcl.Controls.TControl.Hint). + +Stores whether the action representation is visible. +Visible specifies the visible state for the action (True means visible, False means invisible). +This Visible value is propagated to a client of the action if IsVisibleLinked method of the action link linking the client to the action returns True. +If the Visible of an action is False and IsVisibleLinked of an action link returns True, then the Visible of the client (a control, menu item, or others) is also set False and this client is also invisible. Typically, IsVisibleLinked of an action link returns False if the action belongs to TCustomViewAction. Otherwise, when the action belongs to TAction, then IsVisibleLinked of an action link returns True. That is, TCustomViewAction is used when one need to provide visible representation of clients of actions that have Visible set True. + + +Shortcut that triggers the action. +The value of Shortcut can be propagated to all client controls and client menu items linked to the action. + + +Stores shortcuts (in addition to ShortCut) for triggering the action. +Actions can execute in response to multiple shortcut key combinations. SecondaryShortCuts lists all the shortcut key combinations (other than the one specified by the ShortCut property) that can trigger the action. This lets you provide additional, secondary shortcuts. +When the user types one of the key combinations listed in SecondaryShortCuts, the action's Execute method is called. + + +Stores an index in a list of images. +ImageIndex is a zero-based index in a list of images. TContainedAction does not provide the actual list of images, only implementations of actions in GUI application frameworks provide such a property. In general, this list of images contains images that are associated with controls and menu items that use this action. +The value of ImageIndex can be propagated to all client controls and client menu items linked to the action. + +Note: When ImageIndex is -1, this means that the list does not contain any images. +In typical implementations of controls, an image is drawn at the leftmost position in the control, and a control's text is drawn to the right of the image. If ImageIndex is -1, then a control does not offset the text to the right to reserve a placeholder for the image. Otherwise, if ImageIndex is not -1, then the control's text is always drawn with the offset to the right to reserve a place for drawing an image. + + + + + + +Calls the OnHint event handler. +Typically, applications do not call the DoHint method. It is called automatically when the user pauses the mouse on one of the action's client controls or menu items. DoHint is called by the action's client when the client asks to show the hint. + +DoHint checks for an OnHint event handler and passes HintStr to it, if the event handler exists. The OnHint event handler can change the specified hint string HintStr. DoHint returns True if no event handler is assigned or if OnHint returns True. DoHint can be used to determine which hint text should be shown. For example, Vcl.Controls.TControlActionLink.DoShowHint calls DoHint internally, and if DoHint returns True, then Vcl.Controls.TControlActionLink.DoShowHint appends the action's shortcut specification to the hint text to display. + +Occurs when the mouse pauses over a client control or menu item. +Use OnHint to override the default hint that appears when the user pauses the mouse over a client control or menu item. The OnHint event handler can change the hint that appears (by changing the string stored in the client's Hint property), or display the hint in an application-specific way. + + + +Stores the status for an input field in an action. +StatusAction holds the status for an input field in the action, when it is set. +The value of StatusAction can be propagated to all client controls and client menu items linked to the action. + + + +Group or category where the action belongs. +IDE editors for actions group together actions that share the same category. In the VCL, if you are using an action manager, you can generate user interface elements that correspond to action categories. +Action categories group actions by similarities, usually of behavior or functionality. Standard categories are Edit, Format, Help, Windows, and others. At design time you can modify or set the Category for an action by selecting the action from the action list or object tree view, and choosing Category in the Object Inspector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The ancestor class of actions, that contained in the TContainedActionList + It implements to work with common properties for all platforms (FMX, VCL). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The ancestor class of actions, that contained in the TContainedActionList + It implements to work with common properties for all platforms (FMX, VCL). + + + + + + + + + + + + + + + + + + + + +Returns True if the internal list of actions of the TContainedActionList instance has been created. It returns False otherwise. +The internal list of actions is created when you create the TContainedActionList instance. + + + +Raises an EActionError exception if the internal list of actions of the TContainedActionList has not been created. + + + + + + +Adds an action to the list. +Applications cannot call this protected method. AddAction is used internally to add an action to the Actions property array. +To add an action to an action list, set the action's ActionList property. + + + + + + +Removes an action from the list. +Applications cannot call this protected method. RemoveAction is used internally to remove an action from the Actions property array. RemoveAction removes the action and sets its ActionList property to nil (Delphi) or NULL (C++). +To remove an action from an action list, change the action's ActionList property. + + + +Triggers the OnChange event on the action list and then on all its actions. +The internal list of actions is created when you create the TContainedActionList instance. + + + + + + + +Handles notifications about the removal of one of the actions of the list. +If AComponent is an action of the list and Operation is opRemove, the action is removed from the list. + + + + + + + +Sets the order in which actions are passed to a callback by the GetChildren method. +SetChildOrder specifies the order in which the component streaming system loads and saves the action components owned by this action list. It ensures that the actions are loaded and saved in the same order that they appear in the Actions property array. You should not need to call this method directly. + + + + + + +Sets the State property for the action list. +If Value is asSuspendedEnabled, then SetState also sets Enabled to True for all the actions in the action list. This is useful when designing in the Action Manager. +If the OnStateChange event handler is set, then SetState calls this event handler. + + +Occurs when a change occurs in the action list. +Write an OnChange event handler to update your application in response to changes in the action list. Changes to the action list that trigger an OnChange event include changes to an action category or to the action list's image list. + +Note: The action list automatically informs the actions in the list when an OnChange event occurs. You need only provide an OnChange event handler for application-specific responses. +OnChange is an event handler of type TNotifyEvent. + + +Occurs when a client object triggers an action in the list. +Write an OnExecute event handler to respond when an action in the list fires. +When the user invokes a client object, the action list s OnExecute event is the first event to occur in response. If the OnExecute event handler sets its Handled parameter to True, the action is considered handled, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class in response to the user action. +If the OnExecute event handler does not set its Handled parameter to True, the application s OnActionExecute event occurs next. If the OnActionExecute event does not respond to the user input, the action object s OnExecute event occurs. Finally, if the action does not have an OnExecute event handler, the application locates a target object and executes any predefined response implemented by the action object. + + +Occurs when the application is idle so that the action list can update a specific action in the list. +Write an OnUpdate event handler to configure the properties of a specified action in the list so that it reflects current conditions. +When the application is idle, it cycles through every action in turn, giving it a chance to update itself to reflect current conditions. For each action, the first event to occur in this sequence is the action list's OnUpdate event. If the OnUpdate event handler sets its Handled parameter to True, the action is considered updated, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class. +If the OnUpdate event handler does not set its Handled parameter to True, the application's OnActionUpdate event occurs next. If the OnActionUpdate event does not update the action, the action object's OnUpdate event occurs. Finally, if the action does not have an OnUpdate event handler, the application executes any predefined update method implemented by the action object. + + + + + + + + True + + + + + +Returns True if the Source and Dest categories are the same. If IncludeSubCategory is True, this function also returns true if Dest is a subcategory of Source. +These are some examples of calls to this function: + + + +Source + +Dest + +IncludeSubCategory + +Result + + +File + +File + +True + +True + + +File.Recent + +File + +True + +False + + +File + +File.Recent + +True + +True + + +File + +File + +False + +True + + +File.Recent + +File + +False + +False + + +File + +File.Recent + +False + +False + + + + + + +Creates an instance of TContainedActionList. +This creator is inherited from TComponent, see TComponent.Create for more information. + + + + + +Destroys an instance of TContainedActionList. +This destructor is inherited from TComponent, see TComponent.Destroy for more information. + + + + + + + +Generates an OnExecute event. +Typically, applications do not call the ExecuteAction method. Instead, the action indicated by the Action parameter calls ExecuteAction in response to a user command. It is possible, however, to call ExecuteAction to generate an OnExecute event even though no client control has been triggered. +ExecuteAction invokes the OnExecute event handler for the action list. It returns True if the event handler handles the action, False otherwise. + + + + + + + +Calls a specified method for each child action of the action list. +GetChildren is used by the component streaming system. For each action in the action list, GetChildren calls the method passed in Proc. The actions are passed to the callback in the order that they are loaded or saved by the component streaming system. + + + + + + + + + Auxiliary class for enumeration actions in TContainedActionList + + + + + +Returns a TContainedActionList enumerator, a TActionListEnumerator reference that enumerates the actions in the list. +To process all actions, read Current from the enumerator within a while MoveNext do loop. + + + + + + + +Generates an OnUpdate event. +Typically, applications do not call the UpdateAction method. Instead, the action indicated by the Action parameter calls UpdateAction when informed by the application that it can update itself. It is possible, however, to call UpdateAction to generate an OnUpdate event even though this has not been initiated by the application. +UpdateAction invokes the OnUpdate event handler for the action list. It returns True if the event handler updates the action, False otherwise. + + + + + + + + True + + + + + +Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + + + + + + True + + + + + +Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + +Indicates the number of actions in the action list. +ActionCount indicates how many actions are contained in the action list. + + +Indicates whether the actions in the action list respond when the user triggers a client object. +State can be one of the constants defined in the TActionListState type: +asNormal, asSuspended, and asSuspendedEnabled. + + +Occurs after the State property's value is changed. +Write an OnStateChange event handler to respond after the State property's value is changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/System.Classes.xml b/Modules/DelphiFMX/doc/System.Classes.xml new file mode 100644 index 00000000..71800342 --- /dev/null +++ b/Modules/DelphiFMX/doc/System.Classes.xml @@ -0,0 +1,11815 @@ + + + + $7FFFFFF + + + + + $0 + + + + + $1 + + + + + $2 + + + + + soBeginning + + + + + soCurrent + + + + + soEnd + + + + + + + + + + + $FF00 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $1000 + + + + + $2000 + + + + + $4000 + + + + + $8000 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $4 + + + + + $8 + + + + + $8 + + + + + $10 + + + + + $10 + + + + + $10 + + + + + $20 + + + + + $40 + + + + + $40 + + + + + $80 + + + + + $100 + + + + + $200 + + + + + $400 + + + + + $800 + + + + + $800 + + + + + $1000 + + + + + $2000 + + + + + $4000 + + + + + $8000 + + + + + $8000 + + + + + $10000 + + + + + $20000 + + + + + $40000 + + + + + $80000 + + + + + $394DF + + + + + $3 + + + + + $21004 + + + + + $10448 + + + + + $8010 + + + + + $80 + + + + + dupIgnore + + + + + dupAccept + + + + + dupError + + + + + taLeftJustify + + + + + taRightJustify + + + + + taCenter + + + + + bdLeftToRight + + + + + bdRightToLeft + + + + + bdRightToLeftNoAlign + + + + + bdRightToLeftReadingOnly + + + + + taAlignTop + + + + + taAlignBottom + + + + + taVerticalCenter + + + + + ssShift + + + + + ssAlt + + + + + ssCtrl + + + + + ssLeft + + + + + ssRight + + + + + ssMiddle + + + + + ssDouble + + + + + ssTouch + + + + + ssPen + + + + + ssCommand + + + + + ssHorizontal + + + + + htKeyword + + + + + htContext + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lnAdded + + + + + lnExtracted + + + + + lnDeleted + + + + + laCopy + + + + + laAnd + + + + + laOr + + + + + laXor + + + + + laSrcUnique + + + + + laDestUnique + + + + + sdDelimiter + + + + + sdQuoteChar + + + + + sdNameValueSeparator + + + + + sdLineBreak + + + + + sdStrictDelimiter + + + + + soStrictDelimiter + + + + + soWriteBOM + + + + + soTrailingLineBreak + + + + + soUseLocale + + + + + soReference + + + + + soOwned + + + + + vaNull + + + + + vaList + + + + + vaInt8 + + + + + vaInt16 + + + + + vaInt32 + + + + + vaExtended + + + + + vaString + + + + + vaIdent + + + + + vaFalse + + + + + vaTrue + + + + + vaBinary + + + + + vaSet + + + + + vaLString + + + + + vaNil + + + + + vaCollection + + + + + vaSingle + + + + + vaCurrency + + + + + vaDate + + + + + vaWString + + + + + vaInt64 + + + + + vaUTF8String + + + + + vaDouble + + + + + ffInherited + + + + + ffChildPos + + + + + ffInline + + + + + tpIdle + + + + + tpLowest + + + + + tpLower + + + + + tpNormal + + + + + tpHigher + + + + + tpHighest + + + + + tpTimeCritical + + + + + opInsert + + + + + opRemove + + + + + csLoading + + + + + csReading + + + + + csWriting + + + + + csDestroying + + + + + csDesigning + + + + + csAncestor + + + + + csUpdating + + + + + csFixups + + + + + csFreeNotification + + + + + csInline + + + + + csDesignInstance + + + + + csInheritable + + + + + csCheckPropAvail + + + + + csSubComponent + + + + + csTransient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + laCopy + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + + + + +Provides an interface for a method that reads and writes otherwise unpublished data. +Descendants of TPersistent override DefineProperties to designate a method for storing the object's unpublished data to a stream such as a form file. By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method. +When overriding DefineProperties, consider including some or all of the following: + +A call to the inherited method +Calls to the filer object's DefineProperty method +Calls to the filer object's DefineBinaryProperty method +DefineProperties is virtual, so descendant classes can override it as necessary but are not required to do so. + + + + + + +Returns the owner of an object. +GetOwner is used by the GetNamePath method to find the owner of a persistent object. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. As implemented in TPersistent, GetOwner returns nil (Delphi) or NULL (C++). +For TOwnedCollection, GetOwner returns the owner of the collection. For TCollectionItem collection items, GetOwner returns the collection object into which the collection item has been inserted. For TComponent, GetOwner returns the value of the Owner property. + + + + + +Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + + + + +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + + + +Returns the name of the object as it appears in the Object Inspector. +GetNamePath is for internal use only. It determines the text that the Object Inspector displays for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. Do not call GetNamePath directly. +For components, GetNamePath returns the component name. For TCollectionItem objects it returns the name of the hosting component, the name of the property, and the index into the collection surrounded by brackets. + + + +TPersistent is the ancestor for all objects that have assignment and streaming capabilities. +TPersistent encapsulates the behavior common to all objects that can be assigned to other objects, and that can read and write their properties to and from a form file (.xfm or .dfm file). For this purpose, TPersistent introduces methods that can be overridden to: + +Define the procedure for loading and storing unpublished data to a stream. +Provide the means to assign values to properties. +Provide the means to assign the contents of one object to another. +Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Warning: Added is deprecated. + + +Responds when items are added to the collection. +Applications cannot call the protected Added method. It is called automatically immediately after items are added to the collection. +Item is the item that was just added to the collection. +Added is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + + + + + + +Warning: Deleting is deprecated. + + +Responds when items are deleted from the collection. +Applications cannot call the protected Deleting method. The Delete method calls Deleting immediately before it removes an item from the collection. +Item is the item that is about to be removed. +Deleting is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + +Specifies a unique ID that can be assigned to the next added collection item. +TCollection uses NextID internally to assign unique identifiers to collection items. When a new item is added to the collection, its ID property is given the value of NextID and NextID is incremented. + + + + + + + +Responds when items are added to or removed from the collection. +Notify is called automatically when the items in the collection change. +Item is the item that was just added to or that is about to be removed from the collection. +Action indicates whether the item was added, is about to be extracted or is about to be deleted. +As implemented in TCollection, Notify calls Added when Action is cnAdded and calls Deleting when Action is cnDeleting. TCollection ignores the cnExtracting action. Descendant classes can override Notify to modify this behavior. + + + + + + +Returns the number of custom attributes associated with items in the collection. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. GetAttrCount returns the number of distinct attributes assigned to each item in the collection. +As implemented in TCollection, GetAttrCount always returns 0, because TCollection defines no custom attributes. + + + + + + + +Returns the name of a custom attribute that can be retrieved using the GetItemAttr method. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. The GetAttr method returns the name of an attribute. +Index identifies the attribute whose name is requested. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +As implemented by TCollection, GetAttr always returns an empty string, because TCollection defines no custom attributes. + + + + + + + + +Returns the value of a custom attribute assigned to one of the collection's items. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and -- for each item in the collection -- a value, which is a string. GetItemAttr returns the value of one of these attributes for a specified item in the collection. +Index identifies which of the attribute's values is desired. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +ItemIndex identifies the item whose attribute value is desired. This is an index into the Items property array. +As implemented in TCollection, GetItemAttr always returns an empty string, because TCollection defines no custom attributes. + + + +Responds when the collection or any of its items changes. +Changed is called automatically when items in the collection change or when the EndUpdate method signals that an update is complete. It checks the value of UpdateCount, and if it is 0, calls the Update method, which performs any necessary updates. +When writing a TCollection descendant, there is no need to call Changed. Instead, bracket any changes by calls to BeginUpdate and EndUpdate. + + + + + + + +Returns a specified item in the collection. +GetItem is the protected read implementation of the Items property. + + + + + + + +Copies the properties of another item to a specified item in the collection. +SetItem is the protected write implementation of the Items property. It calls the Assign method of the item specified by Index, so that the properties of the item specified by Value are copied to that item. + + + + + + +Initializes the name of a newly inserted collection item. +The Insert method calls SetItemName to initialize the Name property of items when it inserts them into the collection. +As implemented in TCollection, SetItemName does nothing. Some TCollection descendants override this method to provide collection items with default names. + + + + + + +Updates the collection to reflect changes to its items. +Override Update in a descendent class to make any necessary changes when the items in the collection change. This method is called automatically when an update is complete. +Item identifies the item that changed. If the Item parameter is nil (Delphi) or NULL (C++), then the change affects more than one item in the collection. +As implemented in TCollection, Update does nothing. Descendent classes override this method to make any necessary adjustments. + + +Specifies the name of the property that the collection implements. +The GetNamePath method uses this protected property to assemble the name of the collection as it appears in the Object Inspector. It identifies the name of the property in the object returned by the protected GetOwner method that is implemented using this collection object. + + +Counts the number of times BeginUpdate was called without a corresponding call to EndUpdate. +UpdateCount keeps track of calls to BeginUpdate and EndUpdate so that they can be nested. Every call to BeginUpdate increments UpdateCount. Every call to EndUpdate decrements it. When UpdateCount returns to 0, the collection updates itself to reflect all changes that occurred since the first call to BeginUpdate. + + + + + + +Creates and initializes a collection. +Call Create to instantiate a TCollection object at run time. Typically, TCollection descendants are created by a component that uses the collection to implement a property. +ItemClass identifies the TCollectionItem descendants that must be used to represent the items in the collection. The Add method uses this class to create items of the appropriate type. + + + + + +Destroys the collection and each item in it. +Destroy uses the Clear method to free each item referenced in the Items array, then destroys the collection itself. + + + + + + +Returns the Owner of the collection. +Call Owner to obtain a reference to the object that owns this collection. Typically, the owner uses the collection to implement one of its properties. + + + + + + +Creates a new TCollectionItem instance and adds it to the Items array. +Call Add to create an item in the collection. The new item is placed at the end of the Items array. +Add returns the new collection item. + + + + + + +Copies the contents of the Source collection to the current object. +Use Assign to copy the contents of one TCollection instance to another. The Assign method deletes all items from the destination collection (the object where it is executed), then adds a copy of each item in the source collection's Items array. +Source is another object (typically another collection) that contains the items that replace this collection's items. + + + +Signals the start of an update operation. +Call BeginUpdate before starting an operation that performs changes to TCollection. After completing all the changes, call EndUpdate to signal the end of the operation. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, the method is used to suspend screen repainting until changes to a component that involves TCollection are completed. + + + +Deletes all items from the collection. +Clear empties the Items array and destroys each TCollectionItem. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Deletes a single item from the collection. +Delete removes the specified collection item, moving up any items that come after that item in the Items property array. +Index identifies the item to delete. This is the index of the item in the Items property array. 0 specifies the first item, 1 specifies the second item, and so on. + + + +Signals the end of an update operation. +Call EndUpdate after completing an operation that was preceded by a call to the BeginUpdate method. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, use EndUpdate to re-enable screen repainting that was turned off with the BeginUpdate method for the components that involve TCollection. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Returns the item with the specified ID. +The FindItemID method returns the item in the collection whose ID property is passed to it as a parameter. If no item has the specified ID, FindItemID returns nil (Delphi) or NULL (C++). + + + + + + +Returns a TCollection enumerator. +GetEnumerator returns a TCollectionEnumerator reference, which enumerates all items in the collection. +To do so, call the TCollectionEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Returns a string used by the Object Inspector. +If the collection has no owner, GetNamePath returns the name of the collection's actual (runtime) type. If the collection is owned, GetNamePath returns the owner's name followed, if applicable, by a dot and the name of the owner's property that holds the collection. For example, GetNamePath might return "TreeView1.Items". + +Note: For a collection to have an owner, it must override the GetOwner method. + + + + + + +Creates a new TCollectionItem instance and adds it to the Items array. +Call Insert to add a new item at a specified position in the collection. Existing items (starting from the specified position) are moved up in the Items array. +Insert returns the new collection item. + + +Provides access to the internal TList.Capacity property. +The Capacity property specifies the allocated size of the array of pointers maintained by the TList object. This value is set to the number of pointers the list will need to contain. + + + + +Returns the number of items in the collection. +Count contains the number of items in the Items array. Since Items is indexed starting with 0, the value of Count is always one greater than the index of the last member of Items. + + +Indicates the class to which the collection's items belong. +ItemClass is the class (descended from TCollectionItem) to which the items in the collection belong. For example, in an instance of the TCollection descendant THeaderSections, the value of the ItemClass property is THeaderSection. + + + + +TCollection is a container for TCollectionItem objects. +Each TCollection holds a group of TCollectionItem descendants. TCollection maintains an index of the collection items in its Items array. The Count property contains the number of items in the collection. Use the Add and Delete methods to add items to the collection and delete items from the collection. +Objects descended from TCollection can contain objects descended from TCollectionItem. Thus, for each TCollection descendant, there is a corresponding TCollectionItem descendant. +The following table lists some typical descendants of TCollection with the corresponding TCollectionItem descendant and the component that uses each pair: + + + +TCollection descendant + +TCollectionItem descendant + +Component + + + +TBitmapLinks + + + +TBitmapLink + + + +TCustomStyleObject + + + + +TAggregates + + + +TAggregate + + + +TClientDataSet + + + + +TCookieCollection + + + +TCookie + + + +TWebResponse + + + + +TCoolBands + + + +TCoolBand + + + +TCoolBar + + + + +TDBGridColumns + + + +TColumn + + + +TDBGrid + + + + +TDependencies + + + +TDependency + + + +TService + + + + +THeaderSections + + + +THeaderSection + + + +THeaderControl + + + + +TListColumns + + + +TListColumn + + + +TListView + + + + +TParams + + + +TParam + + + +many datasets + + + + +TStatusPanels + + + +TStatusPanel + + + +TStatusBar + + +The controls that use TCollection and TCollectionItem descendants have a published property that holds a collection. (For example, the Panels property of TStatusBar holds a TStatusPanels.) A standard property editor, referred to generically as the Collection editor, can be invoked from the Object Inspector to edit the items in the collection. + +Note: When writing a TCollection descendant that is used by another control, be sure to override the protected GetOwner method of the collection so that the descendant class instances can appear in the Object Inspector. +Note: TCollection has the TOwnedCollection descendant that maintains information about its owner. TOwnedCollection implements the GetOwner method. Therefore, classes derived from TOwnedCollection do not need to add anything in order to appear in the Object Inspector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reads and writes the Strings property as if it were published. +TStrings overrides DefineProperties so that the strings in the list can be loaded and saved with a form file as if the Strings property were published. + + + + + + + +Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + + + + + +Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + + + + + +Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + + + + + +Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + + + + +Returns a string given its index. +Get is the protected read implementation of the Strings property. +In TStrings Get is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the string with the specified index. + + + + + + +Returns the currently allocated size of the list of strings. +GetCapacity is the protected read implementation of the Capacity property. In TStrings, GetCapacity returns the value of the Count property. Descendants of TStrings can override this property to let a string list allocate memory for entries that have not been added to the list. + + + + + + +Returns the number of strings in the list +GetCount is the protected read implementation of the Count property. +In TStrings GetCount is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the number of strings that have been added to the list. + + + + + + + +Returns the object associated with the string at a specified index. +GetObject is the protected read implementation of the Objects property. +Index is the index of the string with which the object is associated. +In TStrings, GetObject always returns nil (Delphi) or NULL (C++). This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override GetObject to return the specified object. + + + + + + +Returns the value of the Text property. +GetTextStr is the protected read implementation of the Text property. It returns a string that lists all the strings in the list, with individual strings separated by the string terminator characters LineBreak. By default, LineBreak is a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. + + + + + + + +Changes the value of the string with a specified index. +Put is the protected write implementation of the Strings property. +Put changes the value of the string with the index specified by Index to S. Put does not change the object at the specified position. That is, any object associated with the previous string becomes associated with the new string. + + + + + + + +Changes the object associated with the string at a specified index. +PutObject is the protected write implementation of the Objects property. +As implemented in TStrings, PutObject does nothing. This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override PutObject to change the specified object. + + + + + + +Changes the amount of memory allocated to hold strings in the list. +SetCapacity is the protected write implementation of the Capacity property. +NewCapacity is the number of strings the list can hold after the capacity has changed. +In TStrings, the SetCapacity method does nothing. Descendent classes must override this method to change the number of strings that the list can hold. + +Note: For descendent classes that implement SetCapacity, assigning a value smaller than Count removes strings from the end of the list. Assigning a value greater than Count allocates space for more strings to be added. + + + + + +Protected setter of the Encoding property. +If Value is one of standard encoding values, SetEncoding sets the Encoding property to Value. Otherwise, SetEncoding sets the Encoding property to default. +Internally, Assign and LoadFromStream call SetEncoding. + + + + + + +Sets the Text property. +GetTextStr is the protected write implementation of the Text property. It replaces the list with the strings specified by the Value parameter. SetTextStr adds strings one at a time to the list, using the carriage returns or linefeed characters in Value as delimiters indicating when to add a new string. + + + + + + +Performs internal adjustments before or after a series of updates. +SetUpdateState is called at the beginning or end of a series of updates. When the BeginUpdate method is first called and the TStrings object is not already in the middle of an update, TStrings calls SetUpdateState internally, with Updating set to true. When the EndUpdate method is called and it cancels out the last unmatched call to BeginUpdate, TStrings calls SetUpdateState internally, with Updating set to false. +As implemented in TStrings, SetUpdateState does nothing. Descendant classes can override this method to optimize the response to updates. + + + + + + + + +Compares two strings. +TStrings uses CompareStrings internally to compare the values of strings that appear in the list. For example, the IndexOf and IndexOfName methods use CompareStrings to compare a specified string with the strings in the list. +S1 and S2 are the strings to compare. +CompareStrings returns a value less than 0 if S1 < S2, 0 if S1 == S2, and a value greater than 0 if S1 > S2. +As implemented in TStrings, CompareStrings uses the global AnsiCompareText function, which compares strings case insensitively. Some descendant classes override this method to change the way strings are compared (for example, to introduce case sensitivity). + + +Indicates the number of calls to BeginUpdate that have not been matched by a call to EndUpdate. +TStrings uses UpdateCount to keep track of calls to the BeginUpdate and EndUpdate methods. Every time a call is made to BeginUpdate, TStrings increments the value of UpdateCount. Every call to EndUpdate causes TStrings to decrement UpdateCount. +When UpdateCount changes from 0 to 1, TStrings calls the SetUpdateState method with a parameter of true. When UpdateCount changes from 1 to 0, TStrings calls the SetUpdateState method with a parameter of false. This allows descendant classes to perform optimizations when handling multiple updates. + + + + + +Creates an instance of a TStrings object. +Do not call the Create method for TStrings directly. TStrings is an abstract class and its constructor should only be called as an inherited method from the constructor of a derived class. + + + + + + +Destroys the TStrings instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + + + + + +Adds a string at the end of the list. +Call Add to add a string to the end of the list. Add returns the index of the new string. + + + +Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + + + + + + + +Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + + + + + + + + + + + + + +Adds a string to the list, and associates an object with the string. +Call AddObject to add a string and its associated object to the list. AddObject returns the index of the new string and object. + +Note: The TStrings object does not own the objects you add this way. Objects added to the TStrings object still exist even if the TStrings instance is destroyed. They must be explicitly destroyed by the application. + + + + + +Adds a string to the list. +Append is the same as the Add method, except that it does not return a value. Use Append when there is no need to know the index of the string after it has been added, or with descendants of TStrings for which the index returned is not meaningful. +For example, the TStrings descendant used by memo objects uses an index to determine where to insert a string, but the inserted string does not necessarily end up as a single string in the list. Part of the inserted text may become part of the previous string, and part may be broken off into a subsequent string. The index returned by Add is not meaningful in this case. +Use Append rather than Add as a parameter for a function requiring a TGetStrProc. + + + + + + +Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + + + + + + + + + + + +Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + + + + + + + + + + + + + + + + +Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + + + + +Sets the strings in the Strings array, possibly associated Objects, and some other properties of the current TStrings object, from the Source object. +Use Assign to set the properties of the TStrings object from the Source object. If Source is of the TStrings type, Assign copies the following properties: + +Strings +Objects +DefaultEncoding +Encoding +LineBreak +Delimiter +QuoteChar +NameValueSeparator +Options +If Source is not of the TStrings type, the inherited Assign will set the value of the string array from any object that supports TStrings in its AssignTo method. + + + +Sets the strings from another TStrings object to the list of strings. +Use SetStrings to assign the value of the TStrings object from another TStrings object (Source). + +Note: SetStrings is similar to Assign, but Assign also copies multiple additional properties. + + + + + + +Enables the TStrings object to track when the list of strings is changing. +BeginUpdate is called automatically by any property or method that changes the list of strings. Once the changes are complete, the property or method calls EndUpdate. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + +Introduces an abstract (Delphi) or pure virtual (C++) method to empty the list and any associated objects. +Descendants of TStrings implement a Clear method to delete all the strings in the list, and to remove any references to associated objects. + + + + + + +Introduces an abstract (Delphi) or pure virtual (C++) method to delete a specified string from the list. +Descendants of TStrings implement a Delete method to remove a specified string from the list. If an object is associated with the string, the reference to the object is removed as well. Index gives the position of the string, where 0 is the first string, 1 is the second string, and so on. + + + +Enables the TStrings object to keep track of when the list of strings has finished changing. +EndUpdate is called automatically by any property or method that changes the list of strings. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + + + + + +Compares the list of strings to the list from another TStrings object and returns true if the two lists match. +Call Equals to compare the lists in two TStrings objects. Equals compares only the strings, not any references to associated objects. Equals returns true if the lists for both TStrings objects have the same number of strings and the strings in each list match. Equals returns false if the lists are different in length, if they contain different strings, or if the order of the strings in the two lists differ. + +Note: The Equals method uses an overridden Get method to perform the compare, thus it does not provide a context-insensitive option. + + + + + + +Swaps the position of two strings in the list. +Call Exchange to rearrange the strings in the list. The strings are specified by their index values in the Index1 and Index2 parameters. Indexes are zero-based, so the first string in the list has an index value of 0, the second has an index value of 1, and so on. +If either string has an associated object, Exchange changes the position of the object as well. + + + + + + +Returns a TStrings enumerator. +GetEnumerator returns a TStringsEnumerator reference, which enumerates the strings in a TStrings object. +To process all these strings, call the TStringsEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Allocates a text buffer and fills it with the value of the Text property. +Call GetText to obtain a dynamically allocated character buffer containing all of the strings in the list. Individual strings are separated by a carriage return (#13) on the OS X operating system, or by a carriage return and a line feed (#13#10) on Windows operating systems. The caller is responsible for freeing the returned value using the StrDispose procedure. + + + + + + + +Returns the position of a string in the list. +Call IndexOf to obtain the position of the first occurrence of the S string. IndexOf is not case-sensitive; this means that the given string may differ in case from the string in the list. For example: + +String1 := MyStrings.Items.IndexOf('My First String'); + +is equivalent to + +String1 := MyStrings.Items.IndexOf('My FIRST String'); + +IndexOf returns the 0-based index of the string. Thus, if S matches the first string in the list, IndexOf returns 0, if S is the second string, IndexOf returns 1, and so on. If the string is not in the string list, IndexOf returns -1. + +Note: If the string appears in the list more than once, IndexOf returns the position of the first occurrence. + + + + + + +Returns the position of the first name-value pair with the specified name. +Call IndexOfName to locate the first occurrence of a name-value pair where the name part is equal to the Name parameter or differs only in case. IndexOfName returns the 0-based index of the string. If no string in the list has the indicated name, IndexOfName returns -1. + +Note: If there is more than one name-value pair with a name portion matching the Name parameter, IndexOfName returns the position of the first such string. + + + + + + +Returns the index of the first string in the list associated with a given object. +Call IndexOfObject to locate the first string in the list associated with the object AObject. Specify the object you want to locate as the value of the AObject parameter. IndexOfObject returns the 0-based index of the string and object. If the object is not associated with any of the strings, IndexOfObject returns -1. + + + + + + + +Introduces abstract (Delphi) or pure virtual (C++) method to insert a string at a specified position. +Descendants of TStrings implement an Insert method to add the string S to the list at the position specified by Index. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. +All methods that add strings to the list use the Insert method to add the string. +If the string has an associated object, use the InsertObject method instead. + + + + + + + + +Inserts a string into the list at the specified position, and associates it with an object. +Call InsertObject to insert the string S into the list at the position identified by Index, and associate it with the object AObject. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. + + + + + + +Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + + + + + +Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + + + + +Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + + + + + +Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + + + + + +Changes the position of a string in the list. +Use Move to move the string at position CurIndex so that it occupies the position NewIndex. The positions are specified as 0-based indexes. For example, the following lines of code move the string in the first position to the last position: +For Delphi: + +MyStringsObject.Move(0, MyStringsObject.Count - 1); + +For C++: + +MyStringsObject->Move(0, MyStringsObject->Count - 1); + +If the string has an associated object, the object remains associated with the string in its new position. + + + + + + +Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + + + + + +Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + + + + +Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + + + + + +Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + + + + +Sets the Text property. +Call SetText to replace the list with the strings specified by the Text parameter. SetText adds strings one at a time to the list, using the carriage returns or linefeed characters in Text as delimiters indicating when to add a new string. + + + + + + +Converts a TStrings descendant to a string array. + +Use ToStringArray to obtain an array of strings for each string in the list. + + + + + + +Returns the TObject array associated with Strings. + +Use ToObjectArray to obtain the array of TObject associated with Strings. + +Note: TStrings is an abstract class and this method has no effect. Descendent classes can associate objects with strings. +Note: The TStrings object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the TStrings object is destroyed. They must be explicitly destroyed by the application. + + +Indicates whether or not the list of strings is in the middle of an update. + + + +Indicates the number of strings the TStrings object can hold. +Read Capacity to determine the currently allocated size of the string list. For the TStrings object, reading Capacity returns the Count property, and setting Capacity does nothing. Descendants of TStrings can override this property to allow a string list to allocate memory for entries that have not been added to the list. + + +Lists the strings in the TStrings object in a single comma-delimited string. +Use CommaText to get or set all the strings in the TStrings object in a single comma-delimited string. The single comma-delimited string format is also known as the system data format (SDF). +When retrieving CommaText, any string in the list that include spaces, commas or double quotes will be contained in double quotes, and any double quotes in a string will be repeated. For example, if the list contains the following strings: + +Stri,ng1 +Stri"ng2 +String 3 +String4 + +CommaText will return: + +"Stri,ng1","Stri""ng2","String 3",String4 + +When assigning CommaText, the value is parsed as SDF formatted text. For SDF format, strings are separated by commas or spaces, and optionally enclosed in double quotes. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored. For example, suppose CommaText is set to: + +"Stri,ng 1","Stri""ng 2",String 3,String4 + +The list will then contain: + +Stri,ng 1 +Stri"ng 2 +String +3 +String4 + +Note: CommaText is the same as the DelimitedText property with a delimiter of ',' and a quote character of '"'. +Including a trailing comma in the source string causes a blank item to be included in the string list. For example, if CommaText is set to + +"String1,String2,String3, " + +the string list will contain + +String1 +String2 +String3 +<Blank> + + +Introduces an abstract property to represent the number of strings in the list. +Descendants of TStrings implement a Count property to indicate the number of strings in the list. +Use the Count property when iterating over all the strings in the list, or when trying to locate the position of a string relative to the last string in the list. + + +The default encoding for the current object. +DefaultEncoding is used when the nil encoding is specified in a call to LoadFromStream or SaveToStream. +By default, DefaultEncoding is set to Default. The user can change DefaultEncoding if another default encoding is desired for LoadFromStream or SaveToStream. + + +Specifies the delimiter used by the DelimitedText property. +Use Delimiter to get or set the delimiter used by the DelimitedText property. DelimitedText represents all of the strings in the TStrings object as a single string, with individual strings separated by the character that is the value of Delimiter. +The default delimiter is represented by comma (,). + + +Represents all the strings in the TStrings object as a single delimited string. +Use DelimitedText to get or set all the strings in the TStrings object in a single string, separated by the character specified by the Delimiter property. +When retrieving DelimitedText, any string in the list that includes spaces or the delimiter and quotation marks characters specified in the Delimiter and QuoteChar properties will be surrounded (before and after) by the quotation mark character (QuoteChar). In addition, any QuoteChar character contained in an individual string will be repeated. +When retrieving DelimitedText, the resulting value delimits individual strings in two ways: each string is surrounded (before and after) by the quotation marks character specified by the QuoteChar property. In addition, individual strings are separated by the character specified by the Delimiter property. +When assigning DelimitedText, individual strings must be separated using Delimiter marks, and optionally enclosed in QuoteChar characters. +When assigning DelimitedText, the value is parsed as SDF formatted text. For SDF format, strings are separated by Delimiter characters or spaces, and optionally enclosed in QuoteChar characters. QuoteChar marks that are part of the string are repeated to distinguish them from the QuoteChar characters that surround the string. Spaces and Delimiter characters that are not contained within QuoteChar marks are delimiters. Two Delimiter characters next to each other will indicate an empty string, but spaces that appear next to another Delimiter character are ignored. +If StrictDelimiter is set to False, the space character is also interpreted as a delimiter, regardless of the value of Delimiter. This is not true when the space character occurs between quotation marks. + +Note: CommaText is the same as the DelimitedText property when Delimiter is ',' and QuoteChar is '"'. Including a trailing Delimiter in the source string causes a blank item to be included in the string list. + +Character encoding determined during reading from a stream or file. +Encoding is a read-only property that contains the value of the character encoding detected when the LoadFromStream or LoadFromFile methods are called. If a file or stream does not contain a BOM (the encoding value cannot be detected) then Encoding is set to the value specified in the DefaultEncoding property. +Encoding is used in the SaveToStream and SaveToFile methods. + + +Defines line-break characters. +The LineBreak property is used internally in TStrings to set the string terminator characters. Set or read the LineBreak property to determine the string terminator characters in multistring output operations. +For example, the GetText method returns a long string containing all TStrings strings, each of which is terminated by the LineBreak value. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on Android, Linux, macOS and iOS it is just a line feed (#10). + + + + + When the list of strings includes strings that are name-value pairs or just names, + read Keys to access the name part of a string. If the string is not a name-value + pair, Keys returns full string. Assigning Keys will write new name for name-value + pair. This is in contrast to Names property. + + + + + +Specifies the quote character used by the DelimitedText property. +Use QuoteChar to get or set the quote character that is used to enclose individual strings in the DelimitedText property. +When QuoteChar is set to the null character, then DelimitedText does the following: + +At reading, does not return quoted list items. +At assigning, does not check an assigning value for quote char. +That is, you can set QuoteChar to the null character to disable quoting in DelimitedText. To set the QuoteChar to the null character, do the following: + + +Delphi: + +MyStringList.QuoteChar := #0; + + + +C++: + +MyStringList->QuoteChar = '\0'; + + + + + +Indicates the character used to separate names from values. +Strings that contain the NameValueSeparator character are considered name-value pairs. NameValueSeparator defaults to the equal sign (=). TStrings defines various methods for accessing names and values and for searching for specific names. +Strings that are name-value pairs consist of a name part, the separator character, and a value part. Any spaces around the separator character are part of the name or value. This convention corresponds to the format used in many initialization files. For example: + +DisplayGrid=1 +SnapToGrid=1 +GridSizeX=8 +GridSizeY=8 + + +Determines how the Delimiter property is used. +If StrictDelimiter is True, individual strings in DelimitedText are only separated by Delimiter or quoted between QuoteChar. If StrictDelimiter is False, spaces and non-printable character are also used as delimiters. + +Tip: You can set QuoteChar to the null character (#0 in Delphi, '\0' in C++) if you do not want quoted strings to be extracted as if they where surrounded by Delimiter. + + + + +Lists the strings in the TStrings object as a single string with the individual strings delimited by carriage returns and line feeds. +Use Text to get or set all the strings in the TStrings object in a single string delimited by carriage return, line feed pairs. +When setting Text, the value will be parsed and separated into substrings whenever the LineBreak value is encountered. For backward compatibility, on POSIX, if the LineBreak separator is LF, then LF, CR, or CRLF are treated as separators. On Windows if the LineBreak separator is CRLF, then LF, CR, or CRLF are treated as separators. +If the strings in the list contain carriage return or linefeed characters, a less ambiguous format for the strings is available through the CommaText or DelimitedText property. + + +Implements an IStringsAdapter interface for the TStrings object. + +StringsAdapter specifies the attached TStringsAdapter when it is used in OLE applications. + +Note: To create a StringsAdapter you can use GetOleStrings and SetOleStrings instead of creating an instance of TStringsAdapter. StringsAdapter is used internally with OLE applications. + +Will cause SaveToStream and SaveToFile to write a BOM. +Set WriteBOM to True to cause SaveToStream to write a BOM (byte-order mark) to the stream and to cause SaveToFile to write a BOM to the file. + + + +Determines whether to add a line Break after the last line of the Text property or not. +Use TrailingLineBreak to add a finishing line break to Text. Set TrailingLineBreak to True to add a line Break after the last line of Text. Set TrailingLineBreak to False to finish Text without a line Break. Default is True. + + + + +Determines the implementation that the list of strings must use for string comparison. +Set UseLocale to True to use AnsiCompareStr and AnsiCompareText to compare strings. +Set UseLocale to False to use CompareStr and CompareText. Default is True. + + + + +Controls a set of boolean properties of TStrings. +Use Options to specify the value of the following boolean properties of the list of strings: + + + +Option + +Property + + +soStrictDelimiter + +StrictDelimiter + + +soWriteBOM + +WriteBOM + + +soTrailingLineBreak + +TrailingLineBreak + + +soUseLocale + +UseLocale + + + + +TStrings is the base class for objects that represent a list of strings. +Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated. +Descendants of TStrings can represent several individual strings, such as the individual lines that appear in a list box. Some objects use descendants of TStrings to represent one long body of text so that it can be manipulated in smaller chunks. +TStrings introduces many properties and methods to: + +Add or delete strings at specified positions in the list. +Rearrange the strings in the list. +Access the string at a particular location. +Read the strings from or write the strings to a file or stream. +Associate an object with each string in the list. +Store and retrieve strings as name-value pairs. +For an explanation of name-value pairs, refer to the NameValueSeparator property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This constructor creates new string list with specified QuoteChar + and Delimiter property values. + + + + + + + + + + + This constructor creates new string list with specified QuoteChar, + Delimiter and Options property values. + + + + + + + + + + + + This constructor creates new string list with specified Duplicates, + Sorted and CaseSensitive property values. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $100000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SyncBuffer writes buffered and not yet written data to the file. + When ReRead is True, then buffer will be repopulated from the file. + When ReRead is False, then buffer will be emptied, so next read or + write operation will repopulate buffer. + + + + + + + + + + + + + $8000 + + + + + + + + + + + + $8000 + + + + + + + + + + + + FlushBuffer writes buffered and not yet written data to the file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + True + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + soReference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDHAS10BYTES + NEXTGEN + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Queue the method to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + + + + + + $0 + + + + + + + + Queue the procedure to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + + + + + + $0 + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + $FFFFFFFF + + + + + + + NEXTGEN + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns True if after AStartTime the specified ATimeout is passed. + When ATimeout <= 0, then timeout is inifinite and function always returns False. + + + + + + + + + + + + + + + + + + + + + + The currently executing thread. This is the same as TThread.CurrentThread. + + + + + + + The currently executing thread. This is the same as TThread.Current. + Please use TThread.Current, which is more clear and less redundant. + + + + + + + The number of processor cores on which this application is running. This will include virtual + "Hyper-threading" cores on many modern Intel CPUs. It is ultimately based on what the underlying + operating system reports. + + + + + + + Simple Boolean property to quickly determine wether running on a single CPU based system. + + + + + + + Event handler, which is called before each Synchronize or Queue call. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + MSWINDOWS + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This field will hold the acquired exception instance raised from the execution of the async method call. + It will be re-raised in the context of the invoking thread when the corresponding EndXXXX method is called. + + + + + + + Override this method to dispatch the actual asynchronous procedure call. Descendants will use whatever context + or other state information contained in the instance to pass along to the procedure or function. + + + + + + + Override this method to perform any extra state or signaling required by the descendant. The descendant must + call this inherited method in order to properly set the completion and possibly signal the FAsyncHandle if + previously created. Failure to call this method can result in a dead lock or hang. + + + + + + + Calls the actual target asynchronous method within the context of however it is scheduled. This could be + in the context of the main or GUI thread, or within a background thread. This depends on the implementation + of a specific asynchronous BeginXXXX method call. + + + + + + + Override this method to schedule the asynchronous procedure call in the manner specific to + a given instance, component or class. By default, this will schedule the async procedure onto + the main thread or execute the procedure synchronously if already on the main thread. + Other classes may schedule the procedure call into a separate thread or thread pool. + + + + + + + This constructor must be called from a descendent protected constructor. + + + + + + + + + + Opaque user-supplied context. This context is available via the IAsyncResult.GetAsyncContext and descendents + if this class. + + + + + + + Returns true if the operation can be cancelled. When cancelling the async operation, do any additional processing. + + + By default, all Async cannot be cancelled. If descendants support cancelling asynchronous tasks, + they must override this behaviour and do the required processing; + + + + + + + + + + This constructor should never be called directly. Only descendents should be constructed using the + protected Create constructor above. Calling this constructor will raise an exception. + + + + + + + + + + + + + Cancels the async operation. Returns True when the asynchronous operation can be cancelled. + + + + + + + + + + This method must be called prior in order to return itself as an IAsyncResult and actually schedule/invoke the + async call. + + + + + + + + + + As long as the rules for only ever accessing this object through the IAsynsResult interface, this method + should only ever be called by a given "EndInvoke" method by casting the IAsyncResult interface instance + back to a specific descendant instance of this class. Never call this method directly outside the context + of an "EndInvoke" style method. + + + + + + + This method is called from VCL.TControl (and possibly other similar) descendants in order to call the + asynchronous procedure/function as a result of a posted Window message. + + + + + + + + + + Set to True when the asynchronous call has been cancelled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + + + + + + + + + +Sets the private, internal storage for the Name property to the string passed in NewName. +Do not use ChangeName directly in an application. Instead, use the Name property. + +Note: The property setter for Name -- SetName-- uses ChangeName to change the component's name. ChangeName is not virtual; do not override it. + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + +Returns the owner of a child component being read from a stream. +GetChildOwner is used internally by the component streaming system. It is rarely necessary to call it directly. +In TComponent, GetChildOwner always returns nil (Delphi) or NULL (C++), indicating that the owner is the root component currently being read (usually a form or data module). The Owner of a component is responsible for destroying it. + + + + + + +Returns the parent or, if there is no parent, returns the owner of a child component being read from a stream. +GetChildParent is used internally in the component streaming system. It is not necessary to call it directly. +As implemented in TComponent, GetChildParent returns Self (Delphi) or this (C++). If GetChildParent returns nil (Delphi) or NULL (C++), the parent is assumed to be the root component currently being read (usually a form). + + + + + + +Returns the owner of a component. +GetOwner is called by GetNamePath to find the owner of a component. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. For TComponent, GetOwner returns the value of the Owner property. + + + +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Reads the state of the component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of Observers. + + + + + + + + +Clears or sets csAncestor state in the component's ComponentState property. +SetAncestor is used internally in the component streaming system. It is not necessary to call it directly. +If Value is set to True, the csAncestor flag is included into the component state; otherwise, it is excluded. + + + + + + + True + + + + +Ensures that components inserted at design time have their design-mode flag set. +SetDesigning is used internally by the Form designer. Do not call SetDesigning directly. +SetDesigning sets the csDesigning flag in the ComponentState property if Value is True; otherwise, it removes csDesigning. +If the SetChildren parameter is True, SetDesigning then calls the SetDesigning methods of any owned components, passing Value, so that the owned components' ComponentState properties are synchronized with the owner's. +The InsertComponent and RemoveComponent methods call SetDesigning for inserted or removed components to ensure that their design-mode flags are set properly. + + + + + + +Sets the csInline bit of the component's ComponentState property. +SetInline is used internally to indicate whether the component can act as a root component in the designer but also be embedded in a form. +SetInline sets the csInline flag in the ComponentState property if Value is True; otherwise, it removes csInline. + + + + + + +Ensures that components inserted at design time have their design-mode flag set. +SetDesignInstance is used internally by the Form designer to identify objects that act as a design surface. Do not call SetDesignInstance directly. +SetDesignInstance sets the csDesignInstance flag in the ComponentState property if Value is +True; otherwise, it removes csDesignInstance. + + + + + + +Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + + + + +Sets the visual ordering of a child control. +SetChildOrder is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to actually implement the ordering. TWinControl uses this ordering information to Z-align the controls. + + + + + + +Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + +Sets the csUpdating state in the component's ComponentState property. +Do not call Updating directly. It is used internally to indicate that the component is about to be updated. A call to Updating, which sets the csUpdating flag, is always followed by a call to Updated, which clears the flag. + + + +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + + + + + + +Provides the interface for a method that adds type library and version information to the Registry on components that implement COM interfaces. +Do not call UpdateRegistry directly. It is for internal use only. + + + + + + + + + + +Ensures that renaming an owned component does not create a name conflict. +ValidateRename checks whether a component can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the Components list, ValidateRename raises an EComponentError exception. +ValidateRename is used internally when the Name property is modified. It is not necessary to call it directly. + + + + + + +Determines whether an object can be inserted into a container. +ValidateContainer is called by a component when it is about to be inserted into a container object. By default, ValidateContainer calls the ValidateInsert method of the component specified by the AComponent parameter. +Descendent components can override ValidateContainer to disallow a component from being inserted into specific containers. To disallow an insertion, raise an exception in the derived method. + + + + + + +Provides the interface for a method that validates a child component before it is inserted. +ValidateInsert does nothing in TComponent. Descendent classes can override it to disallow a component from accepting an object as a child. By default, ValidateInsert allows any object to be inserted into the component. +If a component needs to validate only certain objects, descendent classes can override ValidateInsert to filter out those objects. To disallow an insertion, raise an exception in the derived method. + + + + + + +Writes the state of the component. +WriteState is used internally in the component streaming system. It is not necessary to call it directly. +This method expects a TWriter object that is used for storing the state of the component. + + + +Notifies all owned components of the owner component's imminent destruction. +The RemoveFreeNotifications method notifies all owned components of the owner component's imminent destruction. RemoveFreeNotifications is called automatically when the component is destroyed. + + + + + + + + + + +Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + + + +Called when an application uses a component interface. +_AddRef is a basic implementation of the IInterface method, _AddRef. + +Note: If the component is a wrapper for a COM object, _AddRef calls the _AddRef method of that COM object, and returns the resulting reference count. +In all other cases, _AddRef simply returns 1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _AddRef to implement reference counting. + + + + + + +Called when an application releases a component interface. +_Release is a basic implementation of the IInterface method, _Release. +_Release returns the resulting value of the reference count for the component's interface. + +Note: In all other cases, _Release simply returns 1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _Release to implement reference counting. + + + + + + +Returns the number of type information interfaces that an object provides (either 0 or 1). +GetTypeInfoCount implements the IDispatch interface GetTypeInfoCount method. For components that support interfaces, GetTypeInfoCount calls this method for the interface supported by the component. The Count parameter points to a location that receives the number of type information interfaces provided by the object. If the object provides type information, this number is 1; otherwise the number is 0. + + + + + + + + + +Retrieves the type information for an object. +GetTypeInfo implements the IDispatch interface GetTypeInfo method. For components that support interfaces, GetTypeInfo calls the GetTypeInfo method for the interface supported by the component, passing it the specified parameters. Use the returned value to get the type information for an interface implemented by the component. + + + + + + + + + + + +Maps a single member and an optional set of argument names to a corresponding set of integer dispatch identifiers (dispIDs). +GetIDsOfNames implements the IDispatch interface GetIDsOfNames method. For components that support interfaces, GetIDsOfNames calls this method for the interface supported by the component, passing the specified parameters. The returned value can be used on subsequent calls to the Invoke method. + + + + + + + + + + + + + + +Provides access to Automation properties and methods when the component wraps an Automation object. +Invoke is the standard mechanism for accessing the exposed properties and methods of an Automation object. For components that wrap the IDispatch interface of an Automation object, Invoke calls the Invoke method for the interface supported by the component, passing it the parameters specified by the function. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + nil + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + +Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + + + + + +Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + + + + + + +Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. The result type corresponds to a TObject class type. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + + + + + + +Destroys all owned components. +DestroyComponents iterates through the components owned by the component, removing each from the list of owned components and destroying it. +It is not necessary to call DestroyComponents directly. DestroyComponents is automatically called when the component is destroyed. + + + +Indicates that the component and its owned components are about to be destroyed. +Destroying sets the csDestroying flag in the ComponentState property. It then calls the Destroying method for each owned component so that its csDestroying flag is also set. If csDestroying is already set, Destroying does nothing. +It is not necessary to call Destroying directly. Destroying is automatically called when the component is destroyed. + + + + + + + +Executes an action. +ExecuteAction executes an action for the component. Action is a TBasicAction or any descendant of TBasicAction. +ExecuteAction first checks whether the provided action is compatible with the component and then executes the action. The return value is a Boolean. A value of True is returned if the action was executed; otherwise, False is returned. +Derived classes can override this method to implement a distinct way of handling actions. + + + + + + + +Indicates whether a given component is owned by the component. +FindComponent returns the component in the Components property array with the name that matches the string in the AName parameter. Use FindComponent to determine whether a given component is owned by another. +Component name matches are not case sensitive. + + + + + + +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + + + + +Disables the destruction notification that was enabled by FreeNotification. +RemoveFreeNotification removes the component specified by the AComponent parameter from the internal list of objects to be notified that the component is about to be destroyed. AComponent is added to this list by a previous call to the FreeNotification method. +Most applications have no need to call RemoveFreeNotification. It is used by TComponent to detect loops where two components are notifying each other of their impending destruction. + + + +Frees the interface reference for components that were created from COM classes. +FreeOnRelease is called when an interface implemented by the component is released. FreeOnRelease is used internally and calls the corresponding interface method. It should not be necessary to call FreeOnRelease directly. + + + + + + +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + + + + +Returns a string used by the Object Inspector. +GetNamePath is used to determine the text to display in the Object Inspector for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. TComponent overrides GetNamePath to return the component's name. Do not call GetNamePath directly. + + + + + + +Verifies whether the component has a parent. +Call HasParent to determine whether a specific component has a parent. +Derived classes override this method to implement proper handling for parenting. +Use GetParentComponent to retrieve the component reference. + + + + + + +Establishes the component as the owner of a specified component. +InsertComponent adds the component passed in the AComponent parameter to the end of the Components array property. The inserted component must have no name (no specified Name property value), or the name must be unique among all others in the Components list. +When the owning component is destroyed, AComponent is also destroyed. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use InsertComponent when manually adding components to another Owner component's Components list. + + + + + + +Removes a specified component specified from the component's Components list. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use RemoveComponent to programmatically delete the component specified by AComponent from its Owner component. + + + + + + +Identifies whether the component is a subcomponent. +Call SetSubComponent to indicate whether this component is a subcomponent. A subcomponent is a component whose Owner is a component other than the form or data module in which it resides. Unless such a component calls SetSubComponent with IsSubComponent set to True, its published properties will not be saved to the form file. +IsSubComponent indicates whether the component is a subcomponent (True) or not (False). +SetSubComponent is called at design time: + +Either from the constructor of a component that always acts as a subcomponent. In this case, the component calls its own SetSubComponent method from the constructor with IsSubComponent set to True. +Or immediately after constructing an instance of the subcomponent. In this case, the Owner calls the SetSubComponent method of a component it has just instantiated, with IsSubComponent set to True. + + + + + + + +Handles exceptions in methods declared using the safecall calling convention. +SafeCallException handles exceptions in methods that use the safecall calling convention. Some classes that implement interfaces override this method to handle errors that might occur. TComponent calls the implementation of this method for the interface supported by the component, if it exists. If the component does not support interfaces, this method calls the SafeCallException method inherited from TObject, which returns E_UNEXPECTED. This is a default return value that is appropriate for classes that do not support any interfaces. + + + + + + + +Updates the state of an action. +UpdateAction is used to update the state of an action. Action is a TBasicAction or any descendant. +UpdateAction first checks whether the provided action is compatible with the component and then updates it. The return value is a Boolean. A value of True is returned if the action was updated, and a value of False, otherwise. +Derived classes can override this method to implement a distinct way of handling action updates. + + + + + + + +Indicates whether the component implements a specified interface. +Call IsImplementorOf to determine whether the component (or, if the component aggregates its interface with other components, whether the controlling component) supports the interface specified by I. IsImplementorOf is similar to the QueryInterface method, but it can handle a request for a nil (Delphi) or NULL (C++) interface, and it does not return an interface pointer. +The streaming system that loads and saves components uses IsImplementorOf to resolve property values that are interfaces. + + + + + + + + +Establishes or removes internal links that cause this component to be notified when the implementer of a specified interface is destroyed. +Component writers use ReferenceInterface to ensure that properties whose values are interfaces are informed when the objects that implement those interfaces are destroyed. This notification must be in place for a property whose value is an interface to be saved with the component in a form file (that is, for such a property to persist as a published property). +I is an interface pointer that is the value of the published property of interest. +Operation indicates whether the notification link to the implementer of the interface should be established (opInsert) or removed (opRemove). +ReferenceInterface returns True if it is successful in establishing or removing the notification link. If ReferenceInterface returns False when called with Operation set to opInsert, the specified interface cannot be stored as the value of a published property. + +Note: A result of False does not necessarily indicate an error, merely that the interface cannot be stored by the property streaming system. For example, ReferenceInterface returns False when the specified interface employs true reference counting, independent of component lifetimes. + +Specifies the interface reference implemented by the component. +Use ComObject to assign a COM interface implemented by a component to an interface reference. This property is used by components that support COM interfaces. +If the component is not a wrapper for a COM component, trying to read ComObject causes TComponent to raise an EComponentError exception. + + + +Indicates the number of components owned by the component. +Use the ComponentCount property to determine the number of components owned by a component, for example, when iterating through the components list to perform an action on all owned components. The ComponentCount property equals the number of items in the components list. This value is one more than the highest Components index, because the first components index is 0. + + +Indicates the position of the component in its owner's Components property array. +Use ComponentIndex when iterating through the Components list of the component's owner to perform an action on owned components. It can be used in conjunction with ComponentCount. ComponentIndex is used internally for iterative assignment procedures. + +Note: The first component in the list has a ComponentIndex value of 0, the second has a value of 1, and so on. Therefore, when using ComponentIndex with ComponentCount, note that ComponentCount is always 1 more than the highest Components index. + +Describes the current state of the component, indicating when a component needs to avoid certain actions. +ComponentState is a set of constants defined in the TComponentState type. +Components use the ComponentState property to detect states in which certain kinds of actions are allowed or disallowed. For example, if a component needs to avoid certain behaviors at design time that it performs at run time, it can check for the csDesigning flag. +ComponentState is read-only and its flags are set automatically when appropriate. + + +Governs the behavior of the component. +ComponentStyle governs how the component interacts with the streaming system and the Object Inspector. ComponentStyle is a read-only property. Typically, the value of the various component style flags are part of a component definition, specified in a component constructor. The one exception to this is the csSubComponent style, which can be set by calling the SetSubComponent method. + + +Contains information used by the Form designer. +DesignInfo is used internally. Do not use this property in applications. + + +Indicates the component that is responsible for streaming and freeing this component. +Use Owner to find the owner of a component. The Owner of a component is responsible for two things: +The memory for the owned component is freed when its owner's memory is freed. This means that when a form is destroyed, all the components on the form are also destroyed. +The Owner is responsible for loading and saving the published properties of its owned controls. +By default, a form owns all components that are on it. In turn, the form is owned by the application. Thus, when the application shuts down and its memory is freed, the memory for all forms (and all their owned components) is also freed. When a form is loaded into memory, it loads all of the components that are on it. +The owner of a component is determined by the parameter passed to the constructor when the component is created. For components created in the form designer, the form is automatically assigned as the Owner. + +Warning: If a component has an Owner other than a form or data module, it will not be saved or loaded with its Owner unless you identify it as a subcomponent. To identify a component as a subcomponent, call the SetSubComponent method. + +Represents information used internally by components that support COM. +VCLComObject is for internal use only. + + +Indicates the TObservers object added to the TComponent. +Observers is a read-only property that returns the TObservers added to the TComponent, in order to use the notifications provided by the observers either with LiveBindings or for the developers' own purposes. + + +Specifies the name of the component as referenced in code. +Use Name to change the name of a component to reflect its purpose in the current application. By default, the IDE assigns sequential names based on the type of the component, such as 'Button1', 'Button2', and so on. +Use Name to refer to the component in code. + +Warning: Changing Name at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + +Stores a NativeInt integral value as a part of a component. +Tag has no predefined meaning. The Tag property can store any additional integer value for the convenience of developers. Often, Tag stores a pointer. A Tag value can be typecast to the appropriate pointer type. Notice that on 64-bit platforms, all pointer types are 8 bytes in size, while on 32-bit platforms, pointer types are 4 bytes. These pointer sizes correspond to sizes of NativeInt integral values on 64-bit and 32-bit platforms. + + + + + +TComponent is the common ancestor of all component classes. +TComponent is the base class for all components. Components are persistent objects that have the following capabilities: + +IDE integration. The ability to appear on an IDE palette and be manipulated in a Form Designer. +Ownership. The ability to manage other components. If component A owns component B, then A is responsible for destroying B when A is destroyed. +Streaming and filing. Enhancements of the persistence features inherited from TPersistent. +COM support. Components can be converted into ActiveX controls or other COM objects using wizards provided with Windows products. Components can serve as wrappers for COM objects. +Note: COM features are present in all implementations of TComponent, including those provided for compatibility with OS X. However, COM features are Windows only and cannot be used in multi-device (cross-platform) applications. +TComponent does not provide any user interface or display features. These features are provided by two classes that directly descend from TComponent: + +TControl, in the FMX.Types unit, is the base class for visual components in applications built with the FireMonkey (FMX) framework. +TControl, in the Vcl.Controls unit, is the base class for visual components in Windows-only (VCL) applications. +Note: Only the FMX.Types unit and other FireMonkey-specific units can be used with OS X applications. That is, you cannot use VCL units in multi-device applications. +Components that can be visible at run time are sometimes called visual components. Other components, which are never visible at run time, are sometimes called non-visual components. However it is more common to refer to visual components as controls and non-visual components simply as components. +Do not create instances of TComponent. Use TComponent as a base class when declaring non-visual components that can appear on the component palette and be used in the Form Designer. Properties and methods of TComponent provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Generates an OnChange event. +Change is called automatically when the action's properties change. This method calls the OnChange event handler, if one is assigned. + + + + + + +Assigns an OnExecute event handler for the action and for all clients. +SetOnExecute is the property write method for the OnExecute event. +In addition to assigning the specified Value event handler to the OnExecute event, SetOnExecute propagates the assignment of this event handler to all clients linked to the action and generates an OnChange event. + + +Occurs when one of the action's properties changes. +Applications cannot use the protected OnChange event. It is used internally to manage the relationship between the properties of the action and the corresponding properties of the action's clients. +Component writers can use OnChange in descendent objects to respond when the action's properties change. + + + + + + + +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + +Stores the number of elements in the Clients list of action links associated with the action. + + + + + + + +Associates the action with an action link. +RegisterChanges is called when the action and action link are connected, for example, when a new action link is set to an action. Value is the action link with which the action associates itself. The link is added to the action's client list. + + + + + + +Breaks the association between the action and the action link. +UnRegisterChanges is called when the action and the action link should no longer be associated. UnRegisterChanges is called, for example, in the action destructor or when the action link is unassociated from the action. Value is the action link with which the association is broken. + + + + + + +Instantiates and initializes a TBasicAction object. +Applications do not need to instantiate TBasicAction directly. Actions are created automatically when you choose New Action in the Action List editor. +If you want to create an action at run time, you should call the Create constructor of a FireMonkey action (FMX.ActnList.TAction) or VCL action (Vcl.ActnList.TAction), or any of their subclasses. The Create constructors assign a TActionList component to the ActionList property of the created action. +Create calls the inherited constructor and then creates a list of clients of the created action. + + + + + +Disposes of an instance of a TBasicAction object. +You do not need to call the destructor for an action. An action is a component and is automatically destroyed by its owner, which was passed to the constructor when it is created. If you must destroy an action manually, call Free instead, which safely invokes the destructor. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + + + + +Introduces an interface for a method of notifying a client when the action updates itself. +UpdateTarget does nothing in TBasicAction. UpdateTarget was introduced in TBasicAction so that descendants can override it to correspondingly update a target when the action updates. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + + +Generates an OnExecute event. +Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called, False otherwise. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + +Stores the client component that caused this action to execute. +Use ActionComponent to discern which client component caused this action to execute. For example, examine ActionComponent from an OnExecute event handler if you need to know what user action triggered this action. +When the user clicks a client control, that client sets ActionComponent before calling the action's Execute method. After the action executes, the action resets ActionComponent to nil (Delphi) or NULL (C++). + + +Occurs when the execute event, of a client linked to the action, fires. +Write an OnExecute event handler when you want to respond when the user triggers the client object's default event (typically an OnClick event). +For most target clients, OnExecute is associated with the OnClick event. The Click method triggers the associated Action if EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute). +OnExecute is called in the Execute method. +OnExecute also occurs when the user types the shortcut (or one of the secondary shortcuts) associated with the action or its client. + +Warning: If you assign an OnExecute event handler to a predefined action, the default behavior of that action will not occur. + +Occurs when the application is idle or when the action list updates. +Write an OnUpdate event handler to execute centralized code while an application is idle. For example, actions may want to update enabling and disabling, or checking and unchecking of client targets. + + + +TBasicAction is the ancestor class for all action objects. +TBasicAction introduces the fundamental behavior for an action. Descendants of TBasicAction add functionality for containment in an action list, for being categorized, and for specializing their behavior tailored to particular clients such as controls or menu items. Use TBasicAction if you want to create an action for an object that is neither a menu item nor a control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + axrComponentOnly + + + + + axrIncludeDescendants + + + + + + + + + + + + + + + + + + + + + + + + + sofUnknown + + + + + sofBinary + + + + + sofText + + + + + sofUTF8Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + False + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1000 + + + + + + + + + + False + + + + + + + + + + + + $1000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + $1000 + + + + + + + + + + + + + + + + + + + + + + False + + + + + $1000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DefaultUsrPw + + + + + DefaultUsrPwDm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cnAdding + + + + + cnAdded + + + + + cnExtracting + + + + + cnExtracted + + + + + cnDeleting + + + + + cnRemoved + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + nil + + + + + + + + NEXTGEN + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/System.Types.xml b/Modules/DelphiFMX/doc/System.Types.xml new file mode 100644 index 00000000..33ad715a --- /dev/null +++ b/Modules/DelphiFMX/doc/System.Types.xml @@ -0,0 +1,3859 @@ + + + CPUX86 + + + + Big + + + + + Little + + + + + + + + + + + + + + + + + + + + + Little + + + + + dupIgnore + + + + + dupAccept + + + + + dupError + + + + + FromBeginning + + + + + FromEnd + + + + + + + + + + + + + + +Specifies the width of an object. Typically, the implied units of measurement are pixels. + + + + +Specifies the height of an object. Typically, the implied units of measurement are pixels. + + + + + + + + +Creates a TSize object. +Use Create to construct and initialize a new TSize object. +To create a nonempty TSize object, send a TSize object, or a width and a height, through the constructor parameters. + + + + + + + + + +Creates a TSize object. +Use Create to construct and initialize a new TSize object. +To create a nonempty TSize object, send a TSize object, or a width and a height, through the constructor parameters. + + + + + + + + + + +Tests whether two TSize records are equal, by comparing their cx and cy values. +It returns the Boolean value True if their cx properties are equal and their cy properties are equal. Otherwise, it returns False. + + + + + + + + +Tests whether two TSize objects are unequal, by comparing their cx and cy values. +It returns the Boolean value True if at least one of their cx or cy properties are unequal. Otherwise, it returns False. + + + + + + + + +Calculates the sum between two TSize objects. +Use operator Addition to add the width and height of one TSize object to the width and height of another TSize object. + + + + + + + + +Calculates the difference between two TSize objects. +The cx property of the result is the difference between the cx value of the first TSize and the value of cx of the second TSize. +The cy property of the result is the difference between the cy value of the first TSize and the value of cy of the second TSize. + + + + + + + +Calculates the sum between two TSize objects. +Use Add to add the width and height of one TSize object to the width and height of another TSize object. + + + + + + + +Calculates the euclidean difference between two TSize objects. + + + + + + +Tests whether the width and the height of the TSize object are zero. +IsZero returns the Boolean value True if both the width and the height of the TSize object are zero. Otherwise, it returns False. + + + + + + + +Calculates the difference between two TSize objects. +The cx property of the result is the difference between the cx value of the first TSize and the value of cx of the second TSize. +The cy property of the result is the difference between the cy value of the first TSize and the value of cy of the second TSize. + + +Specifies the width of the TSize object. + + +Specifies the height of the TSize object. + + +Specifies the width and height of an object. +TSize specifies the size of an object. The object can be a rectangle, a form, a button, and so on. Typically, the implied units of measurement are pixels. +cx is the width. +cy is the height. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies the horizontal coordinate of the TPoint object. +The type of TPoint.X is FixedInt. + + +Specifies the vertical coordinate of the TPoint object. +The type of TPoint.Y is FixedInt. + + + + + + +Creates a TPoint object. +Use Create to construct and initialize a new TPoint object. X and Y specify the horizontal and vertical Integer coordinates of the point, respectively. + + + + + + + +Creates a TPoint object. +Use Create to construct and initialize a new TPoint object. X and Y specify the horizontal and vertical Integer coordinates of the point, respectively. + + + + + + + + +Tests whether two TPoint objects are equal. +operator Equality tests whether two TPoint records are equal, by comparing their X and Y values. It returns the Boolean value True if their X properties are equal and their Y properties are equal. Otherwise, it returns False. + + + + + + + + +Tests whether two points are not equal. +operator Inequality tests whether two points are unequal by comparing their X and Y values. It returns the Boolean value True if at least one of their coordinates is different. Otherwise, it returns False. + + + + + + + + +Calculates the sum between two points. +Call Addition to calculate the sum between two points. The X property of the result is the sum between the X value of the first TPoint object and the value of X of the second TPoint object. The Y property of the result is the sum between the Y value of the first TPoint object and the value of Y of the second TPoint object. + + + + + + + + +Calculates the difference between two TPoint objects. +The X property of the result is the difference between the X value of the first TPoint and the value of X of the second TPoint. The Y property of the result is the difference between the Y value of the first TPoint and the value of Y of the second TPoint. + + + + + + + +Returns a TPoint object. +operator Implicit returns a TPoint object with the same coordinates as the TSmallPoint object received as parameter. It converts a TSmallPoint to a TPoint and the conversion is implicit. + + + + + + + +Returns a TSmallPoint object. +operator Explicit returns a TSmallPoint object, with the same coordinates as the TPoint object received as parameter. It converts the coordinates to TSmallPoint values and the conversion must be explicit. + + + + + + + + + +Tests whether the point is on or inside a circle. +PointInCircle returns the Boolean value True if the point is on or inside the circle. Otherwise, it returns False. + + + +Point where the values of X and Y are all 0. + + + + + + + + + + + +Calculates the distance between the current TPoint object and the point specified by the P2 parameter. +The Distance function calculates the length of the segment between the current TPoint point and the point specified by the P2 parameter. It calculates the euclidean distance between two points. + + + + + + + +Sets the location of a TPoint object. +Use SetLocation to set the location of a point at specified coordinates or at a specified TPoint location. + + + + + + +Sets the location of a TPoint object. +Use SetLocation to set the location of a point at specified coordinates or at a specified TPoint location. + + + + + + + +Increments the values of X and Y. +Offset changes the location of the point by incrementing its X and Y values. + + + + + + +Increments the values of X and Y. +Offset changes the location of the point by incrementing its X and Y values. + + + + + + + +Calculates the sum between two points. +Call the Add function to obtain the sum of two points. The X property of the result is the sum between the X value of the first TPoint object and the value of X of the second TPoint object. The Y property of the result is the sum between the Y value of the first TPoint object and the value of Y of the second TPoint object. + + + + + + + +Calculates the difference between two TPoint objects. +The X property of the result is the difference between the X value of the first TPoint and the value of X of the second TPoint. The Y property of the result is the difference between the Y value of the first TPoint and the value of Y of the second TPoint. + + + + + + +Tests whether the point is zero. +IsZero returns the Boolean value True if the point is zero. Otherwise, it returns False. +A point is zero if its X and Y properties are equal to zero. + + + + + + + +Calculates the angle in radians between the positive X-axis of a plane and the point given by the coordinates (X, Y) on the plane. +Angle is equivalent to Arctan2(Y, X). The angle is positive for counter-clockwise angles (upper half-plane, Y > 0), and negative for clockwise angles (lower half-plane, Y < 0). +Arctan2(0, 0) is 0, because normally Arctan2(0, 0) is undefined. + + +Defines a pixel location on-screen. +The TPoint type defines the integer type X and Y coordinates of +a pixel location on-screen, with the origin in the upper-left corner. X and Y specify the horizontal and vertical coordinates of a point, respectively. +The type of X and Y is FixedInt. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zero point having values of (0, 0). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + srLeft + + + + + srRight + + + + + srTop + + + + + srBottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates a TRect rectangle. +Use Create to construct and initialize a new TRect rectangle having Integer coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPoint type point. +P2 represents the lower-right corner of the rectangle as the TPoint type point. +Top, Bottom, Right, and Left are Integer vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Integer width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRect type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPoint) creates an empty rectangle at the given Origin. + + + + + + + +Creates a TRect rectangle. +Use Create to construct and initialize a new TRect rectangle having Integer coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPoint type point. +P2 represents the lower-right corner of the rectangle as the TPoint type point. +Top, Bottom, Right, and Left are Integer vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Integer width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRect type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPoint) creates an empty rectangle at the given Origin. + + + + + + + + +Creates a TRect rectangle. +Use Create to construct and initialize a new TRect rectangle having Integer coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPoint type point. +P2 represents the lower-right corner of the rectangle as the TPoint type point. +Top, Bottom, Right, and Left are Integer vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Integer width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRect type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPoint) creates an empty rectangle at the given Origin. + + + + + + + False + + + + +Creates a TRect rectangle. +Use Create to construct and initialize a new TRect rectangle having Integer coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPoint type point. +P2 represents the lower-right corner of the rectangle as the TPoint type point. +Top, Bottom, Right, and Left are Integer vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Integer width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRect type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPoint) creates an empty rectangle at the given Origin. + + + + + + False + + + + +Creates a TRect rectangle. +Use Create to construct and initialize a new TRect rectangle having Integer coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPoint type point. +P2 represents the lower-right corner of the rectangle as the TPoint type point. +Top, Bottom, Right, and Left are Integer vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Integer width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRect type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPoint) creates an empty rectangle at the given Origin. + + + + + + + +Tests whether two rectangles are equal. +Operator Equality returns the Boolean value True if the two rectangles are equal. Otherwise, it returns False. + + + + + + + + +Tests whether two rectangles are unequal. +Operator Inequality returns the Boolean value True if the two rectangles are not equal. Otherwise, it returns False. + + + + + + + + +Calculates the Union of two rectangles. +Operator Addition calculates the Union of two rectangles and returns a TRect object. + + + + + + + + +Calculates the intersection of two rectangles. +Operator Multiply calculates the Intersection of two rectangles and returns a TRect object, which is the area the two rectangles have in common. + + + + + + +Creates an empty TRect object. +Empty creates an empty TRect object, with the upper-left corner and the lower-right corner both in the point (0, 0). + + + +Normalizes the TRect object. +Use the NormalizeRect method to normalize a TRect object. + +Note: A normalized TRect object is a rectangle with Top < Bottom or Left < Right. +Note: Several methods of TRect (Height, Width, IsEmpty, PtInRect, and so on) assume normalized TRect objects, so use NormalizeRect if Top > Bottom or Left > Right. + + + + + +Tests whether the rectangle is empty. +IsEmpty returns the Boolean value True if the rectangle is empty. Otherwise, it returns False. + + Note: Before calling IsEmpty, make sure the rectangle is normalized. + + + + + + +Tests whether a point or a rectangle is located within the rectangle. +Contains returns True if the received parameter is located within the rectangle. +A point located on the Top or Left side of the rectangle is considered to be within the rectangle, while one located on the Right or Bottom side is considered to be outside of the rectangle. + + + + + + + +Tests whether a point or a rectangle is located within the rectangle. +Contains returns True if the received parameter is located within the rectangle. +A point located on the Top or Left side of the rectangle is considered to be within the rectangle, while one located on the Right or Bottom side is considered to be outside of the rectangle. + + + + + + + +Tests whether two rectangles intersect. +IntersectsWith returns the Boolean value True if two rectangles intersect. Otherwise, it returns False. + + + + + + + + +Calculates the intersection between two rectangles. +Intersect calculates the intersection between two rectangles and returns a TRect object, which is the area the two rectangles have in common. + + + + + + +Calculates the intersection between two rectangles. +Intersect calculates the intersection between two rectangles and returns a TRect object, which is the area the two rectangles have in common. + + + + + + + + +Calculates the union between two rectangles. +Union returns a TRect object that represents the union between two rectangles. + + + + + + +Calculates the union between two rectangles. +Union returns a TRect object that represents the union between two rectangles. + + + + + + + + + + + +Calculates the union between two rectangles. +Union returns a TRect object that represents the union between two rectangles. + + + + + + + +Adds horizontal and vertical specified offsets. +Offset does the following: + +Adds the DX offset to the Left and Right properties. +Adds the DY offset to the Top and Bottom properties. + + + + + +Adds horizontal and vertical specified offsets. +Offset does the following: + +Adds the DX offset to the Left and Right properties. +Adds the DY offset to the Top and Bottom properties. + + + + + + +Sets the location of a rectangle. +SetLocation sets the location of a rectangle to the (X, Y) or Point locations received as parameters. The location of the rectangle is represented by its upper-left corner. + + + + + + +Sets the location of a rectangle. +SetLocation sets the location of a rectangle to the (X, Y) or Point locations received as parameters. The location of the rectangle is represented by its upper-left corner. + + + + + + + +Inflates the dimensions of the rectangle. +Inflate increases the rectangle's dimensions by adding specified values to Right and Bottom, and dropping specified values from Top and Left. +DX and DY are horizontal and vertical offsets, respectively. +The values of the rectangle's properties (Right, Bottom, Top, Left) can be modified by using the DR, DB, DT, DL parameters, respectively. + + + + + + + + + +Inflates the dimensions of the rectangle. +Inflate increases the rectangle's dimensions by adding specified values to Right and Bottom, and dropping specified values from Top and Left. +DX and DY are horizontal and vertical offsets, respectively. +The values of the rectangle's properties (Right, Bottom, Top, Left) can be modified by using the DR, DB, DT, DL parameters, respectively. + + + + + + +Returns the center point of the rectangle. + + + + + + + + +Returns a rectangle obtained from the current rectangle, applying the specified splitting rule. +SplitRect returns a rectangle obtained from the current rectangle by deleting of the specified by Size or Percent part of the current rectangle from the side specified by SplitType. +If a value of Size or Percent is negative, then SplitRect adds the specified by Size or Percent part of the current rectangle to the side specified by SplitType. +SplitType specifies which rectangle side (Left, Right, Top or Bottom) is moved when resizing a rectangle. For example, if srLeft is specified, then the left margin of the current rectangle is moved. +Percent defines the part of the current rectangle to be deleted or added. That is, SplitRect moves the SplitType side onto the specified Percent. 0 corresponds to zero percent. 1 corresponds to 100% percent. If Percent is positive, then the SplitType side is moved in the direction inside the current rectangle. Otherwise, the SplitType side is moved in the direction outside of the current rectangle. +Size or defines the absolute size of the width or height of the part of the current rectangle to be deleted or added. That is, SplitRect moves the SplitType side onto the specified Size distance. + + + + + + + + +Returns a rectangle obtained from the current rectangle, applying the specified splitting rule. +SplitRect returns a rectangle obtained from the current rectangle by deleting of the specified by Size or Percent part of the current rectangle from the side specified by SplitType. +If a value of Size or Percent is negative, then SplitRect adds the specified by Size or Percent part of the current rectangle to the side specified by SplitType. +SplitType specifies which rectangle side (Left, Right, Top or Bottom) is moved when resizing a rectangle. For example, if srLeft is specified, then the left margin of the current rectangle is moved. +Percent defines the part of the current rectangle to be deleted or added. That is, SplitRect moves the SplitType side onto the specified Percent. 0 corresponds to zero percent. 1 corresponds to 100% percent. If Percent is positive, then the SplitType side is moved in the direction inside the current rectangle. Otherwise, the SplitType side is moved in the direction outside of the current rectangle. +Size or defines the absolute size of the width or height of the part of the current rectangle to be deleted or added. That is, SplitRect moves the SplitType side onto the specified Size distance. + + +Returns the width of the rectangle. + + Note: Before calling Width, make sure the rectangle is normalized. + +Returns the height of the rectangle. + + Note: Before calling Height, make sure the rectangle is normalized. + +Returns the size of the rectangle. +Size returns the rectangle's width and height. + + +Returns the X and Y coordinates of the upper-left corner point. + + +Represents the horizontal coordinate of the upper-left corner point of the rectangle. + + +Represents the vertical coordinate of the upper-left corner point of the rectangle. + + +Represents the horizontal coordinate of the lower-right corner point of the rectangle. + + +Represents the vertical coordinate of the lower-right corner point of the rectangle. + + +Returns the upper-left corner point of the rectangle. +TopLeft returns the upper-left corner point of the TRect object. + + +Returns the lower-right corner point of the rectangle. +BottomRight returns the lower-right corner point of the TRect object. + + +TRect defines a rectangle. +TRect represents the dimensions of a rectangle. The coordinates are specified as either four separate integers representing the left, top, right, and bottom sides, or as two points representing the locations of the upper-left and lower-right corners. +Typically, TRect values represent pixel locations, where the origin of the pixel coordinate system is in the upper-left corner of the screen (screen coordinates) or the upper-left corner of a control's client area (client coordinates). When a TRect value represents a rectangle on the screen, by convention the top and left edges are considered inside the rectangle and the bottom and right edges are considered outside the rectangle. This convention allows the width of the rectangle to be Right - Left and the height to be Bottom - Top. + + + + + + + + + + + + + +Creates and returns a TPointF object. +Use Create to construct and initialize a new TPointF object: + +AX and AY specify the horizontal and vertical floating-point Single coordinates of the point, respectively. +APoint specifies the point coordinates using the TPointF type. + + + + + + +Creates and returns a TPointF object. +Use Create to construct and initialize a new TPointF object: + +AX and AY specify the horizontal and vertical floating-point Single coordinates of the point, respectively. +APoint specifies the point coordinates using the TPointF type. + + + + + + + +Calculates the sum between two points. +Call Addition to calculate the sum between two points. The X property of the result is the sum between the X value of the first TPointF object and the value of X of the second TPointF object. The Y property of the result is the sum between the Y value of the first TPointF object and the value of Y of the second TPointF object. + + + + + + + + +Calculates the difference between two TPointF objects. +The X property of the result is the difference between the X value of the first TPointF and the value of X of the second TPointF. The Y property of the result is the difference between the Y value of the first TPointF and the value of Y of the second TPointF. + + + + + + + + +Tests whether two TPointF objects are equal. +operator Equality tests whether two TPointF records are equal by comparing their X and Y values. It returns the Boolean value True if their X properties are equal and their Y properties are equal. Otherwise, it returns False. + + + + + + + + +Tests whether two points are not equal. +operator Inequality tests whether two points are unequal by comparing their X and Y values. It returns the Boolean value True if at least one of their coordinates is different. Otherwise, it returns False. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Tests whether the point is on or inside a circle. +PointInCircle returns the Boolean value True if the point is on or inside the circle. Otherwise, it returns False. + + + +Point where the values of X and Y are all 0. + + + + + + + + + + + +Calculates the distance between the current TPointF object and the point specified by the APoint parameter. +The Distance function calculates the length of the segment between the current TPointF point and the point specified by the APoint parameter. It calculates the euclidean distance between two points. + + + + + + + +Calculates the cross product of two points. +CrossProduct returns the value that results of calculating the cross product of two TPointF objects. + + + + + + + +Calculates the dot product of two points. +DotProduct returns the value that results of calculating the dot product of two TPointF objects. + + + + + + +Increments the values of X and Y. +Offset changes the location of the point by incrementing its X and Y values. + + + + + + + +Increments the values of X and Y. +Offset changes the location of the point by incrementing its X and Y values. + + + + + + +Increments the values of X and Y. +Offset changes the location of the point by incrementing its X and Y values. + + + + + + + + + + + + + + + + + + + + + + + + +Warning: Subtract is deprecated. Please use Offset. + + +Calculates the difference between two TPointF objects. +The X property of the result is the difference between the X value of the first TPointF and the value of X of the second TPointF. The Y property of the result is the difference between the Y value of the first TPointF and the value of Y of the second TPointF. + + + + + + + + +Warning: Subtract is deprecated. Please use Offset. + + +Calculates the difference between two TPointF objects. +The X property of the result is the difference between the X value of the first TPointF and the value of X of the second TPointF. The Y property of the result is the difference between the Y value of the first TPointF and the value of Y of the second TPointF. + + + + + + + + +Warning: Add is deprecated. Please use Offset. + + +Calculates the sum between two points. +Call the Add function to obtain the sum of two points. The X property of the result is the sum between the X value of the first TPointF object and the value of X of the second TPointF object. The Y property of the result is the sum between the Y value of the first TPointF object and the value of Y of the second TPointF object. + + + + + + + + +Warning: Add is deprecated. Please use Offset. + + +Calculates the sum between two points. +Call the Add function to obtain the sum of two points. The X property of the result is the sum between the X value of the first TPointF object and the value of X of the second TPointF object. The Y property of the result is the sum between the Y value of the first TPointF object and the value of Y of the second TPointF object. + + + + + + + + +Warning: Scale is deprecated. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + 0 + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Tests whether the point is zero. +IsZero returns the boolean value True if the point is zero. Otherwise, it returns False. +A point is zero if its X and Y properties are equal to zero. + + + + + + +Does superior rounding over the coordinates of the TPointF object. + + + + + + +Truncates the coordinates of the TPointF object. + + + + + + +Rounds the coordinates of the TPointF object. + + + +Rounds the current TPointF object to the specified scale value. For scale values less than 1, Scale is set to 1. + +AScale is the scale of scene. +APlaceBetweenPixels is set to True by default. When PlaceBetweenPixels is True, the resulting TPointF moves to half the scale. + SnapToPixel returns the current TPointF object after the transformation. + + + + + + True + + + + + + + + + + +Function to normalize the current TPointF object. +Normalizing a TPointF object involves two steps: + +Calculate the Length. +Divide each of the coordinates of the TPointF object by the Length. + Normalize returns the current TPointF object normalized. + + + + + + +Calculates the length of the hypotenuse from (0,0) to the (X,Y) coordinates of the TPointF object. +The magnitude of the hypotenuse is calculated with the square root of the sum of the squared coordinates. + + + + + + + +Function to rotate the current TPointF object with the provided angle. + +Angle: The angle provided to calculate the rotation, in radians. + Rotate returns the coordinates of the TPointF object after rotation. + + + + + + + +Calculates the reflection of the current TPointF object according to the line created with the APoint provided. + +APoint: The coordinates provided to calculate the reflection of the current TPointF object. + Reflect returns the coordinates of the TPointF object reflected according to the line created with the APoint provided. + + + + + + + +Calculates the halfway point of the segment created by the current TPointF object and the APoint provided. + +APoint: The point provided to calculate the midpoint of the segment created by the two points. + MidPoint returns the coordinates of the midpoint TPointF object that results of dividing the line segment into two equal parts. + + + + + + + +Calculates the angle cosine of the current TPointF object. + AngleCosine returns the value in radians of the angle cosine calculated. + + + + + + + +Calculates the angle in radians formed by the point and the APoint parameter relative to the X-Axis using an Arctan2 function. + + Result := Arctan2(Self.Y - APoint.Y, Self.X - APoint.X); + +Angle is equivalent to Arctan2(X, Y), which is the angle in radians between the positive X-axis of a plane and the point given by the coordinates (X, Y) on the plane. The angle is positive for counter-clockwise angles (upper half-plane, Y > 0), and negative for clockwise angles (lower half-plane, Y < 0). +Arctan2(0, 0) is 0, because normally Arctan2(0, 0) is undefined. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the horizontal coordinate of the TPoint object. +The type of X is Single. + + +Specifies the vertical coordinate of the TPoint object. +The type of Y is Single. + + +Defines a pixel location on-screen. +The TPointF type defines the floating-point X and Y coordinates of a pixel location on-screen, with the origin in the upper-left corner. X and Y specify the horizontal and vertical coordinates of a point, respectively. +The type of X and Y is Single. +The TPointF type is primarily used for the coordinates of FireMonkey objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zero point having values of (0, 0). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rounds the current point to the specified scale value + The scale of scene + If True (by default) the resulting point moves to half scale + + The current point after transformation + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies the height of an object. +cx specifies the height of an object such as a rectangle, a form, a button, and so on. Typically, the implied units of measurement are pixels. +The type of the cx field is Single. + + + + +Specifies the width of an object. +cy specifies the width of an object such as a rectangle, a form, a button, and so on. Typically, the implied units of measurement are pixels. +The type of the cy field is Single. + + + + + + + + +Creates a TSizeF object. +The type of the Width and Height properties is Single. +To create a nonempty TSizeF object, send a TSizeF object, or a width and a height, through the constructor parameters. + + + + + + + + + +Creates a TSizeF object. +The type of the Width and Height properties is Single. +To create a nonempty TSizeF object, send a TSizeF object, or a width and a height, through the constructor parameters. + + + + + + + + + + +Tests whether two TSizeF records are equal, by comparing their cx and cy values. +It returns the Boolean value True if their cx properties are equal and their cy properties are equal. Otherwise, it returns False. + + + + + + + + +Tests whether two TSizeF records are unequal, by comparing their cx and cy values. +It returns the Boolean value True if at least one of their cx or cy properties are unequal. Otherwise, it returns False. + + + + + + + + +Calculates the sum between two TSizeF objects. +Use operator Addition to add the width and height of one TSizeF object to the width and height of another TSizeF object. + + + + + + + + +Calculates the difference between two TSizeF objects. +The cx property of the result is the difference between the cx value of the first TSizeF object and the value of cx of the second TSizeF object. +The cy property of the result is the difference between the cy value of the first TSizeF object and the value of cy of the second TSizeF object. + + + + + + + +Returns a TSizeF object, with the same value as the parameter sent. +operator Implicit returns a TSizeF object, with the values of the Width and Height properties set on the values of the TSize, TSizeF or TPoint received as parameter. + + + + + + + +Returns a TSizeF object, with the same value as the parameter sent. +operator Implicit returns a TSizeF object, with the values of the Width and Height properties set on the values of the TSize, TSizeF or TPoint received as parameter. + + + + + + + +Returns a TSizeF object, with the same value as the parameter sent. +operator Implicit returns a TSizeF object, with the values of the Width and Height properties set on the values of the TSize, TSizeF or TPoint received as parameter. + + + + + + +Does superior rounding over the TSizeF object. +Call Ceiling to do a superior rounding over the values of the Width and Height properties of the TSizeF object. + + + + + + +Truncates the TSizeF object. +Call Truncate to truncate the values of the Width and Height properties of the TSizeF object. + + + + + + +Rounds the TSizeF object. +Call Round to round the values of the Width and Height properties of the TSizeF object. + + + + + + + +Calculates the sum between two TSizeF objects. +Use Add to add the width and height of one TSizeF object to the width and height of another TSizeF object. + + + + + + + +Calculates the difference between two TSizeF objects. +The cx property of the result is the difference between the cx value of the first TSizeF object and the value of cx of the second TSizeF object. +The cy property of the result is the difference between the cy value of the first TSizeF object and the value of cy of the second TSizeF object. + + + + + + + +Calculates the euclidean difference between two TSizeF objects. + + + + + + +Tests whether the width and the height of the TSizeF object are zero. +IsZero returns the Boolean value True if both the width and the height of the TSizeF object are zero. Otherwise, it returns False. + + + +Returns the height and width sizes swapped. + + + + + + + + +Specified the width of the TSizeF object. +The type of the Width property is Single. + + +Specifies the height of the TSizeF object. +The type of the Height property is Single. + + +Represents the floating-point width and height of an object. +TSizeF represents the floating-point size of an object using the Width and Height properties: + +Width is stored in the cx field. +Height is stored in the cy field. +The object can be a rectangle, a form, a button, and so on. Typically, the implied units of measurement are pixels. +The type of the Width and Height properties is Single. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates a TRectF rectangle having floating-point coordinates. +Use Create to construct and initialize a new TRectF rectangle object having Single coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPointF type point. +P2 represents the lower-right corner of the rectangle as the TPointF type point. +Top, Bottom, Right, and Left are Single vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Single width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRectF (or TRect) type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPointF) creates an empty rectangle at the given Origin. + + + + + + + +Creates a TRectF rectangle having floating-point coordinates. +Use Create to construct and initialize a new TRectF rectangle object having Single coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPointF type point. +P2 represents the lower-right corner of the rectangle as the TPointF type point. +Top, Bottom, Right, and Left are Single vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Single width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRectF (or TRect) type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPointF) creates an empty rectangle at the given Origin. + + + + + + + + +Creates a TRectF rectangle having floating-point coordinates. +Use Create to construct and initialize a new TRectF rectangle object having Single coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPointF type point. +P2 represents the lower-right corner of the rectangle as the TPointF type point. +Top, Bottom, Right, and Left are Single vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Single width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRectF (or TRect) type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPointF) creates an empty rectangle at the given Origin. + + + + + + + False + + + + +Creates a TRectF rectangle having floating-point coordinates. +Use Create to construct and initialize a new TRectF rectangle object having Single coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPointF type point. +P2 represents the lower-right corner of the rectangle as the TPointF type point. +Top, Bottom, Right, and Left are Single vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Single width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRectF (or TRect) type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPointF) creates an empty rectangle at the given Origin. + + + + + + False + + + + +Creates a TRectF rectangle having floating-point coordinates. +Use Create to construct and initialize a new TRectF rectangle object having Single coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPointF type point. +P2 represents the lower-right corner of the rectangle as the TPointF type point. +Top, Bottom, Right, and Left are Single vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Single width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRectF (or TRect) type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPointF) creates an empty rectangle at the given Origin. + + + + + + False + + + + +Creates a TRectF rectangle having floating-point coordinates. +Use Create to construct and initialize a new TRectF rectangle object having Single coordinates: + +Origin and P1 represent the upper-left corner of the rectangle as the TPointF type point. +P2 represents the lower-right corner of the rectangle as the TPointF type point. +Top, Bottom, Right, and Left are Single vertical or horizontal coordinates of the upper, lower, right, and left sides of the rectangle, respectively. +Width and Height are Single width and height of the rectangle, respectively. +R is the rectangle with coordinates specified using the TRectF (or TRect) type. +Normalize specifies to create a normalized rectangle. +Note: Create(const Origin: TPointF) creates an empty rectangle at the given Origin. + + + + + + + +Tests whether two rectangles are equal. +Operator Equality returns the Boolean value True if the two rectangles are equal. Otherwise, it returns False. + + + + + + + + +Tests whether two rectangles are unequal. +Operator Inequality returns the Boolean value True if the two rectangles are unequal. Otherwise, it returns False. + + + + + + + +Returns a TRectF object. +operator Implicit returns a TRectF object with the same coordinates as the TRect object received as parameter. It implicitly converts a TRect object with integer coordinates to a TRectF object with coordinates in floating points. + + + + + + + +Returns a TRect object. +operator Explicit returns a TRect object with the same coordinates as the TRectF object received as parameter. It rounds the TRectF object with single coordinates to a TRect object with integer coordinates. + + + + + + + + +Calculates the Union of two rectangles and returns a TRectF object. + + + + + + + + +Calculates the intersection of two rectangles. +Operator Multiply calculates the Intersection of two rectangles and returns a TRectF object, which is the area the two rectangles have in common. + + + + + + +Creates an empty TRectF object. +Empty creates an empty TRectF object, with the upper-left corner and the lower-right corner both in the point (0, 0). + + + + + + + +Scales down, if needed, the current rectangle to fit into BoundsRect and centers the scaled rectangle in BoundsRect. Returns the implemented scaling ratio. +Fit implements the following functionality: + +If any dimension of the current rectangle is greater than the corresponding dimension of the BoundsRect rectangle, then Fit scales down the current rectangle (keeping current rectangle proportions the ratio between the width and height) to fit the current rectangle in the BoundsRect rectangle. That is, the whole scaled rectangle should be fitted in the specified BoundsRect rectangle. The current rectangle is placed centered in the BoundsRect rectangle and returns the implemented scaling ratio. + +If the current rectangle is smaller than the BoundsRect rectangle, then the current rectangle is not resized. Fit centers the current rectangle in the BoundsRect rectangle. Fit returns the maximum value between width_of_current_rectangle/width_of_BoundsRect and height_of_current_rectangle/height_of_BoundsRect. + +If any of the BoundsRect dimensions is zero, Fit centers the current rectangle in the BoundsRect rectangle and returns 1. + + + + + + + +Resizes the current rectangle, preserving the current rectangle proportions, to best fit in the ADesignatedArea rectangle, and returns the scaled rectangle centered in ADesignatedArea. +FitInto implements the following functionality: + +If any of the current rectangle dimensions is greater than the corresponding dimension of the ADesignatedArea rectangle, then FitInto scales down the current rectangle to fit into ADesignatedArea. The scaled rectangle is centered in the ADesignatedArea rectangle and the obtained scaled and centered rectangle is returned. +If both width and height of the current rectangle dimensions is smaller than the corresponding dimensions of the ADesignatedArea rectangle, then FitInto stretches the current rectangle to best fit into ADesignatedArea. The stretched rectangle is centered in the ADesignatedArea rectangle and the obtained stretched and centered rectangle is returned. +If any of the ADesignatedArea dimensions is zero then FitInto returns the current rectangle and sets Ratio equals to 1. +Ratio is the implemented scaling ratio. + + + + + + + +Resizes the current rectangle, preserving the current rectangle proportions, to best fit in the ADesignatedArea rectangle, and returns the scaled rectangle centered in ADesignatedArea. +FitInto implements the following functionality: + +If any of the current rectangle dimensions is greater than the corresponding dimension of the ADesignatedArea rectangle, then FitInto scales down the current rectangle to fit into ADesignatedArea. The scaled rectangle is centered in the ADesignatedArea rectangle and the obtained scaled and centered rectangle is returned. +If both width and height of the current rectangle dimensions is smaller than the corresponding dimensions of the ADesignatedArea rectangle, then FitInto stretches the current rectangle to best fit into ADesignatedArea. The stretched rectangle is centered in the ADesignatedArea rectangle and the obtained stretched and centered rectangle is returned. +If any of the ADesignatedArea dimensions is zero then FitInto returns the current rectangle and sets Ratio equals to 1. +Ratio is the implemented scaling ratio. + + + +Places the current TRectF object in the center of the designated area without scaling. + +ADesignatedArea: The coordinates of the rectangle that forms the area to center the current rectangle. + CenterAt returns the current rectangle placed in the center of the area provided. + + + + + + + + +If any dimension of the current rectangle is greater than the corresponding dimension of the ADesignatedArea rectangle, then the current rectangle is scaled down to best fit the ADesignatedArea rectangle. The obtained rectangle is aligned in ADesignatedArea. +PlaceInto implements the following behavior: + +If the width or height of the current rectangle is greater than the corresponding dimension of ADesignatedArea. Then PlaceInto scales down the current rectangle (preserving the current rectangle proportions the ratio between the width and height) to fit in the ADesignatedArea rectangle and centers the scaled rectangle in ADesignatedArea. Then PlaceInto aligns the obtained rectangle in the ADesignatedArea rectangle according to the specified AHorzAlign and AVertAlign. By default, PlaceInto centers the scaled rectangle in the ADesignatedArea rectangle. +Otherwise, PlaceInto just aligns the current rectangle in the ADesignatedArea rectangle according to the specified AHorzAlign and AVertAlign. By default, PlaceInto centers the scaled rectangle in the ADesignatedArea rectangle. +PlaceInto returns the current rectangle if any of the ADesignatedArea dimensions is zero. + + + + + Center + + + + + Center + + + + + + + +Rounds the location and size of the current rectangle to the specified AScale value. + +AScale is the scale of scene. +APlaceBetweenPixels is set to True by default. When PlaceBetweenPixels is True, the resulting TRectF moves to half the scale. + SnapToPixel returns the current TRectF object after the transformation. + + + + + + True + + + + + + + +Normalizes the TRectF object. +Use the NormalizeRect method to normalize a TRectF object. +A normalized TRectF object is a rectangle where the Top is less than the Bottom and the Left is less than the Right. +Several methods of TRectF (Height, Width, IsEmpty, PtInRect, and so on) assume normalized TRectF objects, so use NormalizeRect if the Top is greater than the Bottom or if the Left is greater than the Right. + + + + + + +Tests whether the rectangle is empty. +IsEmpty returns the Boolean value True if the rectangle is empty. Otherwise, it returns False. + + Note: Before calling IsEmpty, make sure the rectangle is normalized. + + + + + + +Tests whether a point or a rectangle is located within the rectangle. +Contains returns True if the received parameter is located within the rectangle. + + Note: A point located on the Top or Left side of the rectangle is considered to be within the rectangle, while one located on the Right or Bottom side is considered to be outside of the rectangle. + + + + + + +Tests whether a point or a rectangle is located within the rectangle. +Contains returns True if the received parameter is located within the rectangle. + + Note: A point located on the Top or Left side of the rectangle is considered to be within the rectangle, while one located on the Right or Bottom side is considered to be outside of the rectangle. + + + + + + +Tests whether two rectangles intersect. +IntersectsWith returns the Boolean value True if two rectangles intersect. Otherwise, it returns False. + + + + + + + + +Calculates the intersection between two rectangles. +Intersect calculates the intersection between two rectangles and returns a TRectF object, which is the area the two rectangles have in common. + + + + + + +Calculates the intersection between two rectangles. +Intersect calculates the intersection between two rectangles and returns a TRectF object, which is the area the two rectangles have in common. + + + + + + + + +Calculates the union between two rectangles. +Union returns a TRectF object that represents the union between two rectangles. + + + + + + +Calculates the union between two rectangles. +Union returns a TRectF object that represents the union between two rectangles. + + + + + + + + + + + +Calculates the union between two rectangles. +Union returns a TRectF object that represents the union between two rectangles. + + + + + + + +Adds horizontal and vertical specified offsets. +Offset does the following: + +Adds the DX offset to the Left and Right properties. +Adds the DY offset to the Top and Bottom properties. +In the second overload of the procedure, the offsets are represented by the coordinates of the point received as parameter. + + + + + + +Adds horizontal and vertical specified offsets. +Offset does the following: + +Adds the DX offset to the Left and Right properties. +Adds the DY offset to the Top and Bottom properties. +In the second overload of the procedure, the offsets are represented by the coordinates of the point received as parameter. + + + + + + + +Sets the location of a rectangle. +SetLocation sets the location of a rectangle to the (X, Y) or point locations received as parameters. The location of the rectangle is represented by its upper-left corner. + + + + + + +Sets the location of a rectangle. +SetLocation sets the location of a rectangle to the (X, Y) or point locations received as parameters. The location of the rectangle is represented by its upper-left corner. + + + + + + + +Inflates the dimensions of the rectangle. +Inflate increases the rectangle's dimensions by adding specified values to Right and Bottom, and dropping specified values from Top and Left. +DX and DY are horizontal and vertical offsets, respectively. +The values of the rectangle's properties (Right, Bottom, Top, Left) can be modified by using the DR, DB, DT, DL parameters, respectively. + + + + + + + + + +Inflates the dimensions of the rectangle. +Inflate increases the rectangle's dimensions by adding specified values to Right and Bottom, and dropping specified values from Top and Left. +DX and DY are horizontal and vertical offsets, respectively. +The values of the rectangle's properties (Right, Bottom, Top, Left) can be modified by using the DR, DB, DT, DL parameters, respectively. + + + + + + +Returns the center point of the rectangle. +CenterPoint returns the center point of the rectangle. + + + + + + +Does superior rounding over the TRectF object. +Call Ceiling to do a superior rounding over the values of the Location, Width, and Height properties of the TRectF object. + + + + + + +Truncates the TRectF object. +Call Truncate to truncate the values of the Location, Width, and Height properties of the TRectF object. + + + + + + +Rounds the TRectF object. +Call Round to round the values of the Location, Width, and Height properties of the TRectF object. + + + + + + + 0 + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Width property of TRectF. +When the Width value is changed, the Right value is modified, leaving the Left unchanged. + + Note: Before modifying the Width value, you must ensure that Left is a valid floating-point value and the rectangle is normalized. + +Height property of the TRectF. +When the Height value is changed, the Bottom value is modified, leaving the Top unchanged. + + Note: Before modifying the Height value, you must ensure that Top is a valid floating-point value and the rectangle is normalized. + +Keeps the floating-point TSizeF size of the rectangle. +Size keeps the Width and Height of the TRectF rectangle. + + +Returns the X and Y coordinates of the upper-left corner point. + + +Represents the horizontal coordinate of the upper-left corner point of the rectangle. + + +Represents the vertical coordinate of the upper-left corner point of the rectangle. + + +Represents the horizontal coordinate of the lower-right corner point of the rectangle. + + +Represents the vertical coordinate of the lower-right corner point of the rectangle. + + +Returns the upper-left corner point of the rectangle. +TopLeft returns the upper-left corner point of the TRectF object. + + +Returns the lower-right corner point of the rectangle. +BottomRight returns the lower-right corner point of the TRectF object. + + +TRectF defines a rectangle, with coordinates in floating points. +TRectF represents the location and dimensions of a rectangle. The coordinates are specified as either four separate Single coordinates representing the left, top, right, and bottom sides, or as two points representing the locations of the upper-left and lower-right corners. +Typically, TRectF values represent pixel locations, where the origin of the pixel coordinate system is in the upper-left corner of the screen (screen coordinates) or the upper-left corner of a control's client area (client coordinates). When a TRectF value represents a rectangle on the screen, by convention, the top and left edges are considered inside the rectangle and the bottom and right edges are considered outside the rectangle. This convention allows the width of the rectangle to be Right - Left and the height to be Bottom - Top. + + + + TBitConverter class implements converter of an array of bytes + into Delphi native data types and backward. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RangeCheckError is a helper used to raise a range check exception + if a conversion (From or Into) accesses memory outside the bounds of the + Byte array. + NOTE: Only used by C++; Delphi calls System.Error(reRangeError) directly. + + + + + UnsafeFrom method converts Value of T type into array of bytes B. + The value will be written into B at Offset offset. The method does not check + that value will fit into B at Offset. + + + + + + + $0 + + + + + + + From method converts Value of T type into array of bytes B. + The value will be written into B at Offset offset. The method checks that + value will fit into B at Offset. If not, then range check exception is raised. + + + + + + + $0 + + + + + + + UnsafeInTo method converts array of bytes B into value of T type. + The value will be read from B at Offset offset. The method does not check + that value fits into B at Offset. + + + + + + $0 + + + + + + + + InTo method converts array of bytes B into value of T type. + The value will be read from B at Offset offset. The method checks that + value fits into B at Offset. If not, then range check exception is raised. + + + + + + $0 + + + + + + + + + + + $A + + + + + $0 + + + + + $9 + + + + + $20 + + + + + $D + + + + + $A + + + + + $B + + + + + $C + + + + + $2028 + + + + + $2029 + + + + + $FEFF + + + + + $FFFE + + + + + + + + + + + + + + + + + + 0.5523 + + + + + 0.4477 + + + + + + + + $FFFFFFFF + + + + + $0 + + + + + $1 + + + + + wrSignaled + + + + + wrTimeout + + + + + wrAbandoned + + + + + wrError + + + + + wrIOCompletion + + + + + + + + + + + + + Abstract base class fully implemented in System.Classes and returned by IAsyncResult.GetAsyncWaitEvent. + This class allows for blocking with any number of these events using WaitForAll() and WaitForAny() + While this class can be implemented by creating a descendant, it is expected that the implementation + will be provided by System.Classes. Any attempt at creating an alternate implementation must adhere to + the "contracts" laid out in the abstract virtual methods. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class variable will be set by a single descendent. The expectation is that one and only one descedent + of this class exists. That one descendent provides the actual implementation. This class variable is + used by the static class function Create to construct an instance of that one class that implements the + needed functionality. + + + + + + + Abstract virtual class overridden in descendant classes to create the proper type for the instance. + + + + + + + Abstract base class fully implemented in System.Classes and returned by IAsyncResult.GetAsyncWaitEvent. + This class allows for blocking with any number of these events using WaitForAll() and WaitForAny() + While this class can be implemented by creating a descendant, it is expected that the implementation + will be provided by System.Classes. Any attempt at creating an alternate implementation must adhere to + the "contracts" laid out in the abstract virtual methods. + + + + + + + + + Since This unit doesn't cannot use System.SysUtls, this virtual allows descendants which do have access to + System.SysUtils to provide a means for this base ancestor class to raise exceptions when validating arguments. + + + + + + + Since This unit doesn't cannot use System.Classes, this virtual allows descendants which do have access to + System.Classes to provide a means for this base ancestor to call System.Classes.TThread.GetTickCount64. + + + + + + + + + + Overridden in descendents. This explicitly locks this specific instance. + + + + + + + Overridden in descendents. This explicitly unlocks this specific instance. + + + + + + + Overridden in descendents. This must atomically set the state of the event. + + + + + + + + + + Overridden in descendents. Notifies all current waiters this event is signaled. + + + + + + + Overridden in descendents. Clears the storage used for the waiters. + + + + + + + Overridden in descendents. Add a new waiter to the list of waiters. + + + + + + + + + + Overridden in descendents. Removed a waiter from the list of waiters. + + + + + + + + + + Overridden in descendents. Returns the current number of waiters in the list of waiters. + + + + + + + + + + Overridden in descendents. Returns the index'th waiter from the waiter list. + + + + + + + + + + + Current number of threads waiting on this event. + + + + + + + Array of PWaitInfo references which contain information about each waiting thread. + + + + + + + Rather than use a constructor which will create an instance of this class, this will + return an instance of the registered descendent type that provides the actual implementation. + + + + + + + Abstract base class fully implemented in System.Classes and returned by IAsyncResult.GetAsyncWaitEvent. + This class allows for blocking with any number of these events using WaitForAll() and WaitForAny() + While this class can be implemented by creating a descendant, it is expected that the implementation + will be provided by System.Classes. Any attempt at creating an alternate implementation must adhere to + the "contracts" laid out in the abstract virtual methods. + + + + + + + + + + + + Wait for this event instance to be signaled or Timeout is reached. + + + + + $FFFFFFFF + + + + + + + + Explicitly set the event as signaled. This procedure is typically called by the implementation of + a specific IAsyncResult. + + + + + + Explicitly reset the event as unsignaled. This procedure is rarely if ever called. If it is called, it + is called by the implementation of a specific IAsyncResult. + + + + + + Wait until all of the indicated TMultiWaitEvents are signaled or Timeout is reached + + + + + + + + + + $FFFFFFFF + + + + + + + + Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached + + + + + + + + + + $FFFFFFFF + + + + + + + + Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached. + Index out parameter is set to the index of the TMultiWaitEvent in the provided array which was signaled. + More than one event may be signaled; Index only indicates which one caused the function to return. Index is undefined if + Timeout was reached. + + + + + + + + + + + + $FFFFFFFF + + + + + + + + Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached. + Returns the TMultiWaitEvent instance which was signaled and caused the function to return. Event is + undefined if Timeout is reached. + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + Interface returned from various "BeginXXX" methods in order to provide asynchronous execution of code. + + + + + + Returns the user-specified context associated with this instance. + + + + + + + + + + Returns an event suitable for use to block until the asynchronous call is complete. This event is also suitable for + use in a list to allow waiting for all or any to be signaled. See the TMultiWaitEvent.WaitForXXX class + functions. + + + + + + + Abstract base class fully implemented in System.Classes and returned by IAsyncResult.GetAsyncWaitEvent. + This class allows for blocking with any number of these events using WaitForAll() and WaitForAny() + While this class can be implemented by creating a descendant, it is expected that the implementation + will be provided by System.Classes. Any attempt at creating an alternate implementation must adhere to + the "contracts" laid out in the abstract virtual methods. + + + + + + + + + Returns true if a given asynchronous call was able to be completed synchronously. In other words, the specific + call completed before returning. + + + + + + + + + + Returns True when the asynchronous call is finished. + + + + + + + + + + Returns True when the asynchronous call has been cancelled. + + + + + + + + + + Cancels the async operation. Returns True when the asynchronous call can be cancelled. + + + + + + + + + + The user-specified context associated with this instance. + + + + + + + Event suitable for use to block until the asynchronous call is complete. This event is also suitable for + use in a list to allow waiting for all or any to be signaled. See the TMultiWaitEvent.WaitForXXX class + functions. + + + + + + + Set to true if a given asynchronous call was able to be completed synchronously. In other words, the specific + call completed before returning. + + + + + + + Set to True when the asynchronous call is finished. + + + + + + + Set to True when the asynchronous call has been cancelled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/System.xml b/Modules/DelphiFMX/doc/System.xml new file mode 100644 index 00000000..f11c99e5 --- /dev/null +++ b/Modules/DelphiFMX/doc/System.xml @@ -0,0 +1,6501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + True + + + + + $7FFFFFFF + + + + + $7FFFFFFF + + + + + 35 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTERNALLINKER + PC_MAPPED_EXCEPTIONS + ARITH_PUREPASCAL + ASSEMBLER + ARITH_PUREPASCAL + + + 35 + + + + + True + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $10 + + + + + $11 + + + + + $12 + + + + + $13 + + + + + $13 + + + + + $14 + + + + + $15 + + + + + $24 + + + + + $48 + + + + + $49 + + + + + $4A + + + + + $100 + + + + + $101 + + + + + $102 + + + + + $FFF + + + + + $2000 + + + + + $4000 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $E + + + + + $F + + + + + $10 + + + + + $11 + + + + + $0 + + + + + CPP_ABI_SUPPORT + + + $0 + + + + + CPP_ABI_SUPPORT + CPU64BITS + + + $FFFFFFA8 + + + + + $FFFFFFAC + + + + + $FFFFFFB0 + + + + + $FFFFFFB4 + + + + + $FFFFFFB8 + + + + + $FFFFFFBC + + + + + $FFFFFFC0 + + + + + $FFFFFFC4 + + + + + $FFFFFFC8 + + + + + $FFFFFFCC + + + + + $FFFFFFD0 + + + + + $FFFFFFD4 + + + + + $FFFFFFD8 + + + + + $FFFFFFDC + + + + + $FFFFFFE0 + + + + + $FFFFFFE4 + + + + + $FFFFFFE8 + + + + + $FFFFFFEC + + + + + $FFFFFFF0 + + + + + $FFFFFFF4 + + + + + $FFFFFFF8 + + + + + $FFFFFFFC + + + + + $0 + + + + + $4 + + + + + $8 + + + + + $C + + + + + CPU64BITS + + + $4 + + + + + $0 + + + + + vcPrivate + + + + + vcProtected + + + + + vcPublic + + + + + vcPublished + + + + + + + + + + + [vcPublic..vcPublished] + + + + + [vcPrivate..vcPublished] + + + + + [vcPublic..vcPublished] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU64BITS + + + + + + False + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TObject is the ultimate ancestor of all objects and components. +TObject encapsulates fundamental behavior common to objects by introducing methods that: + +Create, maintain, and destroy instances of the object by allocating, initializing, and freeing required memory. +Respond when object instances are created or destroyed. +Return class-type and instance information on an object and runtime type information (RTTI) about its published properties. +Support message handling. +Support interfaces implemented by the object. +Use TObject as an immediate base class when declaring simple objects that do not need to persist (are not saved and reloaded) and that do not need to be assigned to other objects. +Much of the capability of objects is established by methods that TObject introduces. Many of these methods are used internally by IDEs and are not intended for users to call directly. Others are overridden in descendant objects that have more complex behavior. +Although TObject is the based object of a component framework, not all objects are components. All component classes descend from TComponent. + +Note: TObject is never directly instantiated. Although it does not use programming language features that prevent instantiation, TObject is an abstract class. + + + + + + + + + + + + + + + + + + + + + + + + CPU64BITS + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + $2 + + + + + $4 + + + + + $8 + + + + + $10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal use only + + + + + Internal use only + + + + + + + + + + + TypeInfo of element type + + + + + Number of element type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal use only + + + + + + + + + + Alignment in bytes + + + + + + + + + + + + + + + + + + $A + + + + + $14 + + + + + $5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + $0 + + + + + $1 + + + + + $80004002 + + + + + $8000FFFF + + + + + $80004001 + + + + + tkUnknown + + + + + tkInteger + + + + + tkChar + + + + + tkEnumeration + + + + + tkFloat + + + + + tkString + + + + + tkSet + + + + + tkClass + + + + + tkMethod + + + + + tkWChar + + + + + tkLString + + + + + tkWString + + + + + tkVariant + + + + + tkArray + + + + + tkRecord + + + + + tkInterface + + + + + tkInt64 + + + + + tkDynArray + + + + + tkUString + + + + + tkClassRef + + + + + tkPointer + + + + + tkProcedure + + + + + tkMRecord + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $80000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU64BITS + + + + CPU64BITS + + + + + + CPU64BITS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $E + + + + + $F + + + + + $10 + + + + + $11 + + + + + $12 + + + + + $13 + + + + + tkChar + + + + + tkWChar + + + + + tkUString + + + + + tkLString + + + + + tkWString + + + + + tkString + + + + + $37 + + + + + csUnallocated + + + + + csAllocated + + + + + csReserved + + + + + csSysAllocated + + + + + csSysReserved + + + + + mba8Byte + + + + + mba16Byte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + $2 + + + + + $3 + + + + + $4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tlbsLF + + + + + tlbsCRLF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $D7B0 + + + + + $D7B1 + + + + + $D7B2 + + + + + $D7B3 + + + + + $1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $20 + + + + + $10 + + + + + $8 + + + + + $4 + + + + + $1 + + + + + $3F + + + + + $2 + + + + + $20 + + + + + $10 + + + + + $8 + + + + + $4 + + + + + $1 + + + + + $3F + + + + + $2 + + + + + $0 + + + + + $800 + + + + + $400 + + + + + $C00 + + + + + $C00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fsZero + + + + + fsNZero + + + + + fsDenormal + + + + + fsNDenormal + + + + + fsPositive + + + + + fsNegative + + + + + fsInf + + + + + fsNInf + + + + + fsNaN + + + + + + + + + + + + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + reNone + + + + + reOutOfMemory + + + + + reInvalidPtr + + + + + reDivByZero + + + + + reRangeError + + + + + reIntOverflow + + + + + reInvalidOp + + + + + reZeroDivide + + + + + reOverflow + + + + + reUnderflow + + + + + reInvalidCast + + + + + reAccessViolation + + + + + rePrivInstruction + + + + + reControlBreak + + + + + reStackOverflow + + + + + reVarTypeCast + + + + + reVarInvalidOp + + + + + reVarDispatch + + + + + reVarArrayCreate + + + + + reVarNotArray + + + + + reVarArrayBounds + + + + + reAssertionFailed + + + + + reExternalException + + + + + reIntfCastError + + + + + reSafeCallError + + + + + reMonitorNotLocked + + + + + reNoMonitorSupport + + + + + rePlatformNotImplemented + + + + + reObjectDisposed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $FDE8 + + + + + $FDE9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + + + + + + + + $1 + + + + + + + + MSWINDOWS + + + + + + + $1 + + + + + + + + POSIX + POSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + POSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PIC + PIC + PUREPASCAL + + + + + + + + + PUREPASCAL + PIC + PIC + PUREPASCAL + + + + + + + + PUREPASCAL + PIC + PIC + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + $3F + + + + + + + + defined(CPUX86) or !defined(CPUX64) + + + + + $3F + + + + + + + + defined(CPUX86) or !Defined(CPUX64) + + + + + + True + + + + + + + defined(CPUX86) or !Defined(CPUX64) + + + + + + + + defined(CPUX86) or !defined(CPUX64) + + + + + + + + + + + + $3F + + + + + + + + defined(CPUX86) or !Defined(CPUX64) + + + + + $3F + + + + + + + + defined(CPUX86) or !Defined(CPUX64) + NEXTGEN + + + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + PIC + PIC + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + + + + + + + + + + + + + + EXTENDEDHAS10BYTES + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PC_MAPPED_EXCEPTIONS + PC_MAPPED_EXCEPTIONS + PUREPASCAL + + + + + + + + + + + + + + + + + + + PUREPASCAL + + + + + + + + + + + + + + + MSWINDOWS + + + + + + + + + + + + + + + MSWINDOWS + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + MSWINDOWS and !POSIX + + + + + + + + + + + + $1 + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + $7FFFFFFF + + + + + + + + PUREPASCAL and !MANAGED_RECORD + + + + + + + + + + Move fields in Record. + MoveRecord is equivalent to calling CopyRecord(Dest, Souce, TypeInfo) + then FinalizeRecord(Source, TypeInfo) + + + + + + + + + + Move Count items in Array. + MoveArray is equivalent to calling CopyArray(Dest, Souce, TypeInfo, Count) + then FinalizeArray(Source, TypeInfo, count) + + + + + + + + + + + PUREPASCAL + PUREPASCAL + Copy Count items in Array. + + + + + + + + + + + PUREPASCAL + PUREPASCAL + Finalize Count items in Array. + + + + + + + + + + PUREPASCAL + PUREPASCAL + Copy fields in Record. + + + + + + + + + + PUREPASCAL + PUREPASCAL + Finalize fields in Record. + + + + + + + + + PUREPASCAL + PUREPASCAL + Call Initialize operator for Dest if exist. + Otherwise call per each managed record member of the record. + + + + + + + + + Call Finalize operator per each elements of the array. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MSWINDOWS and !POSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LINUX + + + + + + + + + + + + + + + + + + + + LINUX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiFMX/doc/docs.xml b/Modules/DelphiFMX/doc/docs.xml new file mode 100644 index 00000000..f8c35236 --- /dev/null +++ b/Modules/DelphiFMX/doc/docs.xml @@ -0,0 +1,27512 @@ + + + + A TListBoxItem is an item that is used in list box components. +The items in list boxes and combo boxes are of type TListBoxItem. To add an item to a list box or combo box, double-click the component or right-click the component and choose Add Item. + + + Notification method called after the creation order is changed. +FMX.ListBox.TListBoxItem.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + Returns the list box object that contains the item. +ListBox gets the list box parent of the item. If the parent of the item is not a TListBox, the method returns nil. + + + Returns the combo box object that contains the item. +ComboBox gets the combo box parent of the item. If the parent of the item is not a TComboBox, the method returns nil. + + + Getter of DefaultSize. +FMX.ListBox.TListBoxItem.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Customizes styles in complex objects. +FMX.ListBox.TListBoxItem.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.ListBox.TListBoxItem.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + Checks whether the input is taken by the control or by its parent. +FMX.ListBox.TListBoxItem.EnterChildren inherits from FMX.Controls.TControl.EnterChildren. All content below this line refers to FMX.Controls.TControl.EnterChildren. +Checks whether the input is taken by the control or by its parent. +EnterChildren returns True if the input is taken directly by the control's parent, and False otherwise. +Usually, EnterChildren returns False. If the control is an item such as TListBoxItem, a TTreeViewItem, or TMenuItem, EnterChildren returns True. + + + OnDragOver event dispatcher. +FMX.ListBox.TListBoxItem.DragOver inherits from FMX.Controls.TControl.DragOver. All content below this line refers to FMX.Controls.TControl.DragOver. +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + OnDragEnd event dispatcher. +FMX.ListBox.TListBoxItem.DragEnd inherits from FMX.Controls.TControl.DragEnd. All content below this line refers to FMX.Controls.TControl.DragEnd. +OnDragEnd event dispatcher. +A control calls DragEnd when a dragging session ends. +Override the protected DragEnd method to provide other responses when the dragging session ends. + + + Renders the control's surface. +FMX.ListBox.TListBoxItem.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Getter function for the Height property. +FMX.ListBox.TListBoxItem.GetHeight inherits from FMX.Controls.TControl.GetHeight. All content below this line refers to FMX.Controls.TControl.GetHeight. +Getter function for the Height property. + + + Getter function for the Width property. +FMX.ListBox.TListBoxItem.GetWidth inherits from FMX.Controls.TControl.GetWidth. All content below this line refers to FMX.Controls.TControl.GetWidth. +Getter function for the Width property. + + + Setter function for the Height property. +FMX.ListBox.TListBoxItem.SetHeight inherits from FMX.Controls.TControl.SetHeight. All content below this line refers to FMX.Controls.TControl.SetHeight. +Setter function for the Height property. Value specifies the new value of the Height property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Retrieves whether any of the default values of font properties that are stored in the StyledSettings property is changed. +FMX.ListBox.TListBoxItem.StyledSettingsStored inherits from FMX.Controls.TTextControl.StyledSettingsStored. All content below this line refers to FMX.Controls.TTextControl.StyledSettingsStored. +Retrieves whether any of the default values of font properties that are stored in the StyledSettings property is changed. +StyledSettingsStored retrieves whether StyledSettings needs to be stored in the .fmx form file, keeping the description of the FMX form. +StyledSettingsStored returns True if StyledSettings <> DefaultStyledSettings. The DefaultStyledSettings property is set during the style loading in the ApplyStyle method. See also AllStyledSettings. + + + Specifies the alignment options (top, left, client, and so on) of this control. +Use Align to automatically set the alignment of the current control. Setting Align to a value different than None can affect the position, size (height and width), and anchors of the control. By default, Align is set to None. +Descendants of TControl typically set the visibility and value for the Align property. For example, for TToolBar, Align defaults to TAlignLayout.Top. +To see the possible values for Align and their visible effects over the control, see FMX.Types.TAlignLayout. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + + Specifies the amount (in degrees) by which the control is rotated from the x-axis. +Positive angles correspond to clockwise rotation. For counterclockwise rotation, use negative values. +To set the rotation center, use RotationCenter. + + + Specifies the position of the pivot point of the control. +The coordinates of the rotation center take values in the range from 0 through 1. The point with the coordinates (0,0) corresponds to the upper-left corner of the control, the point with the coordinates (1,1) corresponds to the lower-right corner of the control. The default center of rotation is (0.5, 0.5). +Values outside of [0,0] and [1,1] can be clipped in some descendant classes. +To set the rotation angle, use RotationAngle. + + + Returns the class type that instance represents the used text settings. +FMX.ListBox.TListBoxItem.GetTextSettingsClass inherits from FMX.Controls.TTextControl.GetTextSettingsClass. All content below this line refers to FMX.Controls.TTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.ListBox.TListBoxItem.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Embarcadero Technologies does not currently have any additional information. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + Setter for the Visible property. +This method also unselects any items that are not visible. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListBox.TListBoxItem.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListBox.TListBoxItem.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Stores a Tvalue, which is a data structure that can store different kinds of data types. +FMX.ListBox.TListBoxItem.Data inherits from FMX.Types.TFmxObject.Data. All content below this line refers to FMX.Types.TFmxObject.Data. +Stores a Tvalue, which is a data structure that can store different kinds of data types. +Data has no predefined meaning. Although Data is used for LiveBinding, any succesor override this behavior. Then, the behaviour of Data is based on the type of its value. + +Note: Do not use this member. It is for internal use only. + + + Returns the containing component. +Returns the containing component. +FMX.ListBox.TListBoxItem.GetParentComponent inherits from System.Classes.TComponent.GetParentComponent. All content below this line refers to System.Classes.TComponent.GetParentComponent. +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + Applies the specified mouse trigger effect to all the children of this FMX object that are of type TEffect. +FMX.ListBox.TListBoxItem.ApplyTriggerEffect inherits from FMX.Controls.TControl.ApplyTriggerEffect. All content below this line refers to FMX.Controls.TControl.ApplyTriggerEffect. +Applies the specified mouse trigger effect to all the children of this FMX object that are of type TEffect. +ApplyTriggerEffect iterates through all the children of this FMX object and, if one of them is of type TEffect, applies the mouse trigger given through the ATrigger parameter (which can be 'IsMouseOver', 'IsMouseOver', 'IsDragOver', and so on). +AInstance specifies the instance of the FMX object to which the trigger effect is applied. + + + Processes the selection of an item. +Sets the value of the IsSelected property, triggers the selection animation and calls the ItemStateChanged method of the listbox selection controller. +The UserChange specifies whether the selection is initiated by an user action (as opposed to by a code call). + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the check box associated with the item is checked. + + + Specifies whether the item is selected. +If IsSelected is True, the item appears as selected inside its parent component. + + + Specifies various data that can be attached to a TListBoxItem in order to be shown in the list box. +Use the ItemData property in order to attach various data to a list box item. This data can then be displayed in the list box. + +ItemData has four sub-properties: + +Accessory - lets you add to the selected list box item one of the following items: +Checkmark icon +Detail icon +More icon +No icon (this is the default) +Bitmap - lets you add a bitmap image to your item. +Detail - lets you add an additional text that describes your list box item. +Text - allows you to change the text displayed on your list box item. + +In the picture above, two list box items are present in the list: + +The first one has a bitmap image, additional text description and no accessory icon. +The second one has a bitmap image, additional text description and the Detail accessory icon. + + + Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + + A TCustomListBox is the base class for list box components. +Inherits from TCustomListBox to create a control that represents a specialized list box. + +List Box Events +TCustomListBox has events that are generic to the list box control, and other events that are specific to the items: + +Events that are generic to the list box control: Events such as OnClick, OnDblClick, OnEnter, and OnMouseDown are inherited events, and they refer to the event that occurs in the list box control. +Events that are specific to the items of the list box: Events such as OnItemClick, OnChange, OnChangeCheck, OnCompare, and OnDragChange are specific to the list box item, and they refer to events that occur in the items of the list box. +Therefore it is important to see, for example, the difference between OnClick that occurs when the list box is clicked, and OnItemClick that occurs when a list box item is clicked. +See the full list of TCustomListBox events in FMX.ListBox.TCustomListBox_Events. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ListBox.TCustomListBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Gets the text of the selected item. +GetData returns the text of the item that is selected in the list box or an empty string, if no item is selected. + + + Sets the text of the selected item. +If no item is selected, nothing happens. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Generates an OnChangeCheck event. +DoChangeCheck is executed internally when the check box associated with one of the items in the list changes its state. Check boxes are visible when the ShowCheckboxes property is set to True. + + + Compares the given items. +CompareItems compares the text of the given TListBoxItem items. +It also generates an OnCompare event. + + + Embarcadero Technologies does not currently have any additional information. + + + Sorts the items in the list box. + + + Sets the index of the selected item in the list. +SetItemIndex is the protected setter method for the ItemIndex property. + + + Returns the index of the currently selected item. + + + Internally executed while a mouse button is pressed over the surface of this scroll box. +FMX.ListBox.TCustomListBox.MouseDown inherits from FMX.Layouts.TCustomScrollBox.MouseDown. All content below this line refers to FMX.Layouts.TCustomScrollBox.MouseDown. +Internally executed while a mouse button is pressed over the surface of this scroll box. +You can call MouseDown programmatically in applications to simulate a mouse button down event over this scroll box. +The Button parameter specifies the mouse button that has just been pressed (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + Internally executed while the mouse is moved over the surface of this scroll box. +FMX.ListBox.TCustomListBox.MouseMove inherits from FMX.Layouts.TCustomScrollBox.MouseMove. All content below this line refers to FMX.Layouts.TCustomScrollBox.MouseMove. +Internally executed while the mouse is moved over the surface of this scroll box. +You can call MouseMove programmatically in applications to simulate a mouse move event over this scroll box. +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + Internally executed while a mouse button is released over the surface of this scroll box. +FMX.ListBox.TCustomListBox.MouseUp inherits from FMX.Layouts.TCustomScrollBox.MouseUp. All content below this line refers to FMX.Layouts.TCustomScrollBox.MouseUp. +Internally executed while a mouse button is released over the surface of this scroll box. +You can call MouseUp programmatically in applications to simulate a mouse button up event over this scroll box. +The Button parameter specifies the mouse button that has just been released (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + Calls Click and starts the animation by calling StartTriggerAnimation. +FMX.ListBox.TCustomListBox.MouseClick inherits from FMX.Controls.TControl.MouseClick. All content below this line refers to FMX.Controls.TControl.MouseClick. +Calls Click and starts the animation by calling StartTriggerAnimation. +MouseClick receives the following parameters: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys -- SHIFT, CTRL, ALT, and CMD (only for Mac) -- were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. + See Also +FMX.Controls.TControl.Click +FMX.Controls.TControl.OnClick +FMX.Controls.TControl.OnMouseLeave +FMX.Controls.TControl.OnMouseEnter +FMX.Controls.TControl.OnMouseMove +FMX.Controls.TControl.OnMouseDown +FMX.Controls.TControl.OnMouseWheel +System.Classes.TShiftState +System.UITypes.TMouseButton +FMX.Ani.TAnimator.StartTriggerAnimation + + + Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.ListBox.TCustomListBox.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + OnDragOver event dispatcher. +FMX.ListBox.TCustomListBox.DragOver inherits from FMX.Controls.TControl.DragOver. All content below this line refers to FMX.Controls.TControl.DragOver. +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + OnDragDrop event dispatcher. +FMX.ListBox.TCustomListBox.DragDrop inherits from FMX.Controls.TControl.DragDrop. All content below this line refers to FMX.Controls.TControl.DragDrop. +OnDragDrop event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor, within the client area of the control. +A control calls DragDrop when a dragged object is dropped on the control area. +Override the protected DragDrop method to provide other responses when a dragged object is dropped on the control area. + + + Getter of DefaultSize. +FMX.ListBox.TCustomListBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Customizes styles in complex objects. +FMX.ListBox.TCustomListBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.ListBox.TCustomListBox.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Responds when receiving input focus. +FMX.ListBox.TCustomListBox.DoEnter inherits from FMX.Controls.TStyledControl.DoEnter. All content below this line refers to FMX.Controls.TStyledControl.DoEnter. +Responds when receiving input focus. +DoEnter is called automatically when the control receives the input focus. + + + OnExit event dispatcher. +FMX.ListBox.TCustomListBox.DoExit inherits from FMX.Controls.TControl.DoExit. All content below this line refers to FMX.Controls.TControl.DoExit. +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.ListBox.TCustomListBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +FMX.ListBox.TCustomListBox.DoCalcContentBounds inherits from FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + Embarcadero Technologies does not currently have any additional information. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Initializes the component after the form file has been read into memory. +FMX.ListBox.TCustomListBox.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Executes internally to render the content of the list box. + + + OnPainting event dispatcher. +FMX.ListBox.TCustomListBox.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + Restores Canvas properties after the painting process. +FMX.ListBox.TCustomListBox.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + Executed when the viewport position changes. +FMX.ListBox.TCustomListBox.ViewportPositionChange inherits from FMX.Layouts.TCustomScrollBox.ViewportPositionChange. All content below this line refers to FMX.Layouts.TCustomScrollBox.ViewportPositionChange. +Executed when the viewport position changes. +ViewportPositionChange receives the following parameters: + +OldViewportPosition is the value that the ViewportPosition property had before it changed. +NewViewportPosition is the new value of the ViewportPosition property. +ContentSizeChanged indicates whether the size of the content of the viewport has changed as well (True) or not (False). +ViewportPositionChange calls the handler of the OnViewportPositionChange event. + + + Sets the default inertial scrolling properties for the current platform. +FMX.ListBox.TCustomListBox.DoUpdateAniCalculations inherits from FMX.Layouts.TCustomScrollBox.DoUpdateAniCalculations. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoUpdateAniCalculations. +Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations is called from UpdateAniCalculations to set the default values to the Animation, +TouchTracking, BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + Embarcadero Technologies does not currently have any additional information. + + + Virtual method to be implemented in subclasses to provide further functionality when adding AObject to the scroll box. +FMX.ListBox.TCustomListBox.ContentAddObject inherits from FMX.Layouts.TCustomScrollBox.ContentAddObject. All content below this line refers to FMX.Layouts.TCustomScrollBox.ContentAddObject. +Virtual method to be implemented in subclasses to provide further functionality when adding AObject to the scroll box. In TScrollBox, ContentAddObject has no implementation. + + + Embarcadero Technologies does not currently have any additional information. + + + Virtual method to be implemented in subclasses to provide further functionality right before removing AObject from the scroll box. +FMX.ListBox.TCustomListBox.ContentBeforeRemoveObject inherits from FMX.Layouts.TCustomScrollBox.ContentBeforeRemoveObject. All content below this line refers to FMX.Layouts.TCustomScrollBox.ContentBeforeRemoveObject. +Virtual method to be implemented in subclasses to provide further functionality right before removing AObject from the scroll box. In TScrollBox, ContentBeforeRemoveObject has no implementation. + + + Virtual method to be implemented in subclasses to provide further functionality right after removing AObject from the scroll box. +FMX.ListBox.TCustomListBox.ContentRemoveObject inherits from FMX.Layouts.TCustomScrollBox.ContentRemoveObject. All content below this line refers to FMX.Layouts.TCustomScrollBox.ContentRemoveObject. +Virtual method to be implemented in subclasses to provide further functionality right after removing AObject from the scroll box. In TScrollBox, ContentRemoveObject has no implementation. + + + Indicates if the control should update effects when you scroll content. +FMX.ListBox.TCustomListBox.IsOpaque inherits from FMX.Layouts.TCustomScrollBox.IsOpaque. All content below this line refers to FMX.Layouts.TCustomScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + Embarcadero Technologies does not currently have any additional information. + + + Updates the items that are selected in the list box. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Updates the layout of the "sticky" item in a list box. +For example, a "sticky" item can be a TSearchBox. "Sticky" means that it always stays on the top of the list, similar to a header. +To add a search box as a "sticky" item, right-click on a TListBox control and select Add Item > TSearchBox. + + + The setter for the GroupingKind property. +Sets the value of the GroupingKind property and updates and repaints the content of the ListBox. + + + Performs the realignment of the children controls of the TScrollBox object within the object. +FMX.ListBox.TCustomListBox.DoRealign inherits from FMX.Layouts.TCustomScrollBox.DoRealign. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoRealign. +Performs the realignment of the children controls of the TScrollBox object within the object. +It is called internally every time visual properties of TScrollBox are changed. +The children are realigned taking into account their alignment properties, margins, and padding. +DoRealign calls the inherited TControl.DoRealign and then executes the realignment during the inertial scrolling. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the current control can receive focus. +CanFocus is True if it can receive focus, and False otherwise. +If it is set to False, the control cannot be selected when using the TAB key. +A control can receive focus after it is created. + + + Specifies whether the parent of this control should be evaluated to receive focus. +CanParentFocus is True when the parent of this control should be evaluated to receive focus if this control cannot receive focus itself, and False otherwise. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +FMX.ListBox.TCustomListBox.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Getter for the FirstSelectedItem property. + + + Allows the dragging of items inside the list. +AllowDrag allows you to change the order of the list items by dragging them. + + + Specifies whether consecutive items should have different backgrounds. +Set AlternatingRowBackground to True so that the background of items alternates. + + + Specifies the number of columns on which to display the items in the list box. +If Columns is set to 3, this is how the list box will display the items: + + + Specifies the width of the items in the list box. +The default value is 0. If you set another value for ItemWidth, all the items will be re-dimensioned to that value and displayed on multiple columns. + + + Specifies the height of the items from the list box. +Use ItemHeight to specify the height, in pixels, of the items in the list box. + + + Specifies how the items are displayed in the list box. +ListStyle specifies whether the items in the list box are displayed vertically or horizontally. +ListStyle can be set to Vertical or Horizontal. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the list of items is sorted. + + + Displays a check box next to every item in the list box. + + + First item in the selection. +Returns nil if no item is selected. + + + Occurs when the selection in the list box changes. +Write an OnChange event handler to take specific action immediately after a new item or items are selected in the list box. + + + Occurs when the check box attached to a list item changes its state. +Write an OnChangeCheck event handler to take specific action after the check box attached to an item changes its state from selected to cleared or vice versa. +To make the check boxes attached to the list items visible, set the ShowCheckboxes property to True. + + + Occurs when two list items are compared. +Write an OnCompare event handler to create your own comparing criteria. + + + Occurs after a drag-and-drop operation. +The OnDragChange event occurs after a drag-and-drop operation and allows you to make further changes to the list box. +If AllowDrag is set to True, you can write an event handler to specify the changes to the list box when a list box item is dragged inside the list. +See TOnListBoxDragChange for more details. + + + Embarcadero Technologies does not currently have any additional information. + + + The current selection controller. +The constructor initializes the MultiSelectStyle property which in turn defines the SelectionController. The default value of MultiSelectStyle is TMultiSelectStyle.None. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListBox.TCustomListBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListBox.TCustomListBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Assigns the Source object to the current object. +Assign copies the elements from Source to the current object, if Source is a TStrings object. + + + Deletes all the items from the list. +Clear removes the items from the list box and also frees the memory allocated for them. The items in the list box are stored as TListBoxItem objects. + + + Generates an OnDragChange event. +DragChange is called automatically after a drag-and-drop operation. + + + Selects all the items in the list. +SelectAll works only if MultiSelect is set to True. + + + Deselects all the selected items from the list box. +If no items are selected before calling ClearSelection, nothing happens. + + + Selects all the items between two given items. +SelectRange selects the items between Item1 and Item2 (including Item1 and Item2) and deselects any other previously selected items. +SelectRange works only if MultiSelect is set to True. + + + Scrolls the content so that the Item is visible. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the item at the specified point. +Call ItemByPoint to get the item that contains in its bounds the point specified by X and Y. + + + Returns the item at the index specified by Idx. + + + Embarcadero Technologies does not currently have any additional information. + + + Sorts components of the layout based on the comparison function Compare. +FMX.ListBox.TCustomListBox.Sort inherits from FMX.Layouts.TCustomScrollBox.Sort. All content below this line refers to FMX.Layouts.TCustomScrollBox.Sort. +Sorts components of the layout based on the comparison function Compare. +TFmxObjectSortCompare is declared as: + +TFmxObjectSortCompare = function(item1, item2: TFmxObject): Integer; + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines the number of items in the list box. + + + Returns the item that is currently selected. +If no item is selected, it returns nil. +To obtain the index of the item that is currently selected, use the ItemIndex property. + + + Specifies the items in the list box. +Use Items to get or set the list of items in the list box as strings. +Use the ListItems property to access an item by specifying its index. This property returns the item as a TListBoxItem object. + +Adding Items +To add items as TListBoxItem at design-time, see ListBox Items Editor. +To add items as TStrings at design-time, see String List editor. + + + Embarcadero Technologies does not currently have any additional information. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Specifies the index of the currently selected item. +Gets or sets the index of the item that is selected in the list box. +The first item in the list has index 0, the second item has index 1, and so on. If no item is selected, the value of ItemIndex is -1. +To get the actual item that is selected, use the Selected property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether multiple items can be selected in the list. +If MultiSelect is set to True, you can select more than one item from the list, otherwise you are limited to one item. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs immediately after clicking an item from the listbox. +Write an OnItemClick event handler to respond to clicking on an item from the listbox component. +The event handler for the OnItemClick event receives two arguments: + +Sender: The TCustomListBox instance that holds the list box item that was clicked. +Item: The TListBoxItem instance that was clicked. +OnItemClick is an event of type TItemClickEvent. + + + + + + + + Gets default style for Group Header, which is used if TListBox.DefaultItemStyles.GroupHeaderStyle + is empty + + + + + + + + Reference to sticky TListBoxGroupHeader clone in Plain grouping mode + + + + + + + + Reference to TListBox that hosts this controller + + + Index of currently selected item, -1 if none + + + Index of first selected item, -1 if none + + + Timer used for DelayedMouseDown + + + Item that's going to be acted upon if DelayedMouseDown is employed + + + Flag used to prevent sending change notification + + + True during mouse selection + + + Create a new instance of TSelectionController + + + Getter for MutliSelectStyle + + + Make host TListBox update selection visuals + + + Initiate a delayed mouse down action + + + Abort delayed mouse down action, if any + + + Get first item index, -1 if none + + + Get current item index, -1 if none + + + Get current TListBoxItem, nil if none selected + + + Clear selection + + + Attempt to copy selection from another selector + + + Select everything + + + Select range between TListBoxItems Item1 and Item2 + + + Mark TListBoxItem Item as Selected if Value is True, as not selected if Value is False. + No notification. Return true if Item.Selected has been changed. + + + Set item with index Index as current. Return True if the value of Current has been changed. + + + Used to notify this TSelectionController when item state was changed externally. See DoItemStateChanged. + + + Start mouse selection + + + Handle mouse move during selection + + + Before mouse selection is finished + + + Finish mouse selection + + + Select using keyboard, e.g. by pressing space. KeyAction is one of: Move or Toggle + + + Invoked when item index is set programmatically by user + + + Dispatch change notification + + + MouseSelectStart implementation + + + MouseSelectMove implementation + + + MouseSelectFinishing implementation + + + MouseSelectFinish implementation + + + KeyboardSelect implementation + + + UserSetIndex implementation + + + ItemStateChanged implementation + + + MultiSelectStyle that this selection controller implements + + + True during mouse selection + + + + + + + + Create TListBoxSelector for ListBox based on MultiSelectStyle + + + Register a selector that handles given MultiSelectStyle. Used during framework initialization + + + + + A TCustomComboBox is the base class for combo box components. +Inherit from TCustomComboBox to create a control that represents a specialized combo box. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ListBox.TCustomComboBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates the list box associated with the combo box. +Call CreateListBox to instantiate the list box component of the current combo box. The list box is of type TComboListBox. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Enumerates all child components. +FMX.ListBox.TCustomComboBox.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Getter of DefaultSize. +FMX.ListBox.TCustomComboBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Customizes styles in complex objects. +FMX.ListBox.TCustomComboBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Performs the alignment of a FireMonkey control. +FMX.ListBox.TCustomComboBox.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Renders the content of the combo box. +DoContentPaint paints the content of the combo box when it is not expanded. +DoContentPaint is used internally. + + + OnExit event dispatcher. +FMX.ListBox.TCustomComboBox.DoExit inherits from FMX.Controls.TControl.DoExit. All content below this line refers to FMX.Controls.TControl.DoExit. +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.ListBox.TCustomComboBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + OnMouseDown event dispatcher. +FMX.ListBox.TCustomComboBox.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseUp event dispatcher. +FMX.ListBox.TCustomComboBox.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + OnMouseWheel event dispatcher. +FMX.ListBox.TCustomComboBox.MouseWheel inherits from FMX.Controls.TControl.MouseWheel. All content below this line refers to FMX.Controls.TControl.MouseWheel. +OnMouseWheel event dispatcher. +A control calls MouseWheel in response to any of mouse wheel messages, decoding the message parameters into the shift-key state, wheel rotation, and handle, which it passes in the Shift, WheelDelta, and Handled parameters, respectively: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +Handled indicates whether the scroll bar was already moved, depending on the WheelDelta value. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the rolling on the other scroll bar, if it exists. +Override the protected MouseWheel method to provide other responses when the mouse wheel is rotated while the cursor is over the control. + + + Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.ListBox.TCustomComboBox.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + Initializes the component after the form file has been read into memory. +FMX.ListBox.TCustomComboBox.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Initializes a list picker. +InitPicker initializes the list picker provided with the AListPicker parameter. + + + Recalculates the pop-up size based on the items. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Gets the pop-up window that is used as a holder for the drop-down list. + + + Specifies whether the current control can receive focus. +CanFocus is True if it can receive focus, and False otherwise. +If it is set to False, the control cannot be selected when using the TAB key. +A control can receive focus after it is created. + + + Specifies whether the parent of this control should be evaluated to receive focus. +CanParentFocus is True when the parent of this control should be evaluated to receive focus if this control cannot receive focus itself, and False otherwise. + + + Specifies the height of the items from the drop-down list. +Use ItemHeight to specify the height, in pixels, of the items in the combo box list. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the maximum number of items displayed in the drop-down list. +By default, the drop-down list displays 8 items that are visible without requiring the user to scroll. To make the drop-down list smaller or larger, specify a number smaller or larger than eight as the DropDownCount value. +If the DropDownCount value is larger than the number of items, the drop-down list will be only large enough to display the existing items. If the DropDownCount value is smaller than the number of items, the drop-down list displays a scroll bar. + + + Specifies the position of the list box relative to the combo box button. +For example, if Placement is set to TPlacement.Right, the drop-down list is displayed to the right of the combo box. + + + Specifies the position of the drop-down list of the combo box. +Use PlacementRectangle to specify the coordinates of the placement rectangle. The drop-down list will be displayed with the upper-left corner in the lower-left corner of the placement rectangle. The origin is considered to be the upper-left corner of the combo box button. + + + Defines whether to use TCustomListPicker pickers providing platform-specific drop-down lists to select string items. +The TDropDownKind type is also used in the TComboEdit, +TComboBox, and TPopupBox controls to define whether to use the TCustomListPicker picker to provide platform-specific controls to select string items from drop-down lists. + + + Specifies the name of the resource object to which the drop-down list of the combo box is linked. +Use ListBoxResource to specify the style for the drop-down list component of the combo box. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs when the selected item in the combo box changes. +Write an OnChange event handler to take specific action immediately after a new item is selected from the list. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs just before the drop-drown list appears. +Write an OnPopup event handler to take specific action just before the drop-drown list appears. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListBox.TCustomComboBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListBox.TCustomComboBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.ListBox.TCustomComboBox.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + Deletes all the items from the Items list. +Call Clear to empty the combo box at run time. + + + Opens the list of items. +DropDown makes visible the list of items of the combo box. + + + Sorts the children in the children list using the specified sorting procedure. +FMX.ListBox.TCustomComboBox.Sort inherits from FMX.Types.TFmxObject.Sort. All content below this line refers to FMX.Types.TFmxObject.Sort. +Sorts the children in the children list using the specified sorting procedure. + + + Gets the drop-down list component of the combo box. +The returned object is a TComboListBox. + + + Returns the total number of items in the drop-down list associated with the combo box. + + + Gets the item that is currently selected in the combo box. +Selected returns the selected item in the combo box as a TListBoxItem instance. + + + Specifies the items in the drop-down list. +Use Items to get or set the list of items in the drop-down as strings. +Use the ListItems property to access an item as a TListBoxItem object. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Specifies the index of the currently selected item. +Gets or sets the index of the item that is selected in the combo box. +The first item in the list has index 0, the second item has index 1, and so on. If no item is selected, the value of ItemIndex is -1. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + A TComboBox is a button with a list box attached to it. +Click the button to display the list. +You can select an item from the list and it will appear as the button's text. You cannot type text directly into the combo box button. +To add items, right-click the combo box on the form and choose Add Item. This creates a new TListBoxItem object that appears in the Structure pane and can be edited individually. +You can also manage the items in the combo box by double-clicking the combo box control in the Form Designer. This opens the Items Designer dialog where you can add, delete, and change the order of the items. + +Note: When a number of items in a control is more than can be concurrently shown in the TListBoxItem list box, then you can use the scroll bar to scroll the items shown in the list box. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll items using the mouse wheel. To enforce the scroll bar to be shown by default, you can use the code like following: +ComboBox1.ListBox.AniCalculations.AutoShowing := false; +In Windows 8 style applications, you can create a Windows 8 style combo box by setting the value Native for the property DropDownKind. For more information, see Creating a Metropolis UI ComboBox. + + + Implements a standard LiveBindings action. +TFMXBindNavigateAction is the base class for all standard LiveBindings actions that are compatible with the bind navigator. The standard LiveBindings actions are listed in the following table. + + + +Button + +Purpose + + +Fmx.Bind.Navigator.TFMXBindNavigateFirst + +Sets the current record to the first record in the data source, disables the First and Prior buttons, and enables the Next and Last buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigatePrior + +Sets the current record to the previous record and enables the Last and Next buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigateNext + +Sets the current record to the next record and enables the First and Prior buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigateLast + +Sets the current record to the last record in the data source, disables the Last and Next buttons, and enables the First and Prior buttons, if they are disabled. + + +Fmx.Bind.Navigator.TFMXBindNavigateInsert + +Inserts a new record before the current record and sets the data source into Insert and Edit states. + + +Fmx.Bind.Navigator.TFMXBindNavigateDelete + +Deletes the current record and makes the next record the current record. + + +Fmx.Bind.Navigator.TFMXBindNavigateEdit + +Puts the data source into Edit state so that the current record can be modified. + + +Fmx.Bind.Navigator.TFMXBindNavigatePost + +Writes changes in the current record to the data source. + + +Fmx.Bind.Navigator.TFMXBindNavigateCancel + +Cancels edits to the current record, restores the record display to its condition prior to editing, and turns off the Insert and Edit states, if they are active. + + +Fmx.Bind.Navigator.TFMXBindNavigateRefresh + +Refreshes the buffered data in the associated data source. + + +Fmx.Bind.Navigator.TFMXBindNavigateApplyUpdates + +Applies all pending updates to the data source. + + +Fmx.Bind.Navigator.TFMXBindNavigateCancelUpdates + +Cancels all pending updates to the data source. + +For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Specifies the bind navigator controller that will execute the standard LiveBindings actions. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateAction.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateAction.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + Destroys the instance of the contained action. +Fmx.Bind.Navigator.TFMXBindNavigateAction.Destroy inherits from System.Actions.TContainedAction.Destroy. All content below this line refers to System.Actions.TContainedAction.Destroy. +Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +Fmx.Bind.Navigator.TFMXBindNavigateAction.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Introduces an interface for invoking an action on a target client component or control. +Fmx.Bind.Navigator.TFMXBindNavigateAction.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Introduces an interface for a method of notifying a client when the action updates itself. +Fmx.Bind.Navigator.TFMXBindNavigateAction.UpdateTarget inherits from System.Classes.TBasicAction.UpdateTarget. All content below this line refers to System.Classes.TBasicAction.UpdateTarget. +Introduces an interface for a method of notifying a client when the action updates itself. +UpdateTarget does nothing in TBasicAction. UpdateTarget was introduced in TBasicAction so that descendants can override it to correspondingly update a target when the action updates. + + + Specifies the linking bind source (binding datasource) that will be affected by standard LiveBindings actions (for instance, Delete, ApplyUpdates, CancelUpdates, and so on). + + + + + Implements a standard First LiveBindings action. +The TFMXBindNavigateFirst class implements a standard LiveBindings action that is used to set the current record to the first record in the data source, to disable the First and Prior buttons, and to enable the Next and Last buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateFirst.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Prior LiveBindings action. +The TFMXBindNavigatePrior class implements a standard LiveBindings action that is used to set the current record to the previous record and to enable the Last and Next buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigatePrior.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Next LiveBindings action. +The TFMXBindNavigateNext class implements a standard LiveBindings action that is used to set the current record to the next record and to enable the First and Prior buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateNext.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Last LiveBindings action. +The TFMXBindNavigateLast class implements a standard LiveBindings action that is used to set the current record to the last record in the data source, to disable the Last and Next buttons, and to enable the First and Prior buttons, if they are disabled. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateLast.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Insert LiveBindings action. +The TFMXBindNavigateInsert class implements a standard LiveBindings action that is used to insert a new record before the current record and to set the data source into Insert and Edit states. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateInsert.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Delete LiveBindings action. +The TFMXBindNavigateDelete class implements a standard LiveBindings action that is used to delete the current record and to make the next record the current record. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateDelete.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + Introduces an interface for invoking an action on a target client component or control. +Fmx.Bind.Navigator.TFMXBindNavigateDelete.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Implements a standard Edit LiveBindings action. +The TFMXBindNavigateEdit class implements a standard LiveBindings action that is used to put the data source into Edit state so that the current record can be modified. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateEdit.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Post LiveBindings action. +The TFMXBindNavigatePost class implements a standard LiveBindings action that is used to apply edits made in the current record to the data source. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigatePost.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Cancel LiveBindings action. +The TFMXBindNavigateCancel class implements a standard LiveBindings action that is used to cancel edits to the current record, to restore the record display to its condition prior to editing, and to turn off the Insert and Edit states, if they are active. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateCancel.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard Refresh LiveBindings action. +The TFMXBindNavigateRefresh class implements a standard LiveBindings action that is used to refresh the current row only from the data source. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateRefresh.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard ApplyUpdates LiveBindings action. +The TFMXBindNavigateApplyUpdates class implements a standard LiveBindings action that is used to apply updates to the database with all changes that have been made to the data source. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateApplyUpdates.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + Implements a standard CancelUpdates LiveBindings action. +The TFMXBindNavigateCancelUpdates class implements a standard LiveBindings action that is used to discard all changes that have been made to the data source and restores the data source to the values originally retrieved from the database. For more information on how to use standard LiveBindings actions, see the LiveBindings and Action Lists help topic. + + + Creates and initializes a TAction object. +Fmx.Bind.Navigator.TFMXBindNavigateCancelUpdates.Create inherits from FMX.ActnList.TAction.Create. All content below this line refers to FMX.ActnList.TAction.Create. +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + + + + Filters the string contained in the Text property. +FMX.Menus.TMenuItem.DoFilterControlText inherits from FMX.Controls.TTextControl.DoFilterControlText. All content below this line refers to FMX.Controls.TTextControl.DoFilterControlText. +Filters the string contained in the Text property. +For example, you can use DoFilterControlText to filter the ampersand symbol of the accelerator key character. +If the control is registered as an accelerator key receiver, you can override this method to do your own filtering to the accelerator keys. + + See Also +FMX.Controls.TTextControl.Text +Specifying Accelerator Keys + + + Determines whether the object reacts to the accelerator key or not. +FMX.Menus.TMenuItem.CanTriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. +Determines whether the object reacts to the accelerator key or not. +Use CanTriggerAcceleratorKey for objects that are not intended to react to the accelerator key, for example: a hidden tab page or a hidden submenu. The object triggers the action if CanTriggerAcceleratorKey is True. Otherwise, the object cannot trigger the action. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TMenuItem.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + OnMouseDown event dispatcher. +In addition to FMX.Controls.TControl.MouseDown, if the left mouse button is clicked and the current TMenuItem object has a pop-up menu, MouseDown displays the pop-up menu. + + + Responds to the click of the left mouse button. +In addition to FMX.Controls.TControl.Click, Click triggers an OnMouseLeave and, if the AutoCheck property is True, negates the IsChecked property. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Menus.TMenuItem.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Protected setter implementation for the Text property. +FMX.Menus.TMenuItem.SetText inherits from FMX.Controls.TTextControl.SetText. All content below this line refers to FMX.Controls.TTextControl.SetText. +Protected setter implementation for the Text property. +In descendants, override SetText to allow for further functionality when setting the text using the Text property. +Do not use SetText directly in applications. Use the Text property instead. + + + Checks whether the input is taken by the control or by its parent. +FMX.Menus.TMenuItem.EnterChildren inherits from FMX.Controls.TControl.EnterChildren. All content below this line refers to FMX.Controls.TControl.EnterChildren. +Checks whether the input is taken by the control or by its parent. +EnterChildren returns True if the input is taken directly by the control's parent, and False otherwise. +Usually, EnterChildren returns False. If the control is an item such as TListBoxItem, a TTreeViewItem, or TMenuItem, EnterChildren returns True. + + + Specifies the behavior of a TMenuItem menu item when Action changes. +ActionChange calls the inherited TTextControl.ActionChange method and then, depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +IsChecked and GroupName properties of TMenuItem. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Determines the number of child TMenuItems that have the Visible property set to True. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Menus.TMenuItem.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Realigns the parent of this TMenuItem. + + + OnResize event dispatcher. +FMX.Menus.TMenuItem.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Embarcadero Technologies does not currently have any additional information. + + + CalcVisibleObjectsItemSize determines the render size of this TMenuItem. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + Protected setter implementation for the Parent property. +FMX.Menus.TMenuItem.SetParent inherits from FMX.Types.TFmxObject.SetParent. All content below this line refers to FMX.Types.TFmxObject.SetParent. +Protected setter implementation for the Parent property. + + + Executed right after the value of the Parent property changes. +FMX.Menus.TMenuItem.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Customizes styles in complex objects. +FMX.Menus.TMenuItem.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.Menus.TMenuItem.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + Returns the number of the visible TMenuItems from the Children property. +GetItemsCount determines and returns the number of the TMenuItem objects from the Children property, for which the Visible property is True. + + + Returns the specified TMenuItem child. +GetItem searches in the Children property for the TMenuItem object specified by the value of the AIndex parameter, and returns it. + +Note: Only TMenuItem objects are taken into account when iterating through the Children property. + + + Setter function for the Visible property. +In addition to FMX.Controls.TControl.SetVisible, SetVisible realigns the children of the Parent property so that, if Visible is False, the TMenuItem object is not displayed. + + + Modifies the value of the Enabled property of this TMenuItem. + + + Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. If the pressed keys match the ShortCut property, an OnClick event is triggered. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + It determines if the item is child of TMenuBar control. +The appearance of these menu items differs from all the others. For example: the default style is menubaritemstyle. + + + Represents the FireMonkey-specific handle of the TMenuItem. + + + It is the additional text offset to the right, which is determined by the width of the picture. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TMenuItem.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TMenuItem.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Clears this TMenuItem. +Clear removes all the children menu items of this menu item. + + + Calculates the size of a TMenuItem as a TPointF. +Use CalcSize to determine the size of a TMenuItem object as a TPointF. + +Note: The Y value of the TPointF returned is 8 for a separator, and 23 for a regular TMenuItem. + + + CalcRenderSize determines the render size of this TMenuItem as a TPointF. + + + Embarcadero Technologies does not currently have any additional information. + + + It returns the parent menu item. + + + It returns the main menu to which the menu item is attached. + + + Creates and displays the TMenuItem's pop-up menu. +Popup creates and displays a pop-up menu containing all the visible TMenuItem children of the current object. + +Note: The TMenuItem children for which the Visible property is False are not displayed. + + + Displays the pop-up menu of the current TMenuItem object, after a short delay. +Use NeedPopup to display the pop-up menu of the current TMenuItem object, after a short delay. + + + Decides whether the current TMenuItem needs a pop-up menu. +A TMenuItem object needs a pop-up menu if at least one of the object's children is a TMenuItem. + + + For internal use. +Do not use this property. It is for internal use. + + + Represents the number of child TMenuItems of this menu item. + + + Specifies whether the TMenuItem is selected. IsSelected is True if the TMenuItem is selected, and False otherwise. + + + Embarcadero Technologies does not currently have any additional information. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + A bitmap that is drawn on the TMenuItem menu item. +Use Bitmap to provide a custom image that appears next to the text of the TMenuItem. +Bitmap is an obsolete feature. We recommend to show images stored in a centralized collection of images. Such image is specified with the ImageIndex property from the image list specified with Images. If an image specified with ImageIndex and Images is not empty, the TMenuItem object shows this image. Otherwise, the TMenuItem object shows the image specified in Bitmap. + + + Controls whether the IsChecked property toggles when the TMenuItem is clicked. +Set the AutoCheck property to True if the toggling of the IsChecked property is desired when the TMenuItem is clicked, and to False otherwise. + + + Identifies the group of TMenuItems to which this TMenuItem belongs. +A group of TMenuItems represents a set of TMenuItem objects belonging to the same pop-up menu, out of which only one TMenuItem, having the RadioItem property set to True, can be selected. + +Note: TMenuItems belonging to different pop-up menus (that do not have the same value for the Parent property) can be simultaneously selected, even if their RadioItem property is True. +Note: By default, all TMenuItems belonging to the same pop-up menu have the same value for the GroupIndex property. + + + Specifies whether the TMenuItem is mutually exclusive with other menu items in its group. +Use RadioItem to make the menu item behave like a radio button with a group of other menu items. The group of menu items is the set of all menu items in a pop-up menu that have the same value of GroupIndex. When RadioItem is True, only one menu item in the group that contains the menu item can be selected at a time. The single selected menu item in the group is indicated by a check mark beside its text. + +Note: RadioItem does not work for the top-level items in a main menu. + + + Specifies whether a check mark is displayed beside the text of the TMenuItem. +Use IsChecked to allow the TMenuItem to work like a check box. The menu item appears selected if IsChecked is True, and cleared otherwise. + +Note: If AutoCheck is False, the menu item remains cleared even if IsChecked is True. + + + Shortcut that opens the menu item. + + + Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + + Represents a pop-up menu. +Use TPopupMenu to describe a menu that appears only when the Popup procedure is called. TPopupMenu appears at the coordinates indicated by the parameters of the Popup procedure. +TPopupMenu is composed of TMenuItems. You can add menu items in several ways: + +To add a menu item at design time, do any of the following: +Right-click the component and select Add Item from the context menu. +Double-click the component and click the Add Item button on the Items Designer. +Right-click the component, select Items Editor from the context menu, and then click the Add Item button. +To add a menu item at run time, use the AddObject procedure of TPopupMenu. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TPopupMenu.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +FMX.Menus.TPopupMenu.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TPopupMenu.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TPopupMenu.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Clears this TPopupMenu. +Clear removes all the child menu items of this pop-up menu. + + + TPopupMenu descendants may implement CloseMenu to define actions made when the pop-up menu closes. +CloseMenu does nothing. It is meant to be implemented by TPopupMenu descendants to describe actions made when the pop-up menu closes. + + + Displays the pop-up menu onscreen. +Call Popup to bring up the pop-up menu. The menu appears at the screen coordinates indicated by the values (in pixels) of X and Y. + + + The point where the pop-up menu opens. + + + Processes a dialog key for each of the TPopupMenu's TMenuItems. +DialogKey is called during the message preprocessing to handle dialog characters. If the pressed keys match the ShortCut property of one of the TPopupMenu's TMenuItems, the OnClick event of that TMenuItem is triggered. + + + Represents the number of child TMenuItems of this pop-up menu. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + Represents an editable menu bar. +TMenuBar describes the structure of a menu bar that can be moved, resized, and edited. TMenuBar is composed of TMenuItems. +Menu items can be added in several ways: + +To add a menu item at design time, do any of the following: +Right-click the component and select Add Item from the context menu. +Double-click the component and click the Add Item button on the Items Designer. +Right-click the component, select Items Editor from the context menu, and then click the Add Item button. +To add a menu item at run time, use the AddObject procedure of the TMenuBar. +Use Items and ItemsCount to retrieve information about menu items. +TMenuBar: + + + Retrieves the TMenuItem specified by AIndex from the menu's list of children menu items. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Menus.TMenuBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Performs the alignment of a FireMonkey control. +FMX.Menus.TMenuBar.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TMenuBar.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Processes a dialog key. +FMX.Menus.TMenuBar.DialogKey inherits from FMX.Controls.TControl.DialogKey. All content below this line refers to FMX.Controls.TControl.DialogKey. +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + Updates the structure of the menu bar, if possible. + + + Setter function for the Visible property. +FMX.Menus.TMenuBar.SetVisible inherits from FMX.Controls.TControl.SetVisible. All content below this line refers to FMX.Controls.TControl.SetVisible. +Setter function for the Visible property. Value specifies the new value of the Visible property. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Initializes the component after the form file has been read into memory. +FMX.Menus.TMenuBar.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Menus.TMenuBar.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Customizes styles in complex objects. +FMX.Menus.TMenuBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.Menus.TMenuBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TMenuBar.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TMenuBar.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Starts the menu loop for this menu bar. There is no need to manually call StartMenuLoop in applications. + + + Clears this TMenuBar. +Clear removes all the children of this menu bar. + + + Returns the total number of menu items in this menu bar. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + Describes the structure of the form's main menu. +Use TMainMenu to describe the structure of the form's main menu. TMainMenu is composed of TMenuItems. +Menu items can be added in several ways: + +To add a menu item at design time, do any of the following: +Right-click the component and select Add Item from the context menu. +Double-click the component and click the Add Item button on the Items Designer. +Right-click the component, select Items Editor from the context menu, and then click the Add Item button. +To add a menu item at run time, use the AddObject procedure of the TMainMenu. + + + Notification method called after the parent is changed. +FMX.Menus.TMainMenu.ParentChanged inherits from FMX.Types.TFmxObject.ParentChanged. All content below this line refers to FMX.Types.TFmxObject.ParentChanged. +Notification method called after the parent is changed. ParentChanged is a virtual method to be implemented in subclasses to allow for changing the parent of this FMX object. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Menus.TMainMenu.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +FMX.Menus.TMainMenu.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Menus.TMainMenu.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Menus.TMainMenu.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs any necessary actions before the first destructor is called. +FMX.Menus.TMainMenu.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Recreates the OS specific menu. + + + Exchanges two objects from the children list. +FMX.Menus.TMainMenu.Exchange inherits from FMX.Types.TFmxObject.Exchange. All content below this line refers to FMX.Types.TFmxObject.Exchange. +Exchanges two objects from the children list. Exchange exchanges AObject1 with AObject2. + + + Processes a dialog key for every item in the menu. +Do not call DialogKey in an application. It is for internal use only. + + + Represents the number of child menu items of this menu. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + + + + Need makes several clicks until the user didn't raise a finger from the screen. + + + + + A special presented edit box equipped with buttons to increment or decrement the displayed numeric value. +TSpinBox is a special edit box that can display only numerical values and is equipped with the Increase and Decrease buttons for incrementing or decrementing the displayed value. + + + Returns a class reference to a data model of this presented control. +FMX.SpinBox.TSpinBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Returns the name of the default presentation proxy that your presented control uses. +FMX.SpinBox.TSpinBox.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + Returns the Model of the TSpinBox with TSpinBoxModel type. + + + Specifies the numerical value that will be used as an increment or decrement factor for this spin box. +For instance, if you set the Increment value to 5, then pressing the plus (increment) button will increase the display value by 5. Pressing the minus (decrement) button will decrease the display value by 5. +However, if, for instance, Value is 4, Increment is 5, and Min is 0 and you press the minus (decrement) button, the value will become 0. In a similar manner, if, for instance, Value is 8, Increment is 5, and Max is 10 and you press the plus (increment) button, the value will become 10. + + + Determines whether the TSpinBox does several clicks when the user keeps the button held down. +When RepeatClick is True, the user can hold the button down to do several clicks until the button is released. +By default the RepeatClick property is set to False. + + + + + TTabItem is a tab item in a TTabControl component. A TTabControl contains one or more TTabItem objects. +The Text property can be used to define an accelerator key to the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Changes the size state from Calculated to Invalid so that the size is re-calculated later. +InvalidateSize returns False if the call is performed at the moment of calculation. That is, when the size state is Calculating. + + + Calls TTabControl.RealignTabs. +RealignTabs returns False if the call to TTabControl.RealignTabs is not executed. For example, in the case of recursive calls. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.TabControl.TTabItem.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Notification method called after the creation order is changed. +FMX.TabControl.TTabItem.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + Holds information about the size of the tab title. +The CalcSize method initializes the Info property. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.TabControl.TTabItem.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Updates the representation of the text on the control. +FMX.TabControl.TTabItem.DoChanged inherits from FMX.Controls.TTextControl.DoChanged. All content below this line refers to FMX.Controls.TTextControl.DoChanged. +Updates the representation of the text on the control. +DoChanged is called internally from the Change methods. +Do not call DoChanged explicitly; call the Change method. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.TabControl.TTabItem.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Protected setter implementation for the Text property. +FMX.TabControl.TTabItem.SetText inherits from FMX.Controls.TTextControl.SetText. All content below this line refers to FMX.Controls.TTextControl.SetText. +Protected setter implementation for the Text property. +In descendants, override SetText to allow for further functionality when setting the text using the Text property. +Do not use SetText directly in applications. Use the Text property instead. + + + Retrieves the resource object linked to the style of the current TTextControl object. +FMX.TabControl.TTabItem.FindTextObject inherits from FMX.Controls.TTextControl.FindTextObject. All content below this line refers to FMX.Controls.TTextControl.FindTextObject. +Retrieves the resource object linked to the style of the current TTextControl object. +In the current implementation, FindTextObject retrieves the resource object linked to the 'text' style. + + + Customizes styles in complex objects. +FMX.TabControl.TTabItem.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.TabControl.TTabItem.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + Initializes the component after the form file has been read into memory. +FMX.TabControl.TTabItem.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + OnMouseDown event dispatcher. +FMX.TabControl.TTabItem.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + Calls Click and starts the animation by calling StartTriggerAnimation. +FMX.TabControl.TTabItem.MouseClick inherits from FMX.Controls.TControl.MouseClick. All content below this line refers to FMX.Controls.TControl.MouseClick. +Calls Click and starts the animation by calling StartTriggerAnimation. +MouseClick receives the following parameters: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys -- SHIFT, CTRL, ALT, and CMD (only for Mac) -- were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. + See Also +FMX.Controls.TControl.Click +FMX.Controls.TControl.OnClick +FMX.Controls.TControl.OnMouseLeave +FMX.Controls.TControl.OnMouseEnter +FMX.Controls.TControl.OnMouseMove +FMX.Controls.TControl.OnMouseDown +FMX.Controls.TControl.OnMouseWheel +System.Classes.TShiftState +System.UITypes.TMouseButton +FMX.Ani.TAnimator.StartTriggerAnimation + + + Responds to user double-clicks. +FMX.TabControl.TTabItem.DblClick inherits from FMX.Controls.TControl.DblClick. All content below this line refers to FMX.Controls.TControl.DblClick. +Responds to user double-clicks. +DblClick is an event handler for the OnDblClick event. It is automatically called when the left mouse button is pressed and released twice, consecutively, with the pointer over the control. +Call DblClick in applications to simulate a mouse OnDblClick event. + + + OnMouseUp event dispatcher. +FMX.TabControl.TTabItem.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.TabControl.TTabItem.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + Executed right after the value of the Parent property changes. +FMX.TabControl.TTabItem.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the alignment options (top, left, client, and so on) of this control. +Use Align to automatically set the alignment of the current control. Setting Align to a value different than None can affect the position, size (height and width), and anchors of the control. By default, Align is set to None. +Descendants of TControl typically set the visibility and value for the Align property. For example, for TToolBar, Align defaults to TAlignLayout.Top. +To see the possible values for Align and their visible effects over the control, see FMX.Types.TAlignLayout. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + + Specifies the amount (in degrees) by which the control is rotated from the x-axis. +Positive angles correspond to clockwise rotation. For counterclockwise rotation, use negative values. +To set the rotation center, use RotationCenter. + + + Specifies the position of the pivot point of the control. +The coordinates of the rotation center take values in the range from 0 through 1. The point with the coordinates (0,0) corresponds to the upper-left corner of the control, the point with the coordinates (1,1) corresponds to the lower-right corner of the control. The default center of rotation is (0.5, 0.5). +Values outside of [0,0] and [1,1] can be clipped in some descendant classes. +To set the rotation angle, use RotationAngle. + + + Aligns the component to the position points of other components (Bounds points). +Specifies the upper-left corner of the current control, relative to its parent. +The Position can be affected by the Padding of its parent and the Margins of the control. + + + Returns the class type that instance represents the used text settings. +FMX.TabControl.TTabItem.GetTextSettingsClass inherits from FMX.Controls.TTextControl.GetTextSettingsClass. All content below this line refers to FMX.Controls.TTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Embarcadero Technologies does not currently have any additional information. + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.TabControl.TTabItem.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Renders the child controls. +FMX.TabControl.TTabItem.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + OnPainting event dispatcher. +FMX.TabControl.TTabItem.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + Renders the control's surface. +FMX.TabControl.TTabItem.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Processes the painting of the control. +FMX.TabControl.TTabItem.DoPaint inherits from FMX.Controls.TControl.DoPaint. All content below this line refers to FMX.Controls.TControl.DoPaint. +Processes the painting of the control. +This method is called internally from PaintTo and PaintChildren. DoPaint defines the drawing area by clipping the Canvas to the areas occupied by the control and its children, paints the children and then the control itself. The call to DoPaint is always preceded by a call to Painting and succeeded by a call to AfterPaint. + + + Restores Canvas properties after the painting process. +FMX.TabControl.TTabItem.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + Specifies the part of the page that needs to be painted. +The tab control sets the PaintPart property during painting. + + + Contains all the controls that you place on the TabItem. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.TabControl.TTabItem.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.TabControl.TTabItem.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a TTabControl object that holds this tab page. + + +Note: You cannot access this TTabControl using the TTabItem.Parent property. + + + If ShowAsDot is true, then the StyleLookup property has the value tabdotstyle. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Specifies whether TTabItem header (where the TabItem names appear) is auto-sized based on the length of the Text. +Set the AutoSize property to True to automatically resize the tab item header according to the length of the Text. +Set the AutoSize property to False to lock autoresize of the TTabItem header. + +Tip: The size of the TTabItem header readjusts when the Font property changes. + + + Specifies custom multi-resolution icons for the tab. This property is of the TFixedMultiResBitmap type. +A TFixedMultiResBitmap multi-resolution bitmap represents a collection of TFixedBitmapItem bitmap items displayed at different scales. You can create a multi-resolution bitmap with the MultiResBitmap Editor. +Mobile applications need to have images of different scales defined for various devices, such as Retina and non-Retina iOS devices. + + + Property that has the True value when the TTabItem object is selected. +IsSelected is a property of TTabItem that has the Boolean value True if the tab item is selected. Otherwise, it has the Boolean value False. + + + Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + Name of the ressource object, to which the current TStyledControl is linked. +If ShowAsDot is True, the name of the ressource object is "tabdotstyle" and you cannot overwrite it. To use a custom resource object name, first ensure that the value of ShowAsDot is False. +For more information, see TStyledControl.StyleLookup. + + + + + TTabControl is a tab set that has the appearance of notebook dividers. +Use TTabControl to add a control with multiple tab settings to a FireMonkey form. When the current tab changes, the tab control must directly update its contents to reflect the change, in an OnChange event handler. +Disabling a TTabControl object disables all tabs at once. To enable or disable specific tabs, you can programmatically use the Tabs property as in the following code snippet where the tab with the index of 1 is rendered as disabled: + + TabControl1.Tabs[1].Enabled := False; + +Use TTabControl to create rich graphical interfaces with great functionality, such as options and configurations for a specific application. + +Code Examples +FMX.ControlsDemo Sample +FMX.MusicPlayer Sample +FMX.TabSlideTransition Sample + + + The styles names which used for the buttons in the header area + + + Protected getter implementation for the Tabs property. + + + Protected read implementation for the TabCount property. + + + Customizes styles in complex objects. +FMX.TabControl.TTabControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.TabControl.TTabControl.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Initializes the component after the form file has been read into memory. +FMX.TabControl.TTabControl.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Renders the child controls. +FMX.TabControl.TTabControl.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + Realigns tabs according to the number of visible tabs, their sizes and offsets. + + + Performs the alignment of a FireMonkey control. +FMX.TabControl.TTabControl.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.TabControl.TTabControl.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Processes a dialog key. +FMX.TabControl.TTabControl.DialogKey inherits from FMX.Controls.TControl.DialogKey. All content below this line refers to FMX.Controls.TControl.DialogKey. +Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.TabControl.TTabControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Embarcadero Technologies does not currently have any additional information. + + + Used to determine whether the tab buttons take up all the space in the tabs band. +If the FullSize property is PlatformDefault, GetEffectiveFullSize returns True if the style element FullSize is found. Otherwise, GetEffectiveFullSize returns the same as the FullSize property. + + + Tries to find a control using specific coordinates on the screen. +First, the search is performed among the additional buttons in the area of titles. Then, the search is performed among the tab titles. After that, the search goes to the general rules set by its ancestor TControl.ObjectAtPoint. + + + Dispatcher for the OnMouseWheel event. +TTabControl calls MouseWheel in response to mouse wheel rotation while the cursor is over the control. +MouseWheel scrolls between the tab items when there is not enough space to display all tab items. +See TControl.MouseWheel for further details. + + + OnResize event dispatcher. +FMX.TabControl.TTabControl.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Called by UpdateTabBarButtons to update the state of the buttons in the area of the tabs titles. +You can override this method to change the location and the appearance of the buttons in the area of the tabs titles. + +Note: DoUpdateTabBarButtons is called from the UpdateTabBarButtons method; you should not call the DoUpdateTabBarButtons method manually. + + + Executes when the value of the Enabled property changes. + + + Forces to load all styles, measure sizes, build font-glyphs, etc. + + + Disables automatically unloading style, when control is not visible on screen for tree with root AControl. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.TabControl.TTabControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.TabControl.TTabControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Sets the focused tab using the specified transition. +SetActiveTabWithTransition sets the currently active tab to ATab using the specified ATransition and ADirection transition parameters. +ATransition specifies the type of transition used to switch the tab. When ATransition = Slide, then the tab control uses visual animation for the switching action. It means that moving of contents in the switched tabs is animated. +ADirection specifies the direction in which the content of the current active tab is replaced with the content of the specified ATab tab. ADirection is considered only when ATransition = Slide. If ADirection = Normal, then the forward left-to-right tab items switching transition animation is used. If ADirection = Reversed, then the backward right-to-left tab items switching transition animation is used. The default is Normal. +Compare with GotoVisibleTab. + +Note: SetActiveTabWithTransition Does not work on Android. + + + Changes the currently active tab to a new ATab asynchronously. +When the animation ends, callback AOnFinish is called. + +Note: SetActiveTabWithTransitionAsync is required when working on Android. + + + Changes the currently active tab to a new ATab asynchronously. +When the animation ends, callback AOnFinish is called. + +Note: SetActiveTabWithTransitionAsync is required when working on Android. + + + Finishes current tabs transition. + + + Returns the first visible tab from the current tab. +Use the FindVisibleTab method to get the first visible tab of type FindKind. +The first overloaded method calculates the index of the found tab in the Index parameter. Index represents: + +At input, the index of the tab where the search begins. +At output, if the returned value is True, the index of the found tab; otherwise, the old value. +The second overloaded method returns the index of the found tab. Searching starts with the current tab. If the tab is found, it return its index, otherwise it returns -1. + + + Returns the first visible tab from the current tab. +Use the FindVisibleTab method to get the first visible tab of type FindKind. +The first overloaded method calculates the index of the found tab in the Index parameter. Index represents: + +At input, the index of the tab where the search begins. +At output, if the returned value is True, the index of the found tab; otherwise, the old value. +The second overloaded method returns the index of the found tab. Searching starts with the current tab. If the tab is found, it return its index, otherwise it returns -1. + + + Moves the title area of the tabs so that the active tab is visible. +The movement of the tabs is asynchronous. + + + Sets the focused tab using the specified transition. Animation of the switch transition depends on mutual positions of the current focused tab and the specified tab. +GotoVisibleTab switches the active tab to the tab specified by the Index parameter if possible (the tab with the specified Index exists and it is visible). GotoVisibleTab switches the active tab using the switch transition specified by the ATransition and ADirection parameters and taking into account mutual positions of the current active tab and the tab specified by Index. +ATransition specifies the type of transition used to switch the tab. When ATransition = Slide, then the tab control uses visual animation for the switching action. That is, moving of contents in the switched tabs is animated. The default ATransition is Slide. +ADirection specifies the direction in which the content of the current active tab is replaced with the content of the specified Index tab. ADirection is taken into account only when ATransition = Slide. GotoVisibleTab animates switching transitions of tabs taking into account mutual positions of the current active tab and the tab specified by Index: + +When ADirection = Normal. If the destination tab is left of the current active tab (lower Index), then the forward left-to-right switching transition animation of tab items is used. If the tab to display is to the right of the active tab (upper Index), then the backward right-to-left switching transition animation of tab items is used. +When ADirection = Reversed, then the switching transitions uses the opposite animation directions to the described above. +The default ADirection is Normal. +In difference to SetActiveTabWithTransition, the +GotoVisibleTab method animates the switch transition depending on mutual positions of the current focused tab and the specified Index tab. +GotoVisibleTab returns True in case of success and False otherwise. + + + Moves the active tab to the next tab. +Use the Next method to move over to the following tab, if it exists. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the next tab. + + + Moves the active tab to the previous tab. +Use the Previous method to move over to the previous tab, if it exists. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the previous tab. + + + Moves to the first visible tab in the tab control. +Use the First method to set the active tab to the first visible tab in the tab control. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the first tab. + + + Moves to the last visible tab in the tab control. +Use the Last method to set the active tab to the last visible tab in the tab control. +ATransition specifies the type of transition used to switch the tab. +ADirection specifies the direction in which the content of the tab is replaced with the content of the last tab. + + + Deletes a tab from the tab control. +Use the Delete method to delete the tab specified by AIndex from the tab control. + + + Adds a new tab to the tab control. +Use the Add method to create a new tab object and add it to the tab control. The type of the tab object is specified by the TabClass parameter. +If TabClass is nil, the created tab object will have the default type TTabItem. + + + Inserts a new tab on the specified position. +Use the Insert method to create a new tab object and insert it on the position specified by Index. +The type of the tab object is specified by the TabClass parameter. If TabClass is nil, the created tab object will have the default type TTabItem. +The Index parameter is 0-based. + + + Determines whether there is an active tab in the tab control. +HasActiveTab returns True if one of the tabs in the tab control is selected and False otherwise. +The tab control has an active tab if TabIndex is between 0 and TabCount-1. + + + Returns the list of tabs contained in this tab control. + + + Updates the state of the buttons in the area of the tab titles. +UpdateTabBarButtons calls the DoUpdateTabBarButtons method. + + + Specifies the number of tabs that are present on this tab control component. +Read the TabCount property to obtain the number of tab items that this tab control component has. If there are no tabs present, reading the TabCount property obtains 0. + + + Represents the settings for the inertial scrolling that controls the movement in the title area of the tabs. + + + The coordinates of the rectangle where all the tab titles are placed. + + + The size of the area that contains all the tab titles. + + + Offset of the area of the tab headers. + + + Determines whether the transition between tabs is currently running. +TransitionRunning returns True if the transition between tabs is currently running and False otherwise. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the tab buttons take up all the space in the tabs band. +See its getter method GetEffectiveFullSize for further details. + + + Indicates whether the device the application runs on has a touch screen. +When HasTouchScreen is True the device where the application runs on has a touch screen. + + + Specifies the buttons to be displayed in the field names of the tabs. +The set of buttons displayed depends on various factors: the availability of the touch screen, the location of the headers, and the number of tabs. + + + Specifies the currently active tab. +ActiveTab sets or gets the currently active (focused) tab item on the current tab control. + + + Specifies whether the tab buttons occupy all the space in the tabs band. +Set the FullSize property to True in order for the clickable tab buttons to take up all the space in the tabs band. For instance, if you have a tab control component of a fairly large width and only two tabs, then setting FullSize to True will make the two tab buttons span over the entire width of the tab control. +Set FullSize to False to let Delphi automatically adjust the way the tab buttons occupy the space. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Specifies the height, in pixels, of the clickable tabs' captions. +Use the TabHeight property to specify the height, in pixels, of the band that holds all the clickable tab buttons that correspond to individual tabs of this tab control component. + + + Specifies the index of the active tab. +Use the TabIndex property to set or get the index of the tab that is active (focused) on this tab control component. A value of 0 indicates that the first tab is active, while a value of -1 indicates that none of the tabs is active, or there are none present. + + + Specifies the position of the tabs on this TTabControl component. +The default value of the TTabPosition property is PlatformDefault. +Refer to the TTabPosition help topic for the description of the possible tab positions. + + + Occurs immediately after changing the active tab on this tab control component. +Write an OnChange event handler to provide additional functionality when changing the active tab of this tab control component. + + + + + + + + Returns multi view parent width. + + + Returns multi view parent height. + + + Sets size of MultiView in opened state. + + + If controls supports opening and closing, returns size of multiview in opened state. + + + If controls supports opening and closing, returns size of multiview in closed state. + + + Used for making initialization of presentation and storing previous state of MultiView. + + + Used for making finalization of presentation and restoring previous state of MultiView. + + + Defines logic of opening MultiView. Parameter can define speed of opening, if presentation supports it. + + + Defines logic of closing MultiView. Parameter can define speed of opening, if presentation supports it. + + + Used for defining when multi view is beginning to open. if presentation supports animation. + + + Used for defining when multi view is ending moving. if presentation supports animation. + + + Returns should be master button hidden or not + + + Returns badge title of current presentation, which is displayed in design time in right bottom + corner of TMultiView + + + Begins internal process of realign. + + + Ends internal process of realign. + + + Are we in a internal process of realign? + + + Installs presentation + + + Uninstalls presentation + + + Opens MultiView, if presentation supports it. + + + Closes MultiView, if presentation supports it. + + + Is MultiView opened? + + + Is MultiView moving? + + + Refresh position and size of MultiView + + + Does presentation supports openning and closing MultiView? + + + Returns badge title of current presentation, which is displayed in design time in right bottom + corner of TMultiView + + + Size of MultiView in opened state + + + Size of MultiView in closed state + + + Link on MultiView + + + Returns should be master button hidden or not + + + + + The base class for MultiView components. +If you need to create a custom MultiView component, derive it from TCustomMultiView. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the current device. +The GetDevice method returns the current device with TDeviceInfo type. +At design-time, the GetDevice method returns the device of the view that is selected in IDEs View Selector. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.MultiView.TCustomMultiView.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. +FMX.MultiView.TCustomMultiView.ParentChanged inherits from FMX.Controls.Presentation.TPresentedControl.ParentChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ParentChanged. +Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.ParentChanged +FMX.Controls.Presentation.TPresentedControl.AncestorParentChanged + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.MultiView.TCustomMultiView.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + OnResize event dispatcher. +FMX.MultiView.TCustomMultiView.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Sends a PM_ABSOLUTE_CHANGED message to the presentation layer through its presentation proxy. +FMX.MultiView.TCustomMultiView.DoAbsoluteChanged inherits from FMX.Controls.Presentation.TPresentedControl.DoAbsoluteChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoAbsoluteChanged. +Sends a PM_ABSOLUTE_CHANGED message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoAbsoluteChanged. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoAbsoluteChanged + + + Executed right after the value of the Enabled property changes. +FMX.MultiView.TCustomMultiView.EnabledChanged inherits from FMX.Controls.TControl.EnabledChanged. All content below this line refers to FMX.Controls.TControl.EnabledChanged. +Executed right after the value of the Enabled property changes. +The control does not execute EnabledChanged if you assign Enabled the same value that it already has. +EnabledChanged is never executed for effects, which execute EffectEnabledChanged instead. + + See Also +FMX.Controls.TControl.BeforeEffectEnabledChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Embarcadero Technologies does not currently have any additional information. + + + Notifies about the changes of ControlType. +FMX.MultiView.TCustomMultiView.ControlTypeChanged inherits from FMX.Controls.Presentation.TPresentedControl.ControlTypeChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ControlTypeChanged. +Notifies about the changes of ControlType. + + + Writes the state of the component. +FMX.MultiView.TCustomMultiView.WriteState inherits from System.Classes.TComponent.WriteState. All content below this line refers to System.Classes.TComponent.WriteState. +Writes the state of the component. +WriteState is used internally in the component streaming system. It is not necessary to call it directly. +This method expects a TWriter object that is used for storing the state of the component. + + + Reads the state of the component. +FMX.MultiView.TCustomMultiView.ReadState inherits from System.Classes.TComponent.ReadState. All content below this line refers to System.Classes.TComponent.ReadState. +Reads the state of the component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Customizes styles in complex objects. +FMX.MultiView.TCustomMultiView.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.MultiView.TCustomMultiView.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Renders the child controls. +FMX.MultiView.TCustomMultiView.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + Ensures that AComponent is notified that the component is going to be destroyed. +FMX.MultiView.TCustomMultiView.FreeNotification inherits from System.Classes.TComponent.FreeNotification. All content below this line refers to System.Classes.TComponent.FreeNotification. +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates a new instance of TPresentedControl. +FMX.MultiView.TCustomMultiView.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.MultiView.TCustomMultiView.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Verifies whether the component has a master button. +A master button is a UI element that allows you to view or hide the master pane. + + + Verifies whether the component has the detail pane. + + + Retrieves whether the master pane of the current MultiView component has the Presenter. + + + Hides the master pane. +Use this method to hide the master pane. + + + Displays the master pane. +Use this method to display the master pane. + + + Embarcadero Technologies does not currently have any additional information. + + + Verifies whether the master pane is displayed. +Use this method to verify whether the master pane is displayed. The IsShowed method returns the following values: + +true: the master pane is displayed. +false: the master pane is hidden. + + + Removes all controls from the content. + + + Holds the content (child controls) of the MultiView. +MasterContent lists child controls in the master pane and does not list the detail pane. + +Note: The detail pane is referenced by the TargetControl property. + + + Keeps the object providing the presentation of the master pane of the current MultiView component. + + + Refers the custom class for presentations of master panes in MultiView controls. +The user can customize the master pane presentation. You need to set the MultiView control to Custom and declare your own class that descends from TMultiViewPresentation or from other classes declared in the FMX.MultiView.Presentations.pas unit (such as MyPresentationClass). +The custom presentation class should be set in the CustomPresentationClass property. See the Custom Mode subsection in Mobile Tutorial: Using a MultiView Component to Display Alternate Views of Information (iOS and Android). + + + Specifies a datail pane container (such as TPanel) showing elements described in the master pane. +For more information about the master-detail interface, see Mobile Tutorial: Using a MultiView Component to Display Alternate Views of Information (iOS and Android). + +Limitations +See FireMonkey Native iOS Controls: Combining Native iOS Controls With Non-native Controls for more information about the limitations when using native controls. + +Exceptions +Setting TargetControl may raise the following exception: + + + +Exception + +Exception.Message + +Scenarios + + + +EComponentError + + + +TargetControl cannot be a child of TMultiView. + + + +You set a child control of a TMultiView as the TargetControl of that TMultiView. +You set a TMultiView as the TargetControl of itself. + + + Handles appearance options of the master pane in the Popover presentation mode. +In the Popover presentation mode, the master pane is a pop-up menu, which can be displayed or hidden using the master button. +The PopoverOptions property allows you to handle the following options: + +AppearanceDuration: specifies the duration of the pop-up window appearance (in seconds). By default, this property is set to 0.25 s. +PopupHeight: specifies the height of the pop-up window (in pixels). By default, this property is set to 400px. +StyleLookup: specifies the name of the resource object (style) to which this pop-up window is linked. +TintColor: specifies the tint applied to this pop-up window. + + + Allows you to hide or show the master pane. +If your application has no master button, leave the MasterButton property empty. + +Limitations +The master button cannot be used when: + +The button is invisible and if the Mode property is set to Panel presentation mode. That is, the master pane is a "docked panel". +The onClick event handler is not supported. + + + Specifies the presentation mode of the master pane. +The TMultiViewMode type provides the following presentation modes: + + + +Mode + +Master Pane Presentation + + +Drawer + +In the Drawer mode, the master pane can be whether hidden or can slide to overlap the detail pane. + + +Panel + +Master and detail panels are always displayed, independently of a device type and orientation. The master panel is docked to the left or right of the MultiView component. + + +PlatformBehaviour + +An application automatically selects the master pane presentation mode depending on the device type and orientation, as described in the tables in the Platform Dependent Behavior Mode subsection below. + + +Popover + +Pop-up menu. + + +NavigationPane + +Navigation pane. + + +Custom + +The user can customize the master pane presentation. The custom presentation class should be set in the CustomPresentationClass property. For details, see Custom Mode description. + +For detailed information about the presentation modes, see Master Pane Presentation Modes. + +Platform Dependent Behavior Mode +In the PlatformBehaviour mode, you let the application automatically select the master pane presentation mode. In this scenario, the application behavior depends on the device type, orientation, and the operation system version (only for desktop applications) as described in the following tables: +Mobile Applications + + + +Device Type + +Device Orientation + +Master Pane Presentation + + +Phone + +Landscape, Portrait + +Drawer (push/overlap) + + +Tablet + +Landscape + +Docked panel + + +Tablet + +Portrait + +Drawer (push/overlap) + +Desktop Applications + + + +OS Version + +Master Pane Presentation + + +Windows 10 + +Navigation pane + + +Windows 8 or earlier + +Docked panel + + +OS X + +Docked panel + + + Handles appearance options of borders for MultiView components. +TMultiViewBorderOptions defines the Color and Visible properties. + + + Handles appearance options of a shadow that the master pane casts on the detail pane. +With ShadowOptions property, you can handle the following appearance options of the shadow: + +Color: specifies the shadow color. +Enabled: enables or disables the shadow. +Opacity: specifies the opacity level of the shadow. + + + Handles appearance options of the master pane in the Panel presentation mode. +With SplitViewOptions property, you can handle the Placement option. Placement specifies the docked master pane location (left, right, top, or bottom). + + + Handles appearance options of the master pane in the Drawer presentation mode. +The DrawerOptions property handles the following options: + +DurationSliding: specifies the duration of the master pane sliding (in seconds). +Mode: specifies the master pane sliding mode. +Placement: specifies the master pane location (left or right). +TouchAreaSize: specifies the touch area size (in pixels). + + + Handles the appearance options of the master pane in the NavigationPane presentation mode. +With NavigationPaneOptions, you can manage the CollapsedWidth property of the master pane appearance of the current MultiView component. CollapsedWidth specifies the width (in pixels) of the master pane in the NavigationPane presentation mode when it is collapsed. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + The class for MultiView components that allows providing the master-detail interface. +With TMultiView, you can implement a master-detail interface, which can be used for any target platform (such as an iOS, Android, or desktop application). +The TMultiView component provides the interface between the master and detail panes: + +In the master pane, you can display a collection of visual controls, such as edit boxes, labels, lists, and so on. These controls may be linked to the concrete views on the detail pane. +The detail pane displays information about the objects selected in the master pane. Whenever you change the selection in the master pane, the detail pane is updated to show details of the new selection. +For more information, see Mobile Tutorial: Using a MultiView Component to Display Alternate Views of Information (iOS and Android) and FMX.MultiViewDemo sample application. + + + + + + Called right after the adapter of the list view is set. + + + Setter of Adapter. + + + Changes the value of HeightSumsNeedUpdate to True to indicate that the total height of the list view items has changed since the last time that the list view presentation calculated that height. +Subclasses of TAdapterListView that handle the presentation of the list view must change the value of HeightSumsNeedUpdate to False each time that they calculate the total height of the list view items and update the list view presentation accordingly. + + + Called after the items of the adapter change. + + + Called before the items of the adapter might change as a result of filtering or sorting. + + + Called after the items of the adapter might have changed as a result of filtering or sorting. + + + Called when the size of the items of the adapter has changed. + + + Called when the items of the adapter need to be painted again. + + + Called when the view of the specified item of the adapter needs to be recreated. + + + Indicates whether the total height of the list view items has changed since the last time that the list view presentation calculated that height (True) or not (False). +Subclasses of TAdapterListView that handle the presentation of the list view must change the value of HeightSumsNeedUpdate to False each time that they calculate the total height of the list view items and update the list view presentation accordingly. + + + Object that handles all interactions between the list view control and its list view items. + + + + + + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ListView.TListViewBase.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Returns True if in edit mode. + + + Used internally by presentation hook. + + + Used internally by presentation hook. + + + Used internally by presentation hook. + + + Invoked when the Edit mode is being changed. +If the Edit mode requires a different appearance, this is where an update of appearances needs to be initiated. + + + Returns True if each list view item contains one or more buttons, or False otherwise. + + + Returns True if the list view supports a mode where you can select list view items to delete, or False otherwise. + + + Returns True if the list view supports a mode where you can select list view items using checkboxes, or False otherwise. + + + Stops edit mode transition animation. + + + Initializes edit mode transition animation. + + + Stops delete mode transition animation. + + + Initializes delete mode transition animation. + + + Updates the layout to place a Delete button. + + + Deletes the item. + + + This method is invoked when the value of the ScrollStretchStrength property is changed (UpdateScrollStretchStrength). + + + Specifies the scroll stretch value when the PullToRefresh property is invoked. + + + Setter function for the SelectionCrossfade property. + + + Getter for the DeleteButtonText property. + + + Setter function for the DeleteButtonText property. + + + Setter function for the PullToRefresh property. + + + Setter function for the ControlType property. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter function for the NativeOptions property. + + + Implements the IListViewController.GetEditModeTransitionAlpha method. +The GetEditModeTransitionAlpha method of TListViewBase implements the GetClientMargins method of IListViewController. + + + Implements the IListViewController.GetDeleteModeTransitionAlpha method. +The GetDeleteModeTransitionAlpha method of TListViewBase implements the GetDeleteModeTransitionAlpha method of IListViewController. + + + Embarcadero Technologies does not currently have any additional information. + + + Implements the IListViewController.GetItemEditOffset method. +The GetItemEditOffset method of TListViewBase implements the GetItemEditOffset method of IListViewController + + + Implements the IListViewController.GetItemDeleteCutoff method. +The GetItemDeleteCutoff method of TListViewBase implements the IListViewController.GetItemDeleteCutoff method of IListViewController. + + + Implements the IListViewController.GetClientMargins method. +The GetClientMargins method of TListViewBase implements the GetClientMargins method of IListViewController. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns list of images. +Can be nil. + + + Returns list of images. +Can be nil. + + + Hook for the IListViewController.RequestReindexing. + + + Hook for the IListViewController.ItemResized. + + + Notifies the TListView that the item requires repainting. + + + Notifies the TListView that a control inside of an item is clicked. + + + Notifies the TListView that an item is clicked. + + + Declares the zero-based index of an image. +If you use a non-existent index to access an image in the images list, then no image is retrieved and no exception is raised. The usual default value is -1. + + + Declares the setter for ImageIndex. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Implements the IListItemStyleResources.GetStyleResources method. +The GetStyleResources method of TListViewBase implements the GetStyleResources method of IListItemStyleResources. + + + Implements the IListItemStyleResources.StyleResourcesNeedUpdate method. +The StyleResourcesNeedUpdate method of TListViewBase implements the StyleResourcesNeedUpdate method of FMX.ListView.Types.IListItemStyleResources. + + + Protected setter implementation for the ItemSpaces property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + Renders the list view. + + + Restores Canvas properties after the painting process. +FMX.ListView.TListViewBase.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + Initializes the component after the form file has been read into memory. +FMX.ListView.TListViewBase.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + OnMouseDown event dispatcher. +FMX.ListView.TListViewBase.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.ListView.TListViewBase.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.ListView.TListViewBase.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + OnMouseWheel event dispatcher. +FMX.ListView.TListViewBase.MouseWheel inherits from FMX.Controls.TControl.MouseWheel. All content below this line refers to FMX.Controls.TControl.MouseWheel. +OnMouseWheel event dispatcher. +A control calls MouseWheel in response to any of mouse wheel messages, decoding the message parameters into the shift-key state, wheel rotation, and handle, which it passes in the Shift, WheelDelta, and Handled parameters, respectively: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +Handled indicates whether the scroll bar was already moved, depending on the WheelDelta value. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the rolling on the other scroll bar, if it exists. +Override the protected MouseWheel method to provide other responses when the mouse wheel is rotated while the cursor is over the control. + + + Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.ListView.TListViewBase.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + Returns the control in which a specified point can be found. +FMX.ListView.TListViewBase.ObjectAtPoint inherits from FMX.Controls.TControl.ObjectAtPoint. All content below this line refers to FMX.Controls.TControl.ObjectAtPoint. +Returns the control in which a specified point can be found. +P is the specified point in the object. +ObjectAtPoint returns the control in which the P point is found. +To start searching within the current control, the control must be visible and enabled. If P is within a child of the control and the child is also a control, the search continues inside the child. +If P is inside the control (not within a child) and the control can be hit, then ObjectAtPoint returns the control. +ObjectAtPoint is used internally. + + + OnMouseLeave event dispatcher. +FMX.ListView.TListViewBase.DoMouseLeave inherits from FMX.Controls.TControl.DoMouseLeave. All content below this line refers to FMX.Controls.TControl.DoMouseLeave. +OnMouseLeave event dispatcher. +DoMouseLeave is called automatically when the mouse pointer leaves the control's area. +DoMouseLeave starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to background the control. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the control's area. + + + OnResize event dispatcher. +FMX.ListView.TListViewBase.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.ListView.TListViewBase.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Customizes styles in complex objects. +FMX.ListView.TListViewBase.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.ListView.TListViewBase.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Forces the repainting of the surface of the rectangle holding this list view component. + + + Realigns and repaints the ListView. + + + OnExit event dispatcher. +FMX.ListView.TListViewBase.DoExit inherits from FMX.Controls.TControl.DoExit. All content below this line refers to FMX.Controls.TControl.DoExit. +OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + Responds to changing the visibility or appearance of the list view component and also to changing the indexes of list items. +The DoChange method also fires an OnChange event. + + + Handles the TDelayedIncident.ChangeRepainted incident. + + + Invokes the OnItemChange handler. + + + Invokes the OnListItemClick handler. + + + Invokes the OnEditModeChange handler. + + + Responds to entering of the list view into edit mode. +The DoEditModeChanging method also fires an OnEditModeChanging event. + + + Called at the end of the animation that plays when the edit mode is toggled. + + + Updates the scrolling limits and animation boundaries. + + + Called before the items of the adapter might change as a result of filtering or sorting. +FMX.ListView.TListViewBase.DoItemsMayChange inherits from FMX.ListView.TAdapterListView.DoItemsMayChange. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsMayChange. +Called before the items of the adapter might change as a result of filtering or sorting. + + See Also +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsInvalidate +FMX.ListView.TAdapterListView.DoItemsResize + + + Called after the items of the adapter might have changed as a result of filtering or sorting. +FMX.ListView.TListViewBase.DoItemsCouldHaveChanged inherits from FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged. +Called after the items of the adapter might have changed as a result of filtering or sorting. + + See Also +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsResize +FMX.ListView.TAdapterListView.DoItemsInvalidate + + + Called when the items of the adapter need to be painted again. +FMX.ListView.TListViewBase.DoItemsInvalidate inherits from FMX.ListView.TAdapterListView.DoItemsInvalidate. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsInvalidate. +Called when the items of the adapter need to be painted again. + + See Also +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsResize +FMX.Controls.TControl.Repaint + + + Called after the items of the adapter change. +FMX.ListView.TListViewBase.DoItemsChange inherits from FMX.ListView.TAdapterListView.DoItemsChange. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsChange. +Called after the items of the adapter change. + + See Also +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsInvalidate +FMX.ListView.TAdapterListView.DoItemsResize + + + Called right after the adapter of the list view is set. +FMX.ListView.TListViewBase.DoAdapterSet inherits from FMX.ListView.TAdapterListView.DoAdapterSet. All content below this line refers to FMX.ListView.TAdapterListView.DoAdapterSet. +Called right after the adapter of the list view is set. + + + Deletes an item. + + + Delets a specific item. +It is called from DeleteItem + + + Returns the area available for item layout. + + + Returns the size of the item. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Notify observers about the selection change. + + + Returns True if this ListView should handle input events. + + + Dispatches the OnUpdatingItemView event. +DoUpdatingItemView receives the following parameters: + +AListItem is the target list view item. +AHandled determines whether the event handler of OnUpdatingItemView takes care of updating the appearance of the list view item (True) or DoUpdatingItemView must update the appearance of the list view item instead (False). +DoUpdatingItemView passes itself (as the Sender parameter) and the received AListItem and AHandled parameters to the event handler of OnUpdatingItemView. + + + Dispatches the OnUpdateItemView event. +DoUpdateItemView receives a single parameter, AItem, which is the target list view item. +DoUpdateItemView passes itself (as the Sender parameter) and the received AItem to the event handler of OnUpdateItemView. + + + Gets the glyph button for item Index. + + + Occurs before the item view is updated (before calling ResetObjects). + + + Occurs after the item view is updated (after calling ResetObjects). + + + Occurs immediately after the list view component enters the edit mode. +Write an OnEditModeChange event handler to provide additional functionality after entering the edit mode. +OnEditModeChange is an event of type TNotifyEvent. + + + Occurs immediately before the list view component enters the edit mode. +Write an OnEditModeChanging event handler to provide additional functionality before entering the edit mode. +OnEditModeChanging is an event of type TNotifyEvent. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.ListView.TListViewBase.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListView.TListViewBase.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Marks the end of an update session of the control and its children. +FMX.ListView.TListViewBase.EndUpdate inherits from FMX.Controls.TControl.EndUpdate. All content below this line refers to FMX.Controls.TControl.EndUpdate. +Marks the end of an update session of the control and its children. +The update session must be started first by calling BeginUpdate. +EndUpdate decreases the FUpdating semaphore. If all update sessions end and FUpdating is 0, EndUpdate invokes Realign to process layout changes. + + See Also +FMX.Controls.TControl.FUpdating +FMX.Controls.TControl.BeginUpdate +FMX.Controls.TControl.IsUpdating +FMX.Controls.TControl.Realign + + + Re-creates the list and updates visible item content when using native presentation. + + + Scrolls the view instantly (without scrolling effect) to the desired item, placing it in the view. +Use the ScrollTo method in order to immediately scroll, without a slow scrolling graphical effect, to the item specified through its index (the AItemIndex parameter), and place it in the view. + + + Specifies the index of the selected item in this list view component. + + + List item that is currently selected on the list view. +This property is nil if no item is selected. +To use Selected as an instance of Appearances.TListViewItem, you must cast it as such: + + +Delphi: + +SelectedItemText := TListViewItem(TListView1.Selected).Text; + + + +C++: + +SelectedItemText = ((TListViewItem*)(TListView1->Selected))->Text; + + + Specifies the position of the vertical scroll in the list. Setting ScrollViewPos to 0 scrolls the list view to its top. + + + Returns a TRectF that surrounds the specified item. +The GetItemRect method returns a rectangle with floating-point coordinates (TRectF) that surrounds the item specified through its index (the AItemIndex parameter). + + + StopPullRefresh is a boolean method. It should be called when the "pull to refresh" mode has been triggered to stop the spinning wheel. +StopPullRefresh can be set to + +True, as result the spinning wheel does not disappear automatically and StopPullRefresh method needs to be called after the refresh operation is done. +False (default value), as result the spinning wheel disappears automatically shortly after triggering the effect. +Note: This works only in native IOS control and only when the PullRefreshWait property is set to True. + + + Specifies the space in logical units around the content of each list item. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Specifies the space in logical units on all sides around the list box, encompassing the items. + + + Specifies whether this list view control is transparent or not. When the control is transparent (Transparent is set to True), its background will not be drawn. + + + Specifies whether the items are selectable or not. +The AllowSelection property specifies whether the items are selectable or not. + +Tip: If items are not selectable, you will still be able to click on the embedded controls. + + + Specifies whether the fill colors for odd and even elements are rendered as alternating or not. +The AlternatingColors property specifies whether the background of the individual items in the list should appear rendered in alternating colors. + + + Determines whether the selection is visible when selecting list view items. The ShowSelection property can be disabled when the list view has check boxes. + + + Sets the swipe-to-delete feature on list view items. +CanSwipeDelete specifies that a swipe gesture on individual list view items enables the end user to choose either to delete or retain the item. +When this feature has been enabled in the Object Inspector, and the end user swipes an item in a listview, the user has the opportunity to delete the item: a Delete button temporarily appears on the item. The user can then click the Delete button to delete the item from the listview, or can release the swipe to retain the item in the list view. + +Tip: When you swipe an item, this item shows the same behavior and appearance as a list item selected when your list view is in edit mode. For a preview of this appearance, see TPublishedAppearance.ItemEditAppearance. +The swipe-to-delete feature is supported on mobile apps (iOS and Android), as well as desktop apps (Windows and OS X) when touch input is available. + + + Specifies whether tapping on the topmost side of this list view automatically scrolls to the top of the list. +Set the AutoTapScroll property to True in order to allow for automatically scrolling to the top of the list when tapping with your finger on the topmost region of this list view component. Set AutoTapScroll to False in order to disable this feature. + + + Specifies the threshold value for the auto tap scrolling. + + + Specifies whether scrolling this list view using the mouse wheel works or not. +Set the DisableMouseWheel property to False to allow scrolling this list view using the mouse wheel. Set DisableMouseWheel to True to disable this feature. + + + Specifies the number of items in this list view component. ItemCount is a read-only property. +Read the ItemCount property in order to obtain the number of list items in this list view component. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs immediately after clicking an item from the list view. OnItemClickEx also receives mouse coordinates inside the clicked item. +Write an OnItemClickEx event handler to respond to clicking an item from the list view component. +It is safe to modify the contents of the list view in the OnItemClickEx event handler (you may add, remove, update or change the order of list view items). If you do not need to do that, you can also use OnItemClick event handler. It is safe to modify the content of the items themselves in both of those handlers. +The OnItemClickEx event handler receives the following parameters: + + + +Parameter + +Description + + + +Sender + + + +The instance of TCustomListView to which the clicked item belongs. + + + + +ItemIndex + + + +The index of the clicked item. + + + + +LocalClickPos + + + +The coordinates of the click. + + + + +ItemObject + + + +The instance of TListItemObject that you click on. + + + Occurs immediately after changing the selected item from the list view. +Write an OnItemChange event handler to respond when changing the selected item in the list view component. +OnItemChange is an event of type TItemEvent. + + + Occurs when the ItemIndex property changes as a result of a user selecting a different item. +Write an OnChange event handler to respond to changes of the ItemIndex property. OnChange allows a response once the list has been successfully changed. +OnChange is an event of type TNotifyEvent. If you want to wait for the list to be repainted to reflect the change, see OnChangeRepainted. + +Note: The OnChange event does not occur when you change the ItemIndex property from code. That is the intended functionality. If you want to replicate the behaviour of a user selecting a different item, call OnChange explicitly. + + + Occurs when the ItemIndex property changes as a result of a user selecting a different item. +Write an OnChangeRepainted event handler to respond to changes of the ItemIndex property. OnChangeRepainted allows a response once the list has been successfully changed and repainted. +OnChangeRepainted is an event of type TNotifyEvent. If you do not need to wait for the list to be repainted to reflect the change, see OnChange. + +Note: The OnChangeRepainted event does not occur when you change the ItemIndex property from code. That is the intended functionality. If you want to replicate the behaviour of a user selecting a different item, call OnChangeRepainted explicitly. + + + Event that occurs after a list of items has been changed. + + + This method is called when ScrollViewPos has changed as a result of scrolling a list or doing it manually in the code. + + + Occurs when a user requests the deletion of a list view item, before this deletion takes place. You can define an event handler for this event to prevent the deletion from actually happening based on your own criteria. +Event handlers for this event must expect the following parameters: + +Sender, the list view. +AIndex, the index of the list view item to be deleted. +ACanDelete, variable that determines whether the list view item is to be deleted or not. +To prevent the deletion from happening, set ACanDelete to False in your event handler. +The code snippet below shows a dialog box asking for confirmation before deleting an item. If you click Cancel, ACanDelete is set to False, canceling the list view item deletion: + + +Delphi: + +procedure TMainForm.ListViewDeletingItem(Sender: TObject; AIndex: Integer; var ACanDelete: Boolean); +var + Input: Integer; +begin + Input := TDialogServiceSync.MessageDialog( + 'Are you sure that you want to remove "' + + (Sender as TListView).Items[AIndex].Text + '" from the list?', + TMsgDlgType.mtConfirmation, mbOKCancel, TMsgDlgBtn.mbOK, 0); + if Input = 2 then // Cancel + ACanDelete := False; +end; + + + +C++: + +void __fastcall TMainForm::ListViewDeletingItem(TObject *Sender, int AIndex, bool &ACanDelete) +{ + TListView* list = reinterpret_cast<TListView*>(Sender); + int input = TDialogServiceSync::MessageDialog( + "Are you sure that you want to remove \"" + + list->Items->Item[AIndex]->Text + "\" from the list?", + TMsgDlgType::mtConfirmation, mbOKCancel, TMsgDlgBtn::mbOK, 0); + if (input == 2) { // Cancel + ACanDelete = false; + } +} + + + Occurs when a user requests the deletion of a list view item, after this deletion takes place. To catch the deletion before it takes place and be able to prevent it from actually happening, write an event handler for OnDeletingItem instead. +Event handlers for this event must expect the following parameters: + +Sender, the list view. +AIndex, the index of the list view item that has been deleted. +Note: You cannot access the data of the deleted item at this point, since a different item is now using that index in the list view. Write an event handler for OnDeletingItem instead if you need to access information about the deleted item. +The code snippet below updates the text in a status bar after an item is deleted to show the position of the deleted item, as well as the number of remaining items in the list: + + +Delphi: + +procedure TMainForm.ListViewDeleteItem(Sender: TObject; AIndex: Integer); +begin + StatusBar.Text := 'Item ' + IntToStr(AIndex+1) + ' has been removed from the list. ' + + IntToStr((Sender as TListView).Items.Count) + ' items remaining.'; +end; + + + +C++: + +void __fastcall TMainForm::ListViewDeleteItem(TObject *Sender, int AIndex) +{ + TListView* list = reinterpret_cast<TListView*>(Sender); + MainForm->StatusBar->Text = "Item " + UnicodeString(AIndex+1) + " has been removed from the list. " + + UnicodeString(list->Items->Count) + " items remaining."; +} + + + Occurs when the visibility of the Delete button of a list item changes. +This event only works when you hide or show the Delete button displayed after a swipe gesture. It does not work when you hide or show the Delete button of a list item when your list view is in edit mode and your list uses an edit mode item appearance of type "Delete". +Sender is the list view and AValue determines whether the Delete button was hidden (False) and now is visible, or it was visible (True) and now is hidden. +For example, the following event handler fills a status bar with a tip when a Delete button is shown on a list item, and removes that tip from the status bar as soon as the Delete button is hidden again: + + +Delphi: + +procedure TMainForm.ListViewDeleteChangeVisible(Sender: TObject; AValue: Boolean); +begin + if (AValue = False) then + StatusBar.Text := 'Click "Delete" to remove the target item from the list.' + else + StatusBar.Text := ''; +end; + + + +C++: + +void __fastcall TMainForm::ListViewDeleteChangeVisible(TObject *Sender, bool AValue) +{ + if (AValue) { + MainForm->StatusBar->Text = "Click \"Delete\" to remove the target item from the list."; + } else { + MainForm->StatusBar->Text = ""; + } +} + + + Occurs when the search box in a list view loses the focus and its content has changed since it gained the focus. This event exposes the OnChange event of the TSearchBox that implements the search box of a list view. +For example, the code snippet below updates the text in a status bar on this event to show the number of items left in the list after the specified filter is applied: + + +Delphi: + +procedure TMainForm.ListViewSearchChange(Sender: TObject); +var + I: Integer; + SearchBox: TSearchBox; + List: TListView; +begin + List := Sender as TListView; + for I := 0 to List.Controls.Count-1 do + if List.Controls[I].ClassType = TSearchBox then + begin + SearchBox := TSearchBox(List.Controls[I]); + Break; + end; + StatusBar.Text := IntToStr(List.Items.Count) + ' list items match ' + QuotedStr(SearchBox.Text) + '.'; +end; + + + +C++: + +void __fastcall TMainForm::ListViewSearchChange(TObject *Sender) +{ + TSearchBox* searchBox; + TListView* list = reinterpret_cast<TListView*>(Sender); + for (int i = 0; i < list->Controls->Count; i++) { + searchBox = dynamic_cast<TSearchBox*>(list->Controls->Items[i]); + if (searchBox) break; + } + MainForm->StatusBar->Text = UnicodeString(list->Items->Count) + " list items match " + QuotedStr(searchBox->Text) + "."; +} + + + Occurs when a search box filters. +Write an event handler for OnFilter to set a custom search filter for TSearchBox. +The OnFilter event with the TFilterEvent type has the following parameters: + + + +Parameter + +Description + + +Sender + +The object whose event handler is called. + + +AFilter + +The string being filtered among the different items (AValue parameter). + + +AValue + +The string of the item where the search of AFilter is being performed. + + +Accept + +Boolean parameter to use when there is a filter condition. +Use Accept to add a filter condition; if a value is filtered by the filter condition, Accept must be True. + + + +For example, the below code snippet adds a custom filter to force the item (AValue) to start with the string being filtered (AFilter): + + +Delphi: + +procedure TForm2.ListView1Filter(Sender: TObject; const AFilter, AValue: string; + var Accept: Boolean); +begin + Accept := AValue.StartsWith(AFilter, True); +end; + + + +C++: + +void __fastcall TForm1::ListView1Filter(TObject *Sender, const UnicodeString AFilter, + const UnicodeString AValue, bool &Accept) +{ + Accept = StartsStr(AFilter.LowerCase(), AValue.LowerCase()); +} + + +Note: Enable the SearchVisible property to show the search box on top of your list view. + + + Occurs when a user pulls down the item list. +Write an event handler for OnPullRefresh to specify what happens when you pull down the list of items. + +Note: For this event to occur, you should set the PullToRefresh property to true. + + + Specifies the name of the Delete button designed to delete the TListView items. +This button can be displayed if the CanSwipeDelete property is set True. + + + Specifies whether this list view component is in the edit mode (True) or in the regular mode (False). +On some platforms, the list view shows an animation when the value of the EditMode property changes at run time. + + + Set SearchVisible to True to show a search box on top of your list view +Shows a search box on top of your list view that can filter the content of the list. +To access the search box control from code, simply loop trough the controls of your list view until you find an instance of TSearchBox. For an example, see the code snippet at FMX.ListView.TListViewBase.OnSearchChange. + + + Search box partially hidden in a list view where SearchAlwaysOnTop is False +Your list view component keeps the search box on top as you scroll. If SearchAlwaysOnTop is False, the search box behaves as a list item: scrolling down the list hides the search box, and you must scroll up to show the search box again. +SearchAlwaysOnTop has no effect if SearchVisible is False. +SearchAlwaysOnTop is supported only on the iOS platform. + + + Enables the selection of Crossfade animation . + + + Determines whether the "pull list to refresh" feature is enabled. +When this property is set to true, the Pull-to-Refresh feature is enabled and the end user can pull down a list view to refresh the contents. +To enable the Pull-to-Refresh feature, select the TListView component in the Form Designer, and do the following: + +On the Properties page of the Object Inspector, set the PullToRefresh property to true. +Open the Events page, and double-click the right-hand column for OnPullRefresh. +When the Code Editor opens, you can implement the OnPullRefresh event handler. In this event handler, you can specify how to refresh the list view. For example, you might update existing list items, add new items, or delete specified items. +Note: In the case of native iOS controls, you can use the PullRefreshWait property to set whether the animated spinning indicator disappears automatically, or if it disappears when you call StopPullRefresh. + + + Determines if the spinning wheel disappears automatically or not. +When set to True, the spinning wheel does not disappear automatically and you have to call the StopPullRefresh method after doing a refresh operation. If PullRefreshWait is set to False (default), then the spinning wheel disappears automatically shortly after triggering the effect. This option only works in native iOS controls and does not have effect otherwise. + +Note: You must set the PullToRefresh property to True to use PullRefreshWait. + + + Describes if the Control type is Styled or Native. + + + Set of properties to customize the appearance and behavior of the list view when ControlType is Platform. +This group of properties provides the subproperties described in the following table. All subproperties are disabled by default. + + + +Subproperty + +Description + + + +Grouped + + + +Make cells use a grouped style. The grouped style is the style that the list of iOS settings uses. + + + +False + +True + + + + + + + + + +Indexed + + + +Shows an index on the right-hand side of the list with the first letter of each header. You may tap a letter to navigate to the header that the letter represents. +If you want to display something other than the first letter of each header, use the IndexTitle of each header item to define a custom text to show for that header. Long index titles may hide important information behind them, use no more than few characters. + + + +False + +True + + + + + + + + + +Styled + + + +Make the native presentation use the style settings defined in your list view control for the following aspects of your list view: + +Font +Text color and selected text color +Text alignment, both vertical and horizontal +Word wrapping and trimming +You cannot customize any other aspects of the native presentation of a list view. If you need to customize your list view further, change ControlType to Styled to use the regular FireMonkey presentation instead. + + + +False + +True + +ControlType: Styled + + + + + + + + Executes the specified procedure as long as there is no other call to ExecuteInterlocked in progress called from a separate thread. If there is a call to ExecuteInterlocked in progress, the specified procedure is never executed. + + + Returns True if the underlying data model allows the presentation layer to select the specified item; it returns False otherwise. + + + Returns True if the underlying data model allows the presentation layer to unselect the specified item; it returns False otherwise. + + + The presentation layer executes this method to indicate that it has selected the specified item. + + + The presentation layer executes this method to indicate that it has unselected the specified item. + + + Notification method called after the creation order is changed. +FMX.ListView.TPresentedListView.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + Executed right after the value of the Parent property changes. +FMX.ListView.TPresentedListView.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Renders the child controls. +FMX.ListView.TPresentedListView.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. +FMX.ListView.TPresentedListView.AncestorVisibleChanged inherits from FMX.Controls.TControl.AncestorVisibleChanged. All content below this line refers to FMX.Controls.TControl.AncestorVisibleChanged. +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged + + + Used internally by presentation hook. + +Used internally by presentation hook. + + + Responds to entering of the list view into edit mode. +The DoEditModeChange method also fires an OnEditModeChange event. + + + This virtual method is called inmediately after a list of items has been changed. + + + Called when the items of the adapter need to be painted again. +FMX.ListView.TPresentedListView.DoItemsInvalidate inherits from FMX.ListView.TAdapterListView.DoItemsInvalidate. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsInvalidate. +Called when the items of the adapter need to be painted again. + + See Also +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsResize +FMX.Controls.TControl.Repaint + + + Notifies the TListView that the item requires repainting. +FMX.ListView.TPresentedListView.DoItemInvalidated inherits from FMX.ListView.TListViewBase.DoItemInvalidated. All content below this line refers to FMX.ListView.TListViewBase.DoItemInvalidated. +Notifies the TListView that the item requires repainting. + + + Notifies the TListView that a control inside of an item is clicked. +FMX.ListView.TPresentedListView.DoCheckStateChanged inherits from FMX.ListView.TListViewBase.DoCheckStateChanged. All content below this line refers to FMX.ListView.TListViewBase.DoCheckStateChanged. +Notifies the TListView that a control inside of an item is clicked. + + + Used internally by presentation hook. + +Used internally by presentation hook. + + + Used internally by presentation hook. + +Used internally by presentation hook. + + + Delets a specific item. +FMX.ListView.TPresentedListView.DoDeleteItem inherits from FMX.ListView.TListViewBase.DoDeleteItem. All content below this line refers to FMX.ListView.TListViewBase.DoDeleteItem. +Delets a specific item. +It is called from DeleteItem + + + Called at the end of the animation that plays when the edit mode is toggled. +FMX.ListView.TPresentedListView.DoResetEditModeAnimation inherits from FMX.ListView.TListViewBase.DoResetEditModeAnimation. All content below this line refers to FMX.ListView.TListViewBase.DoResetEditModeAnimation. +Called at the end of the animation that plays when the edit mode is toggled. + + + Updates the scrolling limits and animation boundaries. +FMX.ListView.TPresentedListView.DoUpdateScrollingLimits inherits from FMX.ListView.TListViewBase.DoUpdateScrollingLimits. All content below this line refers to FMX.ListView.TListViewBase.DoUpdateScrollingLimits. +Updates the scrolling limits and animation boundaries. + + + Embarcadero Technologies does not currently have any additional information. + + + Notification that indicates that the ancestor of the TPresentedControl class loaded the presentation. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns True if this ListView should handle input events. + +FMX.ListView.TPresentedListView.ShouldHandleEvents inherits from FMX.ListView.TListViewBase.ShouldHandleEvents. All content below this line refers to FMX.ListView.TListViewBase.ShouldHandleEvents. +Returns True if this ListView should handle input events. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Implements the IListViewPresentationParent.GetAdapter method. +The GetAdapter method of TPresentedListView implements the GetAdapter method of IListViewPresentationParent. + + + Implements the IListViewPresentationParent.GetItemText method. +The GetItemText method of TPresentedListView implements the GetItemText method of IListViewPresentationParent. + + + Implements the IListViewPresentationParent.GetItemIndexTitle method. +The GetItemIndexTitle method of TPresentedListView implements the GetItemIndexTitle method of IListViewPresentationParent. + + + Implements the IListViewPresentationParent.ItemButtonClicked method. +The ItemButtonClicked method of TPresentedListView implements the ItemButtonClicked method of IListViewPresentationParent. + + + Implements the IListViewPresentationParent.InvokePullRefresh method. +The InvokePullRefresh method of TPresentedListView implements the InvokePullRefresh method of IListViewPresentationParent + + + Implements the IListViewPresentationParent.SetSearchFilter method. +The SetSearchFilter method of TPresentedListView implements the SetSearchFilter method of IListViewPresentationParent. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets a Boolean flag that indicates a native view is being created. It is used as a guard condition to prevent TListView logic from interfering with the presentation while a view is being initialized. + + + It is True if the TListView is transparent. + + + Gets to control opacity. + + + Gets the background color defined by the TListView style. + + + Called when the size of the items of the adapter has changed. +FMX.ListView.TPresentedListView.DoItemsResize inherits from FMX.ListView.TAdapterListView.DoItemsResize. All content below this line refers to FMX.ListView.TAdapterListView.DoItemsResize. +Called when the size of the items of the adapter has changed. + + See Also +FMX.ListView.TAdapterListView.DoItemsMayChange +FMX.ListView.TAdapterListView.DoItemsChange +FMX.ListView.TAdapterListView.DoItemsCouldHaveChanged +FMX.ListView.TAdapterListView.DoItemsInvalidate + + + It is True if a design presentation is attached. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.ListView.TPresentedListView.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs any necessary actions before the first destructor is called. +Performs any necessary actions before the first destructor is called. +FMX.ListView.TPresentedListView.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Forces the current control to recalculate its enabled state. +FMX.ListView.TPresentedListView.RecalcEnabled inherits from FMX.Controls.TControl.RecalcEnabled. All content below this line refers to FMX.Controls.TControl.RecalcEnabled. +Forces the current control to recalculate its enabled state. RecalcEnabled also forces the control's children to recalculate their enabled state. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + OnResize event dispatcher. +FMX.ListView.TPresentedListView.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Renders the list view. + + + Recreates the list and updates the visible items content in native presentation. +When using native presentation, RebuildList recreates the list and updates the visible items content. +To use the native presentation, you must set the ControlType property to Platform. + + + This method should be called when 'pull to refresh' mode has been triggered to stop the spinning wheel. +StopPullRefresh has only effect in native iOS control and only when the PullRefreshWait property is set to True. + + + Forces the current control to recalculate its Opacity property. +FMX.ListView.TPresentedListView.RecalcOpacity inherits from FMX.Controls.TControl.RecalcOpacity. All content below this line refers to FMX.Controls.TControl.RecalcOpacity. +Forces the current control to recalculate its Opacity property. RecalcOpacity also forces the control's children to recalculate their Opacity property. + + + + + + + + Customizes styles in complex objects. +FMX.ListView.TAppearanceListView.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Handler of the TAppearanceListViewItems.OnNotify property. + + + The TAppearanceListView needs adapter to be the TAppearanceListViewItems or derivative. +If the TAppearanceListView is used with a custom adapter, use the Items property to set it instead of the Adapter property of the base class. + + + Called when the view of the specified item of the adapter needs to be recreated. +FMX.ListView.TAppearanceListView.DoResetView inherits from FMX.ListView.TAdapterListView.DoResetView. All content below this line refers to FMX.ListView.TAdapterListView.DoResetView. +Called when the view of the specified item of the adapter needs to be recreated. + + + Returns True if each list view item contains one or more buttons, or False otherwise. +FMX.ListView.TAppearanceListView.HasButtonsInCells inherits from FMX.ListView.TListViewBase.HasButtonsInCells. All content below this line refers to FMX.ListView.TListViewBase.HasButtonsInCells. +Returns True if each list view item contains one or more buttons, or False otherwise. + + See Also +FMX.ListView.TListViewBase.CanSwipeDelete +FMX.ListView.TListViewBase.EditMode +FMX.ListView.TListViewBase.HasCheckboxMode +FMX.ListView.TListViewBase.HasDeletionEditMode +FMX.ListView.TListViewBase.PullRefreshWait +FMX.ListView.TListViewBase.PullToRefresh +FMX.ListView.TListViewBase.SearchAlwaysOnTop +FMX.ListView.TListViewBase.SearchVisible +FMX.Controls.TControl.Enabled +FMX.Controls.TControl.Visible + + + Returns True if the list view supports a mode where you can select list view items to delete, or False otherwise. +FMX.ListView.TAppearanceListView.HasDeletionEditMode inherits from FMX.ListView.TListViewBase.HasDeletionEditMode. All content below this line refers to FMX.ListView.TListViewBase.HasDeletionEditMode. +Returns True if the list view supports a mode where you can select list view items to delete, or False otherwise. + + See Also +FMX.ListView.TListViewBase.CanSwipeDelete +FMX.ListView.TListViewBase.EditMode +FMX.ListView.TListViewBase.HasButtonsInCells +FMX.ListView.TListViewBase.HasCheckboxMode +FMX.ListView.TListViewBase.PullRefreshWait +FMX.ListView.TListViewBase.PullToRefresh +FMX.ListView.TListViewBase.SearchAlwaysOnTop +FMX.ListView.TListViewBase.SearchVisible +FMX.Controls.TControl.Enabled +FMX.Controls.TControl.Visible + + + Returns True if the list view supports a mode where you can select list view items using checkboxes, or False otherwise. +FMX.ListView.TAppearanceListView.HasCheckboxMode inherits from FMX.ListView.TListViewBase.HasCheckboxMode. All content below this line refers to FMX.ListView.TListViewBase.HasCheckboxMode. +Returns True if the list view supports a mode where you can select list view items using checkboxes, or False otherwise. + + See Also +FMX.ListView.TListViewBase.CanSwipeDelete +FMX.ListView.TListViewBase.EditMode +FMX.ListView.TListViewBase.HasButtonsInCells +FMX.ListView.TListViewBase.HasDeletionEditMode +FMX.ListView.TListViewBase.PullRefreshWait +FMX.ListView.TListViewBase.PullToRefresh +FMX.ListView.TListViewBase.SearchAlwaysOnTop +FMX.ListView.TListViewBase.SearchVisible +FMX.Controls.TControl.Enabled +FMX.Controls.TControl.Visible + + + Setter of ItemHeight. + + + Setter of ItemEditHeight. + + + Setter of HeaderHeight. + + + Setter of FooterHeight. + + + Returns the list view item that is located at the specified index of the list of items. + + + Returns the height of the list view item that has the specified index in the list of items, or the value of ItemHeight if you do not specify any index. + + + Returns the height of the list view item that has the specified index in the list of items, or the value of ItemHeight if you do not specify any index. + + + Getter of ItemEditHeight. + + + Getter of HeaderHeight. + + + Getter of FooterHeight. + + + Invoked when the Edit mode is being changed. + +FMX.ListView.TAppearanceListView.WillEnterEditMode inherits from FMX.ListView.TListViewBase.WillEnterEditMode. All content below this line refers to FMX.ListView.TListViewBase.WillEnterEditMode. +Invoked when the Edit mode is being changed. +If the Edit mode requires a different appearance, this is where an update of appearances needs to be initiated. + + + Called at the end of the animation that plays when the edit mode is toggled. +FMX.ListView.TAppearanceListView.DoResetEditModeAnimation inherits from FMX.ListView.TListViewBase.DoResetEditModeAnimation. All content below this line refers to FMX.ListView.TListViewBase.DoResetEditModeAnimation. +Called at the end of the animation that plays when the edit mode is toggled. + + + Called right after the adapter of the list view is set. +FMX.ListView.TAppearanceListView.DoAdapterSet inherits from FMX.ListView.TAdapterListView.DoAdapterSet. All content below this line refers to FMX.ListView.TAdapterListView.DoAdapterSet. +Called right after the adapter of the list view is set. + + + Hook for the IListViewController.RequestReindexing. +FMX.ListView.TAppearanceListView.DoRequestReindexing inherits from FMX.ListView.TListViewBase.DoRequestReindexing. All content below this line refers to FMX.ListView.TListViewBase.DoRequestReindexing. +Hook for the IListViewController.RequestReindexing. + + + Hook for the IListViewController.ItemResized. +FMX.ListView.TAppearanceListView.DoItemResized inherits from FMX.ListView.TListViewBase.DoItemResized. All content below this line refers to FMX.ListView.TListViewBase.DoItemResized. +Hook for the IListViewController.ItemResized. + + + Notifies the TListView that a control inside of an item is clicked. +FMX.ListView.TAppearanceListView.DoCheckStateChanged inherits from FMX.ListView.TListViewBase.DoCheckStateChanged. All content below this line refers to FMX.ListView.TListViewBase.DoCheckStateChanged. +Notifies the TListView that a control inside of an item is clicked. + + + Notifies the TListView that an item is clicked. +FMX.ListView.TAppearanceListView.DoControlClicked inherits from FMX.ListView.TListViewBase.DoControlClicked. All content below this line refers to FMX.ListView.TListViewBase.DoControlClicked. +Notifies the TListView that an item is clicked. + + + Returns an array with the objects of appearance properties of list view items. +The array contains the objects of appearance properties in the following order: + +Appearance of regular items in edit mode. +Appearance of regular items. +Appearance of header items. +Appearance of footer items. + + + Refresh items with specified purposes. +Refresh all items if the set is empty. + + + Refresh items with specified purposes. + + + Called when the appearance of the items is changed. + + + Notifies the owner of the change in the appearance view. + + + Called when the heights of the items are changed. + + + Prepares the appearance of the list view items for the animation that plays when the list view enters the edit mode. +The list view calls EditModeAppearances when the EditMode property of the list view changes from False to True and the run-time platform supports edit mode animations, provided that the event handler of OnEditModeChanging did not prepare the appearance already. + + + Fills the AppearanceClass property of the specified instance of TItemAppearanceProperties with a default value. + + + Dispatches the OnItemClick event. +DoListItemClick receives a single parameter, AItem, which is the clicked list view item. +If AItem is an instance of TListViewItem, DoListItemClick passes itself (as the Sender parameter) and the received AItem to the event handler of OnItemClick. + + + Dispatches the OnUpdatingItemView event. +DoUpdatingItemView receives the following parameters: + +AListItem is the target list view item. +AHandled determines whether the event handler of OnUpdatingItemView takes care of updating the appearance of the list view item (True) or DoUpdatingItemView must update the appearance of the list view item instead (False). +DoUpdatingItemView passes itself (as the Sender parameter) and the received AListItem and AHandled parameters to the event handler of OnUpdatingItemView. +If AListItem is an instance of TListViewItem, DoUpdatingItemView also passes itself (as the Sender parameter) and the received AListItem and AHandled parameters to the event handler of OnUpdatingObjects. + + + Dispatches the OnUpdateItemView and OnUpdateObjects events. +DoUpdateItemView receives a single parameter, AItem, which is the target list view item. +DoUpdateItemView passes itself (as the Sender parameter) and the received AItem to the event handler of OnUpdateItemView. +If AItem is an instance of TListViewItem, DoUpdateItemView also passes itself (as the Sender parameter) and the received AItem to the event handler of OnUpdateObjects. + + + Height in pixels of each regular list view item. + + + Height in pixels of each regular list view item when the list view is in edit mode. + + + Height in pixels of each header list view item. + + + Height in pixels of each footer list view item. + + + Name of the appearance class of regular list view items in edit mode. + + + Name of the appearance class of regular list view items. + + + Name of the appearance class of header list view items. + + + Name of the appearance class of footer list view items. + + + Name of the appearance of regular list view items. +When your list view switches between display mode and edit mode, the item appearance switches between the appearance defined in the ItemAppearanceName property (display mode) and the appearance defined in the ItemEditAppearanceName property (edit mode). Items may display an animation as their appearance changes. +Possible values are: + + + +ItemAppearanceName + +ItemEditAppearanceName + +List Item Preview + + +Not Selected + +Selected + + +Custom + +Custom + + + + + + +ImageListItem + +ImageListItemDeleteImageListItemShowCheck + + + + + + +ImageListItemBottomDetail + +ImageListItemBottomDetailShowCheck + + + + + + +ImageListItemBottomDetailRightButton + +ImageListItemBottomDetailRightButtonShowCheck + + + + + + +ImageListItemRightButton + +ImageListItemRightButtonDeleteImageListItemRightButtonShowCheck + + + + + + +ListItem + +ListItemDeleteListItemShowCheck + + + + + + +ListItemRightDetail + +ListItemRightDetailDeleteListItemRightDetailShowCheck + + + Name of the appearance of regular list view items in edit mode. +When your list view switches between display mode and edit mode, the item appearance switches between the appearance defined in the ItemAppearanceName property (display mode) and the appearance defined in the ItemEditAppearanceName property (edit mode). Items may display an animation as their appearance changes. +You can find the possible values in the table below. + + + +ItemEditAppearance + +ItemAppearanceName + +Editing Mode + +List Item Preview + + +Not Selected + +Selected + + +Custom + +Custom + +Custom + + + + + + +ImageListItemBottomDetailShowCheck + +ImageListItemBottomDetail + +Select + + + + + + +ImageListItemBottomDetailRightButtonShowCheck + +ImageListItemBottomDetailRightButton + +Select + + + + + + +ImageListItemDelete + +ImageListItem + +Delete + + + + + + +ImageListItemRightButtonDelete + +ImageListItemRightButton + +Delete + + + + + + +ImageListItemRightButtonShowCheck + +ImageListItemRightButton + +Select + + + + + + +ImageListItemShowCheck + +ImageListItem + +Select + + + + + + +ListItemDelete + +ListItem + +Delete + + + + + + +ListItemRightDetailDelete + +ListItemRightDetail + +Delete + + + + + + +ListItemRightDetailShowCheck + +ListItemRightDetail + +Select + + + + + + +ListItemShowCheck + +ListItem + +Select + + + + + +Each edit mode item appearance matches a display mode item appearance (ItemAppearanceName). The type of editing mode described in the table above determines how list items behave. + + + +Item + +Behavior + + +Delete + +Tap a list item to show a Delete button. Tap Delete to delete the item, tap anywhere else to hide the Delete button. + + +Select + +Tap a list item to select it. Tap again to unselect it. You can select more than one item (multiselect). + + +Custom + +Your custom implementation of the edit mode item appearance determines the behavior of list items. + + + Name of the appearance of header list view items. +Possible values are: + + + +Item + +Description + + +Custom + +Custom appearance. + + +ListHeader + +Default appearance. + + + Name of the appearance of footer list view items. +Possible values are: + + + +Item + +Description + + +Custom + +Custom appearance. + + +ListHeader + +Default appearance. + + + Specifies the various options that are used when rendering the list view items. + +Note: This is a design-time property. At run time access the relevant properties of the list view instead. See TPublishedAppearance for more information. +Use the ItemAppearance property in order to control how an item from this list view component is displayed. The ItemAppearance property controls the footer, header, and list item appearance and height, and also the list item appearance and height when in edit mode. + + + Allows you to specify properties of individual item appearance objects. These objects include footer, header, item, and item in edit mode objects. +Use the ItemAppearanceObjects property in order to control various properties of the objects that might be part of this list view component. For instance, you can specify accessory and text settings for the items or you can affect text settings for the footer and header items. + + + Occurs immediately when you check a glyph button (such as a check box or a delete button) inside a list view item. +Write an OnButtonChange event handler to provide additional functionality when checking a glyph button (such as a check box or a delete button) inside a list view item. + + + Occurs immediately when you click on a text button or a glyph button inside a list view item. +Write an OnButtonClick event handler to provide additional functionality when clicking on a text button or a glyph button inside a list view item. + + + Creates an instance of TAppearanceListView with the specified component as its owner. + + + Destroys this instance of TAppearanceListView. + + + Marks the start of an update session of the control and its children. +FMX.ListView.TAppearanceListView.BeginUpdate inherits from FMX.Controls.TControl.BeginUpdate. All content below this line refers to FMX.Controls.TControl.BeginUpdate. +Marks the start of an update session of the control and its children. +It increases the value of the FUpdating semaphore. A call to BeginUpdate must be complemented by calls to EndUpdate after the update is finished. +FUpdating is an internal semaphore used to mark the process of control updating. Painting of a control is disabled while FUpdating is higher than 0. + + See Also +FMX.Controls.TControl.FUpdating +FMX.Controls.TControl.EndUpdate +FMX.Controls.TControl.IsUpdating + + + Marks the end of an update session of the control and its children. +FMX.ListView.TAppearanceListView.EndUpdate inherits from FMX.Controls.TControl.EndUpdate. All content below this line refers to FMX.Controls.TControl.EndUpdate. +Marks the end of an update session of the control and its children. +The update session must be started first by calling BeginUpdate. +EndUpdate decreases the FUpdating semaphore. If all update sessions end and FUpdating is 0, EndUpdate invokes Realign to process layout changes. + + See Also +FMX.Controls.TControl.FUpdating +FMX.Controls.TControl.BeginUpdate +FMX.Controls.TControl.IsUpdating +FMX.Controls.TControl.Realign + + + OnResize event dispatcher. +FMX.ListView.TAppearanceListView.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Provides access to individual items in this list view component. +Use the Items property in order to access each individual item stored in this list view component. The Items property is also used if you want to add items to the list view, in a programmatic manner. Otherwise, you would normally add the items automatically via LiveBindings. + + + Occurs immediately after clicking an item from the list view. +Write an OnItemClick event handler to respond to clicking on an item from the list view component. +OnItemClick is an event of type TItemEvent. +Do not modify the contents of the list view in the OnItemClick event handler (do not add, remove, update or change the order of list view items). If you need to do that, use OnItemClickEx event handler instead. It is safe to modify the content of the items themselves in both of those handlers. +The OnItemClick event handler receives the following parameters: + + + +Parameter + +Description + + + +Sender + + + +The instance of TCustomListView to which the clicked item belongs. + + + + +AItem + + + +The instance of Appearances.TListViewItem that you click on. + + + Occurs immediately before the list view component is updated. +Write an OnUpdatingObjects event handler to provide additional functionality before updating the list view component. +OnUpdatingObjects is an event of type TItemEvent. + + + Occurs immediately after the list view component is updated. +Write an OnUpdateObjects event handler to provide additional functionality after updating the list view component. +OnUpdateObjects is an event of type TItemEvent. + + + + + Represents a FireMonkey list view component that you can use to hold and present various types of items. +The TListView displays a collection of items in a list that is optimized for LiveBindings and for fast and smooth scrolling. +The items in the list view can have one or more of the following appearance features: + +A caption or detail text (for example, using the Item.Text bindable member of TListView) +An associated image (for example, using the Item.Bitmap bindable member of TListView) +An accessory icon (for example, using the ItemEditAppearance property in the Object Inspector) +A graphic or a text button attached (for example, using the Item.ButtonText bindable member of TListView) +You can customize the appearance of a list view by modifying the layout of the list items, including the caption, the associated image, text details, or the accessory icon. +TListView has the edit mode in which you can select several items. + +Example +You can add items to a TListView either by binding to a data source, or by code (TListView.Items.Add). +Here is a code example that shows how to add items to a TListView: + + +Delphi: + +var + LItem: TListViewItem; + I: Integer; +begin + for I := 1 to 10 do + begin + LItem := ListView1.Items.Add; + LItem.Text := IntToStr(I); + end; +end; + +// To achieve the best performance use BeginUpdate and EndUpdate. + +var + LItem: TListViewItem; + I: Integer; +begin + ListView1.BeginUpdate; + try + for I := 1 to 10 do + begin + LItem := ListView1.Items.Add; + LItem.Text := IntToStr(I); + end; + finally + ListView1.EndUpdate; + end; +end; + + + +C++: + +for (int i = 1; i <= 10; i++) { + TListViewItem* item = ListView1->Items->Add(); + item->Text = IntToStr(i); +} + +// To achieve the best performance use BeginUpdate and EndUpdate. + +ListView1->BeginUpdate(); +try { + for (int i = 1; i <= 10; i++) { + TListViewItem* item = ListView1->Items->Add(); + item->Text = IntToStr(i); + } +} catch (...) { +} +ListView1->EndUpdate(); + + + Fills the AppearanceClass property of the specified instance of TItemAppearanceProperties with a default value. +FMX.ListView.TListView.InitializeItemAppearance inherits from FMX.ListView.TAppearanceListView.InitializeItemAppearance. All content below this line refers to FMX.ListView.TAppearanceListView.InitializeItemAppearance. +Fills the AppearanceClass property of the specified instance of TItemAppearanceProperties with a default value. + + See Also +FMX.ListView.TAppearanceListView.Create + + + + + Base class for all common binding components descending from it. +TContainedBindComponent is an abstract class that is the base class for TCommonBindComponent. + + + Protected getter method for the BindingsList property. + + + Reads the state of this component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + Protected getter method for the ControlComponent property. + + + Protected setter method for the ControlComponent property. + + + Verifies whether the control component is assigned. +If the ControlComponent is nil, then CheckControlComponent raises an exception. + + + Protected getter implementation for the DisplayName property. + + + Returns whether this component is in design mode. + + + Returns whether this component is in loading mode. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. + + + Returns whether the control component can be set a given value. +As implemented in TContainedBindComponent, CanSetControlComponent always returns True, but in descendants it actually returns whether the given Value (that is itself a TComponent) can be assigned to the control component. + + + Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. + + + Verifies whether the contained binding component has a parent. +HasParent returns True if the contained binding component has a parent, False otherwise. + + + Sets the parent component of this component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. + + + Specifies a list that holds the binding expressions. + + + Returns the index of this component in the bindings list. + + + Specifies the component that will be bound to the source component, by means of LiveBindings. + + + Returns a string containing the name of this component. + + + Specifies a category for this component. +For example, for a binding expression called BindExpressionForm121, of type TBindExpression, the following code: + + ShowMessage(BindExpressionForm121.Category); + +shows the following message: Binding Expressions. + + + + + Represents the base class for the binding list. +The TCustomBindingsList class implements a list of binding expressions, output converters, method scopes, and other binding list-related functionality. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TCustomBindingsList.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TCustomBindingsList.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Data.Bind.Components.TCustomBindingsList.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Enumerates all child components. +Data.Bind.Components.TCustomBindingsList.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Specifies a list of available methods. For more information about these methods, read the LiveBindings Methods topic. + + + Specifies a list of available output converters. For more information about output converters, read the LiveBindings Output Converters help topic. + + + Returns a TComponent enumerator. +Data.Bind.Components.TCustomBindingsList.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the bindings list uses the global application manager for managed bindings. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Implements the bindings list component. TBindingsList is built on the TCustomBindingsList component and publishes additional properties that can be accessed from within the Object Inspector. + + + + + + Enumerator of data source records, such as records in a dataset. + + + Data source member name, such as a FieldName. + + + Editor for a list, such as a FMX TListView. + + + Member name for a list, such as "Text". + + + Indicate whether the assignment can be evaluated without expression engine. + + + Expression engine description of assignment. + + + Event to execute when the expression engine raises an exception + + + Indicate whether the expression has been customized. A customized expression must + be evaluated with expression engine, rather than by shortcut. + + + + + + + + Enumerator of data source records, such as records in a dataset. + + + Data source member name, such as a FieldName. + + + Indicate whether the assignment can be evaluated without expression engine. + + + Expression engine description of expression to evaluate. + + + Event to call when the expression engine raises an exception + + + Indicate whether the expression has been customized. A customized + expression must be evaluated with expression engine, rather than as a shortcut + + + + + + + + Evaluate expressions to fill a break header + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Informs the wrapper binding component that a delegate (or contained) binding component has been activated. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Used internally for observing purposes. + + + Returns an array of scopes for the source component. + + + Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + Returns True if this binding component delegate supports evaluation shortcuts or False otherwise. +Subclasses of TBindComponentDelegate that support evaluation shortcuts must reimplement GetUseEvalShortcuts to return True. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Event that occurs as an expression is evaluated and is assigning to a value of an object member. Event handlers can intercede in the assignment operation. + + + Event that occurs after an expression has been evaluated and has assigned a value to an object member. + + + Event that occurs when an exception is raised while evaluating an expression, such as a conversion error. Event handlers can intercede and raise a different exception. + + + Event that occurs when activating the binding expressions of this delegate wrapper. + + + Event that occurs when the binding expressions of this delegate wrapper have been activated. + + + + + + + + Protected getter method for the ControlComponent property. + + + Protected setter method for the ControlComponent property. + + + Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + Activates or deactivates the bind control value of this link delegate wrapper. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns whether the given parameter can be used as the control component of this binding component. +CanSetControlComponent returns whether the given Value (that is itself a TComponent) can be used as the control component of this binding component. + + + + + + + + Protected setter implementation for the DataSource property. + + + Protected getter implementation for the DataSource property. + + + Protected setter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use SetSourceMember as the setter implementation. + + + Protected getter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use GetSourceMember as the getter implementation. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a TBaseLinkingBindSource object to which this delegate component links. +Use DataSource to determine or set the TBaseLinkingBindSource object that connects to a specific dataset. + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TCustomLinkControlToField.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Returns an array of scopes for the source component. +Data.Bind.Components.TCustomLinkControlToField.GetSourceScopes inherits from Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. +Returns an array of scopes for the source component. + + + Used for renaming a member of this binding component. +Data.Bind.Components.TCustomLinkControlToField.MemberRenaming inherits from Data.Bind.Components.TBindComponentDelegate.MemberRenaming. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.MemberRenaming. +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + Embarcadero Technologies does not currently have any additional information. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Used internally for observing purposes. +Data.Bind.Components.TCustomLinkControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Setter of UseEvalShortcuts. + + + Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + Embarcadero Technologies does not currently have any additional information. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkListControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + Returns a string containing the name of the control component member. +Data.Bind.Components.TCustomLinkListControlToField.GetControlComponentMemberName inherits from Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. +Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkListControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Used internally for observing purposes. +Data.Bind.Components.TCustomLinkListControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkListControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +Data.Bind.Components.TCustomLinkListControlToField.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Setter of UseEvalShortcuts. + + + Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkListControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies additional optional expressions to use when filling the list control. Use this collection when multiple expressions are needed to fill an item in the list. +For instance, you can use FillExpressions in order to populate a FireMonkey list box item Text and Detail properties. Use the FillDisplayCustomFormat and FillDisplayCustomFormat properties in order to fill the Text property and add an item to the FillExpressions collection, for the Detail property. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a collection of expressions to fill a list header. This property is optional. + + + Specifies the field used to determine a break. This property is optional. + + + Specifies a custom expression that is used with the field defined by the FillBreakFieldName property. For instance, the expression StrCopy(%s, 0, 1); causes a break when the first character of the field is different. This property is optional. + + + Specifies the field to display in the list header. If FillBreakFieldName and FillBreakCustomFormat are blank, then the value determined using FillHeaderFieldName and FillBreakCustomFormat controls breaks. This is the only required field to cause breaking. + + + Specifies a custom expression that is used with the field defined by the FillHeaderFieldName property. For instance, the expression StrCopy(%s, 0, 1); displays the first character of the field in the header. This property is optional. + + + Specifies a collection of break value ranges. The break value falls within an item in this collection. The display value associated with the item is displayed in the header. This property is optional. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + + + + Protected setter implementation for the DataSource property. + + + Protected getter implementation for the DataSource property. + + + Protected setter implementation for the FieldName property. + + + Protected getter implementation for the FieldName property. + + + Protected getter implementation for the Component property. + + + Protected setter implementation for the Component property. + + + Protected setter implementation for the ComponentProperty property. + + + Protected setter implementation for the Active property. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a TDataSource object to which this delegate component links. +Use DataSource to determine or set the TDataSource object that connects to a specific dataset. + + + Specifies the component that this wrapping binding component references. + + + Specifies the name of the property of the component that this wrapping binding component references. + + + Specifies the field name that this wrapping binding component references. + + + + + Base class for the binding scope component. TBaseBindScopeComponent is the ancestor for the TCustomBindScope component. TBaseBindScopeComponent provides functionality for adding scope mappings, getting scope members and values, returning the scope itself or the scope of a member. It also provides properties for accessing the binding expressions in this scope and the scope mappings. + + + Protected setter implementation for the ScopeMappings property. + + + Adds the given scope mapping to the ScopeMappings list. The scope mapping to be added is given through the AScope parameter. + + + Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the binding scope for this source component. +The GetScope method returns the binding scope for this source component. This binding scope allows expressions to access properties and methods of the source component, as opposed to GetMemberScope, which allows expressions to access properties and methods of a member of the source component, such as a field. + + + Returns the binding scope for the given member name. +The GetMemberScope method returns the binding scope for the member name given through the AMemberName parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TBaseBindScopeComponent.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Activates or deactivates all the binding expressions of this binding scope component at once. +The ActivateExpressions method activates or deactivates, depending on the value of the AValue parameter, all the binding expressions contained by this binding scope component at once. + +Tip: If one or more of the binding expressions does not support one of the IBindLink, IBindPosition, or IBindActivate interfaces, then ActivateExpressions does nothing for that particular binding expression. + + + Specifies a list of binding components that are using this source component. + + + Specifies an owned collection of scope mappings. +The ScopeMappings property specifies an owned collection whose elements are scope mappings. ScopeMappings are used to add name/value pairs that can be referenced by expressions that reference this source component. + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TBaseBindScopeComponent.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Data.Bind.Components.TBaseBindScopeComponent.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + + + + Evaluate expression to assign a value from a data source to an editor + + + + + + + + Evaluate an expression to retrieve a value from a data source + + + + + + + + Provide an evaluator for assigning from data source to editor + + + Indicate whether this factory can provide an evaluator for assigning from data source to editor + + + Provide an evaluator for retrieving a value from a data source + + + Indicate whether this factory can provide an evaluator for retrieving a value from a data source to editor + + + + + + + + Provide an evaluator for assigning from data source to editor + + + Indicate whether a factory can provide an evaluator for assigning from data source to editor + + + Provide an evaluator for retrieving a value from a data source + + + Indicate whether a factory can provide an evaluator for assigning from a data source to editor + + + Register an evaluator shortcut factory + + + Unregister an evaluator shortcut factory + + + Singleton instance property. Use this property to access instance methods. + + + + + Base class for all edit boxes that manipulate only numerical values. +TCustomEditBox is the base class for all edit boxes that manipulate only numerical values, such as a TNumberBox. TCustomEditBox implements functionality to set the minimum and maximum value that this edit box can display, and also the possibility to specify the number of decimal digits of the displayed value. +If you want to create your own custom edit box control that manipulates number data, then you should derive from TCustomEditBox. + + + It returns False in case Value has a default value, which means there is no need to store it. + + + Returns whether the HorzIncrement value is stored in the form file. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.EditBox.TCustomEditBox.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Protected setter implementation for the Value property. +SetValue sets a value to the Value property of edit boxes. + + + Protected getter implementation for the Data property. +FMX.EditBox.TCustomEditBox.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.EditBox.TCustomEditBox.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Returns the appropriate action link class associated with the track bar. +GetActionLinkClass returns a TValueRangeActionLink. + + + Specifies the behavior of a TCustomEditBox control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +ValueRange property of TCustomEditBox. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Returns the default interval for the values of the control. + + + Returns a class reference to a data model of this presented control. +FMX.EditBox.TCustomEditBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Returns the name of the default presentation proxy that your presented control uses. +FMX.EditBox.TCustomEditBox.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + The data model representing the data used by the presentation of the current control. +FMX.EditBox.TCustomEditBox.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + Creates a new instance of TPresentedControl. +FMX.EditBox.TCustomEditBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Responds after the last constructor has executed and loads the control presentation. +FMX.EditBox.TCustomEditBox.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Represents the value with which the number is incremented or decremented when, while holding down the mouse button, you move the mouse horizontally. +HorzIncrement represents the value added or decreased from the number when, while holding down the mouse button, you move the mouse to the left or to the right. + + + Provides access to the Value and its Min and Max boundaries. + + + Specifies the number of decimal positions of the displayed Value. +This property has effect only if the ValueType property is set to Float. + + + Contains the minimum value the number displayed by an edit control can show. +Min sets the minimum value that can be displayed by edit controls that manipulate only numerical values. + + + Contains the maximum value the number displayed by an edit control can show. +Max sets the maximum value that can be displayed by edit controls that manipulate only numerical values. + + + Contains the default number displayed by an edit control. + + + Defines the integer or float type of the Value number displayed by the edit box control. + + + + + + + + Field to store the hint. + + + Field to store the status (enabled or not) of the hint. + + + Method that updates the state of enabled. + + + Constructor. A constructor needs the native handle of the view that holds the hint. To give an example, + in MS Windows is the HWND of the native window. + + + Sets the full hint string. + + + Gets the full hint string. + + + The hint can follows the following pattern: 'A short Text| A Long text'. It means, the hint can hold + two texts separated by the '|' character. This method returns the short text of the hint. + + + Returns the long text of the hint. + + + If the specific implementation supports it, this metods places the hint in the given position. + + + Register a class to create hint instances. When a new THint instance is needed, the registered classes are invoked + to create the needed instance. + + + Returns an instance created by the first available registered class. This method can return nil if there are no classes + registered or none of the registered classes can create a THint instance. + + + Returns True if there are some THint class registered. + + + If this property is true, the hint can be displayed, if it is False, the hint won't be displayed. + + + + + TCustomControlAction is the base class for the actions that can be associated with some of the controls. +You can add a control action to a control by setting the Action property of the control, if it is supported. In the Object Inspector choose New Standard Action > No Category > TControl Action for the Action property. + + + Responds when components are created or destroyed. +FMX.Controls.TCustomControlAction.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.Controls.TCustomControlAction.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + Embarcadero Technologies does not currently have any additional information. + + + + + + + + This method is invoked to allow a link to customize a Hint that is going to be displayed. + + + This method sets the string of the hint. + + + + + TControl is the base class for FMX on-screen components. Subclasses are roughly divided into primitive shapes and styleable controls. +TControl extends TFmxObject to present objects that are seen, by adding properties and methods for: + +Size and position +Margins and padding +Alignment with others +Visibility, opacity, scale, and rotation +Mouse interaction and hit testing +Keyboard interaction +Focus and tab order +Triggers for animations and effects +Painting + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the InPaintTo property. +Value specifies the value to set the InPaintTo to. +SetInPaintTo is used internally by PaintTo to have the InPaintTo flag set while the control is being painted. Value is likewise applied to all of the control's children. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter for the Hint property. + + + Setter of Enabled. + + + Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +FMX.Controls.TControl.Updated inherits from System.Classes.TComponent.Updated. All content below this line refers to System.Classes.TComponent.Updated. +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Controls.TControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Forwards notification messages to all owned components. +FMX.Controls.TControl.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + + Notification method called after the creation order is changed. +FMX.Controls.TControl.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter function for the Visible property. Value specifies the new value of the Visible property. + + + Warning: DoSetWidth is deprecated. Please use DoSetSize. + + + +Embarcadero Technologies does not currently have any additional information. + + + Warning: DoSetHeight is deprecated. Please use DoSetSize. + + + +Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Executed right after the value of the Size property changes. +The control does not execute HandleSizeChanged if you assign Size the same value that it already has. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter function for the Height property. Value specifies the new value of the Height property. + + + Setter function for the Width property. Value specifies the new value of the Width property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter function for the AbsoluteRect property. + + + Returns the children transformation matrix. +The AbsoluteMatrix is calculated as: + + AbsoluteMatrix = (LocalMatrix * Parent.GetChildrenMatrix) * Parent.AbsoluteMatrix + +TScaledLayout overrides GetChildrenMatrix to prescale layout contents. + + + Getter function for the AbsoluteScale property. + + + Warning: GetParentedRect is deprecated. Please use GetBoundsRect. + + +Getter function for the ParentedRect property. + + + Getter function for the ClipRect property. + + + Returns the rectangle occupied by the effects applied over the control. It is used when the control is updated. + + + Getter function for the AbsoluteEnabled property. + + + Getter function for the ChildrenRect property. + + + Getter function for the LocalRect property. + + + Getter function for the BoundsRect property. + + + Setter function for the BoundsRect property. Value specifies the new value of the BoundsRect property. + + + Warning: IsHeightStored is deprecated. Please use IsSizeStored. + + + +Embarcadero Technologies does not currently have any additional information. + + + Warning: IsWidthStored is deprecated. Please use IsSizeStored. + + + +Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter function for the PopupMenu property. Value specifies the new value of the PopupMenu property. + + + Getter function for the AbsoluteMatrix property. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter function for the UpdateRect property. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter function for the AbsoluteOpacity property. + + + Begins the drag operation automatically. +BeginAutoDrag is called automatically when a user drags a control whose DragMode is dmAutomatic. Do not call BeginAutoDrag in application code. +Write an event handler for OnDragOver to specify what happens when a dragged object is over the area of the current control. + + + Saves the control that currently captures all the mouse messages. +Capture sets the current root's Captured property if root is not empty. +ReleaseCapture prevents the current control from receiving all the mouse messages. + + + Prevents the control from currently capturing all the mouse messages. +Capture empties the root's Captured property. + + + Defines whether the control can use Action.OnExecute for mouse clicks, key pressing, and input on touch devices (gestures). +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise the OnClick event handler is executed. +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. +EnableExecuteAction is True in TTextControl, TImageControl, TSwitch, and their descendants, while False in others. + + + Responds to user clicks, key pressing, and input on touch devices (gestures). +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. Click also can be called in DialogKey and other methods handling an input from keyboards and touch devices. +Call Click in applications to simulate an OnClick mouse event. +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise executes the OnClick event handler. + + + Responds to user double-clicks. +DblClick is an event handler for the OnDblClick event. It is automatically called when the left mouse button is pressed and released twice, consecutively, with the pointer over the control. +Call DblClick in applications to simulate a mouse OnDblClick event. + + + OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + OnMouseWheel event dispatcher. +A control calls MouseWheel in response to any of mouse wheel messages, decoding the message parameters into the shift-key state, wheel rotation, and handle, which it passes in the Shift, WheelDelta, and Handled parameters, respectively: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +Handled indicates whether the scroll bar was already moved, depending on the WheelDelta value. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the rolling on the other scroll bar, if it exists. +Override the protected MouseWheel method to provide other responses when the mouse wheel is rotated while the cursor is over the control. + + + Calls Click and starts the animation by calling StartTriggerAnimation. +MouseClick receives the following parameters: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys -- SHIFT, CTRL, ALT, and CMD (only for Mac) -- were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. + + + Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + OnKeyUp event dispatcher. +KeyUp provides a response when a key is released while the control has keyboard focus. KeyUp calls the OnKeyUp event handler if one is assigned. +A control calls KeyUp in response to any key-up messages, decoding the message parameters into the key code, character code, and shift state. The control passes them in the Key, KeyChar, and Shift parameters, respectively: + +Key is the scan code of the released keyboard key. +KeyChar is the character code of the released key. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when you release the previously pressed key with the control in focus. +Override the protected KeyUp method to provide other responses when a key is released while the control has keyboard input focus. + + + Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. +DialogKey processes the dialog key messages for each of the control's children. + + + Embarcadero Technologies does not currently have any additional information. + + + Displays the PopupMenu context menu of this control on the specified ScreenPosition screen point. +ShowContextMenu returns True if PopupMenu was successfully displayed. Otherwise, ShowContextMenu returns False. +To set or get a context (pop-up) menu for the current control, use the PopupMenu property. +Descendants can override this method. For example, descendants can show a default context menu if PopupMenu = nil. + + + OnDragEnter event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +A control calls DragEnter when a dragged object enters the control area. +Override the protected DragEnter method to provide other responses when a dragged object enters the control area. + + + OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + OnDragDrop event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor, within the client area of the control. +A control calls DragDrop when a dragged object is dropped on the control area. +Override the protected DragDrop method to provide other responses when a dragged object is dropped on the control area. + + + OnDragLeave event dispatcher. +A control calls DragLeave when a dragged object leaves the control area. +Override the protected DragLeave method to provide other responses when a dragged object leaves the control area. + + + OnDragEnd event dispatcher. +A control calls DragEnd when a dragging session ends. +Override the protected DragEnd method to provide other responses when the dragging session ends. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Checks whether the input is taken by the control or by its parent. +EnterChildren returns True if the input is taken directly by the control's parent, and False otherwise. +Usually, EnterChildren returns False. If the control is an item such as TListBoxItem, a TTreeViewItem, or TMenuItem, EnterChildren returns True. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the value of the ParentedVisible property. +GetParentedVisible is a protected method in the TControl class and is used to obtain the current value of the ParentedVisible property. + + + Embarcadero Technologies does not currently have any additional information. + + + Executed right before the value of the Enabled property of an effect changes, and provides the value of the property before it changes. +The control does not execute BeforeEffectEnabledChanged if you assign Enabled the same value that it already has. + + + Executed right after the value of the Enabled property of an effect changes, and provides the new value of the property. +The control does not execute EffectEnabledChanged if you assign Enabled the same value that it already has. +Effects execute EffectEnabledChanged instead of FMX.Controls.TControl.EnabledChanged. + + + Performs the realignment of the control's children within itself. +The children are realigned taking into account their alignment properties, margins, and padding. +It is called internally every time the control's visual properties are changed. Realign is also called by EndUpdate, if there are no opened update sessions (FUpdating is 0). + + + Executed when the alignment of the children of the control changes. +The alignment of the children of the control may change for any of the following reasons: + +The alignment of a child control changes. +The anchoring of a control changes. +The control looses one of its child controls. + + + Getter function for the Align property. + + + Setter function for the Align property. Value specifies the new value of the Align property. + + + Getter function for the Anchors property. + + + Setter function for the Anchors property. +Value specifies the new value of the Anchors property. + + + Getter function for the Margins property. + + + Getter function for the Padding property. + + + Getter function for the Width property. + + + Getter function for the Height property. + + + Getter function for the Left property. + + + Getter function for the Top property. + + + Getter function for the AllowAlign property. + + + Getter function for the AnchorRules property. + + + Getter function for the AnchorOrigin property. + + + Getter function for the OriginalParentSize property. + + + Getter function for the AnchorMove property. + + + Setter function for the AnchorMove property. +Value specifies the new value of the AnchorMove property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter function for the ContainerWidth property. +The container width is equal to the control width. + + + Getter function for the ContainerHeight property. +The container height is equal to the control height. + + + Returns the current control as a TFmxObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter function for the Visible property. + + + Getter function for the DesignInteractive property. + + + Embarcadero Technologies does not currently have any additional information. + + + OnEnter event dispatcher. +DoEnter is called automatically when the control receives the input focus. +DoEnter repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. The applied animations and effects highlight the focused control. +Override the protected DoEnter method to provide other responses when the current control receives focus. + + + OnExit event dispatcher. +DoExit is called automatically when the input focus moves from the current object. +DoExit repaints the control, starts the animation by calling StartTriggerAnimation, and applies effects by calling ApplyTriggerEffect. When a control receives focus, it is highlighted. The animations and effects applied by DoExit background the control. +Override the protected DoExit method to provide other responses when the focus moves from the current control. + + + Embarcadero Technologies does not currently have any additional information. + + + Dispatcher of the OnDeactivate event. + + + OnMouseEnter event dispatcher. +DoMouseEnter is called automatically when the mouse pointer enters the control's area. +DoMouseEnter starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to highlight the control. +Override the protected DoMouseEnter method to provide other responses when the mouse pointer enters the control's area. + + + OnMouseLeave event dispatcher. +DoMouseLeave is called automatically when the mouse pointer leaves the control's area. +DoMouseLeave starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to background the control. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the control's area. + + + Verifies whether the current control can receive focus. +A control can receive focus if the ParentedVisible, CanFocus, and AbsoluteEnabled properties are True. +CheckForAllowFocus returns True if the control can receive focus, and False otherwise. + + + Getter function for the DragMode property. + + + Setter function for the DragMode property. ADragMode specifies the new value of the DragMode property. + + + Getter function for the Locked property. + + + Getter function for the HitTest property. + + + Getter function for the AcceptsControls property. + + + Setter function for the AcceptsControls property. + + + Returns the target control. +P is the current position of the dragged object. +Data is the dragged object. +FindTarget checks whether P belongs to the current control or any of its children (using a recursive method) and, if so, returns the control that contains P. +If the target control or any of its children is in designing mode or is not visible, FindTarget returns nil. + + + Returns the control in which a specified point can be found. +P is the specified point in the object. +ObjectAtPoint returns the control in which the P point is found. +To start searching within the current control, the control must be visible and enabled. If P is within a child of the control and the child is also a control, the search continues inside the child. +If P is inside the control (not within a child) and the control can be hit, then ObjectAtPoint returns the control. +ObjectAtPoint is used internally. + + + Returns True if the control has an available hint to display. + + + Returns the text of the hint. + + + Returns the custom hint object that manages the hint display. +Usually, this is an instance of THint. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Called when the Tap gesture on the style presentation is recognized. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of DefaultSize. + + + Returns the filling direction of the control's text. +FillTextFlags is used by controls that provide the text area to get the filling direction of the text, depending on the reading direction of the control of the current Root, if it exists. + + + Applies effects to the control, if specified. +This method is called internally during the process of component rendering. +Do not call this method. To apply an effect to a control, add an effect component as a child to the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Processes the painting of the control. +This method is called internally from PaintTo and PaintChildren. DoPaint defines the drawing area by clipping the Canvas to the areas occupied by the control and its children, paints the children and then the control itself. The call to DoPaint is always preceded by a call to Painting and succeeded by a call to AfterPaint. + + + Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + Embarcadero Technologies does not currently have any additional information. + + + Performs the alignment of a FireMonkey control. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. + + + Notifies its child controls that the parent of an ancestor of your control has changed. + + + Executed right after the value of the ClipChildren property changes. +The control does not execute ClipChildrenChanged if you assign ClipChildren the same value that it already has. + + + Executed right after the value of the HitTest property changes. +The control does not execute HitTestChanged if you assign HitTest the same value that it already has. + + + Executed right after the value of the Padding property changes. +The control does not execute PaddingChanged if you assign Padding the same value that it already has. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Controls.TControl.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Temporary copy of the canvas on which the control is drawn. +It is used internally in the process of painting. Do not use it in applications. + + + Setter function for the Left property. Value specifies the new value of the Left property. + + + Setter function for the Top property. Value specifies the new value of the Top property. + + + Updates the explicit bounds' properties of the control. +UpdateExplicitBounds is called by SetBounds after updating the control's anchors rules, to update the ExplicitLeft, ExplicitTop, ExplicitWidth, and ExplicitHeight properties. +It is for internal use only. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the horizontal coordinate of the left edge of a component, relative to its parent. +The Left property is used to determine where the left side of the control begins or to reposition the left side of the control. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Left property is relative to the screen, in pixels. +Use Position in applications to allow read and write access. + + + Specifies the vertical coordinate of the upper-left corner of a control, relative to its parent, in pixels. +The Top property is used to locate the top of the control or to reposition the control to a different Y coordinate. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Top property is relative to the screen, in pixels. +Use Position in applications to allow read and write access. + + + Specifies the explicit horizontal pixel coordinate of the left edge of a component, relative to its parent. +ExplicitLeft is a read-only property used internally by Delphi. Use Left in applications to allow read and write access. + + + Specifies the explicit vertical pixel coordinate of the top edge of a component, relative to its parent. +ExplicitTop is a read-only property used internally by Delphi. Use Top in applications to allow read and write access. + + + Specifies the explicit horizontal size of the control (in pixels). +ExplicitWidth is a read-only property used internally by Delphi. Use Width in applications to allow read and write access. + + + Specifies the explicit vertical size of the control (in pixels). +ExplicitHeight is a read-only property used internally by Delphi. Use Height in applications to allow read and write access. + + + Returns the associated action link class. +FMX.Controls.TControl.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Specifies the behavior of a TControl control when Action changes. +Depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +Enabled, Hint, Visible, OnClick, and PopupMenu parameters of TControl. Then ActionChange calls the inherited TFmxObject.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns True when the Visible property needs to be stored in the fmx-file. + + + Executed right after the value of the Enabled property changes. +The control does not execute EnabledChanged if you assign Enabled the same value that it already has. +EnabledChanged is never executed for effects, which execute EffectEnabledChanged instead. + + + Executed right after the value of the Visible property changes. +The control does not execute VisibleChanged if you assign Visible the same value that it already has. + + + Returns True if the control rect is empty. + + + Embarcadero Technologies does not currently have any additional information. + + + Processes the unhandled gesturing events. +DoGesture is run automatically for all gesturing events that were not handled by the user. DoGesture is run only if OnGesture is not set or if it did not handle the gesture event. +Override DoGesture in descending classes to support default behavior for gesture events that were not handled by the user. In TControl, the DoGesture method simply returns and does no special processing. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the amount (in degrees) by which the control is rotated from the x-axis. +Positive angles correspond to clockwise rotation. For counterclockwise rotation, use negative values. +To set the rotation center, use RotationCenter. + + + Specifies the position of the pivot point of the control. +The coordinates of the rotation center take values in the range from 0 through 1. The point with the coordinates (0,0) corresponds to the upper-left corner of the control, the point with the coordinates (1,1) corresponds to the lower-right corner of the control. The default center of rotation is (0.5, 0.5). +Values outside of [0,0] and [1,1] can be clipped in some descendant classes. +To set the rotation angle, use RotationAngle. + + + Specifies the scale of the control. +Set the Scale coordinates to specify the scale on each axis. +The initial scale rate is 1 on each axis. + +Note: Controls that have the Align or Anchors properties set can use a scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + If True, the value of the ShowHint property of this control inherits the value of the ShowHint property of the parent control. +See Using Hints to Show Contextual Help in a FireMonkey Application - Enabling Hints for a Control for more information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Controls.TControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Controls.TControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + Sets the boundaries of the current control. +Use SetBounds to change all of the boundary properties of the control at one time. +X specifies the X coordinate of the Position of the control. +Y specifies the Y coordinate of the Position of the control. +AWidth specifies the value of the Width of the control. +AHeight specifies the value of the Height of the control. +The same effect can be achieved by setting the Position, Width, and Height properties separately, but SetBounds changes all properties at once, ensuring that the control will not repaint between changes. +After setting the boundary properties, SetBounds specifies to the control to maintain the alignment of the control within its parent and of its children within it. The given parameter does not necessarily reflect in the Position, Width, and Height properties. The properties can be updated when the alignment is applied. + + + Translates coordinated of the specified Point from an global perspective to a local coordinates of this control. +The absolute context for a control is the parent form area, and the local context is the control area. +Point is the point to be transformed. +AbsoluteToLocal returns the transformed point. +To have the inverse effect over a point, use LocalToAbsolute. + + + Translates coordinated of the specified Point from an global perspective to a local coordinates of this control. +The absolute context for a control is the parent form area, and the local context is the control area. +Point is the point to be transformed. +AbsoluteToLocal returns the transformed point. +To have the inverse effect over a point, use LocalToAbsolute. + + + Transforms and returns a specified point from the local perspective to the absolute perspective. +Use LocalToAbsolute to get the transposed coordinates of a point from the local context to the absolute context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the point to be transformed. +LocalToAbsolute returns the transformed point. +To have the inverse effect over a point, use AbsoluteToLocal. + + + Transforms and returns a specified point from the local perspective to the absolute perspective. +Use LocalToAbsolute to get the transposed coordinates of a point from the local context to the absolute context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the point to be transformed. +LocalToAbsolute returns the transformed point. +To have the inverse effect over a point, use AbsoluteToLocal. + + + Transforms and returns a specified point from the screen perspective to the local perspective. +P is the point to be transformed. +ScreenToLocal is used internally. + + + Transforms and returns a specified point from the local perspective to the screen perspective. +P is the point to be transformed. +LocalToScreen is used internally when applying a certain placement. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Transforms and returns a specified vector from the absolute perspective to the local perspective. +Use AbsoluteToLocalVector to get the transposed coordinates of a vector from the absolute context to the local context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the vector to be transformed. +AbsoluteToLocalVector returns the transformed vector. +To have the inverse effect over a point, use LocalToAbsoluteVector. + + + Transforms and returns a specified vector from the local perspective to the absolute perspective. +Use LocalToAbsoluteVector to get the transposed coordinates of a vector from the local context to the absolute context of the current control. The absolute context for a control is the parent form area, and the local context is the control area. +P is the vector to be transformed. +LocalToAbsoluteVector returns the transformed vector. +To have the inverse effect over a vector, use AbsoluteToLocalVector. + + + Checks whether the point, specified by the absolute coordinates, belongs to the control area. +PointInObject returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the absolute coordinates (relative to the main form) of the point to be checked (compare with PointInObjectLocal): + +X is the X coordinate. +Y is the Y coordinate. +The points of the control boundary specified by BoundsRect belong to the control and PointInObject returns True for them. + +Note: PointInObject simply converts absolute coordinates of the point to local coordinates and calls PointInObjectLocal. + + + Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + Takes and returns a screenshot of the control. +MakeScreenshot creates a new TBitmap, draws on it the image of the current control by calling PaintTo, and returns it. + + + Marks the start of an update session of the control and its children. +It increases the value of the FUpdating semaphore. A call to BeginUpdate must be complemented by calls to EndUpdate after the update is finished. +FUpdating is an internal semaphore used to mark the process of control updating. Painting of a control is disabled while FUpdating is higher than 0. + + + Returns True if this control is in the middle of one or more update sessions. It returns False otherwise. + + + Marks the end of an update session of the control and its children. +The update session must be started first by calling BeginUpdate. +EndUpdate decreases the FUpdating semaphore. If all update sessions end and FUpdating is 0, EndUpdate invokes Realign to process layout changes. + + + Recalculates AbsoluteMatrix. +It is used in the painting process. Do not call RecalcAbsoluteNow in an application. + + + Forces the current control to recalculate its UpdateRect property. RecalcUpdateRect also forces the control's parent--if necessary--and children to recalculate their UpdateRect property. + + + Forces the current control to recalculate its Opacity property. RecalcOpacity also forces the control's children to recalculate their Opacity property. + + + Forces the current control to recalculate the AbsoluteMatrix property. RecalcAbsolute also forces the control's children to recalculate their AbsoluteMatrix. + + + Forces the current control to recalculate its enabled state. RecalcEnabled also forces the control's children to recalculate their enabled state. + + + Forces the current control to recalculate its HasEffect property. RecalcHasEffect also forces the control's parent to recalculate its HasEffect property. + + + Forces the current control to recalculate its HasClipParent property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Updates the effects of the current control and of the control's parent. +UpdateEffects is called every time the current control is changed (repainted, realigned, resized). UpdateEffects is also used when a new child is added to the control by calling AddObject. + + + Applies the specified mouse trigger effect to all the children of this FMX object that are of type TEffect. +ApplyTriggerEffect iterates through all the children of this FMX object and, if one of them is of type TEffect, applies the mouse trigger given through the ATrigger parameter (which can be 'IsMouseOver', 'IsMouseOver', 'IsDragOver', and so on). +AInstance specifies the instance of the FMX object to which the trigger effect is applied. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the focus to the current control, if CanFocus is True. When the current control receives focus, the OnCanFocus event is triggered. + + + Removes the focus from a control or from any children of the control. + + + Paints the current control to a specified canvas. +ACanvas specifies the canvas to draw on. +ARect specifies the rectangle area of the ACanvas to draw on. +AParent specifies the Parent of the control. By default, it is empty. +PaintTo is called in the process of applying effects on the control in ApplyEffect, in which the control is first painted on the effect's canvas using PaintTo and then the effect is processed. It is also used in MakeScreenshot in order to produce a screenshot bitmap. +Descendants of TControl override PaintTo to provide specific rendering of the respective controls. + + + Forces the control to repaint its image on the screen. +Repaint updates the effects applied to the control, if any, and adds a new update rectangle--which corresponds to the control's UpdateRect--to the control's Scene. +Call Repaint when the control's displayed area needs to be updated. + + + Adds a rectangle to the update region of the scene. +ARect specifies the rectangle to be invalidated. +InvalidateRect transposes ARect to the local perspective and then adds it to the update region of the Scene. + + + Locks the current control, so it cannot be changed at design time. Lock also locks the current control's children. + + + Specifies the absolute transformation matrix of the control. +AbsoluteMatrix is calculated using FLocalMatrix and AbsoluteMatrix of its parent. +The calculation only takes place if FRecalcAbsolute is True and the result is then cached in the FAbsoluteMatrix field. +If the calculation is not taking place during an update session and InPaintTo is not set, it initiates Repaint. +AbsoluteMatrix is used when the control is painted or needs to be repainted. + + + Specifies the absolute opacity of the control. +If the control has another TControl as parent, AbsoluteOpacity depends on the absolute opacity of its parent. +To explicitly set the opacity of a control, use the Opacity property. + + + Specifies the absolute width of the control. +Usually, it has the same values as the Width property. The value can be affected by the transformations applied over the control. + + + Specifies the absolute height of the control. +Usually, it has the same value as the Height property. The value can be affected by the transformations applied over the control. + + + Specifies the absolute scale of the control. +The absolute scale of a control is the scale relative to the scale of its parent. +AbsoluteScale is kept as a TPointF. The X coordinate is the scale for the X axis and Y is the scale for the Y axis. + + + Specifies whether the control is absolutely enabled. +AbsoluteEnabled is True only if Enabled is True and the parent also reports AbsoluteEnabled as True. Therefore, this logic climbs the parent hierarchy to determine whether the control is truly enabled or not. +If Parent is set and the parent's AbsoluteEnabled property is False, AbsoluteEnabled is set to False, otherwise it has the value of the Enabled property. + + + Specifies the absolute rectangle that bounds the control. It returns the bounding rectangle of the control in absolute coordinates (relative to the main form). + + + Specifies the absolute rectangle of the control after all its parent controls clip it. + + + A TRectF defined by the width and height of the control. +This TRectF is normalized. DoGetUpdateRect uses this property. + + + A flag that signals when a control is in the process of applying an effect. +The ApplyEffect method uses this flag to correctly render a control. + + + Specifies whether the control has an applied effect. +HasEffect is False if an effect was applied to the control, and True otherwise. + + + Specifies whether the control's effect is painted. +HasDisablePaintEffect is True if the control has disabled the painting effect, and False otherwise. + + + Specifies whether the control has an effect that is applied after the control is painted. +HasAfterPaintEffect is True if the control has an effect that is applied after the control is painted, and False otherwise. + + + Control that is a direct child of this control and has clipped this control. + + + Specifies the bigger rectangle area occupied by parent and children controls. +ChildrenRect is a rectangle obtained by performing a union operation between the rectangles occupied by the parent control and the children controls. + +Use the ChildrenRect.Width property on the parent, to obtain the width of the rectangle. +Use the ChildrenRect.Height property on the parent, to obtain the height of the rectangle. +Note: They are read-only properties. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the inverse matrix of AbsoluteMatrix. + + + Specifies whether the control is currently being painted. +InPaintTo is True if the current control is being painted. + + + Specifies the local rectangle for painting the control. +The coordinates of the upper-left corner of the rectangle are (0,0) and the coordinates of the bottom right corner are (Width, Height). + + + Indicates whether the control is currently pressed. +Mouse action event handlers use this property as a flag to determine how to proceed in some cases. + + + A point that indicates where exactly on the control the click occured. +MouseDown sets PressedPosition if Button is mbLeft. + + + Specifies the rectangle area of the control that needs to be updated. +UpdateRect is a union between the rectangle areas that need to be painted over the control when: + +The control receives focus. +The control gets new effects. +The control's children are updated. +The control's parent is updated. + + + Specifies the bounding rectangle of the control. +The coordinates of the upper-left corner of the bounding rectangle are X and Y coordinates of the control Position. The coordinates of the lower-right corner are X+Width and Y+Height. +For example: + +R:=Control.BoundsRect; + +The coordinates of the R rectangle are: + +R.Left = Control.Position.X; +R.Top = Control.Position.Y; +R.Right = Control.Position.X + Control.Width; +R.Bottom = Control.Position.Y + Control.Height; + +When BoundsRect is set, the Position property is set to be the upper-left corner of the given bound rectangle, and the Width and Height of the control receive the values of the width and height of the given bound rectangle. +For example: + +Control.BoundsRect:=R; + +The controls have the following properties: + +Control.Position.X= R.Left; +Control.Position.Y= R.Top; +Control.Width= R.Width; +Control.Height= R.Height; + + + Specifies the bounding rectangle of the control within its parent. + + + Specifies whether all the control's parents are visible. +A control can be set to visible if all its parents are also visible. +ParentedVisible returns True if the control's parents are visible, and False otherwise. + + + Specifies the bound rectangle to be clipped. +The values of ClipRect are specified by: + +Left and Top, equal to 0. +Right, equal to Width. +Bottom, equal to Height. + + + Provides the drawing surface of the control. +Canvas defines an area within which you can explicitly position child elements by using coordinates that are relative to the drawing area. +For more details, see TCanvas. + + + Stores an array of child controls attached to this parent control. + + + Number of controls that are direct children of this control. + + + Specifies the parent control of this control. + +Tip: You cannot set the parent control of this control as the control itself (Self (Delphi) or this (C++Builder)). + + + Specifies the current scene in which the control is drawn. +The Scene of the control is also the scene of its children. + + + Specifies whether the control captures mouse events. +When a control captures the mouse, all subsequent mouse events go to that control until the user releases the mouse button. + + + Specifies whether the current control can receive focus. +CanFocus is True if it can receive focus, and False otherwise. +If it is set to False, the control cannot be selected when using the TAB key. +A control can receive focus after it is created. + + + Specifies whether the parent of this control should be evaluated to receive focus. +CanParentFocus is True when the parent of this control should be evaluated to receive focus if this control cannot receive focus itself, and False otherwise. + + + Specifies whether the control has the focus effect disabled. +Set DisableFocusEffect to True so the control disables the effect applied when it receives focus. Usually, DisableFocusEffect for FireMonkey controls is False. + + + Whether the current style of this control has been actually applied to the control. +IsInflated is True if the current style of the control has been applied to the control. It is False otherwise. +For example, if you change the style of a control at run time, IsInflated is False until the control is updated to show its new style. + + + Loops through the controls that are children of this control, and runs the specified procedure once per control, with a different control as the first parameter in each call. + +Warning: EnumControls is deprecated as a function. You should use it as a procedure instead. This page describes the syntax and use of the EnumControls procedure. +EnumControls loops not only through direct children of this control, but also through their children (grand-children), and so on, using a depth-first search algorithm. +Each time EnumControls visits a control during the search, it executes the Proc procedure. This procedure receives the visited control as argument, and it returns a value of type TEnumControlsResult. The return value defines what EnumControls does next. You may return any of the following values: + +Continue lets EnumControls keep searching the controls as usual. +Discard makes the search skip the children of the current control (the control in the first parameter), as well as their children (grand-children) and so on. +Stop interrupts the search loop. If EnumControls were a language-level control loop, Stop would be the Break keyword. +Example +The following is an example call to EnumControls that loops through the children of a panel (Panel1) and fills a list (ListOfVisibleControls) with all the controls that are visible: + + +In Delphi: + +Panel1.EnumControls(function (Control: TControl): TEnumControlsResult + begin + if not Control.Visible then + Result := TEnumControlsResult.Discard + else + begin + ListOfVisibleControls.Add(Control); + Result := TEnumControlsResult.Continue; + end; + end); + + + +In C++: + +1. Define a class that implements the TFunc__2 interface: +class TMethodReference : public TCppInterfacedObject<TFunc__2<TControl*,TEnumControlsResult> > +{ +public: + TEnumControlsResult __fastcall Invoke(TControl* Control) + { + if (!Control->Visible) + return TEnumControlsResult::Discard; + else { + TForm2::ListOfVisibleControls->Add(Control); + return TEnumControlsResult::Continue; + } + } +}; + +2. Then pass an instance of this class to EnumControls: +Panel1->EnumControls(new TMethodReference); + + + Loops through the controls that are children of this control, and runs the specified procedure once per control, with a different control as the first parameter in each call. + +Warning: EnumControls is deprecated as a function. You should use it as a procedure instead. This page describes the syntax and use of the EnumControls procedure. +EnumControls loops not only through direct children of this control, but also through their children (grand-children), and so on, using a depth-first search algorithm. +Each time EnumControls visits a control during the search, it executes the Proc procedure. This procedure receives the visited control as argument, and it returns a value of type TEnumControlsResult. The return value defines what EnumControls does next. You may return any of the following values: + +Continue lets EnumControls keep searching the controls as usual. +Discard makes the search skip the children of the current control (the control in the first parameter), as well as their children (grand-children) and so on. +Stop interrupts the search loop. If EnumControls were a language-level control loop, Stop would be the Break keyword. +Example +The following is an example call to EnumControls that loops through the children of a panel (Panel1) and fills a list (ListOfVisibleControls) with all the controls that are visible: + + +In Delphi: + +Panel1.EnumControls(function (Control: TControl): TEnumControlsResult + begin + if not Control.Visible then + Result := TEnumControlsResult.Discard + else + begin + ListOfVisibleControls.Add(Control); + Result := TEnumControlsResult.Continue; + end; + end); + + + +In C++: + +1. Define a class that implements the TFunc__2 interface: +class TMethodReference : public TCppInterfacedObject<TFunc__2<TControl*,TEnumControlsResult> > +{ +public: + TEnumControlsResult __fastcall Invoke(TControl* Control) + { + if (!Control->Visible) + return TEnumControlsResult::Discard; + else { + TForm2::ListOfVisibleControls->Add(Control); + return TEnumControlsResult::Continue; + } + } +}; + +2. Then pass an instance of this class to EnumControls: +Panel1->EnumControls(new TMethodReference); + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether a control should be ignored in ObjectAtPoint. +False if the control should be ignored in ObjectAtPoint. ShouldTestMouseHits normally returns the same value as the value of Visible property of the control. +TFrame overrides this method to allow itself to be painted in design time regardless of the value of its Visible property. + + + Specifies whether the mouse cursor is over the control. +IsMouseOver is True when the mouse is passing over the control. +For effect triggers, setting IsMouseOver to True triggers the effect while the mouse passes over the control. + + + Specifies whether a dragged object is over the area of the current control. +IsDragOver is True when the dragged object is over the current control. +For effect triggers, setting IsDragOver to True triggers the effect when the dragged object is over the current control. + + + Specifies whether the control is in focus. +IsFocused is True when the focus is on the control. +For effect triggers, setting IsFocused to True triggers the effect when the user selects the control. + + + Specifies whether the control is visible. +IsVisible is True when the control is visible. Use Visible in applications to allow write access. +For effect triggers, setting IsVisible to True triggers the effect when the control is visible on the form. + + + Specifies the alignment options (top, left, client, and so on) of this control. +Use Align to automatically set the alignment of the current control. Setting Align to a value different than None can affect the position, size (height and width), and anchors of the control. By default, Align is set to None. +Descendants of TControl typically set the visibility and value for the Align property. For example, for TToolBar, Align defaults to TAlignLayout.Top. +To see the possible values for Align and their visible effects over the control, see FMX.Types.TAlignLayout. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + + Specifies how the control is anchored to its parent. +Use Anchors to ensure that a control maintains its current position relative to the edges of its parent, even if the parent is resized. When its parent is resized, the control holds its position relative to the edges to which it is anchored. Anchors is enforced only when the parent control is resized. +If a control is anchored to opposite edges at the same time, the control stretches horizontally or vertically to maintain constant the distance between the control edges and parent edges. If a control is anchored to all four edges of its parent, the control stretches in all directions. By default, a control is anchored to the top and left edges of its container (Anchors=[akTop,akLeft]). +The automatic alignment may affect the anchors of a control. When Align is set to None, all the anchors are available. If Align is not None, the anchors affected by the automatic alignment are excluded. Changing the state of the anchors affected by the automatic alignment has no effect over the control. +Controls that have the Align or Anchors properties set can use a Scale that is different from the default (1,1), so that controls align together even when they have a custom scale. + + + Image to use to represent the mouse pointer when it passes into the region covered by the control. +Change the value of Cursor to provide feedback to the user when the mouse pointer enters the control. For a list of cursor constants, see System.UITypes Constants. The image representations of the cursor depend on the theme active on the current platform. +If Cursor is set to the default cursor, this control might display a different cursor when the mouse pointer is over it. The actual cursor that this control displays is the cursor defined in InheritedCursor, a read-only property that is calculated based not only in the value of Cursor in this control, but also the value of Cursor in any ancestor of this control (parent, grand-parent, and so on until the parent form). + + + Image used to represent the mouse pointer when it passes into the region covered by the control. +The value of the read-only InheritedCursor property is the value of the Cursor property unless Cursor has the default value, in which case InheritedCursor contains the first non-default InheritedCursor value of its ancestors (parent, grand-parent, and so on until the parent form). If every ancestor of this control has InheritedCursor set to the default value, InheritedCursor has the default value in this control as well. +Changing the value of Cursor in this control or in any ancestor of this control may affect the value of InheritedCursor in this control. + + + Specifies how the control initiates drag-and-drop operations. +Use DragMode to control when the user can drag the control. Disable the drag-and-drop capability at run time by setting the DragMode property value to dmManual. Enable automatic dragging by setting DragMode to dmAutomatic. + + + Specifies whether the control is highlighted when the dragged object is over it. + + + Specifies whether the control responds to mouse, keyboard, and timer events. +Use Enabled to change the availability of the control to the user. To disable a control, set Enabled to False. Some disabled controls appear dimmed (for example: buttons, check boxes, labels), while others (container controls) simply lose their functionality without changing their appearance. If Enabled is set to False, the control ignores mouse, keyboard, and timer events. +To re-enable a control, set Enabled to True. +This property applies to all TControl descendants. + + + Aligns the component to the position points of other components (Bounds points). +Specifies the upper-left corner of the current control, relative to its parent. +The Position can be affected by the Padding of its parent and the Margins of the control. + + + Specifies whether the control is locked at design time. +A locked control prohibits to move the control at design time, all the other properties can be modified at design time. +To lock the control, set Locked to True. +By default, Locked is False, and the control can be modified at design time. + + + Specifies the horizontal size of the control (in pixels). +Use the Width property to read or change the width of the control. + + + Height specifies the vertical size of the control (in dp). +Use the Height property to read or change the height of the control. + + + Specifies the vertical and horizontal size (Size.Height and Size.Width) of the control (in pixels). +Use the Size property to read or change the size of the control. + + + Aligns the component to the padding points of other components. +The Padding of a control specifies how close, in pixels, the control's children can come to each of its edges (top, left, bottom, right). Padding adds space to the inner side of the control. +The control's children are repositioned and resized, if necessary, to maintain the Padding. +If the Padding control has zero values, RAD Studio uses the default values (Left=4, Top=4, Right=4, Bottom=4). You can also set your own Padding values. +The following image shows how Padding and Margins properties affect alignment, position, and size of controls. + + +Note: Padding constraints do not work for TScrollBox, TListBox, TTreeView, and TGrid based controls. + + + Aligns the component to the margins points of other components. +The Margins of a control are the distances (in pixels) from each edge (top, left, bottom, right) to another control within the same Parent or to the edge of its Parent. The Margins add space to the outer side of the control. It only applies for controls that do not use TAlignLayout None and the components are located to each other. +If a margin is not 0, no other control will come closer to the control than the specified distance. If the distance from a Parent edge to the corresponding control edge is smaller than the specified Margins for that edge, the control is repositioned and resized, if necessary, to maintain the specified distance. +If the Margins control has zero values, RAD Studio uses the default values (Left=4, Top=4, Right=4, Bottom=4). You can also set your own Margins values. It only applies to the IDE control's guidelines, when you are dragging control. But if you use Align=Client (for example), it will use the specified values in Margins. +The following image shows how Padding and Margins properties affect alignment, position, and size of controls. + + + Specifies the control opacity. +Set Opacity to customize the transparency of the current control. +Opacity takes values between 0 and 1. If Opacity is 1, the control is completely opaque; if it is 0, the control is completely transparent. The values over 1 are treated as 1, and the ones under 0 are treated as 0. +Opacity applies to the control's children. + + + Specifies if children of the control should be clipped to the control's on-screen region. +Set ClipChildren to + +True if you want child controls to be clipped to the control's on-screen region. +False if you want child controls to be able to extend beyond the region of the parent control. + + + Specifies whether the current control has clipped its parent. +When ClipParent is True, TControl cuts off the portion of the parent that lies under the control when the control is painted by the Paint and Painting methods. +Parts of the control that do not contain visible objects cut off holes in the parent's image. +ClipParent is ignored in PaintChildren and other painting methods. +If one parent has more that one child control having ClipParent equals True, then only one of these child controls is painted with ClipParent equals True. Others child controls are painted as if ClipParent equals False. + + + Enables the control to capture mouse events. + +If you set HitTest to True, this control captures all mouse events. The example below shows the use of HitTest for an OnClick event. +If you set HitTest to False, the mouse events will pass through this control, so that a control laid out behind this one receives the mouse events instead of this control. +Note: The HitTest enables all mouse-related events, which also include the display of Hints and Hint-related events. +For most controls, HitTest is True by default. However, this is not true for all the controls. For example, for TLabel and TPathLabel, HitTest is False by default; these two controls do not capture the mouse-related events unless you set HitTest to True. + +Example of HitTest +1. On a form, place a TPanel component. +2. Inside the panel, place a TPathLabel component. +3. Implement the OnClick event for both the TPanel and the TPathLabel: + +procedure TForm1.Panel1Click(Sender: TObject); +begin + ShowMessage('OnClick event fired for TPanel'); +end; + +procedure TForm1.PathLabel1Click(Sender: TObject); +begin + ShowMessage('OnClick event fired for TPathLabel'); +end; + +4. Set the TPathLabel HitTest property to False (this is the default setting). Run the application and click the label. The OnClick event is fired for the panel (not the label). +5. Set the TPathLabel HitTest property to True. Run the application and click the label. The OnClick event is fired for the TPathLabel. + + + Specifies the context (pop-up) menu object. +Use PopupMenu to set the context menu of the current control. The pop-up window is displayed when ShowContextMenu is called. + + + Indicates the position of the control in its parent's tab order. +TabOrder is the order in which child controls are visited when the user presses the TAB key. The control with the TabOrder value of 0 is the control that has the focus when the form first appears. +Initially, the tab order is always the order in which the controls were added to the form. The first control added to the form has a TabOrder value of 0, the second is 1, the third is 2, and so on. Change this by changing the TabOrder property. +Each control has a unique tab-order value within its parent. +Assigning TabOrder a value greater than the number of controls contained in the parent control moves the control to the end of the tab order. The control does not take on the assigned value of TabOrder, but instead is given the number that ensures that the control is the last in the tab order. + + + Specifies whether the component appears onscreen. +Use the Visible property to control the visibility of the control at run time. If Visible is True, the control appears. If Visible is False, the control is not visible. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs when a dragged object enters the area of the current control. +OnDragEnter also occurs when DragEnter is called. +Write an event handler for OnDragEnter to specify what happens when a dragged object enters the area of the current control. + + + Occurs when a dragged object leaves the area of the current control. +OnDragLeave also occurs when DragLeave is called. +Write an event handler for OnDragLeave to specify what happens when a dragged object leaves the area of the current control. + + + Occurs when a dragged object is over the area of the current control. +OnDragOver also occurs when DragOver is called. +Write an event handler for OnDragOver to specify what happens when a dragged object is over the area of the current control. +For most controls, HitTest is True by default. However, this is not true for TLabel, TPathLabel and, TMagnifierGlass where HitTest is False by default; these controls do not capture the OnDragOver event unless you set HitTest to True. +This event provides the following arguments to its event handler: + +Sender is a pointer to the object that called this function. +Data is the dragged object. +Point is the current point of the mouse pointer within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. + + + Occurs when a dragged control is dropped. +OnDragDrop also occurs when DragDrop is called. +Write an event handler for OnDragDrop to specify what happens when a dragged control is dropped. + + + Occurs when the dragging of a control ends. +A dragging session can be ended either by dropping the control or by canceling the dropping. +OnDragEnd also occurs when DragEnd is called. +Write an event handler for OnDragEnd to specify what happens when the dragging session ends. + + + Occurs when a key is pressed while the control has focus. +OnKeyDown is called from KeyDown methods of GUI components, for example, of controls and forms. +Write an event handler for OnKeyDown to specify what happens when a control or a form has the input focus and a key is pressed. + + + Occurs when a key is released while the control has focus. +OnKeyUp also occurs when KeyUp is called. +Write an event handler for OnKeyUp to specify what happens when the control is in focus and a key is released. + + + Occurs when the control is clicked. +For controls (such as TLabel and TPathLabel) that have the HitTest property set to False by default, the OnClick and OnDblClick mouse events pass through to the control behind this control. +Usually, the OnClick event happens when the left mouse button is pressed and released with the pointer over the control or when Click is called. +For buttons controls, the OnClick event also happens when the control is in focus and the SPACEBAR or ENTER key is pressed. +For controls with state, like TRadioButton and TCheckBox, OnClick does not change the state (the IsChecked property is not changed). OnClick cannot be associated to a form. + + + Occurs when the left mouse button is double-clicked with the pointer over the control. +OnDblClick also occurs when DblClick is called. +For controls (such as TLabel and TPathLabel) that have the HitTest property set to False by default, the OnClick and OnDblClick mouse events pass through to the control behind this control. + + + Occurs when a control can receive focus. +SetFocus is an event handler for OnCanFocus. +Write an event handler for OnCanFocus to customize the behavior when the control receives focus. + + + Occurs when the control receive input focus. +OnEnter also occurs when DoEnter is called. +Write an event handler for OnEnter to specify what happens when the control receive input focus. + + + Occurs when the input focus is taken from the control. +OnExit also occurs when DoExit is called. +Write an event handler for OnExit to specify what happens when the input focus is taken from the control. + +Note: For example in TEdit control, you may want to prevent the user from leaving the control until a certain value has been entered into it. This can be done with the code like this: +procedure TForm1.Edit1Exit(Sender: TObject); +begin + if Edit1.Text <> 'Hello' then + Edit1.Abort; +end; + +Notice that the code like Edit1.SetFocus; does not have the expected effect. + + + Occurs when a mouse button is pressed over a control. +OnMouseDown also occurs when MouseDown is called. +Write an event handler for OnMouseDown to specify what happens when one of the mouse buttons is pressed over the control. + + + Occurs when the mouse cursor moves while over the control area. +OnMouseMove also occurs when MouseMove is called. +Write an event handler for OnMouseMove to specify what happens when the mouse cursor is moved while over the control area. + + + Occurs when the mouse button that was pressed over the control is released. +OnMouseUp also occurs when MouseUp is called. +Write an event handler for OnMouseUp to specify what happens when the button of the mouse that was pressed over the control is released. + + + Occurs when the mouse wheel moves while the control has focus. +OnMouseWheel also occurs when the MouseWheel is called. +Write an event handler for OnMouseWheel to specify what happens when the mouse wheel is moved while the control has focus. + + + Occurs when the mouse cursor enters the area of the control. +OnMouseEnter also occurs when DoMouseEnter is called. +Write an event handler for OnMouseEnter to specify what happens when the mouse cursor is moved inside the control area. + + + Occurs when the mouse cursor leaves the control area. +OnMouseLeave also occurs when DoMouseLeave is called. +Write an event handler for OnMouseLeave to specify what happens when the mouse cursor is moved outside the control area. + + + Occurs when the control is painted. +OnPainting also occurs when Painting is called. +Write an event handler for OnPainting to change the way the control is painted. + + + Occurs when the control is redrawn. +OnPaint also occurs when DoPaint is called. +Write an event handler for OnPaint to change the way the control renders itself. + +Tip: Notice that calling BeginScene in the OnPaint event handlers has no effect, because BeginScene is called before the OnPaint event handler runs. This guarantees that painting always occurs in OnPaint without requiring extra and probably unexpected code to allow drawing to have an effect. + + + Occurs immediately after the control is resized. +OnResize also occurs when Resize is called. +Write an event handler for OnResize to make any final adjustments after a control is resized. + +Note: This function is deprecated, instead use the OnResized function. + + + Occurs immediately after the control is resized. +This event is invoked when the control is resized, and all the controls children are aligned. + + + Occurs when the window where this control gains the focus, and the control of the window that has the focus is either this control itself or a descendant of this control. A descendant may be a child, a grand-child, and so on. + + + Occurs when the window where this control is loses the focus while this control or a descendant of this control has the focus. A descendant may be a child, a grand-child, and so on. + + + Occurs when a style is applied to the control. +Write an OnApplyStyleLookup event handler to customize the process of applying a style. +ApplyStyleLookup is an event handler for OnApplyStyleLookup. Override it to customize the process of applying a style. +OnApplyStyleLookup is used for styled controls. + + + Set of optional pixel values you can specify to expand the touch target of a FireMonkey styled control. +FMX.Controls.TControl.TouchTargetExpansion is a published property of all FireMonkey styled controls that support Touch. +Defined as an FMX.Types.TBounds, TouchTargetExpansion takes four optional parameters representing the expansion of the four sides of the control in pixels (Bottom, Left, Right, Top). Each parameter specifies the size of an additional screen area that is to be treated as part of the touch target of the control. +The following figure illustrates how TouchTargetExpansion expands the touch target for a FireMonkey control: + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the Hint can be shown. +If ShowHint is set to True, a Hint string is displayed when the user moves the mouse over the control. + + + Specifies the text string that appears when the user moves the mouse over a control. +See Using Hints to Show Contextual Help in a FireMonkey Application for more information about hints. + + + Specifies the touch manager component associated with the control. +Use the Touch property to access gesturing options associated with a control. Touch specifies a class of type TTouchManager. +Touch is used to: + +Associate a TGestureManager. +(TGestureManager manages all the standard gestures that can be used by the control.) +Select the standard, interactive, or custom gestures to associate with the control. +(You can also connect each gesture to an action; see Assigning Actions to Gestures.) + + + Occurs when you perform a gesture associated with this control. +Write an event handler for OnGesture to perform custom processing for gesture events. OnGesture is fired on controls that subscribed for specific gestures using the TTouchManager class. If your code did process the gesture event, do not forget to set the Handled parameter to True so that the event is not propagated further. +If no event handler is associated with the control, the default DoGesture method is executed performing its own processing for the event. +OnGesture is an event handler of type FMX.Types.TGestureEvent. + + + Occurs when a user taps the control using a finger or a similar device (not a mouse). +Write an event handler for OnTap to specify what happens when the user taps the form. +Events occur in the following order: + +OnTap +OnSelectCell +OnSelChanged + + + + + TStyledControl is the base class for customizable and user-interaction controls. +TStyledControl extends TControl to act as the immediate superclass for concrete user-facing widgets. +For descendants of TStyledControl, you can set the style resource and the basis for FireMonkey's dynamic look-and-feel. Subclasses of TStyledControl search their style resource among those assigned to the StyleBook property of the form, using a simple search routine based on class names returned by the GetStyleObject method. The access to the subcomponents defined by the same style permits the parent control to be modified at run time. To apply a style to a control, set the StyleLookup property to the name of the style. +For more details about the style and design of FireMonkey components, see FireMonkey Component Rendering and Customizing with Styles. +Descendants of TStyledControl are controls like TPanel, TLabel, TCheckBox, TImageControl, or TCalendar. + + + Embarcadero Technologies does not currently have any additional information. + + + Gets the index of TStyledControl. It always returns 1. It is for internal use only. + + + Specifies whether HelpContext is stored. It is for internal use only. + + + Setter method for the HelpContext property. It is for internal use only. + + + Setter method for the HelpKeyword property. It is for internal use only. + + + Forwards notification messages to all owned components. +FMX.Controls.TStyledControl.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Embarcadero Technologies does not currently have any additional information. + + + Executed internally each time ApplyStyleLookup is called for this TStyledControl object. +DoApplyStyleLookup activates the OnApplyStyleLookup event handler. + + + Embarcadero Technologies does not currently have any additional information. + + + Requests the value of the StylesData property of the style object. + + + OnPainting event dispatcher. +FMX.Controls.TStyledControl.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Returns context for behavior manager. + + + Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Getter for the ParentClassStyleLookupName property. + + + Responds when receiving input focus. +DoEnter is called automatically when the control receives the input focus. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the size of the control. +AdjustSize sets the size values that AdjustSizeValue specifies. + + + Sets the fixed size of the control. +AdjustFixedSize sets the fixed size according to ChooseAdjustType. + + + Returns an adjust type based on the provided FixedSize. +FixedSize is the value of the FixedSize property of the control that is passed to AdjustFixedSize. + + + Indicates that the control needs to update the style and calls Repaint. +FMX calls DoStyleChanged after the style was changed. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Generates a style lookup name based on the provided AClassName. +The generated style name is composed of the class name without the leading T, followed by the string "style". For example, if you provide TEdit as AClassName, GenerateStyleName returns the string Editstyle. + + + Gets the style resource object linked to TStyledControl. +GetStyleObject is called when the style is applied. Apply a style by calling the ApplyStyleLookup method. +If no style is defined for the current control, it receives the style of the current scene. If the current scene does not have a resource object, GetStyleObject continues to look through the default styles and Parent's style. +Do not call GetStyleObject in an application. + + + Gets the style resource object linked to TStyledControl. +GetStyleObject is called when the style is applied. Apply a style by calling the ApplyStyleLookup method. +If no style is defined for the current control, it receives the style of the current scene. If the current scene does not have a resource object, GetStyleObject continues to look through the default styles and Parent's style. +Do not call GetStyleObject in an application. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the style resource for this control as TFmxObject. + + + Returns the style resource for this control as TControl. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +FMX.Controls.TStyledControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Performs any necessary actions before the first destructor is called. +FMX.Controls.TStyledControl.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Disposes of the component and its owned components. +FMX.Controls.TStyledControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Determines if and how the width and height of this control should be modified to take the fixed space dictated by the style of this control. +Use one of the values of TAdjustType. + + + Updates the width and height of this control according to its current style. + + + This property allows you to define the current state of style. It changes when calls virtual methods: FMX.Controls.TStyledControl.FreeStyle, FMX.Controls.TStyledControl.ApplyStyle, and FMX.Controls.TStyledControl.DoApplyStyleLookup. + + + Embarcadero Technologies does not currently have any additional information. + + + Finds the linked resource object for the style specified by name. +The AStyleLookup parameter specifies the name of the style. +If AStyleLookup is empty, FindStyleResource returns nil. If no resource object is linked directly to the control, FindStyleResource looks to the styles of the control's children. If no resource object is found, it returns nil. +Clone determines whether the returned style resource object should be the original style object (False) or a copy of the original (True). + + + Finds the linked resource object for the style specified by name. +The AStyleLookup parameter specifies the name of the style. +If AStyleLookup is empty, FindStyleResource returns nil. If no resource object is linked directly to the control, FindStyleResource looks to the styles of the control's children. If no resource object is found, it returns nil. +Clone determines whether the returned style resource object should be the original style object (False) or a copy of the original (True). + + + Finds the specified resource object and makes a copy. +AStyleLookup specifies the name of the resource object to search for. A clone of the original resource is set on AResource. +FindAndCloneStyleResource returns true if the corresponding resource object is found and it is of type T. Otherwise it returns nil. + + + Sets a new Scene for the current control. +FMX.Controls.TStyledControl.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + Gets and applies the style of a TStyledControl. +ApplyStyleLookup gets the style by calling the GetStyleObject method and applies it through the ApplyStyle method. + + + Call this procedure to indicate that this control requires to get and apply its style lookup. +This forces the next call to ApplyStyleLookup to get and apply its style lookup. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the control's text should be translated. +Set AutoTranslate to True to permit the control text (if it exists) to be translated, when the control is used in an application available in several languages. Set it to False to keep the text unchanged. + + + Returns a string with the name of the default style of this control. +The name of the default style is composed of the class name without the leading T, followed by the string style, for instance panelstyle. + + + The name of the default style of the parent class of this control. +The name of the style is composed of the class name without the leading T, followed by the string "style". For example, if the class name is TEdit, the style name is Editstyle. + + + Specifies whether the control's context-sensitive Help topic is identified by a context ID or by keyword. +If HelpType is htContext, the HelpContext property value identifies the control's Help topic. +If HelpType is htKeyword, the HelpKeyword property value identifies the control's Help topic. + + + Contains the keyword string that identifies the Help topic for the control. +To enable the keyword-based context-sensitive Help for a control, set the HelpType property to htKeyword and set HelpKeyword to a keyword string. +No keyword (zero-length string, the default) means that no Help topic is provided for the control. + + + Contains the numeric context ID that identifies the Help topic for the control. +In case of a .chm Help file, you must symbolically map Context IDs of Help topics to numeric topic ID values in the [MAP] section of your project (.hhp) file. +To enable Context ID-based context-sensitive Help for a control, set HelpType to htContext and set HelpContext to a numeric topic ID. +A topic ID of 0 (default) means that no Help topic is provided for the control. + + + Specifies the name of the resource object to which the current TStyledControl is linked. +StyleLookup becomes especially useful with the introduction of Metropolis UI styles. Metropolis UI styles contain lots of styles for buttons, panes, lists, and other control elements. Each control has the default style, but you can change this default style to any style accessible for the class of a control. The StyleLookup property can be used to specify such additional style. In the Object Inspector, you can select in the StyleLookup property the name of an additional style for the control -- like searchbuttontext -- from the general style loaded into the TStyleBook or from the default style for the used platform. See StyleLookup Support for Metropolis UI Controls. + + +Note: At design time, using the StyleLookup property of a control in any form in the current project group you can access any custom style defined in any TStyleBook component used in the current project group. That is, even if the form does not have a particular TStyleBook component, controls from this form can use custom styles defined in this TStyleBook component (if this TStyleBook component is used in any form in the current project group). At run time, only styles in the current project and only after an owner of the TStyleBook containing these styles is already created can be accessed. + + + LoadableStyle is used to retrieve the style object. + + + Looks for the style resource object linked to the TStyledControl. +If no style is defined for the current control, LookupStyleObject seeks in the current scene for the active style. +If the current scene does not have a resource object, LookupStyleObject continues the search through the default styles and Parent's style. + + + + + + + + Scene where the style has been changed, nil if the change is global + + + + + + + + Reload style from binary stream + + + Save style to binary stream + + + Clear style and binary stream + + + Return true is style is empty + + + Load style from stream + + + Load style from file + + + Save style to stream + + + Link to owner StyleBook + + + Style that stored on this item + + + If style can not be load on current platform tihs property is True and Style is empty + + + Name used to idenity style in collection + + + Design-time only property used to show Style Designer + + + + + + + + Create and add new item + + + Access property for style collection items + + + + + TStyleBook stores a collection of styles for a form. +There are two ways to create and use a TStyleBook component: + +Drop a TStyleBook component from the Tool Palette onto the Form Designer and make your new TStyleBook component the value of the StyleBook property of the form. This works for desktop applications and mobile applications. +Right-click a control on a FireMonkey desktop form and choose either Edit Default Style or Edit Custom Style. This automatically creates a TStyleBook component, sets it to the form's StyleBook, and opens the Style Designer. +TStyleBook stores the style definition as text in the Resource property and can be loaded from a .style file. +Double-clicking the TStyleBook component on the form opens the Style Designer. + +TStyleBook and Form Inheritance +If you want all the descendant forms to have the same style as the base form, place the TStyleBook in the base form. +If you want the descendant forms to have different styles, place separate TStyleBooks in the descendant forms. +Note: At design time, using the StyleLookup property of a control in any form in the current project group you can access any custom style defined in any TStyleBook component used in the current project group. That is, even if the form does not have a particular TStyleBook component, controls from this form can use custom styles defined in this TStyleBook component (if this TStyleBook component is used in any form in the current project group). At run time, only styles in the current project and only after an owner of the TStyleBook containing these styles is already created can be accessed. + + + Gets the style of the CurrentItem stored in TStyleCollectionItem. Getter of Style. + TStyleCollectionItem stores one style for the specified platform. GetStyle gets the style item. +The style is a TFmxObject type. + + + Use it to look for a style in a global pool. + + + It chooses style depending on context. + + + Creates an empty item on demand. + CreateDefaultItem calls Add to create a TStyleCollectionItem and add it to the TStyleCollection. The new style collection item is placed at the end of the Items array. +Add returns the new style collection item. +Add inherits from System.Classes.TCollection.Add. + + + Loads the style. Loaded is called automatically to load the style definition from the file that is set using the FileName property. + + + Provides an interface for a method that reads and writes otherwise unpublished data. DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Reads the resources from the given stream. ReadResources is called automatically to read resources from the given stream into the TStyleBook object. + + + Creates and initializes a TStyleBook instance. Create constructs a TStyleBook object and initializes its data before the object is first used. + + + Destroys an instance of TStyleBook and frees the associated memory. +Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy. + + + DesignInfo is a TStyleBookDesignInfo record that contains design-time information only used by the Form designer. + + ClassName: Class name of the selected control. + CustomStyle: True when edit custom style mode is active. + DefaultStyleLookup: The default StyleLookup for the selected control. + Name: Name of the selected control. + StyleLookup: Name of the StyleLookup for the selected control. + Control: The selected control itself. + + + Clears the style collection of a TStyleBook. + TStyleCollection is a collection that stores the styles for the different platforms. + Clear deletes all items from the collection. + + + Gets the style of the CurrentItem stored in TStyleCollectionItem. Getter of Style. + TStyleCollectionItem stores one style for the specified platform. GetStyle gets the style item. +The style is a TFmxObject type. + + + Method to load a style to the TStyleBook, from a stream. +To load the style from a file use LoadFromFile. + +procedure TForm1.FormCreate(Sender: TObject); +var + S: TFileStream; +begin + S := TFileStream.Create('Air.Style', fmOpenRead); + Stylebook1.LoadFromStream(S); +end; + +procedure TForm2.FormCreate(Sender: TObject); +var + iStream: TMemoryStream; +begin + StyleBook1.LoadFromFile('Air.Style'); //Loads the style from a file. + iStream := TMemoryStream.Create; //Instanziate the memory stream var. + TStyleStreaming.SaveToStream(StyleBook1.Style, iStream); //saves the style as a memory stream. + StyleBook1.Clear; //Clear the styles from the stylebook. + iStream.Position := 0; //Sets the position to start the streaming. + StyleBook1.LoadFromStream(iStream); //Loads the style to the stylebook from the memory stream. +end; + + + Method to load a style to a TStyleBook, from a file. +Select the full path to the file or the file name when located in the project folder. +FireMonkey styles are delivered in the RAD Studio product installation, at the following paths: + +C:\Program Files (x86)\Embarcadero\Studio\21.0\Redist\styles\Fmx +C:\Users\Public\Documents\Embarcadero\Studio\21.0\Styles +Apply the style to the form using the StyleBook property of the form, for example: + +procedure TForm1.FormCreate(Sender: TObject); +begin + StyleBook1.LoadFromFile('Air.Style'); + Form1.StyleBook := StyleBook1; +end; + +To load a style to an item of the TStyleCollection, that is a style for each platform added to the TStyleBook, then use FMX.Controls.TStyleCollectionItem.LoadFromFile. + + + Represents the current style as a TFmxObject. + + + Index of the current style in the style collection. + CurrentItemIndex is the index of the current StyleCollectionItem from the StyleCollection array. + CurrentItemIndex is an integer value. + + + Current style in the style collection. + CurrentItem is the current StyleCollectionItem from the StyleCollection. + + + The style definition. Resource is a string list containing the style defined by the TStyleBook. + + + Indicates whether the style can be loaded in the current target platform. +If the style cannot be loaded, UnsupportedPlatform is True and Style is empty. + + + The name of the file that contains the style definition. +Use FileName to specify the .style file from which the TStyleBook loads its Resource. +Setting the FileName also loads and applies the style. + + + Specifies whether the TStyleManager replaces the default style for the whole application. + + + Contains the collection of styles stored in the TStyleBook. + + + + + Base class for all text controls such as TDateEdit. +TTextControl is the base class for all graphical controls that display text, such as TTimeEdit, TListBoxItem, TTabItem, and so on. +TTextControl encapsulates standard functionality to manipulate the displayed text, offering the possibility of changing the font, the alignment of the text, or enabling word wrapping. +If you need to create a new control from scratch that displays text (for instance, an enhanced label graphical control or a custom redesigned check box control), then you should derive your component from TTextControl. +TTextControl implements the ITextSettings interface. This interface provides methods and properties to manage the most common text representation properties of general text objects independently of the particular types of these objects. TTextControl and its descendants contain the public property TextSettings of the TTextSettings type. Using the methods and the properties declared in the ITextSettings interface, you can manage the text representation TFont.Family, TFont.Size, TFont.Style, FontColor, HorzAlign, VertAlign, Trimming, and WordWrap properties defining visual parameters of the text representation. For more information, see Setting Text Parameters in FireMonkey. +TTextControl uses the TTextSettingsInfo service class to manage sets of styled text representation properties stored in the DefaultTextSettings, TextSettings, StyledSettings, and ResultingTextSettings properties. +TTextControl implements the IAcceleratorKeyReceiver interface to allow the use of this control as an accelerator key receiver. + + + DoRootChanging is executed when the root container (typically a form) is defined or changes. +For example, DoRootChanging is executed when this control is added to a form or moved from one form to another. +When this control works as an accelerator key receiver, DoRootChanging overrides TControl.DoRootChanging to: + +Register this control to a specific form when the text control is added to the form. +Unregister and register this control from one form to another when this control is moved between forms. + + + Filters the string contained in the Text property. +For example, you can use DoFilterControlText to filter the ampersand symbol of the accelerator key character. +If the control is registered as an accelerator key receiver, you can override this method to do your own filtering to the accelerator keys. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Controls.TTextControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Customizes styles in complex objects. +FMX.Controls.TTextControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + Calls the inherited TStyledControl.DoStyleChanged, then tries to translate the Text. +DoStyleChanged calls the inherited TStyledControl.DoStyleChanged to set that the control needs to update the style, then calls Repaint to redraw the control, and then tries to translate the control's Text calling Translate. + + + Protected setter implementation for the Text property. +In descendants, override SetText to allow for further functionality when setting the text using the Text property. +Do not use SetText directly in applications. Use the Text property instead. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the value of the Name property. +FMX.Controls.TTextControl.SetName inherits from System.Classes.TComponent.SetName. All content below this line refers to System.Classes.TComponent.SetName. +Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Protected getter implementation for the Data property. +FMX.Controls.TTextControl.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.Controls.TTextControl.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Specifies the behavior of a TTextControl control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TCustomAction.Text property of the Sender action to set the new value to the +Text property of TTextControl. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Initializes the component after the form file has been read into memory. +FMX.Controls.TTextControl.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Retrieves the resource object linked to the style of the current TTextControl object. +In the current implementation, FindTextObject retrieves the resource object linked to the 'text' style. + + + Embarcadero Technologies does not currently have any additional information. + + + Keeps the resource object linked to the style of the current TTextControl object. +In the current implementation, TextObject keeps the resource object linked to the 'text' style. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Copies the values of the styled text representation properties of the specified Value object to the current TTextControl object. +SetTextSettings calls + +TTextSettings.Assign(Value); + + + Setter for the StyledSettings property. + + + Updates the representation of the text on the control. +DoChanged is called internally from the Change methods. +Do not call DoChanged explicitly; call the Change method. + + + Retrieves whether any of the default values of font properties that are stored in the StyledSettings property is changed. +StyledSettingsStored retrieves whether StyledSettings needs to be stored in the .fmx form file, keeping the description of the FMX form. +StyledSettingsStored returns True if StyledSettings <> DefaultStyledSettings. The DefaultStyledSettings property is set during the style loading in the ApplyStyle method. See also AllStyledSettings. + + + Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.Controls.TTextControl.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Determines whether the object reacts to the accelerator key or not. +FMX.Controls.TTextControl.CanTriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. +Determines whether the object reacts to the accelerator key or not. +Use CanTriggerAcceleratorKey for objects that are not intended to react to the accelerator key, for example: a hidden tab page or a hidden submenu. The object triggers the action if CanTriggerAcceleratorKey is True. Otherwise, the object cannot trigger the action. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey + + + Returns the character key that serves as the keyboard accelerator for the receiver object. +FMX.Controls.TTextControl.GetAcceleratorChar inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. +Returns the character key that serves as the keyboard accelerator for the receiver object. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex + + + Returns the index of the accelerator character within the text string of the receiver object. +FMX.Controls.TTextControl.GetAcceleratorCharIndex inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. +Returns the index of the accelerator character within the text string of the receiver object. +Use GetAcceleratorCharIndex to highlight the accelerator character when the text string contains several times the same character. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Controls.TTextControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Controls.TTextControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Responds after the last constructor has executed. +FMX.Controls.TTextControl.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + Returns a string containing the class name followed by the text that is rendered over the surface of this TTextControl object. +ToString returns a string containing the concatenation of two substrings: + +The first substring contains the class name of the instance that is being called (retrieved by TObject.ToString). For example, calling on a TCheckBox instance returns a substring containing TCheckBox. +The second substring contains the text from the Text property. This is the text that will be rendered over the surface of the object in which ToString is called. + + + Specifies the text that will be rendered over the surface of this TTextControl object. +Set the Text property to specify the text that will be displayed by this TTextControl. Text can be any string. +If there are any effects already applied before changing the Text property, they will be preserved for the new text. Also, the surface of this TTextControl is repainted. +In the Text property you can define an accelerator key. On Windows platforms, an accelerator key is shown as an underlined letter. To specify an accelerator key, precede an <accelerator_letter> with an ampersand & character. The letter after the ampersand appears underlined. For example, to set the S character as an accelerator key for a Save button, type &Save. On Windows platforms, accelerator keys enable the user to access controls pressing Alt+<accelerator_letter> key combination. When run on not Windows platforms, a single ampersand is simply stripped from the text. To show a single ampersand & character in a Text property specify doubled ampersand && characters. + +Tip: If you specify a new text string that is exactly the same as the one already displayed, the effects will not be re-updated and this TTextControl object will not be repainted. +Note: FMX.ExtCtrls.TPopupBox.Text is not a writable property in the same way as FMX.Controls.TTextControl.Text. The FMX.ExtCtrls.TPopupBox.Text property cannot be "any string", but instead must be just one of the strings in the FMX.ExtCtrls.TPopupBox.Items property and, in this case, FMX.ExtCtrls.TPopupBox.ItemIndex is updated accordingly. + + + Stores a TTextSettings type object keeping the default values of the text representation properties. +DefaultTextSettings is set during the loading of the style in the ApplyStyle method. +DefaultTextSettings is initialized in Create with the following values: + +Font.Size := 11 ; // depends on the platform +Font.Family = 'Tahoma'; // depends on the platform +Font.Style := [] ; +FontColor := TAlphaColorRec.Black; +TextAlign := TTextAlign.Leading; +VertTextAlign := TTextAlign.Center; +Trimming := TTextTrimming.None; +WordWrap := False; + + + Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Keeps final values of text representation properties. These values are really used to draw texts in a control. +ResultingTextSettings keeps a TTextSettings object that manages the final values of the text representation properties. These values are really used to draw texts in a control. +To obtain values stored in ResultingTextSettings, a control uses the StyledSettings property. For example, if StyledSettings contains the TStyledSetting.Family value, then the TFont.Family value is taken from the DefaultTextSettings. (That is the font family name defined in the loaded style is used. The font family name defined by the programmer in the Object Editor is ignored.) Oppositely, if StyledSettings does not contain TStyledSetting.Family, then the font family name defined by the programmer in the Object Editor is used and the font family name defined in the loaded style is ignored. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +RecalculateTextSettings updates the ResultingTextSettings. + + + Calls DoChanged when any of the styled text representation properties of the current TTextControl control is changed. +Change is called when any of the Font, FontColor, VertTextAlign, Trimming or WordWrap properties is changed. +If the control is not in a loading or destroying state (csLoading or csDestroying), Change calls DoChanged to update the representation of the text on the control. + + + Specifies the font to use when rendering the text. +Set Font to specify the font to use when rendering the text. To change to a new font, specify a new TFont object. To modify a font, change the value of the Family, Size, or Style of the TFont object. + + + Specifies the font color of the text in this TTextControl control. +Use the FontColor property to read or change the font color of the text in this TTextControl control. The default value of the FontColor property is TAlphaColorRec.Black. + + + Specifies how the text will be displayed in terms of vertical alignment. +The VertTextAlign property specifies how the TTextControl control displays the text in terms of vertical alignment. VertTextAlign can have one of the following values (defined in TTextAlign): + +Center (default)--aligns the text on a vertical axis, at the middle of the TTextControl object. +Leading--aligns the text on a vertical axis, at the topmost position inside the TTextControl object. +Trailing--aligns the text on a vertical axis, at the bottommost position inside the TTextControl object. +When you use text representation properties stored in ITextSettings.TextSettings, remember that VertTextAlign corresponds to VertAlign. + + + Specifies how the text will be displayed in terms of horizontal alignment. +The TextAlign property specifies how the TTextControl object will display the text in terms of horizontal alignment. TextAlign can have one of the following values (defined in TTextAlign): + +Center (default)--aligns the text on a horizontal axis, at the middle of the TTextControl object. +Leading--aligns the text on a horizontal axis, at the leftmost position inside the TTextControl object. +Trailing--aligns the text on a horizontal axis, at the rightmost position inside the TTextControl object. +When you use text representation properties stored in ITextSettings.TextSettings, remember that TextAlign corresponds to HorzAlign. + + + Specifies whether the text inside the TTextControl object wraps when it is longer than the width of the control. +Set WordWrap to True to allow the TTextControl control to display multiple lines of text. When WordWrap is True, text that is too long for the TTextControl object wraps at the right margin and continues in additional lines. +Set WordWrap to False for the text to span onto a single line of the TTextControl. However, in this case, the text that is too long for TTextControl appears truncated. +The default value for the WordWrap property is False. + + + Specifies the behavior of the text, when it overflows the area for drawing the text. +Trimming may take the following values defined in the TTextTrimming type: None, Character, and Word. +If the value of this property is not None and the text does not fit in the drawing area, then it is trimmed to fit the area and an ellipsis sign is printed after the trimmed text. + +Note: Under the iOS platform, Trimming works only when WordWrap = False. + + + Determines whether the ampersand character (&) is considered as a special prefix character. +The default value is TPrefixStyle.HidePrefix, which means that the (first) ampersand is hidden at run-time. + + + + + TPopup provides a pop-up window. +Use TPopup to display content in a temporary window. +By default, a TPopup content is empty. You can add any number of objects to the TPopup content: + +To add a control to the TPopup content, set the Parent property of the control or create it with the TPopup as its owner. +To access the TPopup children, use ChildrenCount and Children properties. +To position a TPopup, use the following properties: + +PlacementRectangle +PlacementTarget +HorizontalOffset +VerticalOffset +Placement +When TPopup is open, it does not reposition itself if its parent is repositioned. To drag a TPopup together with its parent, set the DragWithParent property to True. +TPopup supports animations and graphic effects. The animations and graphic effects are applied to the displayed window, and not to every child of the TPopup. For opacity effects, set the effects directly to the TPopup children. TPopup children do not inherit the animations and effects applied to the parent. +If TPopup is not explicitly sized, it is sized by its content. In this case, if an effect is applied that increases the content's displayed size, part of the content might be obscured. To avoid this, explicitly set the size for TPopup or set its bounds through the BoundsRect, Margins, and Padding properties. +To open and explicitly close a TPopup, set the TPopup.IsOpen property to True and False, respectively. +(We do not recommend using Popup and ClosePopup.) + + + Customizes styles in complex objects. +FMX.Controls.TPopup.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Renders the control's surface. +FMX.Controls.TPopup.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Forwards notification messages to all owned components. +FMX.Controls.TPopup.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Controls.TPopup.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Processes a dialog key. +DialogKey is called during the message preprocessing to handle dialog characters. +Do not call DialogKey in an application. It is for internal use only. + + + Dispatcher of the OnClosePopup event. + + + Dispatcher of the OnPopup event. + + + Closes the current TPopup. + +Note: We do not recommend using Popup and ClosePopup. To open and explicitly close a TPopup, set the TPopup.IsOpen property to True and False, respectively. +Call ClosePopup to explicitly close a TPopup. If there is more than one pop-ups opened, ClosePopup closes only the specified instance. +To take specific action when TPopup closes, write an OnClosePopup event handler. + + + For internal use. +Creates a new TCustomPopupForm pop-up form. +This pop-up form is stored in the PopupForm property. Popup calls CreatePopupForm. + + + Holds the form that appears on the screen after the Popup method execution. +The value of the PopupForm property is nil if the form does not exist. + + + Specifies whether TPopup has an associated action. +The VisibleStored method returns True if TPopup has an associated action (if the ActionClient property is True). This method returns False otherwise. + + + Creates and initializes a TPopup instance. +Create constructs a TPopup object and initializes its data before the object is used. + + + Destroys the TPopup instance. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the TPopup object is not nil before calling Destroy. + + + Displays the TPopup window. + +Note: We do not recommend using Popup and ClosePopup. To open and explicitly close a TPopup, set the TPopup.IsOpen property to True and False, respectively. +When AShowModal is True, then Popup drops down TPopup as a modal dialog. +Popup applies the specified placement and style to TPopup, before making it visible. +To set the placement, use the PlacementRectangle, PlacementTarget, HorizontalOffset, VerticalOffset, and Placement properties. + + + Returns whether and how the modal form of TPopup closes. +PopupModal returns 0 if the modal form is not closed. Otherwise PopupModal returns the value of the ModalResult property. +To change how the modal form of TPopup is closed, set the ModalResult property. +You can check a return value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions and use the StripAllFromResult function to convert the return value from a constant that refers to "all" to the corresponding simple constant. + + + Returns whether the PopupForm property holds a pop-up form. +HasPopupForm returns True if PopupForm holds the pop-up form that appears on the screen after the Popup method execution. + + + Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +FMX.Controls.TPopup.BringToFront inherits from FMX.Types.TFmxObject.BringToFront. All content below this line refers to FMX.Types.TFmxObject.BringToFront. +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +You can call BringToFront at run time as in the following code snippet: + + Label1.BringToFront; + +or, at design time, by right-clicking the FMX visual control and selecting Control > Bring to Front from the pop-up menu. + + + Sets the animation duration during appearing or closing of the pop-up window. +AniDuration defines time (in seconds) of a custom animation execution. The OnAniTimer event is periodically triggered during the AniDuration time after the pop-up window starts appearing or closing. During the AniDuration time, the AniPosition property changes from 0 to 1 (during opening) and from 1 to 0 (during closing) respectively. The OnAniTimer event handler contains the code that is performed during animation. + +Note: AniDuration does not influence on a duration of an external animation (for example TFloatAnimation animation) if such is assigned to the TPopup pop-up window. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether and how the TPopup closes its modal form. +TModalResult describes possible values of ModalResult. +You can check a ModalResult value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions and use the StripAllFromResult function to convert the ModalResult value from a constant that refers to "all" to the corresponding simple constant. + + + Is True if the TPopup is dropped down, False otherwise. + + + Is True if the TPopup has a closing animation, False otherwise. + + + Sets the size of the TPopup through a TSizeF object. +For example, the following code will set up the TPopup Width to 200 and Height to 250: +Delphi: + + p1.PopupFormSize := TSizeF.Create(200, 250); + +C++ Builder: + + p1->PopupFormSize = TSizeF->Create(200, 250); + + + Embarcadero Technologies does not currently have any additional information. + + + Periodically occurs during TCustomPopupForm custom animation execution. +The OnAniTimer event periodically occurs during AniDuration time while a custom animation executes during appearing and closing of the current TPopup pop-up window. +Write an OnAniTimer event handler to provide animation functionality during appearing and closing of the current pop-up window. AniDuration defines the animation duration in seconds. +To show a TPopup window you can set the IsOpen property to True or call the Popup method. Rendering the TPopup window, the owner form calls CreatePopupForm to create an instance of a TCustomPopupForm pop-up form stored in the PopupForm property. Notice that all visual components placed in the TPopup window are contained in the ContentControl created in the PopupForm pop-up form. +The OnAniTimer event handler has the type TNotifyEvent declared as follows: + + TNotifyEvent = procedure(Sender: TObject) of object; + +Therefore, the Sender parameter, in the following example, can be cast to TCustomPopupForm. See how this is used in the AniTimeProc event handler of the OnAniTimer event in the following example implementing animation of appearing and closing of the TPopup window: + +type + TForm1 = class(TForm) + Button1: TButton; + Popup1: TPopup; + Button2: TButton; + Rectangle1: TRectangle; + procedure FormCreate(Sender: TObject); + public + T: TDateTime; + procedure AniTimeProc(Sender: TObject); + end; + +var + Form1: TForm1; + +implementation + +procedure TForm1.AniTimeProc(Sender: TObject); +begin + Button1.Text := FloatToStr(RoundTo((Now - T) * 86400{SecPerDay}, -2)); + TCustomPopupForm(Sender).ContentControl.Opacity := TCustomPopupForm(Sender).AniPosition; + TCustomPopupForm(Sender).Left := Self.Left + Round(100 * TCustomPopupForm(Sender).AniPosition); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + T := Now; + Popup1.Popup; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + Popup1.AniDuration := 4; + Popup1.OnAniTimer := AniTimeProc; +end; + +end. + +Notice that OnAniTimer can use AniPosition and other properties of TCustomPopupForm. + + + Specifies whether the TPopup is dragged together with its parent. +If DragWithParent is set to True, TPopup is dragged too, when its parent is the target of a drag-and-drop operation. The default value is False. +For example, the TPopup of a combo box is dragged with its parent. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets and gets the horizontal distance between the target origin and the TPopup alignment point. +To set the target origin and the alignment point, use the PlacementTarget, Placement, and PlacementRectangle properties. +HorizontalOffset has no effect if Placement has one of the values: Absolute, Mouse, MouseCenter. + + + Determines how to position the TPopup form relative to a rectangle specified by the PlacementRectangle or PlacementTarget properties, relative to the screen, or relative to the mouse (pointing device) position. +Placement also specifies the behavior of the TPopup form, when it overlaps screen boundaries. The default value is Bottom. +TPlacement determines possible values of Placement. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of TPopup. + + + Gets or sets the rectangle element relative to which TPopup is positioned. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of TPopup. +This is an example of a TPopup with PlacementRectangle: + + + Gets or sets the target relative to which TPopup is positioned. +If PlacementTarget is not set, and TPopup has a parent, TPopup is positioned relative to its parent. If PlacementTarget and Parent are not set, TPopup is positioned relative to the main window. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of TPopup. + + + Gets and sets the TPopup stored style. +To create a new style, use the Style Designer. See details here: Style Resource Storage. + + + Sets and gets the vertical distance between the target origin and the TPopup alignment point. +To set the target origin and the alignment point, use the PlacementTarget, Placement, and PlacementRectangle properties. +VerticalOffset has no effect if Placement has one of the values: Absolute, Mouse, MouseCenter. + + + Occurs when the TPopup object is closed. Write an OnClosePopup event handler to take specific action when the TPopup closes. + + + Occurs just before the pop-up window appears. +Write an OnPopup event handler to take specific action just before the pop-up window appears. + + + + + + + + Provides a mechanism for checking if application analytics has been enabled without accessing the + AnalyticsManager property (which will create an instance of an application manager if one does not already + exist). Returns True if an instance of TAnalyticsManager is assigned to the application. Returns False + otherwise. + + + Cancels the display of a hint for a control. + + + Hides the current hint. + + + Determines whether Help Hints are enabled or disabled for the entire application. + + + Occurs when the mouse pointer moves over a control or menu item that can display a Help Hint. + + + Returns true if RealCreateForms was invoked; otherwise, false. + + + Returns an instance of TAnalyticsManager. An instance will be created if one does not already exist. + There should only be one AnalyticsManager per application. + + + Specifies the text string that appears in the Help Hint box. + + + Enables the display of keyboard shortcuts. + + + + + + + + Notifies when form changed style. + + + + + + + + Previous focused control. + + + New control, which are going to have focus. + + + + + + + + Background color of system status bar + + + Different modes of showing system status bar + + + + + TCommonCustomForm represents the base class for all forms, whether they are 2D or 3D. +TCommonCustomForm is the base class for all TCustomForm and TCustomForm3D, and all their derived objects such as TForm and TForm3D. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the first item in the children list. +FMX.Forms.TCommonCustomForm.GetBackIndex inherits from FMX.Types.TFmxObject.GetBackIndex. All content below this line refers to FMX.Types.TFmxObject.GetBackIndex. +Returns the first item in the children list. This value is usually 0, but for styled objects, which have a style as the first object in the children list, this value is 1. + + + Schedules a repaint of the specified rectangle zone on the given form. +InvalidateRect takes in the R TRectF parameter and repaints the rectangle. + + + Re-creates this form. +Recreate sets this form state to Recreating, then destroys and re-creates its handle, finalizing by showing the form on the screen. In the end, Recreate restores the original form's state by removing the Recreating attribute. +If the form is in a csDesigning state, Recreate exits doing nothing. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the value of the Active property. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Forms.TCommonCustomForm.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Returns the specified control located at the given coordinates. +FindTarget iterates through all the children of this form and searches for the control given through the Data parameter at the coordinates specified by P. If the given control was not found, FindTarget returns nil, otherwise it returns the object. +FindTarget is used internally in drag-and-drop operations. + +Tip: The control searched for must be an IControl, must be Visible, and HitTest must be set to True. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a reference to a specified interface if the current component supports that interface. +FMX.Forms.TCommonCustomForm.QueryInterface inherits from System.Classes.TComponent.QueryInterface. All content below this line refers to System.Classes.TComponent.QueryInterface. +Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates the window for this form and assigns it a handle. CreateHandle is overridden in subclasses to add extra functionality when creating the window containing this form. + + + Destroys the window handle created by CreateHandle. DestroyHandle is overridden in subclasses to add extra functionality when destroying the window containing this form. + + + Resizes this form according to ClientWidth and ClientHeight. +ResizeHandle is overridden in subclasses to implement functionality to resize the dimensions of this form according to the values of the ClientWidth and ClientHeight properties. + + + Returns a reference to this form object. + + + Retrieves the active control. +Retrieves the IControl type object stored in the FActiveControl field. + + + Sets the focus to the specified AControl control. +SetActiveControl sets the focus to the specified AControl control (sets the active control), if possible. +The descendant TCustomForm class uses this protected SetActiveControl method in the setter of the ActiveControl property. +SetActiveControl internally calls FMX.Controls.TControl.SetFocus. + + + Sets the value of the Captured property. + + + Retrieves the control that can obtain the focus. +NewFocusedControl checks whether the specified Value control can obtain the focus. If Value cannot obtain the focus, then NewFocusedControl returns the youngest parent of Value that can obtain the focus. Otherwise, NewFocusedControl returns nil. + + + Protected setter implementation for the Focused property. +SetFocused sets the focus to the specified control. The control must be located on this form and must exist. + + + Sets the Hovered property and activates the functionality informing that the mouse pointer has entered the area of the control. +Sets the control stored in the Hovered property and activates an animation and effects informing that the mouse pointer has entered the area of the control by calling DoMouseEnter. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected getter implementation for the Captured property. + + + Returns the value of the Focused property. + + + Protected getter implementation for the BiDiMode property. + + + Retrieves the control stored in the Hovered property. + + + Implements functionality to start the drag-and-drop operation for the given object on the surface of the given form. +ABitmap specifies the image that will be displayed while dragging the object specified by the Source parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Repaints all the rectangles given through the UpdateRects parameter. UpdateRects is an array of TRectF rectangles. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Used internally by the canvas of this form. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +FMX.Forms.TCommonCustomForm.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Ensures that AComponent is notified that the component is going to be destroyed. +FMX.Forms.TCommonCustomForm.FreeNotification inherits from System.Classes.TComponent.FreeNotification. All content below this line refers to System.Classes.TComponent.FreeNotification. +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Forms.TCommonCustomForm.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +FMX.Forms.TCommonCustomForm.Updated inherits from System.Classes.TComponent.Updated. All content below this line refers to System.Classes.TComponent.Updated. +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + Forwards notification messages to all owned components. +FMX.Forms.TCommonCustomForm.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Ensures that renaming an owned component does not create a name conflict. +FMX.Forms.TCommonCustomForm.ValidateRename inherits from System.Classes.TComponent.ValidateRename. All content below this line refers to System.Classes.TComponent.ValidateRename. +Ensures that renaming an owned component does not create a name conflict. +ValidateRename checks whether a component can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the Components list, ValidateRename raises an EComponentError exception. +ValidateRename is used internally when the Name property is modified. It is not necessary to call it directly. + + + Enumerates all child components. +FMX.Forms.TCommonCustomForm.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the value of the ClientWidth property. + + + Returns the value of the ClientHeight property. + + + UpdateActions updates all the actions associated to the current form. + + + Returns the associated action link class. +FMX.Forms.TCommonCustomForm.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Specifies the behavior of a TCommonCustomForm form when Action changes. +Depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +Visible and Caption properties of TCommonCustomForm. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Embarcadero Technologies does not currently have any additional information. + + + The listener for virtual keyboard events of the form. +TCommonCustomForm uses the System.Messaging.TMessageManager.SubscribeToMessage method to subscribe the VirtualKeyboardChangeHandler listener to the TVKStateChangeMessage virtual keyboard events. +The VirtualKeyboardChangeHandler listener handles the KeyboardVisible and +KeyboardBounds properties by calling the +OnVirtualKeyboardShown and OnVirtualKeyboardHidden event handlers. + + + Determines whether the pressed key should be processed only by the control having the focus or by all children controls and menus of the form. +IsDialogKey is used internally in the KeyDown method. +IsDialog returns True, if KeyChar < ' ' or Shift identifies any of the CTRL, ALT, or CMD keys. That is, if the KeyChar and Shift combination identifies some control combination -- not a printable character. IsDialog returns False, if the Key and KeyChar combination identifies some printable character. The ' ' character has the $20 ASCII value. ASCII values less than $20 identify control combinations. +IsDialogKey has the following parameters: + +Key is the scan code of the pressed keyboard key. This parameter is ignored. +KeyChar is the character code of the pressed key. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when you press the key. +IsDialog is the return boolean parameter. +See also +FMX.Forms.TCommonCustomForm.KeyDown + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Processes the unhandled OnTap events. +DoTap is run automatically for all tap events that were not handled by the user. DoTap is run only if OnTap is not set or if it did not handle the tap event. +Override DoTap in descending classes to support default behavior for tap events that were not handled by the user. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Event handler for the event that occurs when there is a change in the scale of the control. +For instance, changing from retina to non-retina screen on OS X platforms implies a change in the scale factor of the control. + + + Event handler for the event that occurs when there is a style change. +Note: When there is a style change, the control sends a TStyleChangedMessage message. + + + Calls the TriggerOnHint method of all the objects that are registered in the registry. + + + Registers a new receiver. + + + Unregisters a receiver. +AReceiver specifies the receiver to remove from the registry list. + + + Creates and initializes this form. +Create calls the inherited Create to create this form. Create +retrieves the IFMXWindowService, IFMXCursorService, +IFMXFullScreenWindowService, and +IFMXWindowsTouchService services. +Create calls InitializeNewForm to initialize such form parameters as bounds, width and height, border icons, style, border style, and client size for the form. +AOwner specifies the owner of this form. +An AOwner (usually the application) is responsible for freeing the created form. +Most applications do not call this constructor, but rather instantiate a descendant of TForm that is defined in the forms designer. Forms added to an application at design time are created automatically. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Forms.TCommonCustomForm.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs several initializations required by this form. +These initializations include bounds, width and height, border icons, border style, and client size for the form. InitializeNewForm is used by the form constructors. + + + Responds after the last constructor has executed. +FMX.Forms.TCommonCustomForm.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + Performs any necessary actions before the first destructor is called. +FMX.Forms.TCommonCustomForm.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Returns the object located at the given coordinates. +ObjectAtPoint iterates through all the children of this form and returns the component situated at the coordinates given through the AScreenPoint TPointF parameter. +If the object at the specified coordinates was not found, or is not an IControl, or its state is csDesigning, ObjectAtPoint returns nil. Otherwise the object is returned as IControl. + + + Embarcadero Technologies does not currently have any additional information. + + + Executes each time you press a mouse button. +MouseDown has the following parameters: + +Button specifies the mouse button that has been pressed. +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you press the mouse button. +X specifies the horizontal position of the mouse. +Y specifies the vertical position of the mouse. + + + Executes each time you move the mouse over the surface of this form. +MouseMove has the following parameters: + +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you released the mouse button. +X specifies the horizontal position of the mouse. +Y specifies the vertical position of the mouse. + + + Executes each time you release a mouse button. +MouseUp has the following parameters: + +Button specifies the mouse button that has been released. +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you released the mouse button. +X specifies the horizontal position of the mouse. +Y specifies the vertical position of the mouse. + + + Executes each time you roll the mouse wheel. +MouseWheel has the following parameters: + +Shift determines the state of the CTRL, ALT, and SHIFT keys at the moment you released the mouse button. +WheelDelta indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, and negative if the mouse was rotated downward. +Handled specifies whether this form handles the mouse wheel, or other child controls do this. + + + Executes each time the mouse leaves the surface of this form. + + + Executed when a key is pressed while this form has the input focus. +In FireMonkey framework KeyDown is the main method to process pressing of keys in forms. KeyDown is executed each time a key is pressed, when this form has the input focus. KeyDown is used internally: to activate menus and actions and to treat TAB requests to cycle through the children controls of this form. Editors can use KeyDown to add symbols into a text being edited. +You can override KeyDown to provide additional key treating in subclasses. +KeyDown has the following parameters: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +The UITypes unit defines Virtual Keys providing symbolic constants for scan codes of keyboard keys. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). Under FireMonkey framework, platform-specific units (for example FMX.Platform.Mac.pas) should translate native (iOS for FMX.Platform.Mac.pas unit) scan codes to the corresponding Windows codes defined in the UITypes unit. As the result Key always has scan code values defined by vkXXXX constants in UITypes. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key +vkEscape = $1B; { 27 } corresponds to the ESCAPE +vkSpace = $20; { 32 } corresponds to the SPACE +vkF2 = $71; { 113 } corresponds to the F2 keyboard key +Keys of digits and letters -- independently of the selected input language and case of alphabetic keys -- have values corresponding to the '0'..'9' and 'A'..'Z' symbols. For example, Key = vkP = $50 corresponds to the 'P' keyboard key. +If Key = $0, then KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and Input Method Editor (IME) state. +Combinations of the Key and Shift parameters can be translated to shortcut key combinations. + + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be handled as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Determines the state of the CTRL, ALT, SHIFT, and CMD (only for Mac) keys at the moment you press the key. + + + +KeyDown processes pressed keys according to the following algorithm: + +KeyDown first calls the IsDialogKey with the same parameters as those specified for KeyDown. The IsDialog parameter returns True if KeyChar < ' ' or Shift is any of the CTRL, ALT or CMD keys. That is, if the KeyChar and Shift combination identifies some control combination -- not a printable character. Otherwise, it returns False. The ' ' character has the $20 ASCII value. ASCII values less than $20 identify control combinations. +If IsDialogKey returns True in the IsDialog parameter, then the pressed key combination is passed, in the following order, to all child controls, menus and action lists in the form until this key combination is processed: +To the control having focus. +To the context menu of the control having focus. +To all other menus and context menus in the form. +To all other controls (not having focus) in the form. +To action lists in the form and in all child components having assigned action list elements. +To menus and action lists in all other forms. +If the pressed key combination was processed during one of the previous steps, then KeyDown sets Key = 0 and KeyChar = #0 and terminates. +If Key = vkTab, then KeyDown moves the focus to the next control in the controls "tab order" and terminates. +If Key <> 0 or KeyChar <> #0, then KeyDown calls the KeyDown method of the control having focus and then calls the OnKeyDown event handler of the form if one is assigned. +In the finally block, KeyDown stores the current date and time in the LastKeyPress and LastUserActive properties of the current application. + + + Is executed each time when a key is released while this form has the input focus. +First, KeyUp calls the OnKeyUp event handler (if one is defined) of the control having input focus, then KeyUp calls the OnKeyUp event handler. In the finally block, KeyUp stores the current date and time in the LastKeyPress and LastUserActive properties of the current application. +KeyUp has the following parameters: + +Key is the scan code of the pressed keyboard key. The UITypes unit defines Virtual Keys providing symbolic constants for scan codes of keyboard keys. +KeyChar is the character representation of the pressed key. +Shift determines the state of the CTRL, ALT, SHIFT, and CMD (only for Mac) keys at the moment you press the key. +You can override KeyUp to provide additional ways to handle keys in subclasses. + + + Sets the mouse capture to this window, which belongs to the current thread. + + + Releases the mouse capture from this window that belongs to the current thread and restores normal mouse input processing. + + + Recreates the context where the form renders itself. + + + The HandleNeeded method requests the form to create its handle at this moment and all the resources associated to it. + + + Activation event dispatcher. +The form component calls Activate when it gets the focus either because of a change in the active windows within an application or because of the application becoming active. Activate fires an OnActivate event. + + + Deactivation event dispatcher. +The form component calls Deactivate when it loses the focus either because of a change in the active windows within an application or because of the application becoming inactive. Deactivate fires an OnDeactivate event. + + + Executes when you drag an object while entering the surface of this form. +Override DragEnter to add additional code that executes when you enter the surface of this form while dragging an object. +Data is the object being dragged. +Point is the position of the mouse. + + + Executes when you drag an object over the surface of this form. +Override DragOver to add additional code that executes when you drag an object over the surface of this form. DragOver sets the Accept parameter to True to indicate that you can drop the dragged object on this form. It sets Accept to False to indicate that you cannot drop the dragged object on this form. +The Data parameter is the object being dragged. +Point indicates the current position of the mouse. + + + Executes when you drop an object over the surface of this form. +Override DragDrop to add additional code that executes when you drop an object over the surface of this form. +The Data parameter is the object that was dropped onto this form. The Point parameter has the mouse coordinates where the object was dropped. + + + Executes when you drag an object while leaving the surface of this form. +Override DragLeave to add additional code that executes when you leave the surface of this form while dragging an object. + + + Starts the menu loop for the main menu bars that this form might contain. +EnterMenuLoop iterates through all the child controls of this form and, if one of them is a TMenuBar, then starts its menu loop. + + + Signals that this form's window is about to be dragged. StartWindowDrag exits if this form has a csDesigning component state. + + + Signals that this form's window is about to be resized. StartWindowResize exits if this form has a csDesigning component state. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the boundaries for this form. +SetBounds has the following parameters: + +ALeft--the left boundary +ATop--the top boundary +AWidth--the right boundary +AHeight--the bottom boundary + + + Sets the boundaries for this form. +SetBounds has the following parameters: + +ALeft--the left boundary +ATop--the top boundary +AWidth--the right boundary +AHeight--the bottom boundary + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Bounds of form - position and size. + + + Embarcadero Technologies does not currently have any additional information. + + + Converts the given mouse coordinates to screen coordinates. The local coordinates on the surface of this form are given through the Point parameter. + + + Transforms the global screen coordinates to local client area coordinates. The global screen coordinates are given through the Point parameter. + + + Retrieves whether the form is not visible. +CanShow returns True if Visible is False (when the form is not visible). + + + Close-attempt event dispatcher. +CloseQuery is called automatically when an attempt is made to close the form. CloseQuery can allow the form to close by returning True, or prevent the form from closing by returning False. +As implemented in TCommonCustomForm, CloseQuery calls the OnCloseQuery event handler, if it exists. If no such event handler exists, CloseQuery returns True. + + + Returns a TRectF with the coordinates of the client area. The width of the rectangle is the same as ClientWidth and the height of the rectangle is ClientHeight. + + + Embarcadero Technologies does not currently have any additional information. + + + Closes the form and returns the close action that the form uses. +Call Close to close a form. +Attempts to close a form can be aborted by the CloseQuery event dispatcher or the OnCloseQuery event handler. + +Note: When the main form of the application closes, the application terminates. + + + Displays the form onscreen. +The form is displayed onscreen, with the specified Position. + + +Attention: On macOS, the Secondary window created by a modal windows must also be shown using ShowModal. Do not call Show for a window that is being shown from a window shown using ShowModal. + + + Hides the form. +Hide sets the Visible property to False. + + + Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +FMX.Forms.TCommonCustomForm.BringToFront inherits from FMX.Types.TFmxObject.BringToFront. All content below this line refers to FMX.Types.TFmxObject.BringToFront. +Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +You can call BringToFront at run time as in the following code snippet: + + Label1.BringToFront; + +or, at design time, by right-clicking the FMX visual control and selecting Control > Bring to Front from the pop-up menu. + + + Sends this FMX visual object to the background letting other overlapping visual controls that are on the same form to be on top of it. +FMX.Forms.TCommonCustomForm.SendToBack inherits from FMX.Types.TFmxObject.SendToBack. All content below this line refers to FMX.Types.TFmxObject.SendToBack. +Sends this FMX visual object to the background letting other overlapping visual controls that are on the same form to be on top of it. +You can call SendToBack at run time as in the following code snippet: + + Label1.SendToBack; + +or, at design time by right-clicking the FMX visual control and selecting Control > Send To Back from the pop-up menu. + + + Shows the form as a modal dialog box. +Use ShowModal to show the form as a modal dialog box. When a modal form is opened the application cannot continue to run until the modal form is closed. Thus, ShowModal does not return until the form has closed. When the form has closed, it returns the value of the ModalResult property. +To close a modal form, set its ModalResult property to a nonzero value. + + +Tip: If the form contains buttons with a ModalResult property set to a value other than mrNone, the form automatically closes when the user clicks one of these buttons and returns the ModalResult value as the return value of ShowModal. +Warning: Modal dialog boxes are not supported in Android apps. We recommend do not use modal dialog boxes on either of the mobile platforms (iOS and Android) because unexpected behavior can result. Avoiding usage of modal dialog boxes eliminates potential problems in debugging and supporting your mobile apps. +Attention: On macOS, secondary windows shown from a modal window must also be shown modally using ShowModal, otherwise secondary windows do not gain focus. + + + Shows the form as a modal dialog box. +Use ShowModal to show the form as a modal dialog box. When a modal form is opened the application cannot continue to run until the modal form is closed. Thus, ShowModal does not return until the form has closed. When the form has closed, it returns the value of the ModalResult property. +To close a modal form, set its ModalResult property to a nonzero value. + + +Tip: If the form contains buttons with a ModalResult property set to a value other than mrNone, the form automatically closes when the user clicks one of these buttons and returns the ModalResult value as the return value of ShowModal. +Warning: Modal dialog boxes are not supported in Android apps. We recommend do not use modal dialog boxes on either of the mobile platforms (iOS and Android) because unexpected behavior can result. Avoiding usage of modal dialog boxes eliminates potential problems in debugging and supporting your mobile apps. +Attention: On macOS, secondary windows shown from a modal window must also be shown modally using ShowModal, otherwise secondary windows do not gain focus. + + + Prepares a modal form for closing and returns the close action that the form uses. +Do not call CloseModal in your application. CloseModal is used by the the FireMonkey framework when a modal form needs to be closed. CloseModal does not close the form by itself; it simply calls the registered close events and updates the ModalResult property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Schedules a repaint of this form. +Invalidate informs the form that its entire surface needs to be repainted. Calling Invalidate can prevent flicker caused by a series of partial repaints. There is no performance penalty for calling Invalidate multiple times before the form is actually repainted. + + + Starts updating all the child controls in this form. +BeginUpdate starts updating all the child controls placed on this form, thus speeding any operations you might perform on the form or on multiple children. BeginUpdate signals the beginning of an update operation and must be followed by EndUpdate when all the updates have been completed. + + + Ends updating all the child controls in this form. +EndUpdate ends updating all the child controls placed on this form, finalizing any updates you might have performed on the form or on multiple children. EndUpdate signals the end of an update operation and must be preceded by BeginUpdate and by the updates themselves. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns true only if the handle is allocated. + + + Specifies the handle of this form. + + + Specifies the parent form of this form. +The ParentForm parent form must be an instance of a TCommonCustomForm descendant. ParentForm contains the parent component of the current TCommonCustomForm form. ParentForm is responsible for deleting the current TCommonCustomForm form. +The value of ParentForm is set when you change the Parent property. If Parent is a form, then ParentForm is set to the value of Parent. Otherwise, ParentForm is set to the value of the form, to which the Parent belongs. + + + Determines the form style. +FormStyle is one of the Normal, Popup, or StayOnTop values defined in TFormStyle. + + + Represents the return value of a form that is used as a modal dialog box. +Use ModalResult to close the form when it is displayed modally. +By default, ModalResult is mrNone. Set ModalResult to any nonzero value to close the form. The ModalResult value becomes the return value of the ShowModal function called to display the form. +The following table lists the constants defined in the System.UITypes unit to be used for the ModalResult property of the TModalResult type. + + + +Constant + +Value + +Meaning + + + +mrNone + + + +0 + + + +None. Used as a default value before the user exits. + + + + +mrOk + + + +idOK = 1 + + + +The user exited with the OK button. + + + + +mrCancel + + + +idCancel = 2 + + + +The user exited with the CANCEL button. + + + + +mrAbort + + + +idAbort = 3 + + + +The user exited with the ABORT button. + + + + +mrRetry + + + +idRetry = 4 + + + +The user exited with the RETRY button. + + + + +mrIgnore + + + +idIgnore = 5 + + + +The user exited with the IGNORE button. + + + + +mrYes + + + +idYes = 6 + + + +The user exited with the YES button. + + + + +mrNo + + + +idNo = 7 + + + +The user exited with the NO button. + + + + +mrClose + + + +idClose = 8 + + + +The user exited with the CLOSE button. + + + + +mrHelp + + + +idHelp = 9 + + + +The user exited with the HELP button. + + + + +mrTryAgain + + + +idTryAgain = 10 + + + +The user exited with the TRY AGAIN button. + + + + +mrContinue + + + +idContinue = 11 + + + +The user exited with the CONTINUE button. + + + + +mrAll + + + +mrContinue + 1 (12 or $C) + + + +The user exited with the ALL button. + + + + +mrNoToAll + + + +mrAll +1 (13 or $D) + + + +The user exited with the NO TO ALL button. + + + + +mrYesToAll + + + +mrNoToAll +1 (14 or $E) + + + +The user exited with the YES TO ALL button. + + +You can check a ModalResult value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions and use the StripAllFromResult function to convert ModalResult values that refer to "ALL" buttons to identifying values corresponding simple buttons (Ok, No, or Yes). + +Note: This property can be modified automatically setting corresponding ModalResult properties of controls in the modal form. + + + Indicates transitional state information about the form. +Read FormState to determine the state of the form. FormState indicates when the form is in various transitional states or when certain operations have occurred. The following table lists the values that can be included in a form's state: + + + + + +Value + +Meaning + + + +Recreating + + + +The form is recreating its handle and its window is being shown on the screen. + + + + +Modal + + + +The form was created as a modal window. + + + Specifies the designer interface for the form. +The Designer property is used internally at design time. Never assign a value to this property. This is done automatically by the form designer. Only use this property when designing classes for use in the form designer, such as property editors and component editors. + + + Specifies the control that has captured the mouse. Captured is read-only. + + + Specifies the control that has the focus set on it. + + + Identifies the control over which the mouse pointer is hovering. +Used internally for mouse hovering-over purposes. + + + Specifies whether the form has focus. +Use Active to determine whether the form has focus. The Active form receives all keyboard input. If it has a title bar, it is drawn using the active colors specified by the operating system. +If Active is True, the form has focus; if Active is False, the form does not have focus. + + + Indicates the layout of this form when running under Middle Eastern versions of the operating system. +Use BiDiMode to specify the bi-directional mode for the application. The bi-directional mode controls the direction in which text appears (left-to-right or right-to-left), the placement of vertical scroll bars, and the default alignment of text when the application runs in Middle Eastern locales. + + + Specifies a text string that identifies the form to the user. +Use Caption to specify the text string that labels the form, identifying it to the user. + + + Specifies the mouse cursor that will be used on this form. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the appearance and behavior of the form border. +Use BorderStyle to get or set the appearance and behavior of the form border. BorderStyle can be any of the following TFmxFormBorderStyle values: + + + +Value + +Meaning + + + +Single + + + +Not resizable; minimize/maximize menu + + + + +None + + + +Not resizable; no visible border line + + + + +Sizeable + + + +Standard resizable border + + + + +ToolWindow + + + +Similar to Single, but with a smaller caption + + + + +SizeToolWin + + + +Similar to Sizeable, but with a smaller caption + + +Notes: + +In iOS applications, None makes your form run in fullscreen mode. With any other value, your iOS app shows the iOS status bar. +In Android applications, the BorderStyle property does not control fullscreen display. Instead, you should set the theme property on the Project > Options > Version Info page of your Android project: +Setting the theme = TitleBar means that your Android app includes a title or status bar. +Setting the theme = NoTitleBar means that your Android app runs in fullscreen mode, without a title or status bar. + + + Specifies which icons appear on the title bar of the form. +Use BorderIcons to get or set the icons that appear on the title bar of the form. BorderIcons can include any of the following TBorderIcons values: + + + +Value + +Meaning + + + +biSystemMenu + + + +The form has a Control menu (also known as a System menu). + + + + +biMinimize + + + +The form has a Minimize button. + + + + +biMaximize + + + +The form has a Maximize button. + + + + +biHelp + + + +Has no effect in FireMonkey. + + + Bounds of form - position and size. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the height (in pixels) of the form's client area. +Use ClientHeight to determine the height (in pixels) of the form's client area. The client area is the usable area inside the form's border, excluding the title bar, scroll bars, and so on. +Set ClientHeight to change the height of the form's window based on the desired client area. To change the height of the form's window based on the total size of the window (including the border, menu, status bar and so on), use the Height property instead. + + + Specifies the width (in pixels) of the form's client area. +Use ClientWidth to determine the width (in pixels) of the form's client area. The client area is the usable area inside the form's border. Set ClientWidth to change the width of the form's window based on the desired client area. To change the width of the form's window based on the total size of the window (including the border, status bar, and so on), use the Width property instead. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the padding of the form. +The Padding of a form specifies how close, in pixels, the child of the form can come to each of its edges (top, left, bottom, right). Padding adds space to the inner side of the form. +The child of the form is repositioned and resized, if necessary, to fit the Padding. + + + Represents the size and placement of the form. +Use Position to get or set the size and placement of the form. Position can have one of the following TFormPosition values: + + + +Value + +Meaning + + + +Designed + + + +The form appears positioned on the screen and with the same height and width as it had at design time. + + + + +Default + + + +The form appears in a position on the screen and with a height and width determined by the operating system. Each time you run the application, the form moves slightly down and to the right. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of None, for example), the window is positioned in the upper-left corner of the screen. +On OS X, the default position for new windows is the upper-left corner of the screen. + + + + +DefaultPosOnly + + + +The form displays with the size you created it at design time, but the operating system chooses its position on the screen. Each time you run the application, the form moves slightly down and to the right. When the form can no longer move down and to the right and keep the same size while remaining entirely visible on the screen, the form displays in the upper-left corner of the screen. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of None, for example), the window is positioned in the upper-left corner of the screen. +On OS X, the default position for new windows is the upper-left corner of the screen. + + + + +DefaultSizeOnly + + + +The form appears in the position you left it at design time, but the operating system chooses its size. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. + + + + +ScreenCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. + + + + +DesktopCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. No adjustments are made for multi-monitor applications. + + + + +MainFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the application's main form. No adjustments are made for multi-monitor applications. This position should only be used with secondary forms. If set for a main form, it acts like ScreenCenter. + + + + +OwnerFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the owner form. If there is no owner form, this position acts like MainFormCenter. + + +Note that, if Position is set to Default, DefaultPosOnly, or DefaultSizeOnly, and BorderStyle is set to None, the form will be positioned at (0,0). + + + Specifies the style book for this form. For more information on how to customize the looks of a FireMonkey application with styles, refer to the Customizing FireMonkey Applications with Styles help topic. + + + System status bar settings on mobile platforms. + + + Indicates whether the form is transparent or not. +Use Transparency to determine whether the form is displayed as a totally transparent one. However, note that in this situation, all the controls will not be transparent and will be displayed normally. Only the form's background will be set to a transparent state. +If you set Transparency to True, the form will not display its title bar, nor its border. This means that you need to apply programmatic methods (involving setting of the Top and Left properties) to move the form on the screen surface. + + + Specifies the horizontal size of the form (in pixels). +Use the Width property to read or change the width of the form. + + + Specifies the vertical size of the form (in pixels). +Use the Height property to read or change the height of the form. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the form is visible. +Use Visible to determine whether the form is visible. +If Visible is True, the form is visible unless it is completely obscured by other forms. If Visible is False, the form is not visible. +The Show and ShowModal methods set Visible to True and bring the form to the front of all open windows. + + + Represents how the form appears on the screen. +Set WindowState to minimize, maximize, or restore the form window. Read WindowState to determine whether the form is minimized, maximized, or in a normal state. +Possible values for the WindowState property are: + +wsMaximized +wsMinimized +wsNormal + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the form is in fullscreen mode. +Use FullScreen to specify whether the form is in fullscreen mode. + + + Indicates whether the Mac fullscreen icon is visible. +Use ShowFullScreenIcon to specify whether the Mac fullscreen icon or is visible. + +Note: ShowFullScreenIcon has no visible effect in Windows. + + + Specifies the form factor for this FireMonkey form, that is, the TFormFactor properties: width, height, orientations, and devices. + + + Is a string property that specifies the form family this form is part of. +The logic can choose a different form as the main form depending on size, if an app has several forms with the same .FormFamily value as the app's main form. + + + Specifies the save state of the FireMonkey form. +The SaveState property is an instance of the TFormSaveState class, used to save the state of a form so this state can be restored once the application is restarted. + + + Determines whether help hints are enabled or disabled for first level child controls in the form. +For more information about the rules for enabling hints for a control, see Using Hints to Show Contextual Help in a FireMonkey Application. + TCommonCustomForm.ShowHint is a Boolean property set as True by default. When you place a child control in the form, and set the TControl.Hint property, the hint is displayed because the TControl.ParentShowHint is True by default. +If the TCommonCustomForm.ShowHint property of the form is set to False, the hint is not displayed in the child control. +To show the hint for a control, even when the TCommonCustomForm.ShowHint property of the form is set to False, set TControl.ShowHint for the control to True. + + + Occurs when the form is created. +Use OnCreate to perform special processing when the form is created and is invoked by the constructor. Either implement this event or override the constructor of the form; do not perform both actions. Any objects created in the OnCreate event should be freed by the OnDestroy event. +When a form is being created and its Visible property is True, the following events occur in the order listed: + +OnCreate +OnActivate + + + Occurs when the form is destroyed. +Use OnDestroy to perform special processing when the form is destroyed. Either implement this event or override the destructor of the class, but not both. This event should destroy any objects created in the OnCreate event. + + + Occurs when the form closes. +Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close. The handler specified by OnClose might, for example, test that all fields in a data entry form have valid contents before allowing the form to close. +A form is closed by the Close method or when the user chooses Close from the form's system menu. +The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines whether the form actually closes. +The following table lists the possible values of Action: + + + + +Value + +Meaning + + + +caNone + + + +The form is not allowed to close, so nothing happens. + + + + +caHide + + + +The form is not closed, but just hidden. Your application can still access a hidden form. This is the default value for Action. + + + + +caFree + + + +The form is closed and all allocated memory for the form is freed. + + + + +caMinimize + + + +The form is minimized, rather than closed. + + + +By default, Action is set to caHide. +To close the form and free it in an OnClose event, set Action to caFree. + +Note: When the application shuts down, the main form receives an OnClose event, but any child forms do not receive the OnClose event. + + + Occurs when there is an attempt to close the form. +Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler returns a Boolean CanClose value that determines whether a form is allowed to close. Its default value is True. +You can use an OnCloseQuery event handler to ask users whether they are sure they want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form. +The TCloseQueryEvent type points to the method that determines whether a form can be closed. The value of the CanClose parameter determines whether the form can be closed or not. + + + Occurs when the form becomes active. +Use OnActivate to perform special processing when the form receives focus. A form becomes active when the focus is transferred to it (when the user clicks in the form, for example). + + + Occurs when the form loses focus. +Use OnDeactivate to perform special processing when the active form becomes inactive and another form in the same application becomes the active one. + + + Occurs when a key is pressed while the form has focus. +OnKeyDown also occurs when KeyDown is called. +Write an event handler for OnKeyDown to specify what happens when the form is in focus and a key is pressed. + + + Occurs when a key is released while the form has focus. +OnKeyUp also occurs when KeyUp is called. +Write an event handler for OnKeyUp to specify what happens when the form is in focus and a key is released. + + + Occurs when a mouse button is pressed over the form. +OnMouseDown also occurs when MouseDown is called. +Write an event handler for OnMouseDown to specify what happens when one of the mouse buttons is pressed over the form. + + + Occurs when the mouse cursor moves while over the form area. +OnMouseMove also occurs when MouseMove is called. +Write an event handler for OnMouseMove to specify what happens when the mouse pointer is moved while over the form area. + + + Occurs when the mouse button that was pressed over the form is released. +OnMouseUp also occurs when MouseUp is called. +Write an event handler for OnMouseUp to specify what happens when the button of the mouse that was pressed over the form is released. + + + Occurs when the mouse wheel moves while the form has focus. +OnMouseWheel also occurs when MouseWheel is called. + +Note: On OS X platforms, this function can be called when the mouse wheel is moved while the mouse pointer is over the window. It is not necessary for the window to have focus. +Write an event handler for OnMouseWheel to specify what happens when the mouse wheel is moved while the form is in focus. + + + Occurs immediately after the form is resized. +Use OnResize to make any final adjustments after the form is resized. +OnResize is an event handler of type TNotifyEvent. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs when the form is shown (that is, when its Visible property is set to True). +Use OnShow to perform special processing when the form is shown (that is, when the form's Visible property is set to True). + + + Occurs when the form is hidden (that is, when its Visible property is set to False). +Use OnHide to perform special processing when the form is hidden (that is, when the form's Visible property is set to False). + + + Occurs when the current Form loses the focus. +Use OnFocusChanged to manage custom actions in case the focus changes from the current form to another control. + + + Occurs when the virtual keyboard of the form is shown. +Use OnVirtualKeyboardShown to perform special processing when the virtual keyboard of the form is shown. +The Sender parameter of the event handler identifies the form that called the event handler. The Bounds parameter of the event handler specifies the screen coordinates of the window of the virtual keyboard. + + + Occurs when the virtual keyboard of the form is hidden. +Use OnVirtualKeyboardHidden to perform special processing when the virtual keyboard of the form is hidden. +The Sender parameter of the event handler identifies the form that called the event handler. The Bounds parameter of the event handler specifies the screen coordinates of the window of the virtual keyboard. + + + Occurs when the form is about to go to background on mobile devices or when the form is about to be closed on desktop. +Any form-related data should be saved during the OnSaveState event so this data can be restored once the application is restarted. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs when a user taps the form using a finger or a similar device (not a mouse). +Write an event handler for OnTap to specify what happens when the user taps the form. + + + Occurs when the user touches the form area. +You can implement an event handler to manage custom actions when OnTouch occurs. +Note: The number of touch points is platform-specific. + + + Specifies the X coordinate of the upper-left corner of the form, relative to the screen. +Use Left to locate the top of the form or reposition the form to a different X coordinate. The Left property, like the Top property, is the position of the form relative to its container (the screen), in pixels. + + + Specifies the Y coordinate of the upper-left corner of the form, relative to the screen. +Use Top to locate the top of the form or reposition the form to a different Y coordinate. The Top property, like the Left property, is the position of the form relative to its container (the screen), in pixels. + + + + + TCustomForm represents the base class from which you derive other windows such as dialog boxes and forms. +Create a subclass derived from TCustomForm if you want to create new forms such as dialog boxes. A derived form can contain one or more FireMonkey objects, such as TLabel, TComboBox, and so on. +Note that every descendant of TCustomForm is a 2D FireMonkey form or dialog box. + + + Forwards notification messages to all owned components. +FMX.Forms.TCustomForm.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Forms.TCustomForm.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Applies the style for this form. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Fires an OnPaint event. + + + Gets the style resource object linked to this form. +GetStyleObject is called when the style is applied through a call to the ApplyStyleLookup method. +GetStyleObject internally calls LookupStyleObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates the window for this form and assigns it a handle. +FMX.Forms.TCustomForm.CreateHandle inherits from FMX.Forms.TCommonCustomForm.CreateHandle. All content below this line refers to FMX.Forms.TCommonCustomForm.CreateHandle. +Creates the window for this form and assigns it a handle. CreateHandle is overridden in subclasses to add extra functionality when creating the window containing this form. + + + Destroys the window handle created by CreateHandle. +FMX.Forms.TCustomForm.DestroyHandle inherits from FMX.Forms.TCommonCustomForm.DestroyHandle. All content below this line refers to FMX.Forms.TCommonCustomForm.DestroyHandle. +Destroys the window handle created by CreateHandle. DestroyHandle is overridden in subclasses to add extra functionality when destroying the window containing this form. + + + Resizes this form according to ClientWidth and ClientHeight. +FMX.Forms.TCustomForm.ResizeHandle inherits from FMX.Forms.TCommonCustomForm.ResizeHandle. All content below this line refers to FMX.Forms.TCommonCustomForm.ResizeHandle. +Resizes this form according to ClientWidth and ClientHeight. +ResizeHandle is overridden in subclasses to implement functionality to resize the dimensions of this form according to the values of the ClientWidth and ClientHeight properties. + + + Repaints all the rectangles given through the UpdateRects parameter. +FMX.Forms.TCustomForm.PaintRects inherits from FMX.Forms.TCommonCustomForm.PaintRects. All content below this line refers to FMX.Forms.TCommonCustomForm.PaintRects. +Repaints all the rectangles given through the UpdateRects parameter. UpdateRects is an array of TRectF rectangles. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. +FMX.Forms.TCustomForm.Realign inherits from FMX.Forms.TCommonCustomForm.Realign. All content below this line refers to FMX.Forms.TCommonCustomForm.Realign. +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Event handler for the event that occurs when there is a style change. +FMX.Forms.TCustomForm.StyleChangedHandler inherits from FMX.Forms.TCommonCustomForm.StyleChangedHandler. All content below this line refers to FMX.Forms.TCommonCustomForm.StyleChangedHandler. +Event handler for the event that occurs when there is a style change. +Note: When there is a style change, the control sends a TStyleChangedMessage message. + + See Also +FMX.Forms.TCommonCustomForm.ScaleChangedHandler +FMX.Controls.TStyleChangedMessage + + + Creates and initializes this form. +FMX.Forms.TCustomForm.Create inherits from FMX.Forms.TCommonCustomForm.Create. All content below this line refers to FMX.Forms.TCommonCustomForm.Create. +Creates and initializes this form. +Create calls the inherited Create to create this form. Create +retrieves the IFMXWindowService, IFMXCursorService, +IFMXFullScreenWindowService, and +IFMXWindowsTouchService services. +Create calls InitializeNewForm to initialize such form parameters as bounds, width and height, border icons, style, border style, and client size for the form. +AOwner specifies the owner of this form. +An AOwner (usually the application) is responsible for freeing the created form. +Most applications do not call this constructor, but rather instantiate a descendant of TForm that is defined in the forms designer. Forms added to an application at design time are created automatically. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Forms.TCustomForm.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs several initializations required by this form. +FMX.Forms.TCustomForm.InitializeNewForm inherits from FMX.Forms.TCommonCustomForm.InitializeNewForm. All content below this line refers to FMX.Forms.TCommonCustomForm.InitializeNewForm. +Performs several initializations required by this form. +These initializations include bounds, width and height, border icons, border style, and client size for the form. InitializeNewForm is used by the form constructors. + + + Ends updating all the child controls in this form. +FMX.Forms.TCustomForm.EndUpdate inherits from FMX.Forms.TCommonCustomForm.EndUpdate. All content below this line refers to FMX.Forms.TCommonCustomForm.EndUpdate. +Ends updating all the child controls in this form. +EndUpdate ends updating all the child controls placed on this form, finalizing any updates you might have performed on the form or on multiple children. EndUpdate signals the end of an update operation and must be preceded by BeginUpdate and by the updates themselves. + + + Embarcadero Technologies does not currently have any additional information. + + + Recreates the canvas where the form renders itself. + + + Provides access to the drawing area of the form. +Use Canvas to draw directly on the client area of the form. + + + Specifies the way the background on this form is filled. +Use Fill to get or set the brush that defines the way the background of this form is painted (gradient, solid, and so on). + +Tip: Using a brush for Fill overrides the functionality of the Transparency property. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the active control on the form. +Use ActiveControl to get or set the active control (having the focus) on the form. Only one control can have the focus at a given time, in an application. +If the form does not have the focus, ActiveControl is the control, on the form, that receives the focus when the form itself receives the focus. + + + Specifies the name of the style to look up and apply to this form. The FireMonkey Component Design help topic shows, among other useful things related to component designing, how to apply a style to a TPanel component. + + + Occurs when the form is redrawn. +Use OnPaint to perform special processing when the form is redrawn. Any special painting on the form should be done in this event. OnPaint occurs before any controls on the form are painted. + +Tip: Notice that calling BeginScene in the OnPaint event handlers has no effect, because BeginScene is called before the OnPaint event handler runs. This guarantees that painting always occurs in OnPaint without requiring extra and probably unexpected code to allow drawing to have an effect. + + + + + TCustomPopupForm represents the base class for FMX pop-up forms. +Create a subclass derived from TCustomPopupForm if you want to create new pop-up forms. A derived pop-up form can contain one or more FireMonkey objects, such as TLabel, TComboBox, and so on. +Note that every descendant of TCustomPopupForm is a 2D FireMonkey pop-up form. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +FMX.Forms.TCustomPopupForm.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +FMX.Forms.TCustomPopupForm.Updated inherits from System.Classes.TComponent.Updated. All content below this line refers to System.Classes.TComponent.Updated. +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + Forwards notification messages to all owned components. +FMX.Forms.TCustomPopupForm.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Embarcadero Technologies does not currently have any additional information. + + + Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. +FMX.Forms.TCustomPopupForm.Realign inherits from FMX.Forms.TCommonCustomForm.Realign. All content below this line refers to FMX.Forms.TCommonCustomForm.Realign. +Realigns all the child objects of this form and repaints the form's surface by a call to InvalidateRect. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates and initializes this pop-up form. +Create calls CreateNew, which creates this pop-up form and sets initial values to several properties of the created pop-up form. Then Create initializes the PlacementTarget, +Parent, and StyleBook properties for the created pop-up form. +AOwner specifies the owner of this pop-up form. The AOwner is responsible for freeing the created pop-up form. +AStyleBook specifies the style book to set for the StyleBook property of this pop-up form. +APlacementTarget specifies the PlacementTarget property for this pop-up form. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Forms.TCustomPopupForm.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Positions the current pop-up form. +ApplyPlacement positions the TCustomPopupForm pop-up form using the current Size and Placement properties. + + + Retrieves whether the form is not visible. +First CanShow calls the inherited +TCommonCustomForm.CanShow. If TCommonCustomForm.CanShow returns False, CanShow exits returning False. If TCommonCustomForm.CanShow returns True, CanShow initiates animation +(AniDuration, AniPosition, DoAniTimer) and +exits returning True. + + + Close-attempt event dispatcher. +FMX.Forms.TCustomPopupForm.CloseQuery inherits from FMX.Forms.TCommonCustomForm.CloseQuery. All content below this line refers to FMX.Forms.TCommonCustomForm.CloseQuery. +Close-attempt event dispatcher. +CloseQuery is called automatically when an attempt is made to close the form. CloseQuery can allow the form to close by returning True, or prevent the form from closing by returning False. +As implemented in TCommonCustomForm, CloseQuery calls the OnCloseQuery event handler, if it exists. If no such event handler exists, CloseQuery returns True. + + + Sets the animation duration for the pop-up form to close or to show. +AniDuration is measured in seconds. +AniDuration defines a duration time for execution of the custom event handler assigned to the OnAniTimer event of the current TCustomPopupForm pop-up form. + +Note: AniDuration does not influence onto an animation duration of an external animation (for example TFloatAnimation animation) if such is assigned to the TCustomPopupForm pop-up form. AniDuration is used for the custom event handler assigned to the OnAniTimer event. + + + Read-only property returning values between 0 and 1. You can use AniPosition in an OnAniTimer event handler. +The AniPosition value changes during AniDuration time of a custom animation execution from 0 to 1 (during opening of the current pop-up form) and from 1 to 0 (during closing) respectively. +AniPosition might be used as a parameter in intermediate values of animated properties in an OnAniTimer event handler. For example, you can use AniPosition to calculate an intermediate position or intermediate opacity during custom animation. Where AniPosition = 0 corresponds to a starting moment and AniPosition = 1 to a termination of opening animation. +For example, in the sample below the form Width (as a component of the form Size) changes from 0 (when AniPosition = 0) to 200 (when AniPosition = 1) during appearing of the pop-up form and vice versa on the form closing: + +... +procedure TForm1.AniTimerProc(Sender: TObject); +begin + if Sender is TCustomPopupForm then + begin +// You can use AniPosition whether to define Opacity or Size +// TCustomPopupForm(Sender).ContentControl.Opacity := TCustomPopupForm(Sender).AniPosition; + TCustomPopupForm(Sender).Size := TSize.Create(Round(200 * TCustomPopupForm(Sender).AniPosition), 100); + end; +end; + +procedure TForm1.Button1Click(Sender: TObject); +var + R: TRectangle; +begin + R := TRectangle.Create(Self); + F := TCustomPopupForm.Create(Self); + F.AniDuration := 0.5; + F.ContentControl := R; + F.OnAniTimer := AniTimerProc; + F.PlacementTarget := Button1; + F.Show; +end; +... + +Commented line shows how to use AniPosition to animate a form transparency. +See also discussion in TPopup.OnAniTimer. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the control that is shown on the pop-up form. +If a pop-up form does not contain any visible control, then the pop-up form is totally transparent. Therefore, some visible control should be placed onto the pop-up form. This control is specified by the ContentControl property. + +Note: A ContentCtrl control can be associated to a PopupForm pop-up form using the Parent property of the control, like in the following example: ContentCtrl.Parent := ParentForm. However, we recommend using the ContentControl property like ParentForm.ContentControl := ContentCtrl, because TCustomPopupForm handling ContentControl takes into account the current scale and rotation of the ContentCtrl control. + + + Specifies the padding of the pop-up form. +The ContentPadding of a pop-up form specifies how close, in pixels, the children of the form can come to each of the form edges (top, left, bottom, right). See also Padding. +The adhering of the pop-up form is executed to the boundaries of this indented 'padding rectangle'. + + + Specifies whether the current TCustomPopupForm can be dragged after it is shown. +For example, if DragWithParent is True, TCustomPopupForm is dragged together with its parent form when the parent form is the target of a drag-and-drop operation. When Placement is Mouse or MouseCenter, then the pop-up form moves following the mouse cursor. On mobile devices, after changing the orientation (portrait/landscape) the pop-up form can change its position in order not to be partially positioned outside of the screen boundaries. +The default is True. + + + Embarcadero Technologies does not currently have any additional information. + + + The offset of the padding rectangle relative to the rectangle of the pop-up form. +Defines the number of pixels, by which the pop-up form is displaced relatively to the main form position; this number is obtained taking into account all positioning properties used in the TCustomPopupForm class. The Offset direction depends on a Placement value. The Offset property is used, for example, in multi-level menus, when pop-up forms of submenus are placed overlapping a form of a previous level. + + + Gets or sets how the TCustomPopupForm is positioned relative to rectangles specified by the PlacementRectangle or PlacementTarget properties, relative to the screen, or relative to the mouse (pointing device) position. +TPlacement defines possible values of Placement. +TPlacement also specifies the behavior of the TCustomPopupForm, when it overlaps screen boundaries. The default value is Bottom. +This figure demonstrates the TopCenter value. + +In the figure, ScreenPlacementRect is the colored Fuchsia rectangle of the Show popup button. +Use Placement, PlacementTarget, and PlacementRectangle to set the positioning of TCustomPopupForm. + + + Gets or sets a rectangle, relative to which the TCustomPopupForm is positioned. +Screen coordinates of PlacementRectangle are calculated relative to PlacementTarget (if specified). Otherwise, relative to the top left corner of the screen. The following rules are used: + +If PlacementRectangle is not specified (width or height equals to zero 0), but PlacementTarget is specified, then the coordinates and size of PlacementTarget are used. +If neither PlacementRectangle nor PlacementTarget are specified, then adhering of the top left corner of the form is implemented to the mouse cursor. +Use Placement, PlacementTarget, and PlacementRectangle to set the target origin and the alignment point of the TCustomPopupForm. + + + The target control, relative to which the TCustomPopupForm is positioned. +If PlacementTarget is not set, and the TCustomPopupForm has a ParentForm, then the TCustomPopupForm is positioned relative to its parent. If PlacementTarget and ParentForm are not set, TCustomPopupForm is positioned relative to the main window. +Use Placement, +RealPlacement, and PlacementRectangle to set the target origin and the alignment point of TCustomPopupForm. + + + Specifies the index of the display that shows the pop-up form. +Specifies the index of the display in the Displays array that shows the current pop-up form. +PreferedDisplayIndex is used for context menus. When an application opens several submenus of context menus, all these submenus should be shown on the same display, even if a new pop-up submenu can be shown on a neighbor display. +If a specified PreferedDisplayIndex does not exist, then a pop-up form is shown on a display that is the closest to the place where the form should appear according to all specified positioning parameters Placement, PlacementTarget, and PlacementRectangle. + + + Used internally. +The CreateNew constructor initializes RealPlacement equal to Placement. At run time RealPlacement can be changed according to the real environment properties. For example, if a run-time environment supports the mouse, then RealPlacement can be set to +TPlacement.Mouse, otherwise to +TPlacement.Absolute. + + + Screen coordinates of the rectangle relative to which controls in the pop-up form are positioned. +ScreenContentRect is the rectangle inside which all controls of the pop-up form are positioned. +Notice that some 'decorative elements', like 'triangular peaks' on TCalloutPanel rectangles, can be positioned outside the ScreenContentRect. + + + Screen coordinates of the rectangle relative to which the pop-up form is positioned. +ScreenPlacementRect is defined taking into account PlacementRectangle and PlacementTarget. + +In the figure, ScreenPlacementRect is the colored Fuchsia rectangle of the Show popup button. + + + The working area size of the current pop-up form. +Size defines the width and height of the working area of the current TCustomPopupForm pop-up form. Size defines the rectangle to which all controls of the form are aligned. +In the following picture the Size rectangular of the pop-up form is specified with the green dashes. The physical rectangle of the pop-up form window (defined by Width and Height) is marked with red dashes. + +As you see from the picture, the physical rectangle is not used for positioning. +ClientWidth and ClientHeight of the working area of the form are defined automatically according to the specified Size and Padding. If PlacementRectangle is defined and Placement is Absolute, then Size is ignored. +Use a TSizeF object to set the Size of a pop-up form. +For example, the following code will set up the working area width to 200 and height to 250: + + Form1.Size := TSizeF.Create(200, 250); + + + Periodically occurs during TCustomPopupForm custom animation execution. +The OnAniTimer event periodically occurs during AniDuration time while an animation executes during appearing and closing of the current pop-up form. +Write an OnAniTimer event handler to provide animation functionality during appearing and closing of a pop-up form. See the example in TPopup.OnAniTimer. +AniDuration defines the custom animation duration in seconds. OnAniTimer can use AniPosition and other properties. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TForm represents a standard FireMonkey application window (form). +When you create forms in the Form designer at design time, they are implemented as descendants of TForm. Forms can represent the application's main window, or dialog boxes or various preferences-related windows. A form can contain any other FireMonkey objects, such as TButton, TCheckBox, TComboBox objects, and so on. + + + TFrame is a container for components; it can be nested within forms or other frames. +When you create frames, they are implemented as descendants of TFrame. +A frame, like a form, is a container for other components. It uses the same ownership mechanism as forms for automatic instantiation and destruction of the components on it, and the same parent-child relationships for synchronization of component properties. But frames can be nested within forms or other frames, and they can be saved on the Component palette for easy reuse. After a frame is created and saved, it continues to function as a unit and to inherit changes from the components (including other frames) it contains. Moreover, an embedded frame continues to inherit changes made to the frame from which it is derived. + + + Renders the control's surface. +FMX.Forms.TFrame.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Initializes the component after the form file has been read into memory. +FMX.Forms.TFrame.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + OnResize event dispatcher. +FMX.Forms.TFrame.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter function for the Visible property. +FMX.Forms.TFrame.GetVisible inherits from FMX.Controls.TControl.GetVisible. All content below this line refers to FMX.Controls.TControl.GetVisible. +Getter function for the Visible property. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Forms.TFrame.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Responds after the last constructor has executed. +FMX.Forms.TFrame.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + Enumerates all child components. +FMX.Forms.TFrame.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Indicates whether a control should be ignored in ObjectAtPoint. +FMX.Forms.TFrame.ShouldTestMouseHits inherits from FMX.Controls.TControl.ShouldTestMouseHits. All content below this line refers to FMX.Controls.TControl.ShouldTestMouseHits. +Indicates whether a control should be ignored in ObjectAtPoint. +False if the control should be ignored in ObjectAtPoint. ShouldTestMouseHits normally returns the same value as the value of Visible property of the control. +TFrame overrides this method to allow itself to be painted in design time regardless of the value of its Visible property. + + See Also +FMX.Forms.TFrame +FMX.Controls.TControl.ObjectAtPoint +FMX.Controls.TControl.Visible + + + + + + + + The size of primary display. + + + Tries to return a rectangular having the specified Size and positioned in the center of the desktop. + See also IFMXMultiDisplayService.GetDesktopCenterRect + + + + + + + + Notifies abount changed size (Width, Height) + + + Returns owenr of the Data + + + Link on Owner ScrollBox + + + Size of content + + + Event, which is invoked, when size was changed + + + Width of content + + + Height of content + + + + + + + + Invoked, when ScrollBox changed content position or size + + + Need ScrollBox updates effects, when content is scrolled? (False by default) + + + Returns current content bounds. If content bounds size is calculati + + + Defines that scrollbars are automatically hiding when scroll is done + + + Whether it is possible to scroll of content abroad + + + Current content size + + + Enable or disabled scroll + + + Enable or disabled scrolling animation + + + Defines avaiable scroll directions + + + Defines scrollbars visibility + + + Shows small control in the right-bottom corner that represent size changin control + + + Defines that control reacts on touch events + + + Returns the size of displaing area + + + Event that raises after control calculates its content size + + + Raises when the value of ViewportPosition was changed + + + + + + + + Link to the ScrollBox that owns currect content instance + + + The handler for this event should return the clip rectangle + + + + + + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.ScrollBox.TCustomPresentedScrollBox.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Applies the padding to the content of the TPresentedScrollBox. + + + Creates scroll content. +You can override it for creating custom content. It allows to add custom information to the content. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.ScrollBox.TCustomPresentedScrollBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the child controls. +FMX.ScrollBox.TCustomPresentedScrollBox.PaintChildren inherits from FMX.Controls.TControl.PaintChildren. All content below this line refers to FMX.Controls.TControl.PaintChildren. +Renders the child controls. +The PaintChildren method is called automatically in the process of painting of the current control. It renders child controls, if any, on the surface specified by the Canvas property. +The effects that are applied to the control are also applied to its children. +TControl descendants can override PaintChildren to provide specific rendering of the respective controls. + + + Calculates content bounds by building convex shell of all children controls of Content. +If ScrollBox uses Horizontal or Vertical +ScrollDirections mode, it restricts the content size by height or width. + + + Defines, if necessary, to add AObject to the Content or not. + + + This method is invoked when you add a new Object into the Content children list. + + + This method is invoked when you insert a new Object into the Content children list. + + + This method is invoked before removing an Object from the Content children list. + + + This method is invoked when you remove an Object from the Content children list. + + + Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.ScrollBox.TCustomPresentedScrollBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Returns the instance to the class that provides scrolling physics calculations. +AniCalculations is only available for style presentation. For native presentation, it returns null/nil. + + + OnMouseWheel event dispatcher for TCustomPresentedScrollBox. +MouseWheel accepts the following parameters: + +Shift: Specifies which keys are pressed when a mouse button is released. See TShiftState for possible values. +WheelDelta: The distance that the wheel rotates. WheelDelta is positive if the wheel rotates upward, negative otherwise. +Handled: Indicates whether the scroll bar was already moved. If one of the scrolls bars (vertical or horizontal) was already handled or it does not exist, MouseWheel tries to apply the action on the other scroll bar (if the other scroll bar exists). +Unlike the parent method, TControl.MouseWheel, this method also handles the mouse wheel events in design-time. + + + Returns a class reference to a data model of this presented control. +FMX.ScrollBox.TCustomPresentedScrollBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Sends initialization data to the presentation layer through its presentation proxy. +FMX.ScrollBox.TCustomPresentedScrollBox.InitPresentation inherits from FMX.Controls.Presentation.TPresentedControl.InitPresentation. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.InitPresentation. +Sends initialization data to the presentation layer through its presentation proxy. +After LoadPresentation creates a new presentation proxy, it calls InitPresentation. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + Creates a new instance of TPresentedControl. +FMX.ScrollBox.TCustomPresentedScrollBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Changes the scroll position by the offset defined in ADX and ADY. + + + Changes the scroll position to the value defined by AX and AY. +ScrollTo uses the value of the ViewportPosition property to calculate the offset and then calls ScrollBy. + + + Changes the scroll position to the top. + + + Changes the scroll position to the center of the content size. + + + Scrolls the content to the rectangle defined in ARect. + + + Sorts the children in the children list using the specified sorting procedure. +FMX.ScrollBox.TCustomPresentedScrollBox.Sort inherits from FMX.Types.TFmxObject.Sort. All content below this line refers to FMX.Types.TFmxObject.Sort. +Sorts the children in the children list using the specified sorting procedure. + + + Embarcadero Technologies does not currently have any additional information. + + + Recalculates content bounds of a scroll box. +This method does not calculate content bounds if AutoCalculateContentSize is False or if the state of the scroll box is csLoading or csDestroying. +See also ContentBounds. + + + Forces the update of the content size calculation. + + + Container that can hold scrollable content of the scroll box. +Contains controls placed into the scroll box. Content does not contain a style object, any kind of Animation or effect objects. + + + The content bounds. +This property is read-only if AutoCalculateContentSize is True. To update the content bounds when AutoCalculateContentSize is True, call UpdateContentSize. + + + Removes all controls from the content. + + + Data model that represents the data used by the presentation of the current control. + +The constructor of your presented control creates a data model. The class of the data model is the class that DefineModelClass returns. + + + Position of the view port of the ScrollBox content. +ViewportPosition is set in local coordinates of the Content. + + + Size of the view port of the ScrollBox content. + + + Returns the vertical scrollbar component. +VScrollBar is only available for style presentation. For native presentation, it returns null/nil. + + + Returns the horizontal scrollbar component. +HScrollBar is only available for style presentation. For native presentation, it returns null/nil. + + + Returns the control from style that will wrap its scrolling content. +ContentLayout is used by internal methods to get the list of components in the scrollbox and represents the parent for all of them. + + + Indicates that the size of the scrolling content is calculated automatically according to the size of the components in content. +Otherwise, the value of the ContentSize property defines the content size. + + + Defines that scrollbars hide automatically when you scroll. AutoHide can be used to force the scrollbars to display. + + + Indicates if it is possible to scroll content abroad. + + + Current content size. + + + Defines that the control does not have reaction to Mouse-Wheel event. + + + Enables or disables scrolling. + + + Enables or disables scrolling animation. + + + Defines the available scroll directions. + + + Defines scrollbars visibility. + + + Shows a small control in the right-bottom corner that represents the size of the changing control. + + + Defines if the control reacts to touch events. + + + Event that raises after the control calculates its content size. +It is raised only when AutoCalculateContentSize is True. + + + Raises when the value of ViewportPosition was changed. + + + + + + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.ScrollBox.TCustomPresentedVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Creates a new instance of TPresentedControl. +FMX.ScrollBox.TCustomPresentedVertScrollBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.ScrollBox.TCustomPresentedHorzScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Creates a new instance of TPresentedControl. +FMX.ScrollBox.TCustomPresentedHorzScrollBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + + + + Indicates if the control should update effects when you scroll content. +FMX.ScrollBox.TCustomPresentedFramedScrollBox.IsOpaque inherits from FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. + + + + + + + + Indicates if the control should update effects when you scroll content. +FMX.ScrollBox.TCustomPresentedFramedVertScrollBox.IsOpaque inherits from FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.ScrollBox.TCustomPresentedFramedVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + A layout is a container for other graphical objects. +FMX.BufferedLayout.TCustomBufferedLayout inherits from FMX.Layouts.TLayout. All content below this line refers to FMX.Layouts.TLayout. +A layout is a container for other graphical objects. +Use the layouts when you need to organize multiple graphical controls under the same parent. +For instance, you can use these layouts when you need to create rich FireMonkey applications with many graphical controls that are grouped on the same layer. You can set the visibility of all the controls on a layout at once by affecting the visibility of the layout. + + + The base class for edit boxes having a list of predefined choices. +TComboEditBase extends TCustomEdit defining the DropDown method. + + + Creates a new instance of TPresentedControl. +FMX.ComboEdit.TComboEditBase.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Executes internally when the edit control is left-clicked. +DropDown is overridden by edit controls that have pop-up windows that open and close when the edit control is left-clicked. +If the pop-up window is open, then DropDown closes the pop-up window. Else, it opens it. + + + Tries to close the drop-down list. +CloseDropDown sends a PM_CLOSE_DROPDOWN message to the presentation layer through its presentation proxy. + + + + + The base class, implementing the basic functionality, for edit boxes having a list of predefined choices. +TCustomComboEdit extends TComboEditBase implementing the basic functionality for edit boxes having a list of predefined choices. +TCustomComboEdit is a presented control. Its data model is TComboEditModel and presentation is TStyledComboEdit. + + + Returns a class reference to a data model of this presented control. +FMX.ComboEdit.TCustomComboEdit.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Returns the name of the default presentation proxy that your presented control uses. +FMX.ComboEdit.TCustomComboEdit.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + Creates a new instance of TPresentedControl. +FMX.ComboEdit.TCustomComboEdit.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Embarcadero Technologies does not currently have any additional information. + + + The data model representing the data used by the presentation of the current control. +FMX.ComboEdit.TCustomComboEdit.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + Returns whether the drop-down box associated with the current TComboEdit object is visible. + + + Count returns the number of items contained by the ListBox object. + + + Embarcadero Technologies does not currently have any additional information. + + + Defines whether to use TCustomListPicker pickers providing platform-specific drop-down lists to select string items. +The TDropDownKind type is also used in the TComboEdit, +TComboBox, and TPopupBox controls to define whether to use the TCustomListPicker picker to provide platform-specific controls to select string items from drop-down lists. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs just before the drop-drown list appears. +Write an OnPopup event handler to take specific action just before the drop-drown list appears. + + + + + An edit box with a list of predefined choices. +TComboEdit stores the predefined choices in its Items property, which can be edited at design time. +TComboEdit encapsulates TComboEditListBox, which is displayed in the drop-down box when the right arrow icon is clicked. Although the ListBox object is fully exposed, we recommend that you use Items to access the list of items. + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the control's surface. +FMX.Grid.TColumn.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + OnResize event dispatcher. +FMX.Grid.TColumn.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Notifies its child controls that the parent of an ancestor of your control has changed. +FMX.Grid.TColumn.AncestorParentChanged inherits from FMX.Controls.TControl.AncestorParentChanged. All content below this line refers to FMX.Controls.TControl.AncestorParentChanged. +Notifies its child controls that the parent of an ancestor of your control has changed. + + See Also +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Grid.TColumn.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Getter of Observers. +FMX.Grid.TColumn.GetObservers inherits from System.Classes.TComponent.GetObservers. All content below this line refers to System.Classes.TComponent.GetObservers. +Getter of Observers. + + + Executed right after the value of the Enabled property changes. +FMX.Grid.TColumn.EnabledChanged inherits from FMX.Controls.TControl.EnabledChanged. All content below this line refers to FMX.Controls.TControl.EnabledChanged. +Executed right after the value of the Enabled property changes. +The control does not execute EnabledChanged if you assign Enabled the same value that it already has. +EnabledChanged is never executed for effects, which execute EffectEnabledChanged instead. + + See Also +FMX.Controls.TControl.BeforeEffectEnabledChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Executed right after the value of the Visible property changes. +FMX.Grid.TColumn.VisibleChanged inherits from FMX.Controls.TControl.VisibleChanged. All content below this line refers to FMX.Controls.TControl.VisibleChanged. +Executed right after the value of the Visible property changes. +The control does not execute VisibleChanged if you assign Visible the same value that it already has. + + See Also +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Getter of DefaultSize. +FMX.Grid.TColumn.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +FMX.Grid.TColumn.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Initializes the component after the form file has been read into memory. +FMX.Grid.TColumn.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + This method is called before DRAW of the column. +DrawableCell calls DrawableCell.BeforeDrawing. + + + This method is called after DRAW of the column. +DrawableCell calls DrawableCell.AfterDrawing. + + + Responds when need to draw a cell. +When Model.DefaultDrawing is True, DrawableCell.DrawCell, DefaultDrawCell, and Model.DoDrawColumnCell are called. + + + Draws the cell background. +FMX.Grid.TColumn.DrawBackground inherits from FMX.Grid.IDrawableCellEx.DrawBackground. All content below this line refers to FMX.Grid.IDrawableCellEx.DrawBackground. +Draws the cell background. +DrawBackground receives the following parameters: + +Canvas is the canvas where DrawBackground paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawBackground is called before DrawCell. + + See Also +FMX.Grid.IDrawableCell.DrawCell +FMX.Grid.IDrawableCell.BeforeDrawing +FMX.Grid.IDrawableCell.AfterDrawing + + + Getter function for the AbsoluteOpacity property. +FMX.Grid.TColumn.GetAbsoluteOpacity inherits from FMX.Controls.TControl.GetAbsoluteOpacity. All content below this line refers to FMX.Controls.TControl.GetAbsoluteOpacity. +Getter function for the AbsoluteOpacity property. + + + Returns the object used to draw the cells in the column. +The instance is created when you first access this property. The class of the object being created is retrieved by TStyledGrid.GetCellClass. The class of the object is determined by the native or style control that is registered using TPresentationProxyFactory. Usually this is control that supports the IDrawableCell interface. +CellObject can return nil. + + + IDrawableCell interface for the cell control, or nil if the cell control does not exist or if it does not support the IDrawableCell interface. + + + Notification method called after the creation order is changed. +FMX.Grid.TColumn.ChangeOrder inherits from FMX.Types.TFmxObject.ChangeOrder. All content below this line refers to FMX.Types.TFmxObject.ChangeOrder. +Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + This virtual method is called when the data is changed in the cell editor. +You should not perform this method on your own. Instead, use the EditorModified method. +True if it is possible to change the EditorState value. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Grid.TColumn.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + The current text layout that is used to draw text in cells. + + + Determines what column is in edit mode. +This property is left for compatibility. + + + Specifies the current state of the cell editor. + + + Embarcadero Technologies does not currently have any additional information. + + + This method is called when the column changes, and it notifies the model about those changes. + + + Sets the boundaries of the current control. +FMX.Grid.TColumn.SetBounds inherits from FMX.Controls.TControl.SetBounds. All content below this line refers to FMX.Controls.TControl.SetBounds. +Sets the boundaries of the current control. +Use SetBounds to change all of the boundary properties of the control at one time. +X specifies the X coordinate of the Position of the control. +Y specifies the Y coordinate of the Position of the control. +AWidth specifies the value of the Width of the control. +AHeight specifies the value of the Height of the control. +The same effect can be achieved by setting the Position, Width, and Height properties separately, but SetBounds changes all properties at once, ensuring that the control will not repaint between changes. +After setting the boundary properties, SetBounds specifies to the control to maintain the alignment of the control within its parent and of its children within it. The given parameter does not necessarily reflect in the Position, Width, and Height properties. The properties can be updated when the alignment is applied. + + + Indicates whether this column is visible (True) or not (False). + + + Returns True if the column can show a value editor or False otherwise. + + + Changes the value of the column editor (InplaceEdit) to the specified value, and returns True on success or False otherwise. +This function may return False, for example, if the target column is read-only and the editor does not support read-only values, which prevents the editor from working. + + + This method should be performed in the cell editor to notify the grid about changes. + + + Called when the user finishes using the specified column editor (InplaceEdit) on a cell. +Value contains the value defined with the column editor. +If Accept is True, EditingDone changes the value of the cell to Value and returns True on success or False otherwise. +If Accept is False, EditingDone always returns True. + + + Sends the MM_POST_EDITOR_VALUE message to the presentation. +This method is used in LiveBinding. + + + This virtual method is called from the EditingDone method if the parameter is False and some changes are made. +You can override this method in the heir, but you do not have to call it manually. +This method is used to interact with the LiveBinding. + + + Determines that the specified value should not be displayed in the cell and stored in the caches. + + + Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + Returns True if the specified character is a valid character for a cell of this column or False otherwise. +For example, if the column contains numeric values, only digits, sign symbols (+ and -) and digit separators (, and .) would be considered valid. + + + The reference to the data model of the parent control. +Model is set when changing the parent control. If a current column does not belong to the TPresentedControl, or the model of PresentedControl does not belong to the TGridModel, then this property contains nil. + + + The reference to the control using this column and the data model. + + + Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + + Default text settings. + + + Stretches and aligns the Source rectangle, preserving its rectangle proportions, to best fit into the Bounds rectangle. +RectPlaceIntoBounds calls PlaceInto to best fit the Source rectangle, preserving its rectangle proportions, into the Bounds rectangle. RectPlaceIntoBounds uses the default alignment parameters of the current column to align the stretched rectangle in the Bounds rectangle. +RectPlaceIntoBounds returns Source if any of the Bounds rectangle dimensions is zero. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the string in the header cell of the column. + + + The padding of any cells in this column + + + Specifies whether the cells in this column can be edited or not. +Set ReadOnly to True to specify that the content of the cells can only be read. + + + Specifies whether to display this column in run-time. + + + + + Represents a column in a grid, whose cells show progress bars. + + + Function that ensures that the value of Max is only stored in the form file if it is not the default value of the property (TProgressColumn.DefaultMax). + + + Function that ensures that the value of Min is only stored in the form file if it is not the default value of the property (0). + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TProgressColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Returns True if the column can show a value editor or False otherwise. +FMX.Grid.TProgressColumn.CanEdit inherits from FMX.Grid.TColumn.CanEdit. All content below this line refers to FMX.Grid.TColumn.CanEdit. +Returns True if the column can show a value editor or False otherwise. + + See Also +FMX.Grid.TColumn.EditingCancelled +FMX.Grid.TColumn.EditingDone +FMX.Grid.TColumn.EditorModified +FMX.Grid.TColumn.PostEditorValue +FMX.Grid.TColumn.RefreshEditor + + + Draws the default cell background. +FMX.Grid.TProgressColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + Specifies the maximum value for all the progress cells in this column. + + + Specifies the minimum value for all the progress cells in this column. + + + + + Represents a column in a grid, whose cells show check boxes. + + + Getter of DefaultSize. +Getter of DefaultSize. +FMX.Grid.TCheckColumn.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Creates a check box picture, which can be used to paint cells in the current column. +Model defines the grid model used to handle data. +Checked defines whether the rendered check box is checked. +EditorMode determines whether the check box picture is created in edit mode or not. + + + Draws the default cell background. +FMX.Grid.TCheckColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + Draws the value of the column cell. +FMX.Grid.TCheckColumn.ValueToString inherits from FMX.Grid.TColumn.ValueToString. All content below this line refers to FMX.Grid.TColumn.ValueToString. +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + Tries to fill BoolValue with the specified value, and returns True on success or False if Value is not a boolean. + + + + + Represents a column in a TGrid grid. +FMX.Grid.TDateTimeColumnBase inherits from FMX.Grid.TColumn. All content below this line refers to FMX.Grid.TColumn. +Represents a column in a TGrid grid. +TColumn is the base class for classes declaring different types of columns in grids: + +TCheckColumn +TCurrencyColumn +TDateColumn +TGlyphColumn +TImageColumn +TPopupColumn +TProgressColumn +TStringColumn +TTimeColumn +If you need to create a new type of column, you should derive your subclass from TColumn. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TDateTimeColumnBase.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Draws the value of the column cell. +FMX.Grid.TDateTimeColumnBase.ValueToString inherits from FMX.Grid.TColumn.ValueToString. All content below this line refers to FMX.Grid.TColumn.ValueToString. +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Represents a column in a grid, whose cells use an editor similar to TTimeEdit to edit cells in this column. +A really used editor depends on implementation of the styled presentation class of TCustomGrid. For example, see TStyledGrid. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TTimeColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + Represents a column in a grid, whose cells use an editor similar to TDateEdit to edit cells in this column. +A really used editor depends on implementation of the styled presentation class of TCustomGrid. For example, see TStyledGrid. + + + Creates an instance of TDateColumn. + + + + + Represents a column in a grid, whose cells shows pop-up menus. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TPopupColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Grid.TPopupColumn.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Returns the items available for the pop-up column as strings. +The items of Items are displayed in a pop-up that appears when clicking one of the cells in the column. Choosing one of the items will set the item as the value of that cell. + + + + + Represents a column in a grid, whose cells show images. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TImageColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Draws the default cell background. +FMX.Grid.TImageColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + Represents the maximum size of a thumbnail that can be displayed in cells of the column. +To improve performance, large pictures are reduced to the specified PreviewSize size. The obtained thumbnail is stored in internal cache and is drawn during repainting. + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TCustomNumberColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Embarcadero Technologies does not currently have any additional information. + + + Draws the value of the column cell. +FMX.Grid.TCustomNumberColumn.ValueToString inherits from FMX.Grid.TColumn.ValueToString. All content below this line refers to FMX.Grid.TColumn.ValueToString. +Draws the value of the column cell. +Each column type defines its own implementation of this method to convert TValue into string value. + + + Returns True if the specified character is a valid character for a cell of this column or False otherwise. +FMX.Grid.TCustomNumberColumn.ValidChar inherits from FMX.Grid.TColumn.ValidChar. All content below this line refers to FMX.Grid.TColumn.ValidChar. +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +For example, if the column contains numeric values, only digits, sign symbols (+ and -) and digit separators (, and .) would be considered valid. + + + The number of decimal places when displaying float numbers. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TCurrencyColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TFloatColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Grid.TIntegerColumn.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Returns True if the specified character is a valid character for a cell of this column or False otherwise. +FMX.Grid.TIntegerColumn.ValidChar inherits from FMX.Grid.TColumn.ValidChar. All content below this line refers to FMX.Grid.TColumn.ValidChar. +Returns True if the specified character is a valid character for a cell of this column or False otherwise. +For example, if the column contains numeric values, only digits, sign symbols (+ and -) and digit separators (, and .) would be considered valid. + + + + + + + + Notifies its child controls that the parent of an ancestor of your control has changed. +Notifies its child controls that the parent of an ancestor of your control has changed. +FMX.Grid.TGlyphColumn.AncestorParentChanged inherits from FMX.Controls.TControl.AncestorParentChanged. All content below this line refers to FMX.Controls.TControl.AncestorParentChanged. +Notifies its child controls that the parent of an ancestor of your control has changed. + + See Also +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged + + + Initializes the component after the form file has been read into memory. +Initializes the component after the form file has been read into memory. +FMX.Grid.TGlyphColumn.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Calls the OnGetImageIndex event handler and returns the image index. +DoGetImageIndex calls the OnGetImageIndex event handler (if it is set) and returns the ImageIndex index of the image corresponding to the specified Value. Index is in a list of images specified in TGrid.Images. You can override this method but you should not use it explicitly in your code. To retrieve the image index, use GetImageIndex. + + + Reference to a glyph interface supported by the PresentedControl using this glyph column and the current data model. + + + Returns the index of the image specified by Value. +GetImageIndex returns the index of the image corresponding to the specified Value. Index is in a list of images specified in TGrid.Images. + + + Returns True if the column can show a value editor or False otherwise. +FMX.Grid.TGlyphColumn.CanEdit inherits from FMX.Grid.TColumn.CanEdit. All content below this line refers to FMX.Grid.TColumn.CanEdit. +Returns True if the column can show a value editor or False otherwise. + + See Also +FMX.Grid.TColumn.EditingCancelled +FMX.Grid.TColumn.EditingDone +FMX.Grid.TColumn.EditorModified +FMX.Grid.TColumn.PostEditorValue +FMX.Grid.TColumn.RefreshEditor + + + Draws the default cell background. +FMX.Grid.TGlyphColumn.DefaultDrawCell inherits from FMX.Grid.TColumn.DefaultDrawCell. All content below this line refers to FMX.Grid.TColumn.DefaultDrawCell. +Draws the default cell background. +DefaultDrawCell receives the following parameters: + +Canvas is the canvas where DefaultDrawCell paints the cell background. +Bounds indicates the cell boundaries. +Row is the row number. +Value is the cell value. +State is the drawing state of the cell. +DrawCell calls DefaultDrawCell if Model.DefaultDrawing is True. + + See Also +FMX.Grid.TColumn.DrawCell +FMX.Grid.TColumn.BeforeDrawing +FMX.Grid.TColumn.AfterDrawing + + + Returns the rectangle in which to draw the Index image. Stretches and aligns the original rectangle of the Index image, preserving its rectangle proportions, to best fit into the Bounds rectangle. +GlyphPlaceIntoBounds implements algorithm like the following: + +If the Stretch property of the current TGlyphColumn object is False, then GlyphPlaceIntoBounds retrieves the biggest rectangle from all layers of the Index image in the destination collection stretched to the Scale = 1. Then GlyphPlaceIntoBounds stretch the obtained rectangle, preserving its rectangle proportions, to best fits into the specified Bounds rectangle. Then GlyphPlaceIntoBounds aligns this rectangle in the Bounds rectangle using the default alignment parameters of the current column. GlyphPlaceIntoBounds returns the obtained rectangle. +If the Stretch property of the current TGlyphColumn object is True, then GlyphPlaceIntoBounds retrieves the biggest rectangle from all layers of the Index image in the destination collection with the Scale used in the layer. Then GlyphPlaceIntoBounds stretch the obtained rectangle, preserving its rectangle proportions, to best fits into the specified Bounds rectangle. Then GlyphPlaceIntoBounds aligns this rectangle in the Bounds rectangle using the default alignment parameters of the current column. GlyphPlaceIntoBounds returns the obtained rectangle. + + + Specifies whether to stretch the image shown in the glyph control. + + + Custom defined event handler that should return an index of the image corresponding to Value in a list of images specified in TGrid.Images. + + + + + + + + This virtual method returns default options of grid + + + This virtual method must return the class which encapsulates the text settings + + + This virtual method is called after changing text settings + + + This virtual method specifies whether to save the StyledSettings value in fmx-file + + + The current value of cell editor + + + This virtual method is called after new column was added + + + This virtual method is called after column was deleted + + + This virtual method is called after number of rows was changed + + + This event handler is used to get cell data from the some custom defined source + + + This method notifies the presentation, that previously calculated content size is no longer relevant + + + This method notifies the presentation, that current row or column index is changed + + + Inserting a new column before the column with the specified number (with moving to right) + + + Deleting column with the specified order number + + + Changing order number and moving of the column + + + The number of rows + + + Specifies whether the presentation responds to mouse, keyboard, etc + + + An array containing all the columns + + + Returns the column number. If the column is not found, then -1 + + + This method returns a column and row of the cell that can be select after the defined cell + + + This is various flags which responsible for the appearance and behavior of the grid + + + Clear internal cache of values + + + Moving all values of internal cache with the specified column number (from the old index to the new + index) + + + Move to right all values of internal cache with column number that greater or equal to the specified + column number + + + Removes from the cache the value of one cell and invalidates the area of the cell + + + This object provide custom text properties + + + This object provide default text properties (style of system defined) + + + This property indicates whether the custom text settings is used or default + + + This event can by called from presentation (depends on the implementation) after + clicking in column header + + + This event can by called from presentation (depends on the implementation) when + clicking in grid cell after the selection was changed + + + This event can by called from presentation (depends on the implementation) when + double clicking in grid cell after the selection was changed + + + This event is called after successfully changing of column order + + + This event can by called from presentation (depends on the implementation) to + draw header of column + + + This event is called before changing of index selected row or column + + + This event is called after successfully changing of index selected row or column + + + This event can by called from presentation (depends on the implementation) to + draw background of cell + + + This event can by called from presentation (depends on the implementation) to + draw cell + + + In this event handler you should setup value in some custom defined data after cell changing + + + This event can by called from presentation (depends on the implementation) to create the custom + defined cell editors + + + This event can by called from presentation (depends on the implementation) to + create the custom defined cell editors + + + + + + + + Removing all items + + + Removing all items except those who included in the rectangle AExcepRect + + + Removing item by coordinates ACoord + + + Removing all items in which the row or col is equals Index + + + Change index of Column or Row + + + Inserts one column or row with a shift of cells right or down + + + Removing all items in which the column is equals ACol + + + Removing all items in which the row is equals ARow + + + Change index of column + + + Change index of row + + + Inserts one column with a shift of cells right + + + Inserts one row with a shift of cells down + + + Check for equality of two values. This method is called in SetCells (see Cells) + + + This virtual method is called after you change the property Cells. This method not is called after + other methods (Clear, RemoveRow, etc) + + + The values of cells + + + The value that have used in the constructor + + + + + + + + Customizes styles in complex objects. +FMX.Grid.TCustomGrid.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.Grid.TCustomGrid.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.Grid.TCustomGrid.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + This method is invoked when you add a new Object into the Content children list. +FMX.Grid.TCustomGrid.ContentAddObject inherits from FMX.ScrollBox.TCustomPresentedScrollBox.ContentAddObject. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.ContentAddObject. +This method is invoked when you add a new Object into the Content children list. + + + This method is invoked when you insert a new Object into the Content children list. +FMX.Grid.TCustomGrid.ContentInsertObject inherits from FMX.ScrollBox.TCustomPresentedScrollBox.ContentInsertObject. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.ContentInsertObject. +This method is invoked when you insert a new Object into the Content children list. + + + This method is invoked before removing an Object from the Content children list. +FMX.Grid.TCustomGrid.ContentBeforeRemoveObject inherits from FMX.ScrollBox.TCustomPresentedScrollBox.ContentBeforeRemoveObject. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.ContentBeforeRemoveObject. +This method is invoked before removing an Object from the Content children list. + + + Creates scroll content. +FMX.Grid.TCustomGrid.CreateScrollContent inherits from FMX.ScrollBox.TCustomPresentedScrollBox.CreateScrollContent. All content below this line refers to FMX.ScrollBox.TCustomPresentedScrollBox.CreateScrollContent. +Creates scroll content. +You can override it for creating custom content. It allows to add custom information to the content. + + + Returns a class reference to a data model of this presented control. +FMX.Grid.TCustomGrid.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Setter of Enabled. +FMX.Grid.TCustomGrid.SetEnabled inherits from FMX.Controls.TControl.SetEnabled. All content below this line refers to FMX.Controls.TControl.SetEnabled. +Setter of Enabled. + + + Getter of DefaultSize. +FMX.Grid.TCustomGrid.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + It notifies the Grid that the attached TImageList or related ImageIndex was changed. So, the Grid have to refresh all cells that use images from this ImageList. + + + For internal use only. +Do not use this member. It is for internal use only. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Restores Canvas properties after the painting process. +FMX.Grid.TCustomGrid.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + Creates a new instance of TPresentedControl. +FMX.Grid.TCustomGrid.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.Grid.TCustomGrid.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Performs any necessary actions before the first destructor is called. +Performs any necessary actions before the first destructor is called. +FMX.Grid.TCustomGrid.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Unloads the previously-loaded presentation of your control. +FMX.Grid.TCustomGrid.UnloadPresentation inherits from FMX.Controls.Presentation.TPresentedControl.UnloadPresentation. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.UnloadPresentation. +Unloads the previously-loaded presentation of your control. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.Presentation.TPresentedControl.ReloadPresentation + + + Removes and destroys all columns. + + + Returns the column with the given index. +If the column does not exist, ColumnByIndex returns nil. + + + Embarcadero Technologies does not currently have any additional information. + + + Fills ACol and ARow with the column and row numbers that identify the cell located at the specified X and Y coordinates, and returns True on success or False otherwise. + + + Returns the column at the given left and top coordinates. +If the column does not exist, ColumnByPoint returns nil. + + + Returns the index of row at the given left and top coordinates. +If the row does not exist, RowByPoint returns -1, otherwise a positive numerical value is returned. Keep in mind that 0 is the first row, 1 is the second row, and so on. + + + Returns the coordinates of the cell at the specified row and column. +ACol and ARow are 0-based. You can specify values equal to ColumnCount or RowCount to get the coordinates of an non-existent cell that is next to an existing cell. +If the specified column or row numbers are not valid, CellRect returns coordinates (-1, -1, -1, -1). + + + Selects the cell with the specified index of column and rows. +The DoSelectCell method occurs before the change and the DoSelChanged method occurs after the change. + + + Selects the cell with the specified column index and old row index. + + + Selects the cell with the specified row index and old column index. + + + Determines whether the selected cell can be edited (True) or not (False) based on the current configuration of the corresponding column and the grid. + + + Changes the viewport position so that the cell at the specified column number and row number is located on the top-left corner. + + + Determines the cells that are visible, either completely or partially, fills TopLeft with the coordinates of the top-left visible cell, fills BottomRight with the coordinates of the bottom-right visible cell, and returns True on success or False otherwise. + + + Changes the viewport position so that the selected cell is visible. + + + Embarcadero Technologies does not currently have any additional information. + + + The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + + Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Specifies the list of images associated with this grid control. +Images from the Images collection can be shown in cells of the TGlyphColumn type column. + + + Specifies the number of columns in the grid. +Read ColumnCount to determine the number of entries in the Columns array. + + + Specifies the row where you are currently positioned within the grid. +Set the Selected property to any positive numerical value to make the specific row selected. Read Selected to obtain the index of the row where you are currently positioned within the grid. +The first row has an index of 0, the second one has an index of 1, and so on. + + + Specifies the index of the first visible scrollable row in the grid. +Read TopRow to determine the index of the first row in the scrollable region that is visible. Set TopRow to scroll the rows in the grid so that the row with the TopRow index is the first row after the fixed rows. + + + Embarcadero Technologies does not currently have any additional information. + + + Number of the first column that is visible, either completely or partially, from the left-hand side of the grid. + + + Number of the first column that is visible, either completely or partially, from the right-hand side of the grid. + + + Specifies whether the cells in this grid can be modified or not. +Use ReadOnly at run time to determine whether the cells in this grid can be edited. If ReadOnly is True, then you can only read and view the contents of the cells without the ability to affect the grid in any way. + + + Specifies the index of the column that contains the selected cell. +Use ColumnIndex at run time to determine the current column in the grid. Setting ColumnIndex moves the focus to the cell in the current row that is in the new column. The first column has an index of 0, the second column has an index of 1, and so on. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates the number of scrollable rows that are visible in the grid. +Use VisibleRows to determine the number of scrollable rows that are fully visible in the grid. VisibleRows includes any partially visible rows on the top and bottom of the grid. + + + This property is set by the LiveBinding. +If this property is True, you cannot change the OnSetValue and the OnCallbackGetValue. + + + Specifies the height of each row of this grid, in pixels. +Read RowHeight to determine the size of each row in the grid. If the underlying grid is too tall to appear in the control, then the user must scroll to see the entire content of the grid. + + + Specifies the number of rows in the grid. +The value of RowCount includes the scrollable rows in the grid, but not the fixed row with the headers. + +Read RowCount to determine the number of rows in the grid. +Set RowCount to add or delete rows at the bottom of the grid. + + + Defines how grid controls look like and how they behave. + + + Determines whether cells are drawn using the default drawing method (True) or using a user-defined drawing method (False). + + + Determines whether the grid control is in the edit mode (True) or not (False). + + + The column number of the selected cell, or -1 if there is no cell selected. + + + Number of the selected row. + + + Occurs immediately when the left mouse button is clicked with the pointer over the header of a column. +Write an OnHeaderClick event handler to take specific actions when the left mouse button is clicked with the pointer over the header of a column in this grid. + + + Occurs when a user releases the mouse in one of the grid cells. +This event can be called from presentation (depends on the implementation) when clicking a grid cell. + + + Occurs when a user double-clicks one of the grid cells. +This event can be called from presentation (depends on the implementation) when double clicking a grid cell. + + + Occurs immediately after a column is moved. +Write an OnColumnMoved event handler to take specific actions when the column in this grid is moved. + + + Occurs when the grid needs to paint a header of a column. +Write an OnDrawColumnHeader event handler to provide customized drawing for the headers of the grid. + + + Occurs immediately after a cell in a column is selected. +Write an OnSelectCell event handler to take specific actions when the cell of a column in this grid is selected. +Events occur in the following order: + +OnTap +OnSelectCell +OnSelChanged + + + Occurs when the selected row in the grid changes. +Events occur in the following order: + +OnTap +OnSelectCell +OnSelChanged + + + Occurs when the background of a cell needs to be drawn. +You can use this event to draw the background of cells yourself, to override the default cell background. + + + Occurs when the grid needs to paint a cell. +Write an OnDrawColumnCell event handler to provide customized drawing for the data in the cells of the grid. +If the DefaultDrawing property is set to True, the cell will be drawn before the OnDrawColumnCell event. If it is set to False, the grid doesn't draw anything. +Also, in this event handler, it is possible to call the DefaultDrawCell method to process default drawing. It can be useful if DefaultDrawing is set to False and you need to draw something before the default drawing. + + + Occurs immediately when you update the contents of one of the cells in this grid. +Write an OnCallbackGetValue event handler to take specific actions when you update the contents of one of the cells in this grid. + + + Occurs when the grid needs to retrieve a value from an external repository to use as the content of one of the cells in this grid. +Write an OnGetValue event handler to take specific actions when you retrieve a value from an external repository to use as the content of one of the cells in this grid. + + + Occurs when you need to pass a content of one of the cells in this grid as a value to an external repository. +Write an OnSetValue event handler to take specific actions when you need to pass a content of one of the cells in this grid as a value to be set in an external repository. + + + Occurs before the creation of the editor for cells in a column. +Write an OnCreateCustomEditor event handler to take specific actions when a custom editor is created for this grid. +This event is called every time when the grid activates a cell editor. If a custom editor is not required, just do nothing in this event handler and the default editor is created. +The OnCreateCustomEditor event can by called from a presentation (depends on the implementation) to create a custom defined cell editors. Since the presentation does not know about a TCustomGrid object, the presentation calls TGridModel.OnCreateCustomEditor from the Model. For this reason, the TCustomGrid.OnCreateCustomEditor event handler +is always the same as the TGridModel.OnCreateCustomEditor event handler of the Model. + + + Occurs immediately when you accomplish editing of any of cells in this grid. +Write an OnEditingDone event handler to take specific actions when you edit cells in this grid. +For instance, when you paste a string into one of the cells, an OnEditingDone event immediately occurs. + + + + + + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Grid.TGrid.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Embarcadero Technologies does not currently have any additional information. + + + + + + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Grid.TStringGrid.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Returns a class reference to a data model of this presented control. +FMX.Grid.TStringGrid.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + + + + + + + Add several classes of columns to the list of registered classes + + + Remove several classes of columns from the list of registered classes. If some class was not + registered then it is ignored. + + + This function returns array of all registered column classes + + + + + The base class for list of actions, without the published properties. +FMX.ActnList.TCustomActionList inherits from System.Actions.TContainedActionList. All content below this line refers to System.Actions.TContainedActionList. +The base class for list of actions, without the published properties. +Implement TContainedActionList to work with common properties for all GUI application frameworks. +Actions lists the actions maintained by the action list. +The ActionCount property returns the number of actions in the list. +OnStateChange sends a notification when the State changes. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called when you change the Images reference to the TCustomImageList object or the object itself. + + + Destroys an instance of TContainedActionList. +FMX.ActnList.TCustomActionList.Destroy inherits from System.Actions.TContainedActionList.Destroy. All content below this line refers to System.Actions.TContainedActionList.Destroy. +Destroys an instance of TContainedActionList. +This destructor is inherited from TComponent, see TComponent.Destroy for more information. + + See Also +System.Actions.TContainedActionList.Create +System.Classes.TComponent.Destroy + + + Evaluates an input key combination to determine whether it is a shortcut for one of the actions in the list. +Typically, your applications do not need to call DialogKey explicitly. When the form's KeyDown method does not evaluate a shortcut key by some other means (such as an event handler), it calls DialogKey for every associated action list until it finds an action that can handle the shortcut. +The action list's DialogKey method, in turn, checks the specified keystroke against the ShortCut property and SecondaryShortCuts properties of each action in the list. If it finds a match, it tells the action to handle the shortcut, and then returns True. If DialogKey cannot find an action to handle the shortcut, it returns False. +DialogKey has the following parameters: + + + +Parameter + +Description + + +Key + +Is the key code for the potential shortcut key. + + +Shift + +Specifies the state of the Shift, Alt, and Ctrl keys that may be combined with Key. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + + + Maintains a list of actions that can be used by components such as controls, menu items, and tool buttons. +Use Action lists to centralize the responses to user actions. Action list components maintain a list of actions that are available to the client controls in an application. You can add action list components to your form from the Standard page of the component palette. +TActionList lets you set up actions using the Action List editor. Double-click the action list to display the Action List editor, from which you can add, delete, and rearrange actions. +TActionList extends the TCustomActionList class redeclaring the public +Name, State, OnChange, OnExecute, +OnStateChange, and OnUpdate properties and events with the published visibility; therefore, these properties and events can be managed in the Object Inspector at design time. + +Code Examples +FMX.ActionsDemo Sample +FMX.PhotoEditorDemo Sample + + + TCustomAction is a base class for FireMonkey actions intended to be used with menu items and controls. +TCustomAction introduces support for the properties, events, and methods of menu items and controls that are clients of actions. +Most properties and events introduced in TCustomAction are public; therefore, use TCustomAction as a base class when deriving your own actions that publish specific subset of properties of associated controls. +Actions centralize responses to user commands (user actions). An action is associated with the user interface elements (components) in an application that uses this action. Actions provide an easy way to synchronize values of properties of an action and of associated components (clients), for example, the enabled state and caption of an action and of an associated speed button and a menu item, and handle the response when the user clicks these components. Each component, which is called the client, has its properties dynamically updated by the associated action and forwards user commands to the action for a response. +The Text property can be used to set an accelerator key to the action. Notice that & and _ are seen and can be used only for Windows. +At design time, you can work in the Action List editor with actions contained in an action list. The action list is a container for actions, organized into categories (File, Edit, and others). +Public properties and events of a component and control that are supported in TCustomAction, either directly or through an ancestor, are the following: + +Properties: Caption, Checked, Enabled, HelpType, HelpContext, HelpKeyword, Hint, ImageIndex, ShortCut, Visible. +Events: OnHint, OnUpdate, OnExecute. +TCustomAction is the base class for TAction and TCustomViewAction. +TCustomAction acts as the base class for several predefined action classes. For predefined actions that augment the behavior of TCustomAction, see the action classes in the FMX.StdActns unit. + +Code Examples +FMX.ActionsDemo Sample +FMX.KeyboardToolbar Sample +FMX.ScrollableForm Sample + + + UpdateSupported is called when the Supported property can be changed. +UpdateSupported is called from Update or when the value of the +UnsupportedArchitectures or UnsupportedPlatforms property has changed. +UpdateSupported analyzes whether the action can be supported under the current CPU architecture and OS platform with the current settings of the UnsupportedArchitectures, UnsupportedPlatforms, HideIfUnsupportedInterface, and IsSupportedInterface properties. If Supported is estimated False, then UpdateSupported sets Visible and Enabled to False, otherwise UpdateSupported restores the values of Visible and Enabled to the values that were stored before the last time when Supported became False. + + + Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + Creates the TShortCutList object for the action. +CreateShortCutList creates an empty FireMonkey shortcut list object for the current action. +Notice that implementations of shortcuts are FireMonkey or VCL framework-specific. + + + Implements a method for storing an action object's unpublished data on a stream such as a form file. +By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the object's properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method: + +TCustomAction overrides the DefineProperties method, defined in TComponent, to define storing of the Caption and ImageIndex properties. +The System.Classes.TComponent.DefineProperties method, defined in TComponent, defines methods to store the "fake" Top and Left properties. These are defined so that action components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Sets the value of the Target property. +The protected SetTarget method is provided so that descendant classes will be able to set the value of the Target property. + + + Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +FMX.ActnList.TCustomAction.SetEnabled inherits from System.Actions.TContainedAction.SetEnabled. All content below this line refers to System.Actions.TContainedAction.SetEnabled. +Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +The behavior of SetEnabled depends upon the State of the ActionList action list: + +If the value of State is asSuspended, then SetEnabled sets to the specified Value only the Enabled property of the action. +If the value of State is asSuspendedEnabled, then SetEnabled sets to True the Enabled property of the action and of all clients of the action. +Otherwise, SetEnabled sets to the specified Value the Enabled property of the action and propagates this Value to all clients of the action. + + + Sets the new Value of the Visible property for the action and action's clients. +FMX.ActnList.TCustomAction.SetVisible inherits from System.Actions.TContainedAction.SetVisible. All content below this line refers to System.Actions.TContainedAction.SetVisible. +Sets the new Value of the Visible property for the action and action's clients. +SetVisible always propagates this Value to all clients of the action. + + + Initializes the component after the form file has been read into memory. +FMX.ActnList.TCustomAction.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + CustomText is a user text. +Some actions can, by default, automatically set the Text property. For example, in the TFileExit standard action, the Text property has the Quit <Application.Title> value. To set your own value, set the value of the Text property to the value of the CustomText property. + + + Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + Responds when a client control "fires". +Execute is called automatically when a client control "fires" (for example, when the user clicks a button or selects a menu item). +Execute first ensures that the action is updated. Then Execute calls the inherited System.Classes.TBasicAction.Execute method. System.Classes.TBasicAction.Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called and the action is Enabled. Otherwise, Execute returns False. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.ActnList.TCustomAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Checks whether the specified keyboard key corresponds to one of the action's shortcuts. +IsDialogKey returns True if the keyboard key specified by the combination of Key and Shift corresponds to one of the action's shortcuts. Here: + +Key is a keyboard scan code. You can find constants for keyboard scan codes in the Constants section of the System.UITypes unit. These are vkXXXX constants (vkEscape, vkReturn, vkF1, and others). +Shift specifies the combination of the ALT, CTRL, SHIFT, and CMD (only Mac) keys. +The action's shortcuts are listed in the ShortCut and SecondaryShortCuts properties. + + + Represents the caption of the action. +Text holds the string that is used in the same way as the Caption of the action, when it is set. The value of Text is propagated to the action's clients. +Text is the same as Caption. You can use both Text and Caption, but descendant classes should only use the published property Text, so that the Object Inspector displays only the Text property, as in most FireMonkey components. +In the Text property you can define an accelerator key. On Windows platforms, an accelerator key is shown as an underlined letter. To specify an accelerator key, precede an <accelerator_letter> with an ampersand & character. The letter after the ampersand appears underlined. For example, to set the S character as an accelerator key for a Save action, type &Save. On Windows platforms, accelerator keys enable the user to activate actions pressing Alt+<accelerator_letter> key combination. To show a single ampersand & character in a Text property specify doubled ampersand && characters. Notice that & and _ are seen and can be used only under Windows. + + + Holds the action list to which the action belongs. +FMX.ActnList.TCustomAction.ActionList inherits from System.Actions.TContainedAction.ActionList. All content below this line refers to System.Actions.TContainedAction.ActionList. +Holds the action list to which the action belongs. + + + Defines whether the UnSupported action can be visible and accessible. +If HideIfUnsupportedInterface is True, then the +IsSupportedInterface function is used for retrieving the value of the Supported property. In this case, if IsSupportedInterface returns False, then this action is always inaccessible and invisible. +If HideIfUnsupportedInterface is False, then this action can be visible or invisible depending on other properties. In this case, descendant classes or application objects should call IsSupportedInterface to retrieve the visibility and accessibility of the action. + + + Specifies that the action is fired by pressing a keyboard key, not by clicking with the mouse. +ShortCutPressed is a read-only property. When ShortCutPressed is True, it specifies that the action is fired by pressing a keyboard key, and not by clicking a control with the mouse. + + + Defines the component for which the action is executed. +Target is a read-only property. Target defines the component for which the action is executed. It can be nil. In the case where several controls can be called with one shortcut, Target corresponds to the first matched control. + + + Defines the set of unsupported CPU architectures. +The TArchitecture type defines the arIntelX86 and arIntelX64 constants that identify the processor architectures Intel x86 and Intel x64. +Use UnsupportedArchitectures to identify sets of unsupported processor architectures. + + + Defines the set of unsupported OS platforms. +The TPlatform type defines the pfWindows, pfMacOS, pfiOS, pfAndroid, and pfLinux constants that identify the Windows, Mac OS, Android, and other platforms. +Use UnsupportedPlatforms to identify sets of unsupported OS platforms. + + + Defines whether the action can work on the current platform and CPU architecture. +Supported is a read-only property. Supported defines whether the action can work on the current platform and CPU architecture. The value of this property is defined by the UnsupportedArchitectures and UnsupportedPlatforms properties and also by the IsSupportedInterface function. If Supported is False, then this action is always inaccessible and invisible. + + + + + A base class for actions that show a specified component when executed. +Descendants of TCustomViewAction can be associated with a component that is made visible when the action executes. +TCustomViewAction extends TCustomAction declaring the component that the action shows when it executes. +TObjectViewAction extends the TCustomViewAction class that defines the FmxObject property and keeps the component value that should be the TFmxObject type object in this case. +Descendants of TObjectViewAction are associated with the TFmxObject type component that is made visible when the action executes. +TVirtualKeyboard and TViewAction are standard actions that descend from TObjectViewAction. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TCustomViewAction (and its descendants) does not distribute changes in values of Caption, Enabled, Checked, GroupIndex, ShortCut, Visible, and OnExecute properties to the respective properties of clients linked with action links. + + + Responds when components are created or destroyed. +FMX.ActnList.TCustomViewAction.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter for the Component property. + + + Is fired when the target component is created. +Event handlers of the TOnCreateComponent type have the following parameters: + + + +Parameter + +Description + + +Sender + +Is the instance of the action that fired the event. + + +NewComponent + +Returns the created component. + +Only a component object of the TFmxObject type can be created in the event handler of this event. If the created component is not a descendant of TFmxObject, then an exception is raised and a new object is destroyed. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.ActnList.TCustomViewAction.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Keeps a component that executes an action and whose image becomes visible during the action execution. + + + + + + + + Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + + + + Validate inputing text. Calling before OnChangeTracking + + + Validate inputed text. Calling before OnChange + + + Call OnChangeTracking event + + + Call OnChange event + + + Method is calling when some parameter of text settings was changed + + + Returns class type that represent used text settings. Could be overridden in descendants to modify + default behavior + + + Does memo has selected text + + + Returns current selected text + + + If there were made any changes in text OnChange will be raised + + + Convert absolute platform-dependent position in text to platform independent value in format + (line_number, position_in_line) + + + Convert platform-independent position to absolute platform-dependent position + + + Insert text in memo after defined position + + + Delete fragment of the text from the memo after defined position + + + Replace fragment of text from the memo in the specifeid range. + + + Returns caret position by specified hittest point. + + + Select all text when control getting focus + + + Contains component that represent current caret for control + + + Defines character case for text in component + + + Switch on/off spell checking feature + + + Defines the types of information that can be detected in text + (for native presentation on iOS only) + + + Do not draw selected text region when component not in focus + + + Text is in read-only mode + + + Default IME text input mode + + + Defines visual type of on-screen-keyboard + + + Lines of text + + + Available maximum length of text (0 - no length limitation). + + + Brush that is using to draw text selection region + + + Current position of cursor in the text + + + Text selection starting position + + + Length of selected text + + + Container for current text visualization attributes + + + Event that raises when control losing focus or user pressing ENTER key (but onlt if some changes were + made) + + + Event that raises on any change in text + + + Event that raises to validate any change in text (raises before OnChangeTracking event) + + + Event that raises to validate changes in text (raises before OnChange event) + + + + + + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Memo.TCustomMemo.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Returns a class reference to a data model of this presented control. +FMX.Memo.TCustomMemo.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Returns the name of the default presentation proxy that your presented control uses. +FMX.Memo.TCustomMemo.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + Returns the text from the memo control. + + + Modifies the value of the Text property. +Sets the Text property to Value. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates a new instance of TPresentedControl. +FMX.Memo.TCustomMemo.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Delete selected text + + + Removes the selected text from the memo control. +Use DeleteSelection to delete the selected text from the memo control. If the ReadOnly property is True or if no text is selected, DeleteSelection does nothing. + + + Copies the selected text from the memo control to the system Clipboard. +Use CopyToClipboard to replace the contents of the system Clipboard with the selected text. If no text is selected, CopyToClipboard does nothing. + + + Copies the selected text to the system Clipboard and then deletes the selected text. +Use CutToClipboard to replace the contents of the system Clipboard with the selected text and then to delete the selected text from the memo control. If no text is selected, CutToClipboard does nothing. + + + Copies the contents of the system Clipboard to the memo control. +PasteFromClipboard copies the contents of the system Clipboard, if possible, to the memo control, at the position of the cursor. If there is text selected in the memo control, the selected text will be removed. If the content of the system Clipboard is not a string, PasteFromClipboard does nothing. + + + Selects all the text in the memo control. +Use SelectAll to select all the text in the memo control. If there is no text in the memo control, SelectAll does nothing. + + + Selects the word that contains the cursor. +In the memo's text, SelectWord selects a delimited by word dividing characters (space characters, punctuation marks, and others) substring (word) that contains the cursor. Here word dividing characters are space characters, line feeds, and punctuation marks. + + + Cancel the text selection if it exists. +The ResetSelection method internally sets the SelLength property to 0. + + + Moves the cursor to the end of the text in the memo control. + + + Moves the cursor to the beginning of the text in the memo control. + + + Replaces the ALength number of characters, beginning from the AStartPos position, with the AStr string. +The caret is moved to the position of the last inserted character. + + + Moves the cursor to the end of the current visual line. +When WordWrap is True, then each line (in the memo text) can be separated into several 'visual lines'. +GoToLineEnd moves the cursor to the end of the current (pointed by the cursor) visual line. + + + Moves the cursor to the beginning of the current visual line. +When WordWrap is True, then each line (in the memo text) can be separated into several 'visual lines'. +GoToLineBegin moves the cursor to the beginning of the current (pointed by the cursor) visual line. + + + Undoing the latest text change made in the memo control. +UnDo backs out, if possible, the latest change made to the text in the memo control. If no change has been made, UnDo does nothing. + +Note: Remove TDeleteOptions.CanUndo from Options calling DeleteFrom or TInsertOptions.CanUndo from Options calling InsertAfter when modifying the text in the memo control, so that the changes cannot be backed out. + + + Converts APos into a Line/Pos coordinate in the memo control. +TextPosToPos returns the TCaretPosition format position of a character indicated by APos. TextPosToPos calculates the TCaretPosition.Line line number and TCaretPosition.Pos horizontal shifting, corresponding to the APos character count coordinate of a character in the text of the memo control. +Keep in mind that APos counts end-of-line characters. +For example, if the first line of a memo's text contains 'Hello' and the second line contains 'Goodbye', then the following code: + + OldPosition.Line := 1; //Zero-based + OldPosition.Pos := 2; //Zero-based + NewPosition := TextPosToPos(PosToTextPos(OldPosition) + 2); + +sets the NewPosition.Line to 1 and NewPosition.Pos to 4. +TextPosToPos internally calls Model.TextPosToPos. + + + Converts a Line/Pos coordinate of a character into a number of this character in the text of the memo. +PosToTextPos returns an integer an integer representing a position of the character specified by APosition in the memo control. The APosition position is specified in the TCaretPosition format which uses the Line number and Pos horizontal shifting of the character in the memo control. Keep in mind that PosToTextPos calculates the character number counting end-of-line characters. +For example, if the first line of a memo's text contains 'Hello' and the second line contains 'Goodbye', then the following code: + + MyPosition.Line := 1; //Zero-based + MyPosition.Pos := 1; //Zero-based + MyString := Copy(Text, PosToTextPos(MyPosition) + 1, 3); + +sets MyString to 'odb', which are the three characters starting from the third character of the second line. +PosToTextPos internally calls Model.PosToTextPos. + + + Inserts the AFragment string into the memo's text, at APosition. +InsertAfter inserts in the memo's text the string specified by AFragment at the position specified by APosition. Options represent a set of insert options. + +Note: InsertAfter does not insert a newline character. If the Pos field of the APosition parameter is greater than the width of the specified line, then AFragment is inserted on the next line. +Note: If in a call of InsertAfter one removes TInsertOptions.CanUndo from Options, then the implemented changes cannot be backed out. +InsertAfter internally calls Model.InsertAfter. + + + From the memo's text, deletes the fragment of text that has the ALength number of characters and begins at APosition. +Options specifies the delete options. + +Note: If in a call of DeleteFrom, one removes TDeleteOptions.CanUndo from Options, then the implemented changes cannot be backed out. +DeleteFrom internally calls Model.DeleteFrom. + + + Holds the data model of the memo control. + + + Represents the entire text displayed in the memo control. + +Note: The visibility for Text is Public. Thus, Text is not available in the Object Inspector at design time. +For manipulating the text in a TMemo, you should use FMX.Memo.TMemo.Lines, which is available at design time in the Object Inspector. + + + Defines whether the system selects all the memo's text when the control receives focus. +AutoSelect defines whether the system selects all the Text included in the TCustomMemo memo when the control receives focus. If AutoSelect is True, then all text is selected when the memo receives focus. +In TMemo, AutoSelect is set to False. + + + Provides access to the TCaret attached to the memo control. + + + Defines the character case for the text within the memo control. +Modify the CharCase|CharCase property's value in order to change the case of the text in the memo control. +Options are: ecNormal, ecUpperCase and ecLowerCase. + + + Defines whether the spell-checking feature of the memo control is on or off. +This property enables spell checking on the TMemo component. When set to True a red squiggly line appears underlining the words misspelled. +The spell checking is performed by an operating system service. It is only supported on iOS and OS X. + + + The types of information that can be detected in the memo text. +DataDetectorTypes is used on native presentation for iOS only. + + + Determines whether to cancel the visual indication of the selected text region when the memo control does not have the focus. +If HideSelectionOnExit is False, then the memo keeps highlighting the selected text using the SelectionFill brush, even when the focus moves from the memo to another control. + + + For internal use only. +Do not use this member. It is for internal use only. +Specifies the TImeMode input mode for the memo control. + + + Specifies the type of on-screen keyboard to be displayed for the memo control. +Use KeyboardType to specify the type of on-screen keyboard that appears for the memo when ShowVirtualKeyboard is called. + + + Provides access to the individual lines in the memo text. +The memo text can contain several line break symbols that separate the whole memo text into several lines. Depending on the current platform, a line break symbol can be a LF 'line feed' character (MacOS) or a CRLF 'carriage return' plus 'line feed' pair (Windows). Lines holds the memo text separated line by line. +When WordWrap is True then each line (specified in the Lines property) can be wrapped into several 'visual lines' to fit to the memo width. However these several 'visual lines' are still represented by a single string element in the Lines property. + +Notice that GoToLineBegin and GoToLineEnd move the cursor to the beginning or the end of the current (pointed by the cursor) visual line. +Lines is a TStrings object, so you can use TStrings methods to work with the Lines property. +For example, you can count the number of lines: + +ShowMessage('The number of lines:' + IntToStr(Memo1.Lines.Count)); + +You can add new lines: + +Memo1.Lines.Append('New text to append at the end of memo'); + +You can delete lines: + +Memo1.Lines.Delete(0); // Deletes the fist line from memo + +You can replace a line with a new string: + +Memo1.Lines[8] := 'Replace 9th line with this string'; + +To work with all the memo's text at once, one can use the Text property. + + + Specifies the maximum number of characters that can be kept in the memo control. +If the text in the memo control contains more characters than the MaxLength, then the text is truncated to the MaxLength characters. +If the memo control already contains a number of characters equal to MaxLength, then the user cannot enter any more characters. +MaxLength counts end-of-line characters. +If MaxLength is 0, then no explicit length limitation is set. + +Note: Even when MaxLength is 0, there may be limitations imposed by a platform on the number of characters that may be entered into a memo control. + + + Specifies whether the memo's text can be changed. +ReadOnly equals to True forbids any modification of the text in the memo control. + + + Provides access to the current cursor position in the memo's text. +Use CaretPosition to determine the coordinates of the cursor (insertion point) in the memo control. The TCaretPosition type has Line and Pos integer fields: + +Line represents the number of the line containing the cursor, indexed from zero. +Pos represents the horizontal character coordinate of the cursor, indexed from zero. +Modify the value of the CaretPosition property in order to change the position of the cursor within the memo control. In order for the cursor to be visible, the memo control must have focus. +Thus, if Line = 3 and Pos = 5, then the cursor is at the fourth line and at the sixth character from the start of the line. + + + Represents the brush to draw the selected text region in the memo control. +Use SelectionFill to change the brush characteristics for the selected text region in the memo control. For example, to change the background color of the selected text region, use: + + Memo1.SelectionFill.Color := System.UIConsts.claCoral; + + + Specifies the family, size, and style properties of the text font in the memo control. + + + Specifies the font color of the text in this memo. +Use the FontColor property to read or change the font color of the text in this memo component. The default value of the FontColor property is TAlphaColorRec.Black. + + + Specifies the horizontal alignment of the text in the memo control. +Use the TextAlign property to change the horizontal alignment of the text in the memo control. TextAlign can be one of the Center, Leading, or Trailing values defined in TTextAlign. +When you use text representation properties stored in the +TextSettings property, remember that TextAlign corresponds to HorzAlign. + + + Specifies whether to wrap the text in the memo when its length is greater than the memo width. +Set WordWrap to True to wrap the text in the memo control. Wrapping implies the division of the text string that is wider than the memo control onto several lines that fit to the memo control's width. + + + Specifies the zero-based number of the first character selected in the memo's text. +Read SelStart to determine the number of the first selected character, where 0 indicates the first character. If there is no selected text, then SelStart returns the cursor position. Keep in mind that the SelStart character count includes end-of-line characters at the end of each line. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. The memo component must have focus (call SetFocus) before you attempt to use SelStart; otherwise the selection is invisible. + + + Specifies the number of characters that are selected in the memo control. +Read SelLength to determine the length, in characters, of the selected text. +Set the value of the SelLength property in order to specify the length of the selected text, starting at SelStart. Keep in mind that the character count from SelLength will include end-of-line characters at the end of each line. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. The memo component must have focus (call SetFocus) before you attempt to use SelStart; otherwise the selection is invisible. + +Note: Setting SelLength to a value greater than the number of characters from SelStart to the end of the text results in the selection of all characters from SelStart to the end of the text. Reading SelLength immediately after setting it to a value greater than the number of available characters returns the number of characters actually selected, not the value that was just set. + + + Represents the currently selected fragment of the memo's text. +Use SelText in order to retrieve the text that is selected, from the TCustomMemo control. If there is no selection, SelText is an empty string. If the memo control does not have the focus, SelText represents the previous selected portion of the text. + + + Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Occurs when the focus leaves the memo or the user presses ENTER. The event occurs only when the text has changed. +OnChange is raised when the following situations occur: + +Text is cleared in the memo +Text is set in the memo +The memo loses focus +The user presses the ENTER key +Write an OnChange event handler to check the modified text data. + + + Occurs on any change in the memo's text. +Write an OnChangeTracking event handler to respond immediately to any changes made in the memo control's text. The OnChangeTracking event provides the first opportunity to respond to modifications that the user makes by typing into the memo control. +The Text property of the memo control is already updated and reflects any changes when OnChangeTracking is raised. +The difference between OnChangeTracking and OnChange is that OnChangeTracking occurs at each modification of text in the memo control. + +Note: OnChangeTracking does not occur when only text representation characteristics are changed (for example, when changing TextAlign). + + + Raises to validate any change has been made in the memo's text. Occurs before the OnChangeTracking event. +In descendent classes, to change when to raise the OnValidating event, redefine the virtual TCustomMemoModel.DoValidating method. + + + Raises to validate changes have been made in the memo's text when the memo has lost the focus or the user has pressed ENTER. The OnValidate event occurs before the OnChange event. + + + + + TMemo is a multiline text editing control, providing text scrolling. +Use TMemo to place a standard multiline edit control on a form. Multiline edit boxes allow the user to enter more than one line of text. They are appropriate for representing large amounts of text. +The text in the memo control can be edited as a whole or line by line. +The characteristics of the text in the memo control can be modified by using, for example, Font, FontColor, or CharCase. +To limit the changes made to the memo control, use properties such as ReadOnly, Enabled, or MaxLength. +When not in focus, TMemo does not draw a selection rectangle even though the user has selected the text. You can verify whether the text is selected by using the SelText property. + +Note: When a number of lines in a control is more than can be concurrently shown in the control, then you can use a scroll bar to scroll the text in the control. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll a text using the mouse wheel. To enforce the scroll bar to be shown by default, in the Object Inspector, select the memo control and set the AutoHide to False. + + + + + + Reads the state of the action. +ReadState is used internally in the actions system. It is not necessary to call it directly. +ReadState calls the inherited System.Classes.TComponent.ReadState procedure. Then +ReadState checks whether the Parent of Reader (Reader.Parent) is an action list, then ReadState sets that the action belongs to this action list (ActionList). + + + Retrieves whether the list stored in the SecondaryShortCuts property is created. +SecondaryShortCutsCreated returns True if the SecondaryShortCuts list is created. + + + Introduces an interface for creating the ShortCutList object for the action. +As implemented in TContainedAction, CreateShortCutList does not create any shortcut list object and just returns nil. + + + Stores the value of the Enabled property when the action is suspended. +The System.Actions.TContainedActionList.SetState method uses SavedEnabledState internally: + +When System.Actions.TContainedActionList.SetState changes State from asSuspendedEnabled to asNormal, then the value stored in SavedEnabledState is used to set the Enabled property. +When System.Actions.TContainedActionList.SetState sets State to asSuspendedEnabled, then the value of the Enabled property is saved in SavedEnabledState and Enabled is set to True. + + + Copies the properties of this action to a destination action. +Dest specifies the destination action. AssignTo ensures the correct assignment of property values. +If Dest is nil or Dest is not of the TContainedAction type, then an error is raised. + + + Executes the action when the user types one of its shortcuts. +HandleShortCut calls System.Classes.TBasicAction.Execute to cause the action to perform its function. HandleShortCut returns the value that System.Classes.TBasicAction.Execute returns. +Descendant classes can override HandleShortCut to respond in other ways when the user types the action's shortcut keys. + + + Sets the specified Value to the AutoCheck property of the action, and propagates this Value to all clients of the action. + + + Sets the specified Value to the Caption property of the action, and propagates this Value to all the clients of the action. + + + Sets the Name and Caption properties of the action. +SetName calls the inherited System.Classes.TComponent.SetName method to set the specified Value to the Name property of the action. If the action does not have any clients and the current values of the Name and Caption properties of the action are equal, then SetName sets Value to the Caption property of the action also. + +Warning: Using SetName to change the name of an action at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Sets the specified Value to the Checked property of the action, and propagates this Value to all clients of the action. +If the action has a GroupIndex value greater than 0, then setting Checked to True causes all other actions in the group to have their Checked property set to False. + + + Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +The behavior of SetEnabled depends upon the State of the ActionList action list: + +If the value of State is asSuspended, then SetEnabled sets to the specified Value only the Enabled property of the action. +If the value of State is asSuspendedEnabled, then SetEnabled sets to True the Enabled property of the action and of all clients of the action. +Otherwise, SetEnabled sets to the specified Value the Enabled property of the action and propagates this Value to all clients of the action. + + + Sets the specified Value to the GroupIndex property of the action and properly handles the ON or OFF state of the Checked properties of all actions in the group specified by Value. +SetGroupIndex sets the specified Value to the GroupIndex property of the action. If the Checked property of this action is True, then SetGroupIndex sets the Checked property to False for all the other actions in the group defined by the specified Value. +When Value is greater than 0, the group of actions with the GroupIndex property having this Value forms a group of actions that act like a group of radio buttons. When the Checked property of any action in this group is True, the Checked properties of all other actions in the group are False. That is, one and only one action in the group is checked ON at a time. + +Note: All actions in a group must be listed by the same action list. + + + Sets the Help context ID for the action and action's clients. +SetHelpContext sets the new Value of the integer help context ID, stored in the HelpContext property, for the action. +SetHelpContext always propagates this Value to all clients of the action. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help in your application, you need to enable Help in your application. + + + Defines the Help keyword for the action and action's clients. +SetHelpKeyword sets the new Value of the string help keyword, stored in the HelpKeyword property, for the action. +SetHelpKeyword always propagates this Value to all clients of the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + + + Sets the HelpType property for the action and action's clients. +SetHelpType sets the new Value of the HelpType property for the action. +SetHelpType always propagates this Value to all clients of the action. + + + Sets the Hint property for the action and action's clients to a new Value. +SetHint sets the new Value of the Hint property for the action. +SetHint always propagates this Value to all clients of the action. + + + Sets the new Value of the Visible property for the action and action's clients. +SetVisible always propagates this Value to all clients of the action. + + + Sets the new Value of the ShortCut property for the action and action's clients. +SetShortCut always propagates this Value to all clients of the action. + + + Sets the new Value of the ImageIndex property for the action and action's clients. +SetImageIndex always propagates this Value to all clients of the action. + + + Sets the new Value of the StatusAction property for the action and action's clients. +SetStatusAction always propagates this Value to all clients of the action. + + + Instantiates and initializes a TContainedAction object. +Applications do not need to call Create directly. Actions are created automatically when you choose New Action in the Action List editor. +Create calls the inherited System.Classes.TBasicAction.Create constructor and then +initializes the Enabled (setting it to True), Visible (setting it to True), and ImageIndex (setting it to -1) properties. + + + Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + Returns the action list containing the action. +GetParentComponent returns the action list containing the action. This action list is stored in the ActionList property. If ActionList stores nil, then GetParentComponent calls the inherited System.Classes.TComponent.GetParentComponent method. + + + Indicates whether the action is contained in an action list. +HasParent returns True if the action is contained in an action list stored in the ActionList property. If ActionList stores nil, then HasParent calls the inherited System.Classes.TComponent.HasParent method. + + + Sets the action list containing the action. +SetParentComponent sets the specified AParent action list as the action list containing the action. This action list is stored in the ActionList property. + + + Holds the action list to which the action belongs. + + + Returns True if the action list of the action is suspended. + + + Specifies the index of the action in its action list. +Index indicates the position of the action in its action list. You can change the action's Index at design time using one of the IDE editors to handle actions. +The index of actions determines the order in which they appear in user interface elements such as menus and tool bars. +Index is zero-based. When Index is -1, this means that the ActionList property does not contain any list. + + + Indicates whether the action's clients should be disabled if no OnExecute event handler is found. +DisableIfNoHandler defines whether to set the Enabled property of the action to False if no OnExecute event handler is set for the action. Setting Enabled to False disables all the action's clients. +See, for example, how FMX.Forms.TApplication.UpdateAction uses DisableIfNoHandler to define whether to set Enabled to False if the OnExecute event handler is not defined to the action. +For example, setting DisableIfNoHandler to False can be useful when managing submenus. In this case, pointing to a command on the main menu, which causes the submenu to open, does not need any OnExecute event handler. Then, if DisableIfNoHandler is True, this main menu command becomes disabled and the submenu cannot be opened. In such cases it can be convenient to use actions of types FMX.Controls.TControlAction and Vcl.Controls.TControlAction. Objects of these classes have the value of DisableIfNoHandler set to False, by default. + + + Controls whether the Checked property toggles when the action executes. +AutoCheck causes the Checked property to toggle when the action executes. This allows the Checked property of the action to remain in sync with the Checked property of the client (or an equivalent). +If the client has an AutoCheck property of its own, the AutoCheck property of the action is propagated to the AutoCheck property of the client. + + + Represents the caption of the action. +Caption holds the string that is used as the caption of the action, when it is set. The value of Caption can be propagated to all client controls and client menu items linked to the action. + + + Indicates whether client controls and menu items appear checked. +Checked specifies the checked state for the action. The value of Checked can be propagated to all client controls and client menu items linked to the action. + +Note: If the action has a GroupIndex value greater than 0, then setting Checked to True sets to False the Checked properties of all other actions in the GroupIndex group. +Tip: Use the AutoCheck property to ensure that the action's Checked property toggles when the action executes. + + + Specifies the enabled state for the action. +The value of Enabled can be propagated to all client controls and client menu items linked to the action. + + + Indicates a group of actions in one action list. Actions in this group act like the group of radio buttons. +The value of GroupIndex is used to define groups of actions. Actions in each group act like groups of radio buttons. When GroupIndex is greater than 0, this value identifies the group to which some actions belong. The value of GroupIndex can be propagated to all client controls and client menu items linked to the action. +When the Checked property of any action in that group is set to True, the Checked properties of all other actions in the group are set to False. That is, only one action in the group can be checked at a time. + +Note: All actions in a group must be listed by the same action list. + + + Keeps the integer context ID that identifies the Help topic for the action. +HelpContext specifies the integer context ID to identify the Help topic to show when invoking Help for the action. The value of HelpContext can be propagated to all client controls and client menu items linked to the action. See also IsHelpLinked. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the value of the HelpContext property to invoke the online Help that shows the topic with this context ID. The target topic is uniquely identified by a HelpContext context ID value. + + + Contains the keyword string that identifies the Help topic for the action. +The value of HelpKeyword can be propagated to all client controls and client menu items linked to the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the HelpKeyword property's value to invoke the online Help showing the topic with this keyword. + + + Keeps whether to use the HelpContext or HelpKeyword property to identify the Help topic. +The value of HelpType can be propagated to all client controls and client menu items linked to the action. +HelpType can keep one of the following constants: + +htContext instructs to use the HelpContext property to identify the Help topic to show when invoking Help. +htKeyword instructs to use the HelpKeyword property to identify the Help topic to show when invoking Help. + + + Stores the Help hint text. +Hint holds the hint string indicating the hint text for the action. +Hint contains the text strings that appear in a pop-up box (or in a status bar) when the user moves the mouse over screen elements. +This hint string can be propagated to clients of the action to controls, menu items, and other GUI elements. + +Note: VCL controls support hint strings containing three parts that can be shown in separate locations (see Vcl.Controls.TControl.Hint). + + + Stores whether the action representation is visible. +Visible specifies the visible state for the action (True means visible, False means invisible). +This Visible value is propagated to a client of the action if IsVisibleLinked method of the action link linking the client to the action returns True. +If the Visible of an action is False and IsVisibleLinked of an action link returns True, then the Visible of the client (a control, menu item, or others) is also set False and this client is also invisible. Typically, IsVisibleLinked of an action link returns False if the action belongs to TCustomViewAction. Otherwise, when the action belongs to TAction, then IsVisibleLinked of an action link returns True. That is, TCustomViewAction is used when one need to provide visible representation of clients of actions that have Visible set True. + + + Shortcut that triggers the action. +The value of Shortcut can be propagated to all client controls and client menu items linked to the action. + + + Stores shortcuts (in addition to ShortCut) for triggering the action. +Actions can execute in response to multiple shortcut key combinations. SecondaryShortCuts lists all the shortcut key combinations (other than the one specified by the ShortCut property) that can trigger the action. This lets you provide additional, secondary shortcuts. +When the user types one of the key combinations listed in SecondaryShortCuts, the action's Execute method is called. + + + Stores an index in a list of images. +ImageIndex is a zero-based index in a list of images. TContainedAction does not provide the actual list of images, only implementations of actions in GUI application frameworks provide such a property. In general, this list of images contains images that are associated with controls and menu items that use this action. +The value of ImageIndex can be propagated to all client controls and client menu items linked to the action. + +Note: When ImageIndex is -1, this means that the list does not contain any images. +In typical implementations of controls, an image is drawn at the leftmost position in the control, and a control's text is drawn to the right of the image. If ImageIndex is -1, then a control does not offset the text to the right to reserve a placeholder for the image. Otherwise, if ImageIndex is not -1, then the control's text is always drawn with the offset to the right to reserve a place for drawing an image. + + + Calls the OnHint event handler. +Typically, applications do not call the DoHint method. It is called automatically when the user pauses the mouse on one of the action's client controls or menu items. DoHint is called by the action's client when the client asks to show the hint. + +DoHint checks for an OnHint event handler and passes HintStr to it, if the event handler exists. The OnHint event handler can change the specified hint string HintStr. DoHint returns True if no event handler is assigned or if OnHint returns True. DoHint can be used to determine which hint text should be shown. For example, Vcl.Controls.TControlActionLink.DoShowHint calls DoHint internally, and if DoHint returns True, then Vcl.Controls.TControlActionLink.DoShowHint appends the action's shortcut specification to the hint text to display. + + + Occurs when the mouse pauses over a client control or menu item. +Use OnHint to override the default hint that appears when the user pauses the mouse over a client control or menu item. The OnHint event handler can change the hint that appears (by changing the string stored in the client's Hint property), or display the hint in an application-specific way. + + + Stores the status for an input field in an action. +StatusAction holds the status for an input field in the action, when it is set. +The value of StatusAction can be propagated to all client controls and client menu items linked to the action. + + + Group or category where the action belongs. +IDE editors for actions group together actions that share the same category. In the VCL, if you are using an action manager, you can generate user interface elements that correspond to action categories. +Action categories group actions by similarities, usually of behavior or functionality. Standard categories are Edit, Format, Help, Windows, and others. At design time you can modify or set the Category for an action by selecting the action from the action list or object tree view, and choosing Category in the Object Inspector. + + + + + + + + Returns True if the internal list of actions of the TContainedActionList instance has been created. It returns False otherwise. +The internal list of actions is created when you create the TContainedActionList instance. + + + Raises an EActionError exception if the internal list of actions of the TContainedActionList has not been created. + + + Adds an action to the list. +Applications cannot call this protected method. AddAction is used internally to add an action to the Actions property array. +To add an action to an action list, set the action's ActionList property. + + + Removes an action from the list. +Applications cannot call this protected method. RemoveAction is used internally to remove an action from the Actions property array. RemoveAction removes the action and sets its ActionList property to nil (Delphi) or NULL (C++). +To remove an action from an action list, change the action's ActionList property. + + + Triggers the OnChange event on the action list and then on all its actions. +The internal list of actions is created when you create the TContainedActionList instance. + + + Handles notifications about the removal of one of the actions of the list. +If AComponent is an action of the list and Operation is opRemove, the action is removed from the list. + + + Sets the order in which actions are passed to a callback by the GetChildren method. +SetChildOrder specifies the order in which the component streaming system loads and saves the action components owned by this action list. It ensures that the actions are loaded and saved in the same order that they appear in the Actions property array. You should not need to call this method directly. + + + Sets the State property for the action list. +If Value is asSuspendedEnabled, then SetState also sets Enabled to True for all the actions in the action list. This is useful when designing in the Action Manager. +If the OnStateChange event handler is set, then SetState calls this event handler. + + + Occurs when a change occurs in the action list. +Write an OnChange event handler to update your application in response to changes in the action list. Changes to the action list that trigger an OnChange event include changes to an action category or to the action list's image list. + +Note: The action list automatically informs the actions in the list when an OnChange event occurs. You need only provide an OnChange event handler for application-specific responses. +OnChange is an event handler of type TNotifyEvent. + + + Occurs when a client object triggers an action in the list. +Write an OnExecute event handler to respond when an action in the list fires. +When the user invokes a client object, the action list s OnExecute event is the first event to occur in response. If the OnExecute event handler sets its Handled parameter to True, the action is considered handled, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class in response to the user action. +If the OnExecute event handler does not set its Handled parameter to True, the application s OnActionExecute event occurs next. If the OnActionExecute event does not respond to the user input, the action object s OnExecute event occurs. Finally, if the action does not have an OnExecute event handler, the application locates a target object and executes any predefined response implemented by the action object. + + + Occurs when the application is idle so that the action list can update a specific action in the list. +Write an OnUpdate event handler to configure the properties of a specified action in the list so that it reflects current conditions. +When the application is idle, it cycles through every action in turn, giving it a chance to update itself to reflect current conditions. For each action, the first event to occur in this sequence is the action list's OnUpdate event. If the OnUpdate event handler sets its Handled parameter to True, the action is considered updated, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class. +If the OnUpdate event handler does not set its Handled parameter to True, the application's OnActionUpdate event occurs next. If the OnActionUpdate event does not update the action, the action object's OnUpdate event occurs. Finally, if the action does not have an OnUpdate event handler, the application executes any predefined update method implemented by the action object. + + + Returns True if the Source and Dest categories are the same. If IncludeSubCategory is True, this function also returns true if Dest is a subcategory of Source. +These are some examples of calls to this function: + + + +Source + +Dest + +IncludeSubCategory + +Result + + +File + +File + +True + +True + + +File.Recent + +File + +True + +False + + +File + +File.Recent + +True + +True + + +File + +File + +False + +True + + +File.Recent + +File + +False + +False + + +File + +File.Recent + +False + +False + + + Creates an instance of TContainedActionList. +This creator is inherited from TComponent, see TComponent.Create for more information. + + + Destroys an instance of TContainedActionList. +This destructor is inherited from TComponent, see TComponent.Destroy for more information. + + + Generates an OnExecute event. +Typically, applications do not call the ExecuteAction method. Instead, the action indicated by the Action parameter calls ExecuteAction in response to a user command. It is possible, however, to call ExecuteAction to generate an OnExecute event even though no client control has been triggered. +ExecuteAction invokes the OnExecute event handler for the action list. It returns True if the event handler handles the action, False otherwise. + + + Calls a specified method for each child action of the action list. +GetChildren is used by the component streaming system. For each action in the action list, GetChildren calls the method passed in Proc. The actions are passed to the callback in the order that they are loaded or saved by the component streaming system. + + + Returns a TContainedActionList enumerator, a TActionListEnumerator reference that enumerates the actions in the list. +To process all actions, read Current from the enumerator within a while MoveNext do loop. + + + Generates an OnUpdate event. +Typically, applications do not call the UpdateAction method. Instead, the action indicated by the Action parameter calls UpdateAction when informed by the application that it can update itself. It is possible, however, to call UpdateAction to generate an OnUpdate event even though this has not been initiated by the application. +UpdateAction invokes the OnUpdate event handler for the action list. It returns True if the event handler updates the action, False otherwise. + + + Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + Indicates the number of actions in the action list. +ActionCount indicates how many actions are contained in the action list. + + + Indicates whether the actions in the action list respond when the user triggers a client object. +State can be one of the constants defined in the TActionListState type: +asNormal, asSuspended, and asSuspendedEnabled. + + + Occurs after the State property's value is changed. +Write an OnStateChange event handler to respond after the State property's value is changed. + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the member for the given member name. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetMember inherits from Data.Bind.Components.TBaseBindScopeComponent.GetMember. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.GetMember. +Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + Forwards notification messages to all owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Initializes the component after the form file has been read into memory. +Data.Bind.ObjectScope.TBaseObjectBindSource.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Adds the given bind component to the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.AddExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.AddExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.AddExpression. +Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + Removes the given binding component from the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.RemoveExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. +Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a TComponent enumerator. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the bind source adapter is positioned in the last record. +Read Eof (end of file) to determine if ItemIndex is located in the last record. If Eof is True, the bind source has an adapter and the active record is the last one or there are no records. Eof is False if the ItemIndex is located in any other position. + + + Indicates whether the bind source adapter is positioned in the first record. +Read BOF (beginning of file) to determine if ItemIndex is located in the first record. If BOF is True, the bind source has an adapter and the active record is the first one. BOF is also True if there is no active record. BOF is False in all other cases. + + + Specifies whether the bind source has permission to modify the data. +Check CanModify to determine if data can be edited. When CanModify is set to True, the bind source can edit the data. When CanModify is set to False, the bind source cannot edit the data. + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TBaseObjectBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies whether the bind source adapter is active. +Read Active to determine whether the bind source adapter is active. By default, the Active property is set to True. +When Active is False, the bind source does not have an adapter or its adapter is not active. When Active is True, the bind source has an active adapter. + + + Specifies whether the bind source is automatically activated. Set AutoActive to True for automatic activation. + + + Specifies the index of the current record. +ItemIndex holds the index of the current record of the dataset the bind source adapter is currently on. The first item has the index 0, the second item has the index 1, and so on. If no item is selected, the value of ItemIndex is -1. + + + Indicates whether the data is in edit mode. +Read Editing to determine whether the bind source adapter can currently edit the data. If the Editing property is True, the data provided by the bind source adapter is in editing mode. Otherwise, it is False. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the internal adapter of the bind source. +The InternalAdapter property holds the internal adapter of the bind source. InternalAdapter uses the GetInternalAdapter method to return the internal adapter of the bind source. + +Note: The GetInternalAdapter method always returns nil. Descendant classes must override this method to return the internal adapter. + + + + + Is a base class that implements a bind source for creating sample data. +If you want to create your own custom prototype bind source, then you should derive your class from TCustomPrototypeBindSource. When designing applications, TPrototypeBindSource is available from the Tool Palette. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TCustomPrototypeBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + + + + Method subclasses should override to configure the desired quality. + + + Returns the current frame configuration. + + + Configures the capture frame with the given settings. + + + Returns the available capture settings. + + + Returns a new capture settings configuration with given parameters. + + + Constructor. + + + Configures the capture frame with the given settings. + + + Returns the available capture settings taking in account the canvas class bitmap size limitations. + + + Returns the available capture settings using the default canvas class to keep the limitation of the + bitmap size. + + + Current frame configuration. + + + Current settings sort priority. + + + Current frame configuration. + + + + + + + + Default constructor. + + + + + + + + Sets the priority to sort the result of available frame settings. + + + Gets the priority criteria to sort the result of available frame settings. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Media.TCameraComponent.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Media.TCameraComponent.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Displays the captured data on a bitmap. +The SampleBufferToBitmap method displays the captured video data on a bitmap. + +The ABitmap parameter is the bitmap where the image is displayed. +The ASetSize parameter specifies whether the video samples are resized to fit the current size of ABitmap, or whether ABitmap is resized to the windows sizes. + + + Getter of CaptureSetting. + + + Setter of CaptureSetting. + + + It returns the available capture settings. + +Note: The returning array is sorted with the CaptureSettingPriority criteria. + + + Returns an array of available video capture settings. + + + Array with the available capture settings. +You can use CaptureSettingPriority to set the criterion to sort the Array. +Use the CaptureSetting property to set the capture data resolution. +See the Quality property for further details. + + + Current frame capture configuration. +Use the CaptureSetting property to set the capture data resolution from the available ones. +See the Quality property for further details. + + + Priority criterion for sorting the result of the available frame settings. +See the Quality property for further details. + + + States the quality of the video capture. +The Quality property of type TVideoCaptureQuality can take one of the following values: + + + +Value + +Meaning + + + +PhotoQuality + + + +The captured data has high-resolution photo quality. + + + + +HighQuality + + + +The captured data has high resolution (depending on the device). + + + + +MediumQuality + + + +The captured data has medium resolution (depending on the device). + + + + +LowQuality + + + +The captured data has low resolution (depending on the device). + + + + +CaptureSettings + + + +This option allows you to set a customized capture data resolution. + + +By default, Quality is set to CaptureSettings and it uses the best available camera quality (best resolution and best frame rate) prioritizing first the Resolution. +For example, to change the Quality of the CameraComponent1 TCameraComponent to LowQuality, you can use the following line: + + +Delphi: + +CameraComponent1.Quality := TVideoCaptureQuality.LowQuality; + + + +C++: + +CameraComponent1->Quality = TVideoCaptureQuality::LowQuality; + + +Setting a Custom Quality Capture Setting +By setting the Quality to TVideoCaptureQuality.CaptureSettings you can set a customized capture data resolution: + +Use the AvailableCaptureSettings property to see the Array with the different supported configurations. +You can use CaptureSettingPriority to set the criterion to sort the Array of the AvailableCaptureSettings to prioritize Resolution or FrameRate when sorting the Array. See TVideoCaptureSettingPriority for further information. +Use the CaptureSetting property to set the capture data resolution from the available ones. +To set the best available capture settings prioritizing the frame rate, you could for example use the following: + + +Delphi: + +procedure TForm1.SetMaxFrameRateClick(Sender: TObject); +var + LSettings: TArray<TVideoCaptureSetting>; +begin + CameraComponent1.CaptureSettingPriority := TVideoCaptureSettingPriority.FrameRate; + LSettings := CameraComponent1.AvailableCaptureSettings; + CameraComponent1.CaptureSetting := LSettings[0]; +end; + + + +C++: + +void __fastcall TForm1::SetMaxFrameRateClick(TObject *Sender) +{ + DynamicArray<TVideoCaptureSetting> LSettings; + CameraComponent1->CaptureSettingPriority = TVideoCaptureSettingPriority::FrameRate; + LSettings = CameraComponent1->AvailableCaptureSettings; + CameraComponent1->CaptureSetting = LSettings[0]; +} + + +Note: When you set a specific CaptureSetting, the Quality property is automatically set to TVideoCaptureQuality.CaptureSettings. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the camera device has torch. +Use the HasTorch property to see whether the camera device has torch. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Selects the different modes for the torch: on, off, or auto. +The TorchMode property can take one of three values enumerated by TTorchMode: ModeOff, ModeOn, and ModeAuto. +For example, to turn on the torch of the CameraComponent1 TCameraComponent, you can use the following line: + + +Delphi: + +CameraComponent.TorchMode := TTorchMode.ModeOn; + + + +C++: + +CameraComponent->TorchMode = TTorchMode::ModeOn; + + +Use the HasTorch property to see whether the camera device has a torch. + + + Enables and disables the camera device. +Set the Active property to True to enable the camera device, and set Active to False to disable it. + + + Selects the kind of camera device: default, front, or back camera. +The Kind property can take one of three values enumerated by TCameraKind: Default, FrontCamera, and BackCamera. +For example, to select the back camera of the CameraComponent1 TCameraComponent you can use the following line: + + +Delphi: + +CameraComponent1.Kind := TCameraKind.BackCamera; + + + +C++: + +CameraComponent1->Kind = TCameraKind::BackCamera; + + + Occurs when the sample buffer is ready. +Write an event handler for the OnSampleBufferReady event to specify what happens when the sample buffer is ready. + + + + + Base class to access media files. +TMedia is an abstract class that defines an interface for media files. Platform-specific subclasses provide concrete implementations for Windows and OS X platforms. +TMedia exposes media file properties such as file name, size, dimension, state, or duration. +The supported media files formats are the native formats for each platform: + +For Windows: +Audio formats: .wma, .mp3, .wav +Video formats: .avi, .wmv +For OS X: +Audio formats: .mp3 +Video formats: .mov, .m4v, .mp4 +Using TMediaCodecManager, it is possible to register custom media codecs to extend the audio/video feature support. +For easy access to media files, use the TMediaPlayer and TMediaPlayerControl components. + + + Getter function for the Duration property. + + + Getter function for the CurrentTime property. + + + Setter function for the CurrentTime property. +Value specifies the new value for CurrentTime. + + + Getter function for the VideoSize property. + + + Getter function for the State property. + + + Getter function for the Volume property. + + + Setter function for the Volume property. +Value specifies the new value of Volume. + + + Updates the current Media, depending on the TMediaPlayerControl associated with it. +UpdateMediaFromControl is used to keep the current Media, which has been updated after being manipulated by the TMediaPlayerControl associated with it. +The TMediaPlayerControl associated with the current media is specified through the Control property. + + + Plays the current media file. +To start playing the current media, call the Play method. + + + Stops the current media from being played. +To stop playing the current media, call the Stop method. + + + Embarcadero Technologies does not currently have any additional information. + + + Constructs an object and initializes its data before the object is first used. +FMX.Media.TMedia.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + + Starts the playback of the current media file. +Call the Play method to playback the current media file. To pause or stop the current media file from playing, call the Stop method. + + + Stops the playback of the current media file. +Call the Stop method to stop or to pause the current played media file. To play the current media file, call the Play method. + + + Specifies the media player control that plays the current media file. +Set Control to specify the media player control that plays the current media file. + +Tip: For easy access to media files and easy playing, use the TMediaPlayer or TMediaPlayerControl visual components. Giving the name of the file to be played will automatically create the TMedia objects and set the Control to the current used media player control. + + + Specifies the name of the current used media file. +FileName specifies the name of the media file used to create the current TMedia object. FileName includes the path, name, and extension of the media file. + + + Specifies the total play time of the current media file. +Duration is measured in 100ns. To obtain s, divide Duration by MediaTimeScale. + + + Specifies the current playback position. +CurrentTime is measured in 100ns. To obtain s, divide Duration by MediaTimeScale. +Set CurrentTime to control the current position to be played. + + + Specifies the resolution of the current video file. +VideoSize specifies the native width and height of the current media file, in pixels. +VideoSize is a TPointF. The X coordinate of the point represents the width of the window, and the Y coordinate of the point represents the height of the window. If the media file is audio only and does not have a window to be displayed, VideoSize is (0,0). + + + Specifies the audio volume of the current media file. +Volume takes values in the range from 0 through 1. If Volume is 1, then the media file is played at the maximum native volume. If Volume is 0, then the media file is mute. + + + Specifies whether the current media file is playing or is stopped. +If the current media file is not assigned or supported, then State is set to Unavailable. +If the current media file is playing, then State is set to Playing, otherwise it is set to Stopped. + + + + + Base class for media codecs. +TCustomMediaCodec is an abstract class that defines a media codec. +Use TMediaCodecManager to register custom media codecs to extend FireMonkey audio/video features. + + + Creates a TMedia from a specified file. +The AFileName parameter specifies the name of the file from which the TMedia is created. +Do not use CreateFromFile explicitly in applications. Use TMediaCodecManager to access and manage media codecs. + + + + + Nonvisual component for media file playback. +Use a TMediaPlayer component for easy access to media files. +The currently accessed media file is specified through the Media property. +To specify the media file to be played by the current TMediaPlayer, set the FileName property. The file name must include the path of the file, so it can be localized on the memory, and the extension. +Call the Play and Stop methods to start playing a media file, or to stop or pause a running media file. The current position is specified through the CurrentTime property. TMediaPlayer also exposes media file properties such as Duration, VideoSize, Volume or State. +TMediaPlayer can play back audio files and the audio component of a video file. To display a video file, use a TMediaPlayerControl component. For more information, see Audio-Video in FireMonkey. + +Note: In order to play an audio file using TMediaPlayer, use the appropriate format: +.wav on Windows +.caf on iOS and OS X +.3GP on Android + + + Returns a reference to a specified interface if the current component supports that interface. +FMX.Media.TMediaPlayer.QueryInterface inherits from System.Classes.TComponent.QueryInterface. All content below this line refers to System.Classes.TComponent.QueryInterface. +Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Media.TMediaPlayer.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Media.TMediaPlayer.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Starts playing the current Media. +Call the Play method to play the current Media. If Media is not assigned, Play does nothing. +To stop or pause the current media file from playing, call the Stop method. + + + Stops or pauses playing the current Media. +Call Stop to stop or to pause the current Media. If Media is not assigned, Stop does nothing. +To start playing the current media file, call the Play method. + + + Clears the current media player. +Call Clear to clear the current Media attached to the media player. Clear also empties the FileName property. + + + Specifies the current TMedia attached to this media player. +Call the Play and Stop methods to start playing, or to stop or pause the current Media file, respectively. +Media is assigned and created when the FileName property is set. +TMediaPlayer exposes the Media properties through the following properties: Duration, VideoSize, CurrentTime, Volume, and State. +To empty the current Media attached to the media player, call the Clear method. +If Media type is audio, then calling Play will start playing the audio file. If Media type is video, then calling Play will just play the audio component of the specified video file. To display a video file, use a TMediaPlayerControl, and link the current TMediaPlayer to it by setting the MediaPlayer property of the TMediaPlayerControl. + + + Specifies the total play time of the current media file attached to the media player. +Duration is measured in 100ns. To obtain s, divide Duration by MediaTimeScale. + + + Specifies the current playback position. +CurrentTime is measured in 100ns. To obtain s, divide CurrentTime by MediaTimeScale. +Set CurrentTime to control the current position to be played. + + + Specifies the resolution of the current video file. +VideoSize specifies the native width and height of the current media file, in pixels. +VideoSize is a TPointF. The X coordinate of the point represents the width of the window, and the Y coordinate of the point represents the height of the window. If the media file is audio only and does not have a window to be displayed, or if no media file is attached to the media player, then VideoSize is (0,0). + + + Specifies the audio volume of the current media file. +Volume takes values in the range from 0 through 1. If Volume is 1, then the media file is played at the maximum native volume. If Volume is 0, then the media file is mute. +If there is no media file attached to the current media player, then Volume is 1. + + + Specifies whether the current attached Media is playing or is stopped. +If the current media file is not assigned or supported, then State is set to Unavailable. +If the current media file is playing, then State is set to Playing, otherwise it is set to Stopped. + + + Specifies the media file name played by the current media player. +Media is assigned and created when the FileName property is set. The file name must include the path of the file, so it can be localized on the memory, and the extension. +To empty the current Media attached to the media player, call the Clear method. + + + + + Visual component to display video media files. +TMediaPlayerControl is a native control used to display video media files at design time. It is an empty control that does not show any video data. TMediaPlayerControl can be placed anywhere on a form. To set the video to be displayed, link the current TMediaPlayerControl to a TMediaPlayer through the MediaPlayer property. + + + Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. +FMX.Media.TMediaPlayerControl.AncestorVisibleChanged inherits from FMX.Controls.TControl.AncestorVisibleChanged. All content below this line refers to FMX.Controls.TControl.AncestorVisibleChanged. +Notifies its child controls that the visibility of an ancestor of your control has changed to Visible. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.ParentChanged + + + Executed right after the value of the Parent property changes. +FMX.Media.TMediaPlayerControl.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Embarcadero Technologies does not currently have any additional information. + + + Updates the currently manipulated TMedia. +Move extends the behavior inherited from TControl to update the TMedia attached to the TMediaPlayer with which the current TMediaPlayerControl is linked. + + + OnResize event dispatcher. +Resize extends the behavior inherited from TControl to update the TMedia attached to the TMediaPlayer with which the current TMediaPlayerControl is linked. + + + Renders the control's surface. +FMX.Media.TMediaPlayerControl.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +FMX.Media.TMediaPlayerControl.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Media.TMediaPlayerControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Media.TMediaPlayerControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies the TMediaPlayer to which this TMediaPlayerControl is linked. +Set MediaPlayer to link a TMediaPlayer to this TMediaPlayerControl, so the video file attached to the media player is displayed on a form. + + + + + + + + Responds when components are created or destroyed. +FMX.Media.TCustomMediaPlayerAction.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + Instantiates and initializes a TCustomMediaPlayerAction object. +Applications do not need to call Create directly. Actions are created automatically when you add them to a TActionList component using New > New Standard Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. + + + Whether Target is appropriate for the action (True) or not (False). +HandlesTarget ignores the specified Target parameter, actually. Regardless of the specified target, HandlesTarget returns True provided that: + +The platform where your application is running supports this action. +Your action does not have any event handler assigned to its OnExecute event. +You have an instance of TMediaPlayer in the MediaPlayer property of your action. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TCustomMediaPlayerAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Instance of TMediaPlayer that is target of the action. + + + + + + + + Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action: "Play". +TMediaPlayerStart calls CustomTextChanged when you change the value of the MediaPlayer property of your action, and when the action updates. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerStart.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Executes the action on the media player of the MediaPlayer property. The specified Target is ignored. + + + + + + + + Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action: "Stop". +TMediaPlayerStop calls CustomTextChanged when you change the value of the MediaPlayer property of your action, and when the action updates. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerStop.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Executes the action on the media player of the MediaPlayer property. The specified Target is ignored. + + + + + + + + Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action: "Pause" if the state of the media player is Playing, or "Play" otherwise. +TMediaPlayerPlayPause calls CustomTextChanged when you change the value of the MediaPlayer property of your action, and when the action updates. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerPlayPause.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Executes the action on the media player of the MediaPlayer property. The specified Target is ignored. + + + + + + + + Responds when components are created or destroyed. +FMX.Media.TMediaPlayerValue.Notification inherits from System.Classes.TBasicAction.Notification. All content below this line refers to System.Classes.TBasicAction.Notification. +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. + + + State of the value. +The state of the value may be any of the following: + +Normal, which is the default state. +ActionUpdating, the action is being updated. +ValueUpdating, the value is being updated. + + + This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. + + + This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. + + + Creates an instance of TMediaPlayerValue. + + + Whether Target is appropriate for the action (True) or not (False). +HandlesTarget is always False. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.Media.TMediaPlayerValue.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Instance of TMediaPlayer that is target of the value. + + + + + + + + Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. +FMX.Media.TMediaPlayerCurrentTime.CreateValueRange inherits from FMX.Media.TMediaPlayerValue.CreateValueRange. All content below this line refers to FMX.Media.TMediaPlayerValue.CreateValueRange. +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. + + See Also +FMX.StdActns.TCustomValueRangeAction +FMX.StdActns.TCustomValueRange + + + This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. +FMX.Media.TMediaPlayerCurrentTime.UpdateValueAction inherits from FMX.Media.TMediaPlayerValue.UpdateValueAction. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValueAction. +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. + + + This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. +FMX.Media.TMediaPlayerCurrentTime.UpdateValuePlayer inherits from FMX.Media.TMediaPlayerValue.UpdateValuePlayer. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValuePlayer. +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. + + + Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action, which is the current time of the media player. For example: "00:12:34". +If you define a value for CustomText, you may include time specifiers in your value, which TMediaPlayerCurrentTime replaces by actual time values based on the current time of the media player. For a list of time specifiers, see FormatDateTime. + + + + + + + + Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. +FMX.Media.TMediaPlayerVolume.CreateValueRange inherits from FMX.Media.TMediaPlayerValue.CreateValueRange. All content below this line refers to FMX.Media.TMediaPlayerValue.CreateValueRange. +Method inherited from TCustomValueRangeAction that TMediaPlayerValue implements to provide a custom instance of a TCustomValueRange subclass to hold the value range that the action handles. + + See Also +FMX.StdActns.TCustomValueRangeAction +FMX.StdActns.TCustomValueRange + + + This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. +FMX.Media.TMediaPlayerVolume.UpdateValueAction inherits from FMX.Media.TMediaPlayerValue.UpdateValueAction. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValueAction. +This virtual protected method is called when the value of the action must be updated after a change of the equivalent value in the media player. + + + This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. +FMX.Media.TMediaPlayerVolume.UpdateValuePlayer inherits from FMX.Media.TMediaPlayerValue.UpdateValuePlayer. All content below this line refers to FMX.Media.TMediaPlayerValue.UpdateValuePlayer. +This virtual protected method is called when the equivalent value in the media player must be updated after a change of the value of the action. + + + Updates the value of the Text property to be the value of the CustomText property or, if CustomText is an empty string, to be the default text of the action, which is the volume of the media player in percentage. For example: "74%". +If you define a value for CustomText, your string must be a format string ready for a single, floating-point value (f). For example: %f%%. + + + + + Represents a rectangular-shaped color indicator. +A TColorBox is a visual component represented as a rectangular-shaped optical indicator whose color can be changed programmatically by means of the Color property, or by attaching it to one of the following color selector components: + +TColorPanel +TColorQuad + + + Renders the control's surface. +FMX.Colors.TColorBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Specifies the alpha color displayed by this color box. + + + + + Represents a three-color gradient color selector. +A TColorQuad component is a color selector that displays a color spectrum drawn as a three-color gradient (black, white, and a specified color) that lets you fine-tune your color selection. TColorQuad can be attached to a TColorPicker component. + + + OnMouseMove event dispatcher. +FMX.Colors.TColorQuad.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.Colors.TColorQuad.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +FMX.Colors.TColorQuad.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Renders the control's surface. +FMX.Colors.TColorQuad.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Checks whether the point specified by local coordinates belongs to the control area. +FMX.Colors.TColorQuad.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorQuad.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorQuad.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies the alpha channel (transparency) to apply to the selected color. +Change the Alpha property to a value in the range from 0 through 1 to set the alpha channel (transparency) for the selected color. + + + Specifies the color box attached to this color quad component. +A color box is a visual component represented as a rectangular-shaped optical indicator that changes color according to the color selected in this color quad component. + + + Specifies the hue of the selected color, in HSL color coordinates. +Set or read Hue in conjunction with Sat and Lum in order to change or obtain the color selected in this color quad component. + + + Specifies the luminance of the selected color, in HSL color coordinates. +Set or read Lum in conjunction with Hue and Sat in order to change or obtain the color selected in this color quad component. + + + Specifies the saturation of the selected color, in HSL color coordinates. +Set or read Sat in conjunction with Hue and Lum in order to change or obtain the color selected in this color quad component. + + + Occurs immediately after changing the color on this color quad component. +Write an OnChange event handler to provide additional functionality when changing the color of this color quad component. + + + + + Represents a color selector that displays the entire color spectrum. +A TColorPicker component is a color selector that displays a color spectrum and lets you pick any color by moving a dot-style selector. TColorPicker can be attached to a TColorQuad component. + + + +Note: The TColorPicker (Delphi) example describes how to implement a color picker as shown in the image. +See Also +FMX.Colors.THueTrackBar +FMX.Colors.TColorQuad +TColorPicker (Delphi) + + + OnMouseMove event dispatcher. +FMX.Colors.TColorPicker.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.Colors.TColorPicker.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Getter function for the AbsoluteRect property. +FMX.Colors.TColorPicker.GetAbsoluteRect inherits from FMX.Controls.TControl.GetAbsoluteRect. All content below this line refers to FMX.Controls.TControl.GetAbsoluteRect. +Getter function for the AbsoluteRect property. + + + Forwards notification messages to all owned components. +FMX.Colors.TColorPicker.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Renders the control's surface. +FMX.Colors.TColorPicker.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Checks whether the point specified by local coordinates belongs to the control area. +FMX.Colors.TColorPicker.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorPicker.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorPicker.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies the alpha color selected in this color picker. +Color changes in respect to the variation of the Hue property. Programmatically set Hue to a specific value, or visually move the hue selector of this color picker, at run time, to obtain the color in the Color property. + + + Specifies the TColorQuad component that is attached to this color picker. +Specify a TColorQuad component that is attached to this TColorPicker. In this way, every time you change the Color in this color picker, the color quad component automatically updates to the color selected in the color picker, further allowing you to tweak the saturation and luminance. + +In the picture above, a 0.5 alpha channel TColorBox component was also attached to the TColorQuad for a complete color selection application. + + + Specifies the color, by hue, from this color picker. +Hue variates from 0 to 1 and spans the entire color spectrum drawn on this color picker. Programmatically set Hue to a specific value, or visually move the hue selector of this color picker, at run time, to obtain the color in the Color property. + + + + + Represents a gradient editor component. +A TGradientEdit component is a gradient editor that can be used to create new gradient patterns. + + + OnMouseDown event dispatcher. +FMX.Colors.TGradientEdit.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.Colors.TGradientEdit.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.Colors.TGradientEdit.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Forwards notification messages to all owned components. +FMX.Colors.TGradientEdit.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Renders the control's surface. +FMX.Colors.TGradientEdit.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TGradientEdit.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TGradientEdit.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Executes each time the selected color changes in order to update the gradient. + + + Specifies the color gradient this gradient edit component will use. +Set or get the Gradient property to a TGradient type in order to specify a new gradient pattern. + + + Specifies the location of the selector point over the spanning of the component, which is a gradient color selector. +When the CurrentPoint property changes, an OnSelectPoint event also occurs. + + + Specifies the color picker attached to this gradient editor component. +A color picker is a visual component represented as a rectangular-shaped optical indicator that permits you to select a color from the color spectrum. + + + Occurs immediately after changing the color on this component, which is a gradient color selector. +Write an OnChange event handler to provide additional functionality when changing the color of this component, which is a gradient color selector. + + + Occurs immediately after clicking over the surface of this gradient color selector. +Write an OnSelectPoint event handler to provide additional functionality when clicking over the surface of this gradient color selector component. OnSelectPoint also occurs when setting the value of the CurrentPoint property. + + + + + Represents a color selector component complete with alpha channel selection. +A TColorPanel component is a color selector that displays a color spectrum represented as a THueTrackBar, an alpha channel track bar selector, and a color quad. These make the TColorPanel component a great color selector. +A similar color selector can be found in the drop-down mode of the TComboColorBox component. + + + Getter of Observers. +FMX.Colors.TColorPanel.GetObservers inherits from System.Classes.TComponent.GetObservers. All content below this line refers to System.Classes.TComponent.GetObservers. +Getter of Observers. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected getter implementation for the Data property. +FMX.Colors.TColorPanel.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Executes every time the alpha channel track bar changes its value. + + + Executes every time the hue track bar changes its value. + + + Executes every time the color selected by this color panel changes. + + + Forwards notification messages to all owned components. +FMX.Colors.TColorPanel.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorPanel.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorPanel.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the alpha color selected by this color panel. + + + Specifies the color box attached to this color panel component. +A color box is a visual component represented as a rectangular-shaped optical indicator that changes color according to the color selected in this color panel component. + + + Specifies whether this color panel component will display the alpha channel track bar. +Set the UseAlpha property to True to make this color panel component display the alpha channel (transparency) track bar. Set UseAlpha to False to use solid non-alpha colors. +The default value for the UseAlpha property is True. + + + Occurs immediately after changing the color of this color panel component. +Write an OnChange event handler to provide additional functionality when changing the color of this color panel component. + + + + + Represents a combo box that allows you to select an alpha color from a color spectrum. +A TComboColorBox behaves like a standard TComboBox, with the difference that, while in drop-down mode, it displays a color spectrum represented as a THueTrackBar, an alpha channel track bar, a color quad, a HEX color value edit box, and a color box. These make the TComboColorBox a great color selector. + + + Protected getter implementation for the Data property. +FMX.Colors.TComboColorBox.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.Colors.TComboColorBox.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Customizes styles in complex objects. +FMX.Colors.TComboColorBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Colors.TComboColorBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Executes each time the OnPaint event appears. + + + OnMouseDown event dispatcher. +FMX.Colors.TComboColorBox.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + Executed right after the value of the Parent property changes. +FMX.Colors.TComboColorBox.ParentChanged inherits from FMX.Controls.TControl.ParentChanged. All content below this line refers to FMX.Controls.TControl.ParentChanged. +Executed right after the value of the Parent property changes. +The control does not execute ParentChanged if you assign Parent the same value that it already has. + + See Also +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.PaddingChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Executes each time the OnChange event appears. + + + Executes each time the OnChange event appears. + + + The DoValidating method validates the Text input string. +The method tries to modify the Text input string to match a color name in case the input string is not exactly the name of a color. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TComboColorBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TComboColorBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Makes this combo color box expand its color selection display. +Call DropDown in applications to make this combo color box expand its contents, allowing you to select a new color from the drop-down list. + + + Specifies the color selected by this combo color box component. +Set or get the Color property in order to specify or obtain the alpha color selected by this combo color box component. + + + Specifies whether this combo color box component will display the alpha channel track bar when in drop-down mode. +Set the UseAlpha property to True to make this combo color box display the alpha channel (transparency) track bar, when it is in drop-down mode. Set UseAlpha to False to use solid non-alpha colors. + + + Occurs immediately after changing the color selected by this combo color box. +Write an OnChange event handler to provide additional functionality when changing the color specified by this combo color box. + + + + + Represents a standard button that displays a color instead of a standard caption. +A TColorButton behaves like a standard TButton. It can even have a modal result, just like typical standard buttons. The only difference between a standard button and a TColorButton is that the latter does not display a standard text caption, but a color in a rectangle that fills almost completely the surface of the button. + + + Customizes styles in complex objects. +FMX.Colors.TColorButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.Colors.TColorButton.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Creates a new instance of TPresentedControl. +FMX.Colors.TColorButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.Colors.TColorButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Specifies the color this button will display. The Color property is of type TAlphaColor. + + + Occurs when the Color of TColorButton is changed. +The OnChange event occurs when the button Color property is changed. + + + + + Represents a combo box that allows you to select an alpha color from a color spectrum. +A TColorListBox behaves like a standard TListBox, but instead of standard text items, it displays a list of colors under the form of small colored squares, along with the color names. +The TColorComboBox component also displays this kind of list when in drop-down mode. + + + Gets the text of the selected item. +FMX.Colors.TColorListBox.GetData inherits from FMX.ListBox.TCustomListBox.GetData. All content below this line refers to FMX.ListBox.TCustomListBox.GetData. +Gets the text of the selected item. +GetData returns the text of the item that is selected in the list box or an empty string, if no item is selected. + + + Sets the text of the selected item. +FMX.Colors.TColorListBox.SetData inherits from FMX.ListBox.TCustomListBox.SetData. All content below this line refers to FMX.ListBox.TCustomListBox.SetData. +Sets the text of the selected item. +If no item is selected, nothing happens. + + + Clears the actual items in the color list box, then rebuilds the list with the color items. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Colors.TColorListBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TColorListBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Colors.TColorListBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies the alpha color that is currently selected from the list. + + + + + A TCustomComboBox is the base class for combo box components. +FMX.Colors.TCustomColorComboBox inherits from FMX.ListBox.TCustomComboBox. All content below this line refers to FMX.ListBox.TCustomComboBox. +A TCustomComboBox is the base class for combo box components. +Inherit from TCustomComboBox to create a control that represents a specialized combo box. + + + Protected getter implementation for the Data property. +FMX.Colors.TCustomColorComboBox.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.Colors.TCustomColorComboBox.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Clears the items in the color list box, then rebuilds the list with the color items. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Colors.TCustomColorComboBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Colors.TCustomColorComboBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Colors.TCustomColorComboBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Represents a combo box that allows you to select a color from a color palette. +A TColorComboBox behaves like a standard TComboBox, with the difference that, when in drop-down mode, it displays a list of colors from the standard Delphi palette that you can select. The colors appear in the drop-down list as small colored squares, along with their names. + + +Note: The number of colors in the color palette is more than can be concurrently shown in the TListBoxItem list box. You can use the scroll bar to scroll the items shown in the list box. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll colors using the mouse wheel. To enforce the scroll bar to be shown by default, you can use the code like following: +ColorComboBox1.ListBox.AniCalculations.AutoShowing := false; + + + TPersistent is the ancestor for all objects that have assignment and streaming capabilities. +TPersistent encapsulates the behavior common to all objects that can be assigned to other objects, and that can read and write their properties to and from a form file (.xfm or .dfm file). For this purpose, TPersistent introduces methods that can be overridden to: + +Define the procedure for loading and storing unpublished data to a stream. +Provide the means to assign values to properties. +Provide the means to assign the contents of one object to another. +Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects. + + + Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + Provides an interface for a method that reads and writes otherwise unpublished data. +Descendants of TPersistent override DefineProperties to designate a method for storing the object's unpublished data to a stream such as a form file. By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method. +When overriding DefineProperties, consider including some or all of the following: + +A call to the inherited method +Calls to the filer object's DefineProperty method +Calls to the filer object's DefineBinaryProperty method +DefineProperties is virtual, so descendant classes can override it as necessary but are not required to do so. + + + Returns the owner of an object. +GetOwner is used by the GetNamePath method to find the owner of a persistent object. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. As implemented in TPersistent, GetOwner returns nil (Delphi) or NULL (C++). +For TOwnedCollection, GetOwner returns the owner of the collection. For TCollectionItem collection items, GetOwner returns the collection object into which the collection item has been inserted. For TComponent, GetOwner returns the value of the Owner property. + + + Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + Returns the name of the object as it appears in the Object Inspector. +GetNamePath is for internal use only. It determines the text that the Object Inspector displays for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. Do not call GetNamePath directly. +For components, GetNamePath returns the component name. For TCollectionItem objects it returns the name of the hosting component, the name of the property, and the index into the collection surrounded by brackets. + + + + + TCollection is a container for TCollectionItem objects. +Each TCollection holds a group of TCollectionItem descendants. TCollection maintains an index of the collection items in its Items array. The Count property contains the number of items in the collection. Use the Add and Delete methods to add items to the collection and delete items from the collection. +Objects descended from TCollection can contain objects descended from TCollectionItem. Thus, for each TCollection descendant, there is a corresponding TCollectionItem descendant. +The following table lists some typical descendants of TCollection with the corresponding TCollectionItem descendant and the component that uses each pair: + + + +TCollection descendant + +TCollectionItem descendant + +Component + + + +TBitmapLinks + + + +TBitmapLink + + + +TCustomStyleObject + + + + +TAggregates + + + +TAggregate + + + +TClientDataSet + + + + +TCookieCollection + + + +TCookie + + + +TWebResponse + + + + +TCoolBands + + + +TCoolBand + + + +TCoolBar + + + + +TDBGridColumns + + + +TColumn + + + +TDBGrid + + + + +TDependencies + + + +TDependency + + + +TService + + + + +THeaderSections + + + +THeaderSection + + + +THeaderControl + + + + +TListColumns + + + +TListColumn + + + +TListView + + + + +TParams + + + +TParam + + + +many datasets + + + + +TStatusPanels + + + +TStatusPanel + + + +TStatusBar + + +The controls that use TCollection and TCollectionItem descendants have a published property that holds a collection. (For example, the Panels property of TStatusBar holds a TStatusPanels.) A standard property editor, referred to generically as the Collection editor, can be invoked from the Object Inspector to edit the items in the collection. + +Note: When writing a TCollection descendant that is used by another control, be sure to override the protected GetOwner method of the collection so that the descendant class instances can appear in the Object Inspector. +Note: TCollection has the TOwnedCollection descendant that maintains information about its owner. TOwnedCollection implements the GetOwner method. Therefore, classes derived from TOwnedCollection do not need to add anything in order to appear in the Object Inspector. + + + Warning: Added is deprecated. + + +Responds when items are added to the collection. +Applications cannot call the protected Added method. It is called automatically immediately after items are added to the collection. +Item is the item that was just added to the collection. +Added is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + + Warning: Deleting is deprecated. + + +Responds when items are deleted from the collection. +Applications cannot call the protected Deleting method. The Delete method calls Deleting immediately before it removes an item from the collection. +Item is the item that is about to be removed. +Deleting is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + + Specifies a unique ID that can be assigned to the next added collection item. +TCollection uses NextID internally to assign unique identifiers to collection items. When a new item is added to the collection, its ID property is given the value of NextID and NextID is incremented. + + + Responds when items are added to or removed from the collection. +Notify is called automatically when the items in the collection change. +Item is the item that was just added to or that is about to be removed from the collection. +Action indicates whether the item was added, is about to be extracted or is about to be deleted. +As implemented in TCollection, Notify calls Added when Action is cnAdded and calls Deleting when Action is cnDeleting. TCollection ignores the cnExtracting action. Descendant classes can override Notify to modify this behavior. + + + Returns the number of custom attributes associated with items in the collection. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. GetAttrCount returns the number of distinct attributes assigned to each item in the collection. +As implemented in TCollection, GetAttrCount always returns 0, because TCollection defines no custom attributes. + + + Returns the name of a custom attribute that can be retrieved using the GetItemAttr method. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. The GetAttr method returns the name of an attribute. +Index identifies the attribute whose name is requested. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +As implemented by TCollection, GetAttr always returns an empty string, because TCollection defines no custom attributes. + + + Returns the value of a custom attribute assigned to one of the collection's items. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and -- for each item in the collection -- a value, which is a string. GetItemAttr returns the value of one of these attributes for a specified item in the collection. +Index identifies which of the attribute's values is desired. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +ItemIndex identifies the item whose attribute value is desired. This is an index into the Items property array. +As implemented in TCollection, GetItemAttr always returns an empty string, because TCollection defines no custom attributes. + + + Responds when the collection or any of its items changes. +Changed is called automatically when items in the collection change or when the EndUpdate method signals that an update is complete. It checks the value of UpdateCount, and if it is 0, calls the Update method, which performs any necessary updates. +When writing a TCollection descendant, there is no need to call Changed. Instead, bracket any changes by calls to BeginUpdate and EndUpdate. + + + Returns a specified item in the collection. +GetItem is the protected read implementation of the Items property. + + + Copies the properties of another item to a specified item in the collection. +SetItem is the protected write implementation of the Items property. It calls the Assign method of the item specified by Index, so that the properties of the item specified by Value are copied to that item. + + + Initializes the name of a newly inserted collection item. +The Insert method calls SetItemName to initialize the Name property of items when it inserts them into the collection. +As implemented in TCollection, SetItemName does nothing. Some TCollection descendants override this method to provide collection items with default names. + + + Updates the collection to reflect changes to its items. +Override Update in a descendent class to make any necessary changes when the items in the collection change. This method is called automatically when an update is complete. +Item identifies the item that changed. If the Item parameter is nil (Delphi) or NULL (C++), then the change affects more than one item in the collection. +As implemented in TCollection, Update does nothing. Descendent classes override this method to make any necessary adjustments. + + + Specifies the name of the property that the collection implements. +The GetNamePath method uses this protected property to assemble the name of the collection as it appears in the Object Inspector. It identifies the name of the property in the object returned by the protected GetOwner method that is implemented using this collection object. + + + Counts the number of times BeginUpdate was called without a corresponding call to EndUpdate. +UpdateCount keeps track of calls to BeginUpdate and EndUpdate so that they can be nested. Every call to BeginUpdate increments UpdateCount. Every call to EndUpdate decrements it. When UpdateCount returns to 0, the collection updates itself to reflect all changes that occurred since the first call to BeginUpdate. + + + Creates and initializes a collection. +Call Create to instantiate a TCollection object at run time. Typically, TCollection descendants are created by a component that uses the collection to implement a property. +ItemClass identifies the TCollectionItem descendants that must be used to represent the items in the collection. The Add method uses this class to create items of the appropriate type. + + + Destroys the collection and each item in it. +Destroy uses the Clear method to free each item referenced in the Items array, then destroys the collection itself. + + + Returns the Owner of the collection. +Call Owner to obtain a reference to the object that owns this collection. Typically, the owner uses the collection to implement one of its properties. + + + Creates a new TCollectionItem instance and adds it to the Items array. +Call Add to create an item in the collection. The new item is placed at the end of the Items array. +Add returns the new collection item. + + + Copies the contents of the Source collection to the current object. +Use Assign to copy the contents of one TCollection instance to another. The Assign method deletes all items from the destination collection (the object where it is executed), then adds a copy of each item in the source collection's Items array. +Source is another object (typically another collection) that contains the items that replace this collection's items. + + + Signals the start of an update operation. +Call BeginUpdate before starting an operation that performs changes to TCollection. After completing all the changes, call EndUpdate to signal the end of the operation. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, the method is used to suspend screen repainting until changes to a component that involves TCollection are completed. + + + Deletes all items from the collection. +Clear empties the Items array and destroys each TCollectionItem. + + + Embarcadero Technologies does not currently have any additional information. + + + Deletes a single item from the collection. +Delete removes the specified collection item, moving up any items that come after that item in the Items property array. +Index identifies the item to delete. This is the index of the item in the Items property array. 0 specifies the first item, 1 specifies the second item, and so on. + + + Signals the end of an update operation. +Call EndUpdate after completing an operation that was preceded by a call to the BeginUpdate method. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, use EndUpdate to re-enable screen repainting that was turned off with the BeginUpdate method for the components that involve TCollection. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the item with the specified ID. +The FindItemID method returns the item in the collection whose ID property is passed to it as a parameter. If no item has the specified ID, FindItemID returns nil (Delphi) or NULL (C++). + + + Returns a TCollection enumerator. +GetEnumerator returns a TCollectionEnumerator reference, which enumerates all items in the collection. +To do so, call the TCollectionEnumerator GetCurrent method within a While MoveNext do loop. + + + Returns a string used by the Object Inspector. +If the collection has no owner, GetNamePath returns the name of the collection's actual (runtime) type. If the collection is owned, GetNamePath returns the owner's name followed, if applicable, by a dot and the name of the owner's property that holds the collection. For example, GetNamePath might return "TreeView1.Items". + +Note: For a collection to have an owner, it must override the GetOwner method. + + + Creates a new TCollectionItem instance and adds it to the Items array. +Call Insert to add a new item at a specified position in the collection. Existing items (starting from the specified position) are moved up in the Items array. +Insert returns the new collection item. + + + Provides access to the internal TList.Capacity property. +The Capacity property specifies the allocated size of the array of pointers maintained by the TList object. This value is set to the number of pointers the list will need to contain. + + + Returns the number of items in the collection. +Count contains the number of items in the Items array. Since Items is indexed starting with 0, the value of Count is always one greater than the index of the last member of Items. + + + Indicates the class to which the collection's items belong. +ItemClass is the class (descended from TCollectionItem) to which the items in the collection belong. For example, in an instance of the TCollection descendant THeaderSections, the value of the ItemClass property is THeaderSection. + + + + + TStrings is the base class for objects that represent a list of strings. +Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated. +Descendants of TStrings can represent several individual strings, such as the individual lines that appear in a list box. Some objects use descendants of TStrings to represent one long body of text so that it can be manipulated in smaller chunks. +TStrings introduces many properties and methods to: + +Add or delete strings at specified positions in the list. +Rearrange the strings in the list. +Access the string at a particular location. +Read the strings from or write the strings to a file or stream. +Associate an object with each string in the list. +Store and retrieve strings as name-value pairs. +For an explanation of name-value pairs, refer to the NameValueSeparator property. + + + Reads and writes the Strings property as if it were published. +TStrings overrides DefineProperties so that the strings in the list can be loaded and saved with a form file as if the Strings property were published. + + + Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + Returns a string given its index. +Get is the protected read implementation of the Strings property. +In TStrings Get is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the string with the specified index. + + + Returns the currently allocated size of the list of strings. +GetCapacity is the protected read implementation of the Capacity property. In TStrings, GetCapacity returns the value of the Count property. Descendants of TStrings can override this property to let a string list allocate memory for entries that have not been added to the list. + + + Returns the number of strings in the list +GetCount is the protected read implementation of the Count property. +In TStrings GetCount is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the number of strings that have been added to the list. + + + Returns the object associated with the string at a specified index. +GetObject is the protected read implementation of the Objects property. +Index is the index of the string with which the object is associated. +In TStrings, GetObject always returns nil (Delphi) or NULL (C++). This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override GetObject to return the specified object. + + + Returns the value of the Text property. +GetTextStr is the protected read implementation of the Text property. It returns a string that lists all the strings in the list, with individual strings separated by the string terminator characters LineBreak. By default, LineBreak is a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. + + + Changes the value of the string with a specified index. +Put is the protected write implementation of the Strings property. +Put changes the value of the string with the index specified by Index to S. Put does not change the object at the specified position. That is, any object associated with the previous string becomes associated with the new string. + + + Changes the object associated with the string at a specified index. +PutObject is the protected write implementation of the Objects property. +As implemented in TStrings, PutObject does nothing. This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override PutObject to change the specified object. + + + Changes the amount of memory allocated to hold strings in the list. +SetCapacity is the protected write implementation of the Capacity property. +NewCapacity is the number of strings the list can hold after the capacity has changed. +In TStrings, the SetCapacity method does nothing. Descendent classes must override this method to change the number of strings that the list can hold. + +Note: For descendent classes that implement SetCapacity, assigning a value smaller than Count removes strings from the end of the list. Assigning a value greater than Count allocates space for more strings to be added. + + + Protected setter of the Encoding property. +If Value is one of standard encoding values, SetEncoding sets the Encoding property to Value. Otherwise, SetEncoding sets the Encoding property to default. +Internally, Assign and LoadFromStream call SetEncoding. + + + Sets the Text property. +GetTextStr is the protected write implementation of the Text property. It replaces the list with the strings specified by the Value parameter. SetTextStr adds strings one at a time to the list, using the carriage returns or linefeed characters in Value as delimiters indicating when to add a new string. + + + Performs internal adjustments before or after a series of updates. +SetUpdateState is called at the beginning or end of a series of updates. When the BeginUpdate method is first called and the TStrings object is not already in the middle of an update, TStrings calls SetUpdateState internally, with Updating set to true. When the EndUpdate method is called and it cancels out the last unmatched call to BeginUpdate, TStrings calls SetUpdateState internally, with Updating set to false. +As implemented in TStrings, SetUpdateState does nothing. Descendant classes can override this method to optimize the response to updates. + + + Compares two strings. +TStrings uses CompareStrings internally to compare the values of strings that appear in the list. For example, the IndexOf and IndexOfName methods use CompareStrings to compare a specified string with the strings in the list. +S1 and S2 are the strings to compare. +CompareStrings returns a value less than 0 if S1 < S2, 0 if S1 == S2, and a value greater than 0 if S1 > S2. +As implemented in TStrings, CompareStrings uses the global AnsiCompareText function, which compares strings case insensitively. Some descendant classes override this method to change the way strings are compared (for example, to introduce case sensitivity). + + + Indicates the number of calls to BeginUpdate that have not been matched by a call to EndUpdate. +TStrings uses UpdateCount to keep track of calls to the BeginUpdate and EndUpdate methods. Every time a call is made to BeginUpdate, TStrings increments the value of UpdateCount. Every call to EndUpdate causes TStrings to decrement UpdateCount. +When UpdateCount changes from 0 to 1, TStrings calls the SetUpdateState method with a parameter of true. When UpdateCount changes from 1 to 0, TStrings calls the SetUpdateState method with a parameter of false. This allows descendant classes to perform optimizations when handling multiple updates. + + + Creates an instance of a TStrings object. +Do not call the Create method for TStrings directly. TStrings is an abstract class and its constructor should only be called as an inherited method from the constructor of a derived class. + + + Destroys the TStrings instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + Adds a string at the end of the list. +Call Add to add a string to the end of the list. Add returns the index of the new string. + + + Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + Adds a string to the list, and associates an object with the string. +Call AddObject to add a string and its associated object to the list. AddObject returns the index of the new string and object. + +Note: The TStrings object does not own the objects you add this way. Objects added to the TStrings object still exist even if the TStrings instance is destroyed. They must be explicitly destroyed by the application. + + + Adds a string to the list. +Append is the same as the Add method, except that it does not return a value. Use Append when there is no need to know the index of the string after it has been added, or with descendants of TStrings for which the index returned is not meaningful. +For example, the TStrings descendant used by memo objects uses an index to determine where to insert a string, but the inserted string does not necessarily end up as a single string in the list. Part of the inserted text may become part of the previous string, and part may be broken off into a subsequent string. The index returned by Add is not meaningful in this case. +Use Append rather than Add as a parameter for a function requiring a TGetStrProc. + + + Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + Sets the strings in the Strings array, possibly associated Objects, and some other properties of the current TStrings object, from the Source object. +Use Assign to set the properties of the TStrings object from the Source object. If Source is of the TStrings type, Assign copies the following properties: + +Strings +Objects +DefaultEncoding +Encoding +LineBreak +Delimiter +QuoteChar +NameValueSeparator +Options +If Source is not of the TStrings type, the inherited Assign will set the value of the string array from any object that supports TStrings in its AssignTo method. + + + Sets the strings from another TStrings object to the list of strings. +Use SetStrings to assign the value of the TStrings object from another TStrings object (Source). + +Note: SetStrings is similar to Assign, but Assign also copies multiple additional properties. + + + Enables the TStrings object to track when the list of strings is changing. +BeginUpdate is called automatically by any property or method that changes the list of strings. Once the changes are complete, the property or method calls EndUpdate. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + Introduces an abstract (Delphi) or pure virtual (C++) method to empty the list and any associated objects. +Descendants of TStrings implement a Clear method to delete all the strings in the list, and to remove any references to associated objects. + + + Introduces an abstract (Delphi) or pure virtual (C++) method to delete a specified string from the list. +Descendants of TStrings implement a Delete method to remove a specified string from the list. If an object is associated with the string, the reference to the object is removed as well. Index gives the position of the string, where 0 is the first string, 1 is the second string, and so on. + + + Enables the TStrings object to keep track of when the list of strings has finished changing. +EndUpdate is called automatically by any property or method that changes the list of strings. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + Compares the list of strings to the list from another TStrings object and returns true if the two lists match. +Call Equals to compare the lists in two TStrings objects. Equals compares only the strings, not any references to associated objects. Equals returns true if the lists for both TStrings objects have the same number of strings and the strings in each list match. Equals returns false if the lists are different in length, if they contain different strings, or if the order of the strings in the two lists differ. + +Note: The Equals method uses an overridden Get method to perform the compare, thus it does not provide a context-insensitive option. + + + Swaps the position of two strings in the list. +Call Exchange to rearrange the strings in the list. The strings are specified by their index values in the Index1 and Index2 parameters. Indexes are zero-based, so the first string in the list has an index value of 0, the second has an index value of 1, and so on. +If either string has an associated object, Exchange changes the position of the object as well. + + + Returns a TStrings enumerator. +GetEnumerator returns a TStringsEnumerator reference, which enumerates the strings in a TStrings object. +To process all these strings, call the TStringsEnumerator GetCurrent method within a While MoveNext do loop. + + + Allocates a text buffer and fills it with the value of the Text property. +Call GetText to obtain a dynamically allocated character buffer containing all of the strings in the list. Individual strings are separated by a carriage return (#13) on the OS X operating system, or by a carriage return and a line feed (#13#10) on Windows operating systems. The caller is responsible for freeing the returned value using the StrDispose procedure. + + + Returns the position of a string in the list. +Call IndexOf to obtain the position of the first occurrence of the S string. IndexOf is not case-sensitive; this means that the given string may differ in case from the string in the list. For example: + +String1 := MyStrings.Items.IndexOf('My First String'); + +is equivalent to + +String1 := MyStrings.Items.IndexOf('My FIRST String'); + +IndexOf returns the 0-based index of the string. Thus, if S matches the first string in the list, IndexOf returns 0, if S is the second string, IndexOf returns 1, and so on. If the string is not in the string list, IndexOf returns -1. + +Note: If the string appears in the list more than once, IndexOf returns the position of the first occurrence. + + + Returns the position of the first name-value pair with the specified name. +Call IndexOfName to locate the first occurrence of a name-value pair where the name part is equal to the Name parameter or differs only in case. IndexOfName returns the 0-based index of the string. If no string in the list has the indicated name, IndexOfName returns -1. + +Note: If there is more than one name-value pair with a name portion matching the Name parameter, IndexOfName returns the position of the first such string. + + + Returns the index of the first string in the list associated with a given object. +Call IndexOfObject to locate the first string in the list associated with the object AObject. Specify the object you want to locate as the value of the AObject parameter. IndexOfObject returns the 0-based index of the string and object. If the object is not associated with any of the strings, IndexOfObject returns -1. + + + Introduces abstract (Delphi) or pure virtual (C++) method to insert a string at a specified position. +Descendants of TStrings implement an Insert method to add the string S to the list at the position specified by Index. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. +All methods that add strings to the list use the Insert method to add the string. +If the string has an associated object, use the InsertObject method instead. + + + Inserts a string into the list at the specified position, and associates it with an object. +Call InsertObject to insert the string S into the list at the position identified by Index, and associate it with the object AObject. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. + + + Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + Changes the position of a string in the list. +Use Move to move the string at position CurIndex so that it occupies the position NewIndex. The positions are specified as 0-based indexes. For example, the following lines of code move the string in the first position to the last position: +For Delphi: + +MyStringsObject.Move(0, MyStringsObject.Count - 1); + +For C++: + +MyStringsObject->Move(0, MyStringsObject->Count - 1); + +If the string has an associated object, the object remains associated with the string in its new position. + + + Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + Sets the Text property. +Call SetText to replace the list with the strings specified by the Text parameter. SetText adds strings one at a time to the list, using the carriage returns or linefeed characters in Text as delimiters indicating when to add a new string. + + + Converts a TStrings descendant to a string array. + +Use ToStringArray to obtain an array of strings for each string in the list. + + + Returns the TObject array associated with Strings. + +Use ToObjectArray to obtain the array of TObject associated with Strings. + +Note: TStrings is an abstract class and this method has no effect. Descendent classes can associate objects with strings. +Note: The TStrings object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the TStrings object is destroyed. They must be explicitly destroyed by the application. + + + Indicates whether or not the list of strings is in the middle of an update. + + + Indicates the number of strings the TStrings object can hold. +Read Capacity to determine the currently allocated size of the string list. For the TStrings object, reading Capacity returns the Count property, and setting Capacity does nothing. Descendants of TStrings can override this property to allow a string list to allocate memory for entries that have not been added to the list. + + + Lists the strings in the TStrings object in a single comma-delimited string. +Use CommaText to get or set all the strings in the TStrings object in a single comma-delimited string. The single comma-delimited string format is also known as the system data format (SDF). +When retrieving CommaText, any string in the list that include spaces, commas or double quotes will be contained in double quotes, and any double quotes in a string will be repeated. For example, if the list contains the following strings: + +Stri,ng1 +Stri"ng2 +String 3 +String4 + +CommaText will return: + +"Stri,ng1","Stri""ng2","String 3",String4 + +When assigning CommaText, the value is parsed as SDF formatted text. For SDF format, strings are separated by commas or spaces, and optionally enclosed in double quotes. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored. For example, suppose CommaText is set to: + +"Stri,ng 1","Stri""ng 2",String 3,String4 + +The list will then contain: + +Stri,ng 1 +Stri"ng 2 +String +3 +String4 + +Note: CommaText is the same as the DelimitedText property with a delimiter of ',' and a quote character of '"'. +Including a trailing comma in the source string causes a blank item to be included in the string list. For example, if CommaText is set to + +"String1,String2,String3, " + +the string list will contain + +String1 +String2 +String3 +<Blank> + + + Introduces an abstract property to represent the number of strings in the list. +Descendants of TStrings implement a Count property to indicate the number of strings in the list. +Use the Count property when iterating over all the strings in the list, or when trying to locate the position of a string relative to the last string in the list. + + + The default encoding for the current object. +DefaultEncoding is used when the nil encoding is specified in a call to LoadFromStream or SaveToStream. +By default, DefaultEncoding is set to Default. The user can change DefaultEncoding if another default encoding is desired for LoadFromStream or SaveToStream. + + + Specifies the delimiter used by the DelimitedText property. +Use Delimiter to get or set the delimiter used by the DelimitedText property. DelimitedText represents all of the strings in the TStrings object as a single string, with individual strings separated by the character that is the value of Delimiter. +The default delimiter is represented by comma (,). + + + Represents all the strings in the TStrings object as a single delimited string. +Use DelimitedText to get or set all the strings in the TStrings object in a single string, separated by the character specified by the Delimiter property. +When retrieving DelimitedText, any string in the list that includes spaces or the delimiter and quotation marks characters specified in the Delimiter and QuoteChar properties will be surrounded (before and after) by the quotation mark character (QuoteChar). In addition, any QuoteChar character contained in an individual string will be repeated. +When retrieving DelimitedText, the resulting value delimits individual strings in two ways: each string is surrounded (before and after) by the quotation marks character specified by the QuoteChar property. In addition, individual strings are separated by the character specified by the Delimiter property. +When assigning DelimitedText, individual strings must be separated using Delimiter marks, and optionally enclosed in QuoteChar characters. +When assigning DelimitedText, the value is parsed as SDF formatted text. For SDF format, strings are separated by Delimiter characters or spaces, and optionally enclosed in QuoteChar characters. QuoteChar marks that are part of the string are repeated to distinguish them from the QuoteChar characters that surround the string. Spaces and Delimiter characters that are not contained within QuoteChar marks are delimiters. Two Delimiter characters next to each other will indicate an empty string, but spaces that appear next to another Delimiter character are ignored. +If StrictDelimiter is set to False, the space character is also interpreted as a delimiter, regardless of the value of Delimiter. This is not true when the space character occurs between quotation marks. + +Note: CommaText is the same as the DelimitedText property when Delimiter is ',' and QuoteChar is '"'. Including a trailing Delimiter in the source string causes a blank item to be included in the string list. + + + Character encoding determined during reading from a stream or file. +Encoding is a read-only property that contains the value of the character encoding detected when the LoadFromStream or LoadFromFile methods are called. If a file or stream does not contain a BOM (the encoding value cannot be detected) then Encoding is set to the value specified in the DefaultEncoding property. +Encoding is used in the SaveToStream and SaveToFile methods. + + + Defines line-break characters. +The LineBreak property is used internally in TStrings to set the string terminator characters. Set or read the LineBreak property to determine the string terminator characters in multistring output operations. +For example, the GetText method returns a long string containing all TStrings strings, each of which is terminated by the LineBreak value. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on Android, Linux, macOS and iOS it is just a line feed (#10). + + + When the list of strings includes strings that are name-value pairs or just names, + read Keys to access the name part of a string. If the string is not a name-value + pair, Keys returns full string. Assigning Keys will write new name for name-value + pair. This is in contrast to Names property. + + + Specifies the quote character used by the DelimitedText property. +Use QuoteChar to get or set the quote character that is used to enclose individual strings in the DelimitedText property. +When QuoteChar is set to the null character, then DelimitedText does the following: + +At reading, does not return quoted list items. +At assigning, does not check an assigning value for quote char. +That is, you can set QuoteChar to the null character to disable quoting in DelimitedText. To set the QuoteChar to the null character, do the following: + + +Delphi: + +MyStringList.QuoteChar := #0; + + + +C++: + +MyStringList->QuoteChar = '\0'; + + + Indicates the character used to separate names from values. +Strings that contain the NameValueSeparator character are considered name-value pairs. NameValueSeparator defaults to the equal sign (=). TStrings defines various methods for accessing names and values and for searching for specific names. +Strings that are name-value pairs consist of a name part, the separator character, and a value part. Any spaces around the separator character are part of the name or value. This convention corresponds to the format used in many initialization files. For example: + +DisplayGrid=1 +SnapToGrid=1 +GridSizeX=8 +GridSizeY=8 + + + Determines how the Delimiter property is used. +If StrictDelimiter is True, individual strings in DelimitedText are only separated by Delimiter or quoted between QuoteChar. If StrictDelimiter is False, spaces and non-printable character are also used as delimiters. + +Tip: You can set QuoteChar to the null character (#0 in Delphi, '\0' in C++) if you do not want quoted strings to be extracted as if they where surrounded by Delimiter. + + + Lists the strings in the TStrings object as a single string with the individual strings delimited by carriage returns and line feeds. +Use Text to get or set all the strings in the TStrings object in a single string delimited by carriage return, line feed pairs. +When setting Text, the value will be parsed and separated into substrings whenever the LineBreak value is encountered. For backward compatibility, on POSIX, if the LineBreak separator is LF, then LF, CR, or CRLF are treated as separators. On Windows if the LineBreak separator is CRLF, then LF, CR, or CRLF are treated as separators. +If the strings in the list contain carriage return or linefeed characters, a less ambiguous format for the strings is available through the CommaText or DelimitedText property. + + + Implements an IStringsAdapter interface for the TStrings object. + +StringsAdapter specifies the attached TStringsAdapter when it is used in OLE applications. + +Note: To create a StringsAdapter you can use GetOleStrings and SetOleStrings instead of creating an instance of TStringsAdapter. StringsAdapter is used internally with OLE applications. + + + Will cause SaveToStream and SaveToFile to write a BOM. +Set WriteBOM to True to cause SaveToStream to write a BOM (byte-order mark) to the stream and to cause SaveToFile to write a BOM to the file. + + + Determines whether to add a line Break after the last line of the Text property or not. +Use TrailingLineBreak to add a finishing line break to Text. Set TrailingLineBreak to True to add a line Break after the last line of Text. Set TrailingLineBreak to False to finish Text without a line Break. Default is True. + + + Determines the implementation that the list of strings must use for string comparison. +Set UseLocale to True to use AnsiCompareStr and AnsiCompareText to compare strings. +Set UseLocale to False to use CompareStr and CompareText. Default is True. + + + Controls a set of boolean properties of TStrings. +Use Options to specify the value of the following boolean properties of the list of strings: + + + +Option + +Property + + +soStrictDelimiter + +StrictDelimiter + + +soWriteBOM + +WriteBOM + + +soTrailingLineBreak + +TrailingLineBreak + + +soUseLocale + +UseLocale + + + + + + + + This constructor creates new string list with specified QuoteChar + and Delimiter property values. + + + This constructor creates new string list with specified QuoteChar, + Delimiter and Options property values. + + + This constructor creates new string list with specified Duplicates, + Sorted and CaseSensitive property values. + + + + + + + + SyncBuffer writes buffered and not yet written data to the file. + When ReRead is True, then buffer will be repopulated from the file. + When ReRead is False, then buffer will be emptied, so next read or + write operation will repopulate buffer. + + + FlushBuffer writes buffered and not yet written data to the file. + + + + + + + + Queue the method to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + Queue the procedure to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + Returns True if after AStartTime the specified ATimeout is passed. + When ATimeout <= 0, then timeout is inifinite and function always returns False. + + + The currently executing thread. This is the same as TThread.CurrentThread. + + + The currently executing thread. This is the same as TThread.Current. + Please use TThread.Current, which is more clear and less redundant. + + + The number of processor cores on which this application is running. This will include virtual + "Hyper-threading" cores on many modern Intel CPUs. It is ultimately based on what the underlying + operating system reports. + + + Simple Boolean property to quickly determine wether running on a single CPU based system. + + + Event handler, which is called before each Synchronize or Queue call. + + + + + + + + This field will hold the acquired exception instance raised from the execution of the async method call. + It will be re-raised in the context of the invoking thread when the corresponding EndXXXX method is called. + + + Override this method to dispatch the actual asynchronous procedure call. Descendants will use whatever context + or other state information contained in the instance to pass along to the procedure or function. + + + Override this method to perform any extra state or signaling required by the descendant. The descendant must + call this inherited method in order to properly set the completion and possibly signal the FAsyncHandle if + previously created. Failure to call this method can result in a dead lock or hang. + + + Calls the actual target asynchronous method within the context of however it is scheduled. This could be + in the context of the main or GUI thread, or within a background thread. This depends on the implementation + of a specific asynchronous BeginXXXX method call. + + + Override this method to schedule the asynchronous procedure call in the manner specific to + a given instance, component or class. By default, this will schedule the async procedure onto + the main thread or execute the procedure synchronously if already on the main thread. + Other classes may schedule the procedure call into a separate thread or thread pool. + + + This constructor must be called from a descendent protected constructor. + + + Opaque user-supplied context. This context is available via the IAsyncResult.GetAsyncContext and descendents + if this class. + + + Returns true if the operation can be cancelled. When cancelling the async operation, do any additional processing. + + + This constructor should never be called directly. Only descendents should be constructed using the + protected Create constructor above. Calling this constructor will raise an exception. + + + Cancels the async operation. Returns True when the asynchronous operation can be cancelled. + + + This method must be called prior in order to return itself as an IAsyncResult and actually schedule/invoke the + async call. + + + As long as the rules for only ever accessing this object through the IAsynsResult interface, this method + should only ever be called by a given "EndInvoke" method by casting the IAsyncResult interface instance + back to a specific descendant instance of this class. Never call this method directly outside the context + of an "EndInvoke" style method. + + + This method is called from VCL.TControl (and possibly other similar) descendants in order to call the + asynchronous procedure/function as a result of a posted Window message. + + + Set to True when the asynchronous call has been cancelled. + + + + + TComponent is the common ancestor of all component classes. +TComponent is the base class for all components. Components are persistent objects that have the following capabilities: + +IDE integration. The ability to appear on an IDE palette and be manipulated in a Form Designer. +Ownership. The ability to manage other components. If component A owns component B, then A is responsible for destroying B when A is destroyed. +Streaming and filing. Enhancements of the persistence features inherited from TPersistent. +COM support. Components can be converted into ActiveX controls or other COM objects using wizards provided with Windows products. Components can serve as wrappers for COM objects. +Note: COM features are present in all implementations of TComponent, including those provided for compatibility with OS X. However, COM features are Windows only and cannot be used in multi-device (cross-platform) applications. +TComponent does not provide any user interface or display features. These features are provided by two classes that directly descend from TComponent: + +TControl, in the FMX.Types unit, is the base class for visual components in applications built with the FireMonkey (FMX) framework. +TControl, in the Vcl.Controls unit, is the base class for visual components in Windows-only (VCL) applications. +Note: Only the FMX.Types unit and other FireMonkey-specific units can be used with OS X applications. That is, you cannot use VCL units in multi-device applications. +Components that can be visible at run time are sometimes called visual components. Other components, which are never visible at run time, are sometimes called non-visual components. However it is more common to refer to visual components as controls and non-visual components simply as components. +Do not create instances of TComponent. Use TComponent as a base class when declaring non-visual components that can appear on the component palette and be used in the Form Designer. Properties and methods of TComponent provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + + Sets the private, internal storage for the Name property to the string passed in NewName. +Do not use ChangeName directly in an application. Instead, use the Name property. + +Note: The property setter for Name -- SetName-- uses ChangeName to change the component's name. ChangeName is not virtual; do not override it. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Returns the owner of a child component being read from a stream. +GetChildOwner is used internally by the component streaming system. It is rarely necessary to call it directly. +In TComponent, GetChildOwner always returns nil (Delphi) or NULL (C++), indicating that the owner is the root component currently being read (usually a form or data module). The Owner of a component is responsible for destroying it. + + + Returns the parent or, if there is no parent, returns the owner of a child component being read from a stream. +GetChildParent is used internally in the component streaming system. It is not necessary to call it directly. +As implemented in TComponent, GetChildParent returns Self (Delphi) or this (C++). If GetChildParent returns nil (Delphi) or NULL (C++), the parent is assumed to be the root component currently being read (usually a form). + + + Returns the owner of a component. +GetOwner is called by GetNamePath to find the owner of a component. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. For TComponent, GetOwner returns the value of the Owner property. + + + Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Embarcadero Technologies does not currently have any additional information. + + + Reads the state of the component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of Observers. + + + Clears or sets csAncestor state in the component's ComponentState property. +SetAncestor is used internally in the component streaming system. It is not necessary to call it directly. +If Value is set to True, the csAncestor flag is included into the component state; otherwise, it is excluded. + + + Ensures that components inserted at design time have their design-mode flag set. +SetDesigning is used internally by the Form designer. Do not call SetDesigning directly. +SetDesigning sets the csDesigning flag in the ComponentState property if Value is True; otherwise, it removes csDesigning. +If the SetChildren parameter is True, SetDesigning then calls the SetDesigning methods of any owned components, passing Value, so that the owned components' ComponentState properties are synchronized with the owner's. +The InsertComponent and RemoveComponent methods call SetDesigning for inserted or removed components to ensure that their design-mode flags are set properly. + + + Sets the csInline bit of the component's ComponentState property. +SetInline is used internally to indicate whether the component can act as a root component in the designer but also be embedded in a form. +SetInline sets the csInline flag in the ComponentState property if Value is True; otherwise, it removes csInline. + + + Ensures that components inserted at design time have their design-mode flag set. +SetDesignInstance is used internally by the Form designer to identify objects that act as a design surface. Do not call SetDesignInstance directly. +SetDesignInstance sets the csDesignInstance flag in the ComponentState property if Value is +True; otherwise, it removes csDesignInstance. + + + Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Sets the visual ordering of a child control. +SetChildOrder is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to actually implement the ordering. TWinControl uses this ordering information to Z-align the controls. + + + Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + Sets the csUpdating state in the component's ComponentState property. +Do not call Updating directly. It is used internally to indicate that the component is about to be updated. A call to Updating, which sets the csUpdating flag, is always followed by a call to Updated, which clears the flag. + + + Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + Provides the interface for a method that adds type library and version information to the Registry on components that implement COM interfaces. +Do not call UpdateRegistry directly. It is for internal use only. + + + Ensures that renaming an owned component does not create a name conflict. +ValidateRename checks whether a component can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the Components list, ValidateRename raises an EComponentError exception. +ValidateRename is used internally when the Name property is modified. It is not necessary to call it directly. + + + Determines whether an object can be inserted into a container. +ValidateContainer is called by a component when it is about to be inserted into a container object. By default, ValidateContainer calls the ValidateInsert method of the component specified by the AComponent parameter. +Descendent components can override ValidateContainer to disallow a component from being inserted into specific containers. To disallow an insertion, raise an exception in the derived method. + + + Provides the interface for a method that validates a child component before it is inserted. +ValidateInsert does nothing in TComponent. Descendent classes can override it to disallow a component from accepting an object as a child. By default, ValidateInsert allows any object to be inserted into the component. +If a component needs to validate only certain objects, descendent classes can override ValidateInsert to filter out those objects. To disallow an insertion, raise an exception in the derived method. + + + Writes the state of the component. +WriteState is used internally in the component streaming system. It is not necessary to call it directly. +This method expects a TWriter object that is used for storing the state of the component. + + + Notifies all owned components of the owner component's imminent destruction. +The RemoveFreeNotifications method notifies all owned components of the owner component's imminent destruction. RemoveFreeNotifications is called automatically when the component is destroyed. + + + Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + Called when an application uses a component interface. +_AddRef is a basic implementation of the IInterface method, _AddRef. + +Note: If the component is a wrapper for a COM object, _AddRef calls the _AddRef method of that COM object, and returns the resulting reference count. +In all other cases, _AddRef simply returns 1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _AddRef to implement reference counting. + + + Called when an application releases a component interface. +_Release is a basic implementation of the IInterface method, _Release. +_Release returns the resulting value of the reference count for the component's interface. + +Note: In all other cases, _Release simply returns 1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _Release to implement reference counting. + + + Returns the number of type information interfaces that an object provides (either 0 or 1). +GetTypeInfoCount implements the IDispatch interface GetTypeInfoCount method. For components that support interfaces, GetTypeInfoCount calls this method for the interface supported by the component. The Count parameter points to a location that receives the number of type information interfaces provided by the object. If the object provides type information, this number is 1; otherwise the number is 0. + + + Retrieves the type information for an object. +GetTypeInfo implements the IDispatch interface GetTypeInfo method. For components that support interfaces, GetTypeInfo calls the GetTypeInfo method for the interface supported by the component, passing it the specified parameters. Use the returned value to get the type information for an interface implemented by the component. + + + Maps a single member and an optional set of argument names to a corresponding set of integer dispatch identifiers (dispIDs). +GetIDsOfNames implements the IDispatch interface GetIDsOfNames method. For components that support interfaces, GetIDsOfNames calls this method for the interface supported by the component, passing the specified parameters. The returned value can be used on subsequent calls to the Invoke method. + + + Provides access to Automation properties and methods when the component wraps an Automation object. +Invoke is the standard mechanism for accessing the exposed properties and methods of an Automation object. For components that wrap the IDispatch interface of an Automation object, Invoke calls the Invoke method for the interface supported by the component, passing it the parameters specified by the function. + + + Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. The result type corresponds to a TObject class type. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + Destroys all owned components. +DestroyComponents iterates through the components owned by the component, removing each from the list of owned components and destroying it. +It is not necessary to call DestroyComponents directly. DestroyComponents is automatically called when the component is destroyed. + + + Indicates that the component and its owned components are about to be destroyed. +Destroying sets the csDestroying flag in the ComponentState property. It then calls the Destroying method for each owned component so that its csDestroying flag is also set. If csDestroying is already set, Destroying does nothing. +It is not necessary to call Destroying directly. Destroying is automatically called when the component is destroyed. + + + Executes an action. +ExecuteAction executes an action for the component. Action is a TBasicAction or any descendant of TBasicAction. +ExecuteAction first checks whether the provided action is compatible with the component and then executes the action. The return value is a Boolean. A value of True is returned if the action was executed; otherwise, False is returned. +Derived classes can override this method to implement a distinct way of handling actions. + + + Indicates whether a given component is owned by the component. +FindComponent returns the component in the Components property array with the name that matches the string in the AName parameter. Use FindComponent to determine whether a given component is owned by another. +Component name matches are not case sensitive. + + + Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + Disables the destruction notification that was enabled by FreeNotification. +RemoveFreeNotification removes the component specified by the AComponent parameter from the internal list of objects to be notified that the component is about to be destroyed. AComponent is added to this list by a previous call to the FreeNotification method. +Most applications have no need to call RemoveFreeNotification. It is used by TComponent to detect loops where two components are notifying each other of their impending destruction. + + + Frees the interface reference for components that were created from COM classes. +FreeOnRelease is called when an interface implemented by the component is released. FreeOnRelease is used internally and calls the corresponding interface method. It should not be necessary to call FreeOnRelease directly. + + + Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + Returns a string used by the Object Inspector. +GetNamePath is used to determine the text to display in the Object Inspector for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. TComponent overrides GetNamePath to return the component's name. Do not call GetNamePath directly. + + + Verifies whether the component has a parent. +Call HasParent to determine whether a specific component has a parent. +Derived classes override this method to implement proper handling for parenting. +Use GetParentComponent to retrieve the component reference. + + + Establishes the component as the owner of a specified component. +InsertComponent adds the component passed in the AComponent parameter to the end of the Components array property. The inserted component must have no name (no specified Name property value), or the name must be unique among all others in the Components list. +When the owning component is destroyed, AComponent is also destroyed. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use InsertComponent when manually adding components to another Owner component's Components list. + + + Removes a specified component specified from the component's Components list. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use RemoveComponent to programmatically delete the component specified by AComponent from its Owner component. + + + Identifies whether the component is a subcomponent. +Call SetSubComponent to indicate whether this component is a subcomponent. A subcomponent is a component whose Owner is a component other than the form or data module in which it resides. Unless such a component calls SetSubComponent with IsSubComponent set to True, its published properties will not be saved to the form file. +IsSubComponent indicates whether the component is a subcomponent (True) or not (False). +SetSubComponent is called at design time: + +Either from the constructor of a component that always acts as a subcomponent. In this case, the component calls its own SetSubComponent method from the constructor with IsSubComponent set to True. +Or immediately after constructing an instance of the subcomponent. In this case, the Owner calls the SetSubComponent method of a component it has just instantiated, with IsSubComponent set to True. + + + Handles exceptions in methods declared using the safecall calling convention. +SafeCallException handles exceptions in methods that use the safecall calling convention. Some classes that implement interfaces override this method to handle errors that might occur. TComponent calls the implementation of this method for the interface supported by the component, if it exists. If the component does not support interfaces, this method calls the SafeCallException method inherited from TObject, which returns E_UNEXPECTED. This is a default return value that is appropriate for classes that do not support any interfaces. + + + Updates the state of an action. +UpdateAction is used to update the state of an action. Action is a TBasicAction or any descendant. +UpdateAction first checks whether the provided action is compatible with the component and then updates it. The return value is a Boolean. A value of True is returned if the action was updated, and a value of False, otherwise. +Derived classes can override this method to implement a distinct way of handling action updates. + + + Indicates whether the component implements a specified interface. +Call IsImplementorOf to determine whether the component (or, if the component aggregates its interface with other components, whether the controlling component) supports the interface specified by I. IsImplementorOf is similar to the QueryInterface method, but it can handle a request for a nil (Delphi) or NULL (C++) interface, and it does not return an interface pointer. +The streaming system that loads and saves components uses IsImplementorOf to resolve property values that are interfaces. + + + Establishes or removes internal links that cause this component to be notified when the implementer of a specified interface is destroyed. +Component writers use ReferenceInterface to ensure that properties whose values are interfaces are informed when the objects that implement those interfaces are destroyed. This notification must be in place for a property whose value is an interface to be saved with the component in a form file (that is, for such a property to persist as a published property). +I is an interface pointer that is the value of the published property of interest. +Operation indicates whether the notification link to the implementer of the interface should be established (opInsert) or removed (opRemove). +ReferenceInterface returns True if it is successful in establishing or removing the notification link. If ReferenceInterface returns False when called with Operation set to opInsert, the specified interface cannot be stored as the value of a published property. + +Note: A result of False does not necessarily indicate an error, merely that the interface cannot be stored by the property streaming system. For example, ReferenceInterface returns False when the specified interface employs true reference counting, independent of component lifetimes. + + + Specifies the interface reference implemented by the component. +Use ComObject to assign a COM interface implemented by a component to an interface reference. This property is used by components that support COM interfaces. +If the component is not a wrapper for a COM component, trying to read ComObject causes TComponent to raise an EComponentError exception. + + + Indicates the number of components owned by the component. +Use the ComponentCount property to determine the number of components owned by a component, for example, when iterating through the components list to perform an action on all owned components. The ComponentCount property equals the number of items in the components list. This value is one more than the highest Components index, because the first components index is 0. + + + Indicates the position of the component in its owner's Components property array. +Use ComponentIndex when iterating through the Components list of the component's owner to perform an action on owned components. It can be used in conjunction with ComponentCount. ComponentIndex is used internally for iterative assignment procedures. + +Note: The first component in the list has a ComponentIndex value of 0, the second has a value of 1, and so on. Therefore, when using ComponentIndex with ComponentCount, note that ComponentCount is always 1 more than the highest Components index. + + + Describes the current state of the component, indicating when a component needs to avoid certain actions. +ComponentState is a set of constants defined in the TComponentState type. +Components use the ComponentState property to detect states in which certain kinds of actions are allowed or disallowed. For example, if a component needs to avoid certain behaviors at design time that it performs at run time, it can check for the csDesigning flag. +ComponentState is read-only and its flags are set automatically when appropriate. + + + Governs the behavior of the component. +ComponentStyle governs how the component interacts with the streaming system and the Object Inspector. ComponentStyle is a read-only property. Typically, the value of the various component style flags are part of a component definition, specified in a component constructor. The one exception to this is the csSubComponent style, which can be set by calling the SetSubComponent method. + + + Contains information used by the Form designer. +DesignInfo is used internally. Do not use this property in applications. + + + Indicates the component that is responsible for streaming and freeing this component. +Use Owner to find the owner of a component. The Owner of a component is responsible for two things: +The memory for the owned component is freed when its owner's memory is freed. This means that when a form is destroyed, all the components on the form are also destroyed. +The Owner is responsible for loading and saving the published properties of its owned controls. +By default, a form owns all components that are on it. In turn, the form is owned by the application. Thus, when the application shuts down and its memory is freed, the memory for all forms (and all their owned components) is also freed. When a form is loaded into memory, it loads all of the components that are on it. +The owner of a component is determined by the parameter passed to the constructor when the component is created. For components created in the form designer, the form is automatically assigned as the Owner. + +Warning: If a component has an Owner other than a form or data module, it will not be saved or loaded with its Owner unless you identify it as a subcomponent. To identify a component as a subcomponent, call the SetSubComponent method. + + + Represents information used internally by components that support COM. +VCLComObject is for internal use only. + + + Indicates the TObservers object added to the TComponent. +Observers is a read-only property that returns the TObservers added to the TComponent, in order to use the notifications provided by the observers either with LiveBindings or for the developers' own purposes. + + + Specifies the name of the component as referenced in code. +Use Name to change the name of a component to reflect its purpose in the current application. By default, the IDE assigns sequential names based on the type of the component, such as 'Button1', 'Button2', and so on. +Use Name to refer to the component in code. + +Warning: Changing Name at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Stores a NativeInt integral value as a part of a component. +Tag has no predefined meaning. The Tag property can store any additional integer value for the convenience of developers. Often, Tag stores a pointer. A Tag value can be typecast to the appropriate pointer type. Notice that on 64-bit platforms, all pointer types are 8 bytes in size, while on 32-bit platforms, pointer types are 4 bytes. These pointer sizes correspond to sizes of NativeInt integral values on 64-bit and 32-bit platforms. + + + + + TBasicAction is the ancestor class for all action objects. +TBasicAction introduces the fundamental behavior for an action. Descendants of TBasicAction add functionality for containment in an action list, for being categorized, and for specializing their behavior tailored to particular clients such as controls or menu items. Use TBasicAction if you want to create an action for an object that is neither a menu item nor a control. + + + Generates an OnChange event. +Change is called automatically when the action's properties change. This method calls the OnChange event handler, if one is assigned. + + + Assigns an OnExecute event handler for the action and for all clients. +SetOnExecute is the property write method for the OnExecute event. +In addition to assigning the specified Value event handler to the OnExecute event, SetOnExecute propagates the assignment of this event handler to all clients linked to the action and generates an OnChange event. + + + Occurs when one of the action's properties changes. +Applications cannot use the protected OnChange event. It is used internally to manage the relationship between the properties of the action and the corresponding properties of the action's clients. +Component writers can use OnChange in descendent objects to respond when the action's properties change. + + + Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + Stores the number of elements in the Clients list of action links associated with the action. + + + Associates the action with an action link. +RegisterChanges is called when the action and action link are connected, for example, when a new action link is set to an action. Value is the action link with which the action associates itself. The link is added to the action's client list. + + + Breaks the association between the action and the action link. +UnRegisterChanges is called when the action and the action link should no longer be associated. UnRegisterChanges is called, for example, in the action destructor or when the action link is unassociated from the action. Value is the action link with which the association is broken. + + + Instantiates and initializes a TBasicAction object. +Applications do not need to instantiate TBasicAction directly. Actions are created automatically when you choose New Action in the Action List editor. +If you want to create an action at run time, you should call the Create constructor of a FireMonkey action (FMX.ActnList.TAction) or VCL action (Vcl.ActnList.TAction), or any of their subclasses. The Create constructors assign a TActionList component to the ActionList property of the created action. +Create calls the inherited constructor and then creates a list of clients of the created action. + + + Disposes of an instance of a TBasicAction object. +You do not need to call the destructor for an action. An action is a component and is automatically destroyed by its owner, which was passed to the constructor when it is created. If you must destroy an action manually, call Free instead, which safely invokes the destructor. + + + Embarcadero Technologies does not currently have any additional information. + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Introduces an interface for a method of notifying a client when the action updates itself. +UpdateTarget does nothing in TBasicAction. UpdateTarget was introduced in TBasicAction so that descendants can override it to correspondingly update a target when the action updates. + + + Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Generates an OnExecute event. +Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called, False otherwise. + + + Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Stores the client component that caused this action to execute. +Use ActionComponent to discern which client component caused this action to execute. For example, examine ActionComponent from an OnExecute event handler if you need to know what user action triggered this action. +When the user clicks a client control, that client sets ActionComponent before calling the action's Execute method. After the action executes, the action resets ActionComponent to nil (Delphi) or NULL (C++). + + + Occurs when the execute event, of a client linked to the action, fires. +Write an OnExecute event handler when you want to respond when the user triggers the client object's default event (typically an OnClick event). +For most target clients, OnExecute is associated with the OnClick event. The Click method triggers the associated Action if EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute). +OnExecute is called in the Execute method. +OnExecute also occurs when the user types the shortcut (or one of the secondary shortcuts) associated with the action or its client. + +Warning: If you assign an OnExecute event handler to a predefined action, the default behavior of that action will not occur. + + + Occurs when the application is idle or when the action list updates. +Write an OnUpdate event handler to execute centralized code while an application is idle. For example, actions may want to update enabling and disabling, or checking and unchecking of client targets. + + + + + + + + Validate inputing text. Calling before OnChangeTracking + + + This property indicates that the control is in validate value mode. See DoValidate, Change + + + Set text in model without text validation and sending notification to presenter + + + Returns caret position by specified hittest point. + + + Text control is in read-only mode + + + Defines character case for text in component + + + + + TCustomEdit is the base class from which all FireMonkey edit boxes and memo controls are derived. +TCustomEdit encapsulates the behavior common to all components for editing text by introducing methods and properties that provide: + +Basic text editing functions such as selecting text, modifying selected text, and case conversions. +Ability to respond to changes in the contents of the text. +Access control of the text for making it read-only or introducing a password character to hide the actual value. +When not in focus, TCustomEdit does not draw a selection rectangle even though the user has selected the text. You can verify whether the text is selected by using the SelText property. +Do not create instances of TCustomEdit. Use TCustomEdit as a base class when declaring control objects that permit the user to enter or modify text. Properties and methods of TCustomEdit provide basic behavior that descendant classes inherit, as well as behavior that components can override to customize their behavior. + + + Protected getter implementation for the Data property. +FMX.Edit.TCustomEdit.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.Edit.TCustomEdit.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.Edit.TCustomEdit.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Protected getter implementation for the Text property. + + + Protected setter implementation for the Text property. + + + Adds a child object to the edit control. +If AObject is a TEditButton, it is added to the buttons associated with the edit control. + + + Adds a child object at the specified index. +If the AObject is a TEditButton, it is inserted into the TCustomEdit.ButtonsContent at the specified Index. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected getter implementation for the ImeMode property. + + + Protected setter implementation for the ImeMode property. + + + Sets the value of the InputSupport property. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Edit.TCustomEdit.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Gets the default size of the control. +Returns a TSizeF with the default values of Width and Height. + + + OnResize event dispatcher. +FMX.Edit.TCustomEdit.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Realigns the edit buttons container within the edit control. + + + For internal use only. +Do not use this member. It is for internal use only. + + + For internal use only. +Do not use this member. It is for internal use only. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Sets a new value for the text settings in the TextSettingsInfo property of the TCustomEditModel. + + + Setter method for the StyledSettings property. + + + Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +StyledSettingsStored returns True when the set of styled text representation properties stored in +StyledSettings differs from the default set of styled text representation properties for this control. + + + Protected setter implementation for the KeyboardType property. + + + Protected getter implementation for the KeyboardType property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the edit control accepts any sort of input from the user. +If InputSupport is False, no interaction with the control is provided, including editing, selection and focus. + + + Returns the number of TEditButton objects associated with the edit control. + + + Returns the edit button with the specified index. +GetItem returns the TEditButton associated with the edit control, at the position specified by AIndex. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a class reference to a data model of this presented control. +FMX.Edit.TCustomEdit.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Returns the name of the default presentation proxy that your presented control uses. +FMX.Edit.TCustomEdit.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + The data model representing the data used by the presentation of the current control. +FMX.Edit.TCustomEdit.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + Creates a new instance of TPresentedControl. +FMX.Edit.TCustomEdit.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.Edit.TCustomEdit.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Removes the selected text from the edit control. +Use DeleteSelection to delete the selected text from the edit control. If no text is selected, DeleteSelection does nothing. If all the text is selected, DeleteSelection clears all the text. + + + Copies the selected text in the edit control to the Clipboard, in plain text format. +Use CopyToClipboard to replace the contents of the Clipboard with the selected text. CopyToClipboard does not clear the Clipboard if no text is selected. If no text is selected, CopyToClipboard does nothing. + + + Copies the selected text to the Clipboard, in plain text format, and then deletes the selection. +Use CutToClipboard to replace the contents of the Clipboard with the selected text while clearing the selected text. If no text is selected, CutToClipboard does nothing. + + + Pastes the plain text contents of the Clipboard text into the edit control. +Use PasteFromClipboard to paste the plain text contents held by the Clipboard into the edit control. If the Clipboard does not have a plain text content, PasteFromClipboard does nothing. PasteFromClipboard does not clear the contents of this edit control. + + + Selects all the characters of the displayed Text at once. +Equivalent to the CTRL+A key combination on Windows, or Command+A on OS X. +SelectAll does not change the current CaretPosition. + + + SelectWord assigns to the FMX.Edit.TCustomEdit.SelLength property the length of the first word found if this exists. +If several words exist in the text, the procedure SelectWord checks if the cursor position is the start position of a word. If not, it searches for the closest word from the left of cursor position. + + + Resets the selection from an edit box. +ResetSelection sets the CaretPosition property with the start position of the selection and resets the value of the SelLength property to 0. If no text is selected, the ResetSelection property does nothing. + + + Moves the cursor to the end of the text in the edit control. + + + Moves the cursor to the beginning of the text in the edit control. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns true if any selection exists in the edit box, false otherwise. +Use HasSelection in order to check if any part of the text is selected. + + + Returns the control that contains the edit buttons associated with the edit control. + + + Represents the caret of the control. +Caret is of type TCaret. + + + Provides access to the caret position in this edit control. +Use CaretPosition to determine the position of the cursor in the edit control. +CaretPosition indicates the horizontal character coordinate of the cursor, indexed from zero. +Modify the value of the CaretPosition property to change the position of the cursor within the edit control. For the cursor to be visible, the edit control must have focus. +For example, if CaretPosition is set to 4, then the cursor is at the fifth character. If the length of text in the edit control is shorter than 5, the cursor moves to the end of the string. + + + Embarcadero Technologies does not currently have any additional information. + + + Defines whether the spell-checking feature of the edit control is on or off. +This property enables spell checking on the TEdit component. When set to True a red squiggly line appears underlining the words misspelled. +The spell checking is performed by an operating system service. It is only supported on iOS and OS X. + + + Stores a TTextSettings type object keeping the default values of the text representation properties. +DefaultTextSettings is initialized in Create with the following values: + +Font.Size := 11 ; // depends on the platform +Font.Family = 'Tahoma'; // depends on the platform +Font.Style := [] ; +FontColor := TAlphaColorRec.Black; +TextAlign := TTextAlign.Leading; +VertTextAlign := TTextAlign.Center; + +The ApplyStyle method might load from a style the values of the following +DefaultTextSettings properties: FontColor, Font, +TextAlign, and VertTextAlign. + + + Specifies the font to use when rendering the text. +Set Font to specify the font to use when rendering the text. To change to a new font, specify a new TFont object. To modify a font, change the value of the Family, Size, or Style of the TFont object. + + + Specifies the color of the text in the edit control. + + + Specifies which characters are allowed to be typed into this edit control. +The FilterChar property specifies a string containing individual characters that are allowed to be typed into this edit control. +For instance, if you set FilterChar to '123abc', then only the a, b, and c letters and the 1, 2, and 3 numerals are allowed to be typed into this edit control. All other characters are ignored. However, note that the uppercase version of a, b, and c are not allowed by this filter string. If you want to add uppercase variants, then FilterChar should be set to '123abcABC'. +To allow for all characters, set FilterChar to an empty string (''). + + + For internal use only. +Do not use this member. It is for internal use only. + + + Determines the type of the virtual keyboard. +Set KeyboardType to determine the type of virtual keyboard this edit is to use. Possible values for the KeyboardType property are Alphabet, Default, EmailAddress, NamePhonePad, and so on (values are selectable in the Object Inspector and are described in FMX.Types.TVirtualKeyboardType). +Keyboard types are illustrated in the Mobile Tutorial: Using the Web Browser Component (iOS and Android). + +Note: On Android, the Alphabet keyboard type has no word completion or word suggestions. The keyboard looks the same as the Default keyboard, but without suggestions. + + + Specifies whether to hide the virtual keyboard by clicking the Return key. +When KillFocusByReturn is True, clicking the Return key hides the virtual keyboard. + + + Specifies the maximum length of the text entered in this edit control. +Set the MaxLength property in order to limit the maximum length of the text held by this edit control. For instance, if you want to be able to input strings of maximum 5 characters, set MaxLength to 5. +Note that setting MaxLength to a value lower than the length of the actual display text does not affect the display. It only limits the number of characters while typing. + + + Specifies whether this edit control shows its characters or not. +Set the Password property to True to make this edit control hide its characters for password-like input. Set Password to False to make this edit control show all its characters. + + + Determines whether you can change the text of this edit control. +To prevent the contents of the edit control from being edited, set the ReadOnly property to True. Set ReadOnly to False to allow the contents of the edit control to be edited. +Setting ReadOnly to True ensures that the text is not altered, while still allowing you to select text. The selected text can then be manipulated by the application, or copied to the Clipboard. + + + Indicates the type of action that the edit control performs when you are editing the text of the control and you press the return key on the virtual keyboard. The run-time platform uses this value to determine the type of return button that it displays on the virtual keyboard for the edit control. +The value of ReturnKeyType does not affect the actual action that the edit control performs when you press the return key. To define that action, use the OnKeyUp event. + +Platform Support +This property only has effect on Android and iOS. + + + Keeps final values of text representation properties. These values are really used to draw texts in a control. +ResultingTextSettings keeps a TTextSettings object that manages the final values of the text representation properties. These values are really used to draw texts in a control. +To obtain values stored in ResultingTextSettings, a control uses the StyledSettings property. For example, if StyledSettings contains the TStyledSetting.Family value, then the TFont.Family value is taken from the DefaultTextSettings. (That is the font family name defined in the loaded style is used. The font family name defined by the programmer in the Object Editor is ignored.) Oppositely, if StyledSettings does not contain TStyledSetting.Family, then the font family name defined by the programmer in the Object Editor is used and the font family name defined in the loaded style is ignored. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +RecalculateTextSettings updates the ResultingTextSettings. + + + Specifies the color and pattern used to fill the font of the selected text or to stroke the outline of it. +Read the SelectionFill property to get a TBrush object with the color and pattern used to fill the font of selected text displayed, or to stroke the outline of it. + + + Specifies the position of the first selected character in the text. +Read SelStart to determine the position of the first selected character, where 0 indicates the first character. If there is no selected text, SelStart indicates the position of the cursor. Set SelStart to remove the current selection and to position the cursor just before the indicated character. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. + + + Specifies the number of characters that are selected. +Read SelLength to determine the length, in bytes, of the selected text. This is the same as the number of characters, unless you are using a multibyte character set. Set SelLength to change the selection to consist of the first SelLength bytes starting at SelStart. + +Tip: Setting SelLength to a value greater than the number of characters from SelStart to the end of the text results in the selection of all characters from SelStart to the end of the text. Reading SelLength immediately after setting it to a value greater than the number of available characters returns the number of characters actually selected, not the value that was just set. + + + Specifies the selected portion of the edit control's text. +Read SelText to determine the value of the selected text. Set SelText to replace the selected text with a new string. If there is no selection, but the edit control has focus, set SelText to insert a new string into the text, at the cursor. + + + Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Contains the text displayed by this edit control. +Use the Text property to read the text of this edit control or to specify a new string to be displayed. + + + Specifies how the text will be displayed in terms of horizontal alignment. +The TextAlign property specifies how this edit control displays the text in terms of horizontal alignment. TextAlign can have one of the following, defined in TTextAlign, values: + +Center (default) aligns the text at the middle of the edit control. +Leading aligns the text at the leftmost position inside the edit control. +Trailing aligns the text at the rightmost position inside the edit control. +When you use text representation properties stored in ITextSettings.TextSettings, remember that TextAlign corresponds to HorzAlign. + + + Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + A hint or message to be displayed when the Text property is empty. +Use TextPrompt to cue the user about the kind of entry that is expected in the text field. The TextPrompt is grayed (like a watermark), cannot be scrolled at run time, and is cleared from the entry field as soon as the user begins to type into the edit field. +The following image contains a design-time preview of setting the TextPrompt property: + + + Specifies whether the user is typing something in this edit control. +The Typing property is True if the user is typing something into this edit control, False otherwise. +When any printable character is typed, the Typing property is set to True. A printable character is any character that is not a control character. +When the ENTER key is pressed, the Typing property is set to False. + + + Specifies how the text will be displayed in terms of vertical alignment. +The VertTextAlign property specifies how the TCustomEdit control displays the text in terms of vertical alignment. VertTextAlign can have one of the following values (defined in TTextAlign): + +Center (default)--aligns the text on a vertical axis, at the middle of the TCustomEdit object. +Leading--aligns the text on a vertical axis, at the topmost position inside the TCustomEdit object. +Trailing--aligns the text on a vertical axis, at the bottommost position inside the TCustomEdit object. +When you use text representation properties stored in ITextSettings.TextSettings, remember that VertTextAlign corresponds to VertAlign. + + + It defines whether to implement the UPPER or lower case conversion to the memo's text. + + + Occurs when the text for the edit control may have changed. +Write an OnChange event handler to take specific action whenever the text for the edit control may have changed. The Text property of the edit control will already have been updated to reflect any changes. + +Tip: OnChange does not occur after individual characters have been typed, but only after the user presses the ENTER key or the focus leaves the control. An event that responds to individual character changes is OnChangeTracking. + + + Occurs when typing individual characters into the edit control. +Write an OnChangeTracking event handler to take specific action whenever you set the text for the edit control or type individual characters in it. The Text property of the edit control will already have been updated to reflect any changes. This event provides the first opportunity to respond to modifications the user brought to the text of the edit control. + +Tip: There is also an OnChange event that does not occur after individual characters have been typed, but only after the user presses the ENTER key or the focus leaves the control. For responding to individual character changes, use only the OnChangeTracking event. + + + Occurs when you are typing into this edit control. +Write an OnTyping event handler to take specific action whenever you type into this edit control. While you type in characters, the Typing property is also set to True. + + + Occurs when you are entering symbols or when focus shifts away from this edit control. +Write an OnValidating event handler to immediately validate any edits while the user is entering information into the edit control. The OnValidating event handler can verify the supplied text and, if it is not acceptable, return an error or warning message. + +Example +To clarify, consider the following scenario: an application provides a text edit box designed to enter an email address. If the user enters the blank character or the "@." substring, the OnValidating event handler displays the exclamation icon next to the edit control. This icon informs the user that the current symbols are not acceptable for the email address. + + +Note: Initially, the exclamation icon is invisible. The OnValidating event handler sets the TImage.Visible property to True, if an input error occurs. + + + +For this scenario, you can implement the following OnValidating event handlers: + + +Delphi: + +procedure TForm1.Edit1Validating(Sender: TObject; var Text: string); +begin + Image1.Visible := Text.Contains(' ') or Text.Contains('@.'); +end; + + + +C++Builder: + +void __fastcall TForm1::Edit1Validating(TObject *Sender, UnicodeString &Text) { + Image1->Visible = ContainsStr(Text, " ") || ContainsStr(Text, "@."); +} + + + +Note: To process the user's input, these code snippets use: + +For C++Builder: the System.StrUtils.ContainsStr routine. +For Delphi: the System.SysUtils.TStringHelper.Contains methode. + + + Occurs after the user presses the ENTER key or the focus leaves the control. + +Write an OnValidate event handler to validate any edits the user enters in the edit control before the text has changed. +The OnValidate event handler can verify the supplied text and, if it is not acceptable, return an error or warning message. + +Code Snippets +To clarify, consider the following scenario: an application provides a text edit box designed to enter a user email address from the mycompany.com domain, such as John.Doe@mycompany.com. If the user enters a text that does not end with the "mydomain.com" substring, the application displays an error message in the edit control. +In this scenario, you can implement the following OnValidate event handlers: + + +Delphi: + +procedure TForm1.Edit1Validate(Sender: TObject; var Text: string); +begin + if not EndsText('mycompany.com', Text) then + Text := 'Invalid email!' +end; + + + +C++Builder: + +void __fastcall TForm1::Edit1Validate(TObject *Sender, UnicodeString &Text) +{ + if (!EndsText("mycompany.com", Text)) { Text = "Invalid email!"; + + } +} + + + +Note: These code snippets use the System.StrUtils.EndsText routine. + + + + + General-purpose FireMonkey edit box. +TEdit extends the functionality of TCustomEdit by publishing a set of properties to the Object Inspector so you can customize the look and feel of this edit box. +For using TEdit in a Metro application, see +Creating Metropolis UI Edit Buttons with Embedded Glyphs. +When not in focus, TEdit does not draw a selection rectangle even though the user has selected the text. You can verify whether the text is selected by using the SelText property. + +Note: For a multiline edit control, use FMX.Memo.TMemo. + + + Maxmimum length of text that can be input in the edit field. + + + Defines characters which can be input in the edit field. All characters not in FilterChar will be + ignored. Empty FilterChar value means no filtering. + + + + + + + + List of published properties used in streaming + + + Target's names that used in style file + + + Platform's names that used at framework + + + Allows to check style for fitting for specified Platform + + + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + This method tries to parse the style file and read the style description. +The TStyleDescription object specified by Description should be destroyed by the caller. + + + Loads a style from the specified file. +LoadFromFile returns a style object that can be set as the active style using the SetStyle method. +Note that LoadFromFile does not automatically switch to the loaded style. To do that, call the SetStyleFromFile method. + + + Loads a style from the specified stream. +LoadFromStream returns a style object that can be set as the active style using the SetStyle method. +Note that LoadFromStream does not automatically switch to the loaded style. To do that, call the SetStyleFromFile method. + + + Loads a style from the specified resource. +LoadFromResource returns a style object that can be set as the active style using the SetStyle method. +Note that LoadFromResource does not automatically switch to the loaded style. To do that, call the SetStyleFromFile method. + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResourceType + +A string that identifies the type of resource. + + + Loads a style from the specified file without raising an exception. +CanLoadFromFile searches for the style specified by FileName. +CanLoadFromFile returns True if the style is successfully loaded, and False otherwise. + + + Loads a style from the specified stream without raising an exception. +CanLoadFromStream searches for the style specified by AStream. +CanLoadFromStream returns True if the style is successfully loaded, and False otherwise. + + + Loads a style from the specified resource without raising an exception. +In the first signature CanLoadFromResource searches for the specified ResourceName with type ResourceType in the instace handle indicated by Instance. +In the second signature CanLoadFromResource internally calls EnumModules in order to search for ResourceName in all modules of the application. +CanLoadFromResource returns True if the style is successfully loaded, and False otherwise. + + + Loads a style from the specified resource without raising an exception. +In the first signature CanLoadFromResource searches for the specified ResourceName with type ResourceType in the instace handle indicated by Instance. +In the second signature CanLoadFromResource internally calls EnumModules in order to search for ResourceName in all modules of the application. +CanLoadFromResource returns True if the style is successfully loaded, and False otherwise. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TStyleManager handles styles-related operations. +Use TStyleManager to: + +Set and retrieve the active style. +Load styles from files or streams. + + + Removes the specified Style from the pool of styles. + + + Updates the style for all the registered scenes. + + + Enumetates all the registered style resource objects. + + + Gets the style resource object. +GetStyleResource returns the style resource if it exits in cache. Otherwise it loads the style resource. +ResourceName specifies the style resource as per name. + + + Registers the style resource for the specified platform. + +ResourceName specifies the resource style. +APlatform specifies the target platform. + + + Registers the style resource specified by selection. + +APlatform specifies the target platform. +ASelection specifies the style selection with type TPlatformStyleSelectionProc. + + + Returns the style that is currently set. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the active style to the instance specified by the Style parameter. +To set the active style to the native system style, for example Windows theme, pass nil as the Style parameter. + +Note: If you call the SetStyle function in the initialization section of a unit on the main project file, before Application.Initialize, then it is applied to all forms. + + + Sets the active style to the instance specified by the Style parameter. +To set the active style to the native system style, for example Windows theme, pass nil as the Style parameter. + +Note: If you call the SetStyle function in the initialization section of a unit on the main project file, before Application.Initialize, then it is applied to all forms. + + + Sets the style specified by FileName as the active style. +Do not place multiple lines calling SetStyleFromFile in a project, because you can have only one active style in the style manager. +You can call SetStyleFromFile either in the project source code (before calling Application.Initialize) or in the initialization section of one of the form units: + +If you call SetStyleFromFile in a form, the style is reapplied. +If you call SetStyleFromFile before the form is created, the custom style fully replaces the platform style. +Example +This Delphi code demonstrates how to use the StyleManager: + + +Delphi: + +procedure TForm1.FormCreate(Sender: TObject); + var + od : TOpenDialog; + begin + od := nil; + try + od := TOpenDialog.Create(self); + od.Filter := 'Style Files|*.style'; + if od.Execute() then + TStyleManager.SetStyleFromFile(od.FileName); + finally + od.Free(); + end; +end; + + + Sets the style specified by FileName as the active style. +Do not place multiple lines calling SetStyleFromFile in a project, because you can have only one active style in the style manager. +You can call SetStyleFromFile either in the project source code (before calling Application.Initialize) or in the initialization section of one of the form units: + +If you call SetStyleFromFile in a form, the style is reapplied. +If you call SetStyleFromFile before the form is created, the custom style fully replaces the platform style. +Example +This Delphi code demonstrates how to use the StyleManager: + + +Delphi: + +procedure TForm1.FormCreate(Sender: TObject); + var + od : TOpenDialog; + begin + od := nil; + try + od := TOpenDialog.Create(self); + od.Filter := 'Style Files|*.style'; + if od.Execute() then + TStyleManager.SetStyleFromFile(od.FileName); + finally + od.Free(); + end; +end; + + + Loads the style from ResourceName and sets the style as the active style. +TrySetStyleFromResource sets the style without raising exceptions. + + + Uninitializes data about styles. + +Note: This function is reserved for internal use only. Do not call it directly. + + + Returns the style description of the specified style. +FindStyleDescriptor returns the TStyleDescription object associated with the style specified by AObject, if such a description is set. +You can set the style description fields using the Tools > Bitmap Style Designer dialog. + + + Embarcadero Technologies does not currently have any additional information. + + + + + The base class for 2D graphic primitives--TLines, TRectangles, TPaths, and others. All these primitives inherit TControl and can be used in styles to construct controls. +TShape is the ancestor class to most other classes defined in the Objects unit. It defines the common behavior--methods and properties--for 2D graphic primitives. TShape objects cannot be used as stand-alone 2D components. + + + Calls the inherited Painting method, which calls the event handler of the OnPainting event. Then Painting initializes the fill and stroke properties of the current canvas. +Painting initializes the Fill and Stroke properties of the current canvas with values defined for the proper properties of the shape object. + + + Forces the shape to repaint its image on the screen. +FillChanged is the event handler of the FMX.Graphics.TBrush.OnChanged event of the Fill property. + + + Forces the shape to repaint its image on the screen. +StrokeChanged is the event handler of the FMX.Graphics.TBrush.OnChanged event of the Stroke property. + + + Retrieves the ShapeRect rectangle for drawing the shape. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates an instance of TShape with the specified component as owner. + + + Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + Determines the color and pattern used to fill the shape background. +The value of Fill is an FMX.Graphics.TBrush object. It can define the gradient, brush pattern, brush color, opacity, and other parameters to fill the shape background. + + + Determines the color and pattern of the drawing pen used to draw lines and shape contours of the graphical primitives. +The value of Stroke is an FMX.Graphics.TStrokeBrush object. To customize the outline pen, change the Thickness, Cap, Dash, and Join properties of the TStrokeBrush object. + + + Specifies the rectangle for drawing the shape. +The coordinates of the upper-left corner of the rectangle are (0,0), and the coordinates of the lower-right corner are (Width, Height). + + + + + TLine defines 2D lines. It inherits TControl and can be used in styles to construct controls. +The end points of the line to draw are defined by the following properties of the TLine object: + +The shape rectangle and the LineType define the straight-line segment to draw: +LineType defines the orientation of the line segment. +The intersection points of this line segment with the local rectangle define the end points of the straight-line segment. +RotationCenter defines the rotation axis and RotationAngle defines the rotation angle on which the straight-line segment is rotated to obtain the line to draw. +Note: Scaling not only scales the line length proportionally to scaling the factors. It also changes the thickness of the stroke that draws the line. That change is proportional to the scaling factor for each axis. +The parent TControl draws TLine with the Paint method. +To draw TLine, the Paint method uses the drawing pen with the Stroke property defined for the TLine object. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns True if the control rect is empty. +FMX.Objects.TLine.IsControlRectEmpty inherits from FMX.Controls.TControl.IsControlRectEmpty. All content below this line refers to FMX.Controls.TControl.IsControlRectEmpty. +Returns True if the control rect is empty. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TLine.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Renders the control's surface. +FMX.Objects.TLine.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Specifes the way a line is drawn. +The available values are: + +Boundary: Default. If you increase the thickness of a Boundary line, the line grows inside and outside of the control symmetrically. The central point of the growth depends on the TLineType. If TLineType is Diagonal, the line goes from the top-left corner to the bottom-right corner. If the thickness of the line is greater than the size of the control, a Boundary line may grow beyond the control. +Inner: If you increase the thickness of an Inner line, the line grows inside the control. If the thickness of the line is greater than the size of the control, an Inner line may grow beyond the control. +InnerWithin: If you increase the thickness of an InnerWithin line, the line grows inside the control. The thickness of an InnerWithin line is limited by the size of the control (it never grows beyond the control). + + + Specifies how to place the line inside the shape rectangle. +The LineType value should be one of the constants defined in the TLineType type: Diagonal, Top, or Left. +The default is Diagonal. +The TLineType type defines the following constants: + + + +Constant + +Meaning + + + +Diagonal + + + + Draw the line as the diagonal of the shape rectangle. + + + + +Top + + + + Draw the line as the top side (width) of the shape rectangle. + + + + +Bottom + + + + Draw the line as the bottom side (width) of the shape rectangle. + + + + +Left + + + + Draw the line as the left side (height) of the shape rectangle. + + + + +Right + + + + Draw the line as the right side (height) of the shape rectangle. + + + Indicates whether to shorten the line. +If True, the width of the line is reduced symmetrically by half of the thickness, while the value of Width stays the same. + + + + + TRectangle defines 2D rectangles with customized corners. It inherits TControl and can be used in styles to construct controls. +The CornerType, XRadius, and YRadius properties define how to customize shapes of rectangle corners: + + +Corners specifies which corners to be customized. +Notice that, if Corners is an empty set or any of the XRadius or YRadius properties is zero, then no corner shape customization is used. +The rectangle size and position are defined by the following properties of the TRectangle object: + +The shape rectangle ShapeRect defines the initial size and position of the rectangle. +You can use the rotation axis RotationCenter and rotation angle RotationAngle of the TRectangle object to rotate and move the rectangle. +You can use the scaling factors of the TRectangle object to proportionally scale rectangle coordinates along local coordinate axes. Scaling moves the rectangle and changes its size. +Note: Scaling not only scales the shape of an object proportionally to the scaling factors. It also changes the thickness of the stroke that draws the contour proportionally to the scaling factor for each axis. +TRectangle draws the contour and fills the background with the Paint method. Paint uses the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties. + + + Setter for the XRadius property. + + + Setter for the YRadius property. + + + Setter for the Corners property. +Value is a set of constants defined in TCorner: TopLeft, TopRight, BottomLeft, and BottomRight. + + + Setter for the CornerType property. +Value should be one of the constants defined in TCornerType: Round, Bevel, InnerRound, and InnerLine. + + + Setter for the Sides property. +Value is a set of constants defined in TSide: Top, Left, Bottom, and Right. + + + Renders the control's surface. +FMX.Objects.TRectangle.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TRectangle.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Specifies shapes of which corners in the TRectangle rectangle object are customized according to the CornerType, XRadius, and YRadius properties. +By default, all four corners are customized. +Corners can contain a set of constants defined in the TCorner type: TopLeft, TopRight, BottomLeft, and BottomRight. Use the AllCorners constant to select all corners. +If Corners is an empty set or any of the XRadius and YRadius properties is zero, then no corner shape customization is used. + + + Specifies the type of the corner shape's customization in the rectangle. +Values of CornerType are defined in TCornerType. These Round, Bevel, InnerRound, and InnerLine values define the following types of corner shape customizations: + + +CornerType applies to corners specified in the Corners set. +XRadius and YRadius specify the distance from a corner to the start point of the corner shape customization, on the horizontal and vertical sides. + +Note: If Corners is an empty set or any of the XRadius and YRadius properties is zero, then no corner shape customization is used. + + + Specifies which sides of the TRectangle rectangle to display. +A side is a rectangle boundary between two adjacent corners or end points of corner customizations. End points of corner customizations are defined by XRadius and YRadius. A corner customization applies to corners included into the Corners set. +By default, all sides of the rectangle are displayed. +Sides can contain a set of constants defined in TSide: Top, Left, Bottom, and Right. +Use the AllSides constant to select all sides. +If Sides is empty, then no side is displayed. + + + Specifies the distance from a corner to the start point of the corner shape customization, on the horizontal sides of TRectangle. +During design time, the maximum possible value of XRadius is limited by the half of the smallest side. +If XRadius=0, then no corner shape customization is used. + + + Specifies the distance from a corner to the start point of the corner shape customization, on the vertical sides of TRectangle. +During design time, the maximum possible value of YRadius is limited by the half of the smallest side. +If YRadius=0, then no corner shape customization is used. + + + + + TCaretRectangle is a TRectangle descendant that can additionally hold caret (cursor) information. + + + Forwards notification messages to all owned components. +FMX.Objects.TCaretRectangle.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Represents the default width for the caret of this TCaretRectangle. + + + Represents the default color of the caret. +Use DefaultColor to retrieve the default color for the caret of this TCaretRectangle. + + + Specifies whether the caret color of this TCaretRectangle is specified. +This information is retrieved from the system information. + + + Represents the default interval of time, in milliseconds, at which the caret flashes. +The default interval of time is 500 milliseconds. + + + Getter of DefaultSize. +FMX.Objects.TCaretRectangle.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TCaretRectangle.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Destroys the object instance and frees its memory. +FMX.Objects.TCaretRectangle.Destroy inherits from FMX.Objects.TShape.Destroy. All content below this line refers to FMX.Objects.TShape.Destroy. +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + Updates the state of this TCaretRectangle. + + + Caret is a TCustomCaret that describes the caret of this TCaretRectangle. + + + + + TRoundRect defines 2D rectangles with rounded corners. It inherits TControl and can be used in styles to construct controls. +The rectangle size and position are defined by the bounding rectangle of the TRoundRect object. You can use the scaling factors Scale of the TRoundRect object to proportionally change rectangle coordinates along local coordinate axes. This will move the rectangle and change its shape. The rotation axis RotationCenter and rotation angle RotationAngle of the TRoundRect object can be used to rotate the rectangle. + +Note: Scaling not only scales the shape of an object proportionally to the scaling factors. It also changes the thickness of the stroke that draws the contour proportionally to the scaling factor for each axis. +The Corners property defines which rectangle corners are to be rounded. The Radius of the rounding is defined by the following formula: + +Radius := Min(RectHeight(GetShapeRect),RectWidth(GetShapeRect)) / 2; + +TRoundRect draws the contour and fills the shape background with the Paint method. +Paint draws the contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TRoundRect object. + + + Setter for the Corners property. +Value is a set of constants defined in TCorner: TopLeft, TopRight, BottomLeft, and BottomRight. + + + Renders the control's surface. +FMX.Objects.TRoundRect.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TRoundRect.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Specifies which corners in the TRoundRect object are to be rounded. +The rounding radius is equal to the half of the smallest side. +By default, all four corners are rounded. +Corners is a set of TCorner values that specify which of the corners are rounded. +If Corners is an empty set, then no corner is rounded. +Use the AllCorners constant to select all corners. + + + + + A rectangle with a triangular "peak" on one of four sides, used primarily to render a TCalloutPanel. +Because TCalloutRectangle inherits from TRectangle, TCalloutRectangle provides all the properties (Corners, CornerType, Sides, XRadius, YRadius, and others) and methods to define the shape of the rectangle itself. +A call-out often takes the form of a pull-quote, in which a particular snippet of text in a document is duplicated to attract attention: in a larger size, with a different typeface, in a colored box, with stylized quote marks, and so on. With illustrations, boxed text will refer to different elements of interest, and each box will be drawn with extra lines that point to its element. +TCalloutRectangle is a rectangle with an isosceles triangle on one of its four sides, used to point at something else. The triangle is included in the bounding rectangle of the object: the longer its length, the shorter the rectangle shape will be, and vice versa. Keeping the rectangle the same size while changing the length of the triangle requires changing the height or width of the object, depending on which side the triangle appears. + + + Embarcadero Technologies does not currently have any additional information. + + + Setter for the XRadius property. +FMX.Objects.TCalloutRectangle.SetXRadius inherits from FMX.Objects.TRectangle.SetXRadius. All content below this line refers to FMX.Objects.TRectangle.SetXRadius. +Setter for the XRadius property. + + + Setter for the YRadius property. +FMX.Objects.TCalloutRectangle.SetYRadius inherits from FMX.Objects.TRectangle.SetYRadius. All content below this line refers to FMX.Objects.TRectangle.SetYRadius. +Setter for the YRadius property. + + + Setter for the Corners property. +FMX.Objects.TCalloutRectangle.SetCorners inherits from FMX.Objects.TRectangle.SetCorners. All content below this line refers to FMX.Objects.TRectangle.SetCorners. +Setter for the Corners property. +Value is a set of constants defined in TCorner: TopLeft, TopRight, BottomLeft, and BottomRight. + + + Setter for the CornerType property. +FMX.Objects.TCalloutRectangle.SetCornerType inherits from FMX.Objects.TRectangle.SetCornerType. All content below this line refers to FMX.Objects.TRectangle.SetCornerType. +Setter for the CornerType property. +Value should be one of the constants defined in TCornerType: Round, Bevel, InnerRound, and InnerLine. + + + Setter for the Sides property. +FMX.Objects.TCalloutRectangle.SetSides inherits from FMX.Objects.TRectangle.SetSides. All content below this line refers to FMX.Objects.TRectangle.SetSides. +Setter for the Sides property. +Value is a set of constants defined in TSide: Top, Left, Bottom, and Right. + + + OnResize event dispatcher. +FMX.Objects.TCalloutRectangle.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Initializes the component after the form file has been read into memory. +FMX.Objects.TCalloutRectangle.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Generates the contour of TCalloutRectangle. +CreatePath uses parameters of the current TCalloutRectangle object to generate a series of connected curves and lines (in the FMX.Graphics.TPathData type) that form the TCalloutRectangle contour to draw. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the control's surface. +FMX.Objects.TCalloutRectangle.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TCalloutRectangle.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Destroys the object instance and frees its memory. +FMX.Objects.TCalloutRectangle.Destroy inherits from FMX.Objects.TShape.Destroy. All content below this line refers to FMX.Objects.TShape.Destroy. +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + The width of the callout pointer. +TCalloutRectangle renders its callout pointer as an isosceles triangle on one of its sides. +CalloutWidth is the length of the base of the triangle. + + + The length of the callout pointer. +TCalloutRectangle renders the callout pointer as an isosceles triangle on one of its sides. CalloutLength is the height of this triangle. The triangle is included in the bounding rectangle ShapeRect of the TCalloutRectangle object; therefore, the longer CalloutLength is, the smaller the height (or width) of the callout rectangle itself is, and vice versa. Keeping the bounding rectangle the same size while changing the length of the triangle CalloutLength requires changing the height or width of the callout rectangle TCalloutRectangle itself, depending on which side the triangle appears. + + + Specifies the side of the rectangle where the callout pointer appears. +TCalloutRectangle renders its callout pointer as an isosceles triangle on one of its four sides. +Set CalloutPosition to one of the Top, Left, Bottom, or Right constants predefined in TCalloutPosition to define the side on which the callout pointer should appear. +By default, the callout pointer appears on the top side CalloutPosition = Top. + + + The position of the callout pointer, relative to the center or edges of the side on which it appears. +TCalloutRectangle renders the callout pointer as an isosceles triangle on one of its sides. The CalloutPosition defines the side on which the triangle appears. +CalloutOffset is the triangle offset implemented according to the following conditions: + +If CalloutOffset is zero, then the triangle is centered on the specified side. +If CalloutOffset is positive, then the closest point of the callout pointer to a corner of the triangle has the CalloutOffset offset on the following sides: +Top--offset to the right from the upper-left corner. +Left--offset to the bottom from the upper-left corner. +Right--offset to the bottom from the upper-right corner. +Bottom--offset to the right from the lower-left corner. +If CalloutOffset is negative, then the closest point of the callout pointer to a corner of the triangle has the CalloutOffset offset on the following sides: +Top--offset to the left from the upper-right corner. +Left--offset to the top from the lower-left corner. +Right--offset to the top from the lower-right corner. +Bottom--offset to the left from the lower-right corner. + + + + + TEllipse defines 2D ellipses. It inherits TControl and can be used in styles to construct controls. +The following TEllipse properties define the ellipse shape and position: + +Initially the ellipse is inscribed into the bounding rectangle ShapeRect of the TEllipse object. +Then the rotation axis RotationCenter is moved along the local coordinate axes proportionally to the Scale factors. +Then this ellipse is rotated around the obtained pivot on the RotationAngle angle. +Note: Scaling not only scales the shape of an object proportionally to the scaling factors. It also changes the thickness of the stroke that draws the contour proportionally to the scaling factor for each axis. +TEllipse draws the contour and fills the background with the Paint method. +Paint draws the contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TEllipse object. + + + Renders the control's surface. +FMX.Objects.TEllipse.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Checks whether the point specified by local coordinates belongs to the control area. +FMX.Objects.TEllipse.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + + + TCircle defines 2D circles. It inherits TControl and can be used in styles to construct controls. +The following TCircle properties define the circle size and position: + +The bounding rectangle ShapeRect of TCircle defines the bounding square for the circle: +The length of the bounding square sides equals to Min(Width, Height) of the ShapeRect bounding rectangle. +The bounding square center coincides with the center of the bounding rectangle. +The TCircle shape is inscribed into the obtained bounding square. +You can use the Scale scaling factors of the TCircle object to proportionally scale circle coordinates along local coordinate axes. Scaling moves the circle and changes its size. +You can use the rotation axis RotationCenter and rotation angle RotationAngle of the TCircle object to modify the circle shape and position. +TCircle draws the contour and fills the shape background with the Paint method. +Paint draws the contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TCircle object. + + + Renders the control's surface. +FMX.Objects.TCircle.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + TPie defines 2D pies. +TPie is drawn as part of TEllipse. It inherits TControl and can be used in styles to construct controls. +The TPie object is the part of the TEllipse object enclosed between radiuses with the StartAngle and EndAngle angles. +The ShapeRect bounding rectangle, scaling factors specified by Scale, RotationCenter rotation axis, and RotationAngle rotation angle of the TEllipse object should be used to define the general size, shape, and position of TPie. +TPie draws the contour and fills the shape background with the Paint method. +Paint draws the contour using the drawing pen with the properties, color, and opacity defined by the Stroke property of the TPie object. +Paint fills the background using the drawing brush with the properties, color, and opacity defined by the current Fill property of the TPie object. + + + Renders the control's surface. +FMX.Objects.TPie.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Checks whether the point, specified by the absolute coordinates, belongs to the control area. +FMX.Objects.TPie.PointInObject inherits from FMX.Controls.TControl.PointInObject. All content below this line refers to FMX.Controls.TControl.PointInObject. +Checks whether the point, specified by the absolute coordinates, belongs to the control area. +PointInObject returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the absolute coordinates (relative to the main form) of the point to be checked (compare with PointInObjectLocal): + +X is the X coordinate. +Y is the Y coordinate. +The points of the control boundary specified by BoundsRect belong to the control and PointInObject returns True for them. + +Note: PointInObject simply converts absolute coordinates of the point to local coordinates and calls PointInObjectLocal. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TPie.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Specifies the start angle for this pie object. +The StartAngle start angle is measured clockwise from the x-axis. +Use StartAngle in conjunction with EndAngle to specify how to draw and fill this pie. +Notice that FMX.Controls.TControl.RotationAngle rotates the x-axis. + + + Specifies the end angle for this pie object. +The EndAngle end angle is measured clockwise from the StartAngle start angle. +Use EndAngle in conjunction with StartAngle to specify how to draw and fill this pie. + + + + + TArc defines 2D arcs. +TArc is drawn as part of TEllipse's contour. It inherits TControl and can be used in styles to construct controls. +The TArc object is the part of the TEllipse's contour enclosed between radiuses with the StartAngle and EndAngle angles. +To define the general size, shape, and position of TArc, use the ShapeRect bounding rectangle, the scaling factors specified by Scale, the RotationCenter rotation axis, and the RotationAngle rotation angle of the TEllipse object. +TArc draws the contour and fills the shape background with the Paint method. +The Paint method draws the TArc contour using the drawing pen having the Stroke property of the TArc object. + + + Renders the control's surface. +FMX.Objects.TArc.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TArc.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Specifies the start angle for this arc object. +The StartAngle start angle is measured clockwise from the x-axis. +Use StartAngle in conjunction with EndAngle to specify how to draw this arc. +Notice that FMX.Controls.TControl.RotationAngle rotates the x-axis. + + + Specifies the end angle for this arc object. +The EndAngle end angle is measured clockwise from the StartAngle start angle. +Use EndAngle in conjunction with StartAngle to specify how to draw this arc. + + + + + TCustomPath is the base class for all 2D path-type shapes representing groups of connected curves and lines. +TCustomPath renders the path Data graphics with the Paint method. Paint scales and positions the path graphics according to the WrapMode parameter. Paint draws the path contour and fills the background using the drawing pen and brush with the properties, color, and opacity defined by the Stroke and Fill properties of the TCustomPath object. + + + Forces the shape to repaint its image on the screen. +FMX.Objects.TCustomPath.StrokeChanged inherits from FMX.Objects.TShape.StrokeChanged. All content below this line refers to FMX.Objects.TShape.StrokeChanged. +Forces the shape to repaint its image on the screen. +StrokeChanged is the event handler of the FMX.Graphics.TBrush.OnChanged event of the Stroke property. + + + Forces the repainting of the TCustomPath image on the screen. + + + Renders the control's surface. +FMX.Objects.TCustomPath.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Resize is called when TCustomPath is resized. +Resize calls the inherited FMX.Controls.TControl.Resize method and then sets that the TCustomPath image needs to be updated. + + + Makes required initializations by calling the inherited TControl.Loaded procedure and then sets that the TCustomPath image needs to be updated. +For additional details, see TControl.Loaded and TComponent.Loaded. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates an instance of TShape with the specified component as owner. +FMX.Objects.TCustomPath.Create inherits from FMX.Objects.TShape.Create. All content below this line refers to FMX.Objects.TShape.Create. +Creates an instance of TShape with the specified component as owner. + + + Destroys the object instance and frees its memory. +FMX.Objects.TCustomPath.Destroy inherits from FMX.Objects.TShape.Destroy. All content below this line refers to FMX.Objects.TShape.Destroy. +Destroys the object instance and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the object instance is not nil before calling Destroy. + + + Checks whether the specified point belongs to the path Data of the TCustomPath object. +PointInObject calls the FMX.Graphics.TCanvas.PtInPath method of the TCanvas object to check whether the specified point belongs to the path Data of the TCustomPath object. +X and Y are absolute pixel coordinates of the point to be checked: + +X is the x-coordinate. +Y is the y-coordinate. + + + Specifies the SVG data used to build graphic shapes. +The Data property supports only a comma-separated list of instructions defined for the d attribute of the path element in SVG 1.0. +In SVG 1.0, the d attribute contains the moveto, line, curve, arc, and closepath instructions. All instructions are expressed as one character (for example, a moveto is expressed as an M). +For more information, see Scalable Vector Graphics (SVG) 1.0 Specification. + +Example +To clarify, consider the following code snippets that specify the SVG instructions at run time: + + +Delphi: + +Path1.Data.Data := 'M 1,0, L 2,1, L 1,2, L 0,1, L 1,0'; + + +C++Builder: + + +Path1->Data->Data = "M 1,0, L 2,1, L 1,2, L 0,1, L 1,0"; + + +An application that uses the above mentioned SVG instructions displays a rhomb: + + + Specifies whether and how to resize, replicate, and position the graphical path representation for painting the area. +The WrapMode property should be one of the constants defined in the TPathWrapMode type: + +Stretch--stretches the path representation to fill the entire area. Default. +Original--keeps the original path size. +Fit--resizes the path representation (keeping proportions) to best fit the area. +Tile--renders the path representation repeatedly to tile the area. + + + + + TPath defines 2D path-type shapes representing groups of connected curves and lines. + + + TText defines 2D text objects. It inherits TControl and can be used in styles to construct controls. +TText implements the ITextSettings interface. Therefore, TText objects provide all declared in ITextSettings methods and properties to manage the text appearance parameters declared in TTextSettings. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Objects.TText.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Computes the size of the TText control, based on the font used, then re-renders it with the new dimensions. +The FontChanged method recalculates the physical dimensions (height and width) of the TText control according to the font used to display the text, and re-renders it with the new dimensions. +FontChanged is used internally for auto-sizing purposes. For more information on how to make TText auto-resize according to its display text, refer to the AutoSize API help topic. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsClass class reference to the TTextSettingsClass class (or its descendant). An instance of such class provides Font, FontColor, HorzAlign, VertAlign, Trimming, WordWrap, and other text representation properties of a control. Some of these properties can be declared as published to be editable in the Object Inspector. +You can override the method in descendant classes to modify the default behavior. + + + Renders the control's surface. +FMX.Objects.TText.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Getter method for the Text property. + + + Setter method for the Text property. + + + Computes the new size of the TText control and re-renders it with the new dimensions. + + + Computes the new size of the TText control and re-renders it with the new dimensions. +The AdjustSize method recalculates the physical dimensions (height and width) of the TText control according to the text it displays, and re-renders it with the new dimensions. +AdjustSize is used internally for auto-sizing purposes. For more information on how to make TText auto-resize according to its display text, refer to the AutoSize API help topic. + + + OnResize event dispatcher. +FMX.Objects.TText.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Initializes the component after the form file has been read into memory. +FMX.Objects.TText.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Removes the accelerator keys drawing information. + + + Indicates the accelerator keys drawing information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TText.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TText.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Responds after the last constructor has executed. +FMX.Objects.TText.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + Sets the boundaries of the current control. +FMX.Objects.TText.SetBounds inherits from FMX.Controls.TControl.SetBounds. All content below this line refers to FMX.Controls.TControl.SetBounds. +Sets the boundaries of the current control. +Use SetBounds to change all of the boundary properties of the control at one time. +X specifies the X coordinate of the Position of the control. +Y specifies the Y coordinate of the Position of the control. +AWidth specifies the value of the Width of the control. +AHeight specifies the value of the Height of the control. +The same effect can be achieved by setting the Position, Width, and Height properties separately, but SetBounds changes all properties at once, ensuring that the control will not repaint between changes. +After setting the boundary properties, SetBounds specifies to the control to maintain the alignment of the control within its parent and of its children within it. The given parameter does not necessarily reflect in the Position, Width, and Height properties. The properties can be updated when the alignment is applied. + + + Specifies the attributes of text written on or in the control. +To change to a new font, specify a new TFont object. To modify a font, change the value of the Family, Size, or Style of the TFont object. + + + Specifies the color of the Text. +Use Color to set and get the color used to display Text within TText. + + + Specifies how the text will be displayed in terms of horizontal alignment. +The HorzTextAlign property specifies how the TText control will display the text in terms of horizontal alignment. HorzTextAlign can have one of the following values: + +Center (default)--aligns the text on a horizontal axis, at the middle of the TText control. +Leading--aligns the text on a horizontal axis, at the topmost position inside the TText control. +Trailing--aligns the text on a horizontal axis, at the bottommost position inside the TText control. + + + Specifies the behavior of the text, when it overflows the area for drawing the text. +Trimming may take the following values defined in the TTextTrimming type: None, Character, and Word. +If the value of this property is not None and the text does not fit in the drawing area, then it is trimmed to fit the area and an ellipsis sign is printed after the trimmed text. + +Note: For Android and iOS platforms, Trimming works only when WordWrap = False. + + + Specifies how the text will be displayed in terms of vertical alignment. +The VertTextAlign property specifies how the TText control will display the text in terms of vertical alignment. VertTextAlign can have one of the following values: + +Center (default)--aligns the text on a vertical axis, at the middle of the TText control. +Leading--aligns the text on a vertical axis, at the topmost position inside the TText control. +Trailing--aligns the text on a vertical axis, at the bottommost position inside the TText control. + + + Specifies whether the text inside the TText control wraps when it is longer than the width of the control. +Set WordWrap to True to allow the TText control to display multiple lines of text. When WordWrap is True, text that is too long to fit in the TText control wraps at the right margin and continues in additional lines. +Set WordWrap to False for the text to span onto a single line of the TText control. However, in this case, the text that is too long to fit in the TText control appears truncated. + + + Specifies whether TText control is auto-sized based on the length of the text. +Set the AutoSize property to True to automatically resize the TText control according to the length of the Text. +Set the AutoSize property to False to lock autoresize of the TText control. + +Tip: The size of the TText control readjusts when the Font property changes. +When both AutoSize and WordWrap are set to True, the height of the TText control increases to show the full text, while the width does not change. +When AutoSize is set to True and WordWrap is False the width of the TText control changes to display the text in one line, while the height does not change. + + + Specifies whether the text in the control will be displayed as stretched over the entire client area. +Set the Stretch property to True to display the text stretched over the entire client area of the TText control. Set the Stretch property to False to display the text normally, without the stretch effect. The default value for the Stretch property is False. + +Tip: Setting the Stretch property to True cancels the effect of the WordWrap property. + + + Specifies the text that will be displayed in the TText control. +The Text property sets or reads the text that is displayed by the TText control. Text is a string. + + + Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + It determines the way to portray a single character, such as "&". + + + + + TImage defines 2D image components. It inherits TControl and can be used in styles to construct controls. +Use TImage to display a graphical image on a control. +Use the MultiResBitmap property to specify the multi-resolution set of bitmaps the most appropriate of which will be displayed as the picture on this TImage control. The TImage control shows the bitmap item with the scale best matching to the device resolution. See in the Bitmap property which algorithm is used to define the most appropriate bitmap item. +You can find the list of supported picture formats in TBitmapCodecManager. +Use the WrapMode property to specify whether and how to resize, replicate, and position the bitmap image for rendering the TImage surface. +Notice that if any BitmapMargins is defined, then WrapMode is ignored. + + + Forces the current TImage control to repaint its image on the screen and update the effects of the control and of the control's parent. +DoChanged is called every time the current TImage control is changed. + + + Renders the control's surface. +FMX.Objects.TImage.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Embarcadero Technologies does not currently have any additional information. + + + Tries to find the item in MultiResBitmap that has the most suitable scale. +If the IncludeEmpty parameter is True, the returned item can be empty. Otherwise, the returned item cannot be empty. Empty items are ignored. +If the search is successful, ItemForCurrentScale returns the TCustomBitmapItem, otherwise ItemForCurrentScale returns nil. + + + Protected getter implementation for the Data property. +If the Data property is empty, GetData returns the value of the Bitmap property. + + + Protected setter implementation for the Data property. +Additionally, if Value is a TPersistent descendant, the Bitmap property is also set to Value. + + + Creates the MultiResBitmap multi-resolution bitmap image of the TFixedMultiResBitmap type that will be used by this TImage component to display a picture. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Objects.TImage.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Retrieves whether some properties of MultiResBitmap are stored. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TImage.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TImage.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Draws a TBitmap image after scaling it to a specified area of the TCanvas. +Use this method to display a whole bitmap image into a specified area of the TCanvas. To display a specified area of the bitmap image, use the FMX.Graphics.TCanvas.DrawBitmap method. + +Parameters +This method defines the following parameters: + +Canvas: specifies a canvas. +ARect: specifies the rectangle area of Canvas to be drawn. +ABitmap: specifies a TBitmap image. +AOpacity: specifies the transparency to be applied to the ABitmap. +Notes +When using the DrawBitmap method, pay attention to the following: + +When drawing a bitmap image, this method uses the following properties of TImage: +FMX.Objects.TImage.BitmapMargins: Specifies the margins of the bitmap image to draw. +FMX.Objects.TImage.WrapMode: Specifies whether and how to resize, replicate, and position the bitmap image. +It is recommended to use this method within the onPaint event handlers, such as FMX.Controls.TControl.OnPaint or FMX.Forms.TCustomForm.OnPaint. + + + Specifies the bitmap picture that will be displayed by this TImage component. +Set the Bitmap property to the bitmap picture that you want to be displayed by this TImage component. Reading Bitmap provides a TBitmap image that you can assign to other TImage components or you can save to a stream or a file. +The Bitmap getter retrieves the Bitmap image from the appropriate bitmap item of the multi-resolution bitmap stored in MultiResBitmap. When you set a new value to the bitmap, the Bitmap setter saves this bitmap in this bitmap item of the MultiResBitmap multi-resolution bitmap. If you change this bitmap item in MultiResBitmap by any way, this will change the Bitmap image. For example, you can edit MultiResBitmap in the MultiResBitmap Editor from the Object Inspector. +For a list of image formats supported by this component, please refer to the TBitmapCodecManager API help topic. +You can also assign an image programmatically, as exemplified in the following code snippet: + + Image1.Bitmap.LoadFromFile('MyImage.jpg'); + +Note: The Bitmap getter uses the following algorithm to retrieve the Bitmap property's value: +Using the GetSceneScale function for the Scene in which the control is drawn, the Bitmap getter retrieves the Scale for the current device. If Scene is not defined, then the 1.0 value for Scale is accepted. +If MultiResBitmap is assigned, then the getter gets the Bitmap from the bitmap item having the scale best matching to the obtained Scale (not including empty bitmap items.) +If the getter does not find any not empty bitmap item, then the getter tries to retrieve an empty bitmap item having the scale exactly matching to the obtained Scale. +If the getter cannot find an empty bitmap item having the obtained Scale, then the getter creates a new bitmap item with the obtained Scale and returns the bitmap from the created bitmap item. +If the obtained Scale <= 0 or MultiResBitmap is not assigned, the exception is raised. + + + Keeps the TFixedMultiResBitmap multi-resolution bitmap. + + + Specifies the margins of the bitmap displayed by this TImage component. +Set or read the BitmapMargins property in order to affect the margins of the image that is displayed by this TImage component. + + + Enables or disables the interpolation of the bitmap image displayed by this TImage component. +The DisableInterpolation property specifies whether the interpolation is used while rendering the bitmap image displayed by this TImage component. By default, DisableInterpolation is set to False. +The following picture shows the same image rendered once with DisableInterpolation set to False and once with DisableInterpolation set to True. + + + Specifies how the margins of the Bitmap are resized, replicated, and positioned. +Use MarginWrapMode property to set and get how the margins of the Bitmap are displayed within the TImage. By default the margins are stretched to fill the entire TImage. To see the possible values of MarginWrapMode, go to TImageWrapMode. +If BitmapMargins property is not set, then MarginWrapMode has no effect over the image. + + + Specifies whether and how to resize, replicate, and position the bitmap image for rendering the TImage surface. +The WrapMode property should be one of the constants defined in the TImageWrapMode type: + +Original displays the image with its original dimensions. +Fit provides the best fit, keeping image proportions (the ratio between the width and height) for the TImage rectangle. If needed, the image is scaled down or stretched to best fit the rectangle area. This is the default option. +Stretch stretches the image to fill the entire rectangle of the TImage component. +Tile tiles the TImage image to cover the entire rectangle of the TImage component. +Center centers the image to the rectangle of the TImage component. The image is never resized, regardless the size of the rectangle of the TImage component. +Place fits the image into the TImage rectangle. If the width or height of the image is greater than the corresponding dimension of the TImage rectangle, then the image is scaled down keeping image proportions (the ratio between the width and height) to fit in the TImage rectangle. The obtained image is centered in the TImage rectangle. Place only makes images smaller, never larger. + + + + + TPaintBox defines a 2D image component providing a canvas that an application can use for rendering an image. It inherits TControl and can be used in styles to construct controls. +Unlike TImage, which displays a picture that is stored in a file, TPaintBox requires an application to draw the image directly on a canvas. Use the OnPaint event handler to draw on the paint box's FMX.Graphics.TCanvas, the drawing surface of the paint box. + + + Renders the control's surface. +FMX.Objects.TPaintBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TPaintBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TPaintBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Occurs when the control is redrawn. +FMX.Objects.TPaintBox.OnPaint inherits from FMX.Controls.TControl.OnPaint. All content below this line refers to FMX.Controls.TControl.OnPaint. +Occurs when the control is redrawn. +OnPaint also occurs when DoPaint is called. +Write an event handler for OnPaint to change the way the control renders itself. + +Tip: Notice that calling BeginScene in the OnPaint event handlers has no effect, because BeginScene is called before the OnPaint event handler runs. This guarantees that painting always occurs in OnPaint without requiring extra and probably unexpected code to allow drawing to have an effect. + + + + + TSelection defines 2D rectangle object that can be moved and resized. It inherits TControl and can be used in styles to construct controls. +You can use scaling factors Scale of the TSelection object to proportionally change coordinates of a selection object's rectangle along local coordinate axes. Scaling moves the selection rectangle and change its size. The rotation axis RotationCenter and rotation angle RotationAngle of the selection object can also be used to modify the selection rectangle's size and position. +The Paint method renders the TSelection image. Paint internally defines the properties of the drawing pen to draw the selection contour and the brush to fill the background depending on whether the control is enabled, the zone is hot, and other conditions. +To resize the TSelection rectangle you can use four grip controls. Grip controls appear as small circles at the selection rectangle corners when the mouse pointer hovers over the grip controls. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the control's surface. +FMX.Objects.TSelection.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + It draws a grip handle. + + + It draws a frame rectangle. + + + Checks whether the point specified by local coordinates belongs to the control area. +FMX.Objects.TSelection.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TSelection.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TSelection.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Handles the pressing of a mouse button inside the TSelection object. +MouseDown calls FMX.Controls.TControl.MouseDown, checks whether any of the grip controls (small circles in the selection rectangular corners) are pointed to resize the selection shape and activate resizing by moving this control or activates moving of the TSelection object by moving the mouse pointer. +MouseDown has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the TShiftState type and passes additional information such as: whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were pressed when the mouse button was clicked; whether the mouse button was double-clicked (ssDouble). +X and Y--are the local pixel coordinates of the mouse pointer within the TSelection object. +The TForm form, owner of the TSelection object, calls MouseDown in response to mouse-down messages. +Override the public MouseDown method to provide a customized response when a mouse button is pressed when the mouse pointer is over the TSelection object. + + + Handles moving of the mouse pointer over a TSelection object. +As the mouse pointer moves over a TSelection object, this method is called repeatedly. It is called each time with the new mouse pointer coordinates that reflect the continuous path of the mouse pointer. + +Parameters +MouseMove has the following parameters: + +Shift--belongs to the TShiftState type and passes additional information, such as: which mouse button was pressed (ssLeft--left, ssRight--right) or whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were pressed when the mouse button was clicked. +X and Y--are the local pixel coordinates of the mouse pointer within the TSelection object. +Functionality +MouseMove executes the following operations: + +MouseMove calls the inherited FMX.Controls.TControl.MouseMove method. Then: +If the mouse button is not pressed down: +Check whether the mouse pointer hovers over a grip control: +When the mouse pointer moves over a grip control--shows the resizing arrow on the grip control over which the mouse pointer is moving. +When the mouse pointer moves outside a grip control--clears the resizing arrows, if any. +Force repaint of the selection shape. +If the left mouse button is pressed inside the TSelection object: +Moves the shape of the TSelection object on the vector with the start point having the coordinates where the mouse button was pressed and the end point having the current coordinates of the mouse. +If ParentBounds is True, the TSelection object shape is moved inside the boundaries of the parent control. +If ParentBounds is False, the TSelection object shape is moved inside the boundaries of the current TCanvas object. +Calls the customer event handler of the OnTrack event. +If the left mouse button is pressed down on one of the grip controls of the TSelection object: +The shape of the TSelection object is resized to reflect the moving of the selected grip control. +If ParentBounds is True, the TSelection object shape is resized to fit the boundaries of the parent control. +If ParentBounds is False, the TSelection object shape is resized to fit the boundaries of the current TCanvas object. +If Proportional is True, the object shape is resized keeping the Width/Height proportion. +Call the customer event handler of the OnTrack event. +Force the repaint of the selection shape. + +Override the public MouseMove method to provide a customized response when the mouse pointer is moved over the TSelection object. + + + Handles the release of a mouse button pressed inside the TSelection object. +MouseUp calls the inherited FMX.Controls.TControl.MouseUp. If the TSelection object is being moved or resized by the mouse, MouseUp calls the OnChange event handler, and then stops moving or resizing by the mouse. +MouseUp has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the TShiftState type and passes additional information, such as whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were down when the pressed mouse button was released. +X and Y--are the local pixel coordinates of the mouse pointer within the TSelection object. +The TForm form (owner of the TSelection object) calls MouseUp in response to mouse-up messages. +Override the public MouseUp method to provide a customized response if the mouse button is released when the mouse pointer is over the TSelection object. + + + DoMouseLeave is called automatically when the mouse pointer leaves the TSelection object. +DoMouseLeave of the TSelection object calls the inherited FMX.Controls.TControl.DoMouseLeave method which starts animation by calling StartTriggerAnimation, applies effects by calling ApplyTriggerEffect, and calls the FMX.Controls.TControl.OnMouseLeave event handler. Then DoMouseLeave frees the grip controls. Finally, DoMouseLeave initializes the TSelection shape repaint operation. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the TSelection object. + + + It grips the handle where the mouse is hovered. + + + Selection frame and handle's border color. + + + Defines the size of the grip controls used to resize the TSelection object. + + + Defines whether to hide the selection rectangle when the TSelection object is not selected. +When HideSelection is True and the TSelection object is not selected, the rectangle and grip controls are invisible. + +See also +FMX.Objects.TSelection.GripSize + + + Defines the minimum possible values for the width and height of the TSelection object. + + + Defines whether the shape of the TSelection object should be inside the boundaries of the parent control. +When ParentBounds is True, the shape of the TSelection object cannot be moved outside the boundaries of the parent control. + + + Defines whether the width/height proportion should be kept during the resizing of the TSelection object. + + + It indicates the visibility of the handles. + + + The event handler of the OnChange event is called from the MouseUp method whenever the shape of a TSelection object changes. +Write a custom OnChange event handler to perform a specific action when the TSelection object changes. + + + The event handler of the OnTrack event is called cyclically from the MouseMove method while the TSelection object is in the process of moving or resizing. +Write a custom OnTrack event handler to perform a specific action when TSelection is in the process of moving or resizing. + + + + + TSelectionPoint defines a 2D point object that can be moved. It inherits TControl and can be used in styles to create controls. +The TSelectionPoint class implements operations of moving of a 2D point object with a mouse or another pointing device. +The behavior of selection point objects depends upon the existence of a corresponding style-resource in an application style book: + +When an application style book does not contain a style-resource for selection points: +A selection point in this application is drawn as a circle having a radius equal to GripSize. +The used GripSize is truncated to 1<= GripSize<=20. +A selection point is drawn as a white circle having the blue circumference. +When a selection point is selected, its circle is shown red. +To select a selection point, place the mouse pointer over the circle shape or the bounds rectangle of the selection point (having the Width and Height dimensions). +When an application style book contains a style-resource for selection points, then all selection point properties are loaded from the style-resource; property values are set in the Form Designer or are ignored programmatically. On some platforms, selection points use predefined platform-specific values. For example, on some mobile platforms GripSize is 16 or 17 and this value cannot be changed programmatically. +Notice that the GripCenter property has the following implementation. The X and Y values of GripCenter define an offset between the mouse pointer position and the shown selection point when the pressed mouse pointer is moved. +You can use scaling factors Scale of the TSelectionPoint object to proportionally change a selection point and a grip sizes along coordinate axes. The rotation axis RotationCenter and rotation angle RotationAngle of the selection point object can also be used to modify the position of the selection point. + + + Renders the control's surface. +FMX.Objects.TSelectionPoint.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Setter function for the Height property. +Value specifies the new value of the Height property. +If no style is applied to the TSelectionPoint object, then SetHeight sets Height = 2*GripSize. The specified Value is ignored. + + + Setter function for the Width property. +Value specifies the new value of the Width property. +If no style is applied to the TSelectionPoint object, then SetWidth sets Width = 2*GripSize. The specified Value is ignored. + + + Embarcadero Technologies does not currently have any additional information. + + + DoMouseEnter is called when the mouse pointer enters the TSelectionPoint object. +DoMouseEnter calls the inherited FMX.Controls.TControl.DoMouseEnter method and then initializes repainting of the TSelectionPoint shape. +Override the protected DoMouseEnter method to provide other responses when the mouse pointer enters the TSelectionPoint object. + + + DoMouseLeave is called when the mouse pointer leaves the TSelectionPoint object. +DoMouseLeave calls the inherited FMX.Controls.TControl.DoMouseLeave method and then initializes repainting of the TSelectionPoint shape. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the TSelectionPoint object. + + + Handles the pressing of a mouse button on the TSelectionPoint object. +MouseDown calls the FMX.Controls.TControl.OnMouseDown event handler and sets that the left mouse button is pressed. +MouseDown has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the TShiftState type and passes additional information, such as whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were pressed when the mouse button was clicked, or whether the mouse button was double-clicked (ssDouble). +X and Y--are the local pixel coordinates of the mouse pointer within the TSelectionPoint object. +The TForm form (owner of the TSelectionPoint object) calls MouseDown in response to mouse-down messages. +Override the public MouseDown method to provide a customized response when a mouse button is pressed when the mouse pointer is over the TSelectionPoint object. + + + Handles moving of the mouse pointer over a TSelectionPoint object. +As the mouse pointer moves over a TSelectionPoint object, this method is called repeatedly. Each time it is called with the new mouse pointer coordinates that reflect the continuous path of the mouse pointer. +MouseMove has the following parameters: + +Shift--belongs to the TShiftState type; it can pass additional information. +X and Y--are the local pixel coordinates of the mouse pointer within the parent control. +The MouseMove method has the following implementation: + +MouseMove calls the inherited FMX.Controls.TControl.MouseMove method. +If the TSelectionPoint object is pressed with the left mouse button, the TSelectionPoint is dragged by the mouse pointer: +If ParentBounds is True and the parent is a control, the TSelectionPoint object is moved only inside the boundaries of the parent control. +If ParentBounds is True and the parent is not a control, the TSelectionPoint object is moved inside the boundaries of the current TCanvas object. +If ParentBounds is False, the TSelectionPoint object is moved to the specified X and Y coordinates. +Then, it calls the customer event handler of the OnTrack event. +Override the public MouseMove method to provide a customized response when the mouse pointer is moved over the TSelectionPoint object. + + + Handles release of the left mouse button pressed inside the TSelectionPoint object. +MouseUp calls the FMX.Controls.TControl.OnMouseUp and the OnChange event handlers, and releases mouse capturing from the TSelectionPoint object. +MouseUp has the following parameters: + +Button--belongs to the TMouseButton type and specifies the pressed mouse button: mbLeft--left, mbRight--right, or mbMiddle--middle. +Shift--belongs to the [[System.Classes.TShiftState|TShiftState] type and passes additional information, such as whether shift keys (ssShift--SHIFT, ssCtrl--CTRL, or ssAlt--ALT) were down when the pressed mouse button was released. +X and Y--are the local pixel coordinates of the mouse pointer within the TSelectionPoint object. +The TForm form, owner of the TSelectionPoint object, calls MouseUp in response to mouse-up messages. +Override the public MouseUp method to provide a customized response when the mouse button is released while the mouse pointer is over the TSelectionPoint object. + + + OnTrack event dispatcher. +DoChangeTracking is automatically called when the mouse is moved while the left mouse button is pressed. +DoChangeTracking fires an OnTrack event. + + + OnChange event dispatcher. +DoChange is automatically called when the left mouse button is released. +DoChange fires an OnChange event. + + + Customizes styles in complex objects. +FMX.Objects.TSelectionPoint.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.Objects.TSelectionPoint.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Objects.TSelectionPoint.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Objects.TSelectionPoint.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Checks whether the point specified by local coordinates belongs to the control area. +FMX.Objects.TSelectionPoint.PointInObjectLocal inherits from FMX.Controls.TControl.PointInObjectLocal. All content below this line refers to FMX.Controls.TControl.PointInObjectLocal. +Checks whether the point specified by local coordinates belongs to the control area. +PointInObjectLocal returns True if the specified point belongs to the control area, and False otherwise. +The X and Y are the local coordinates of the point to be checked (compare with PointInObject): + +X is the X coordinate. +Y is the Y coordinate. +The local coordinates of the upper-left corner of the control rectangle are (0,0), and the local coordinates of the lower-right corner are (Width, Height). +The points of the control boundary specified by BoundsRect belong to the control and PointInObjectLocal returns True for them. +If a control supports the Touch property, the control area can be optionally inflated on the values specified by the TouchTargetExpansion property. TouchTargetExpansion keeps four optional parameters representing the expansion for the four sides of the control in pixels (Bottom, Left, Right, and Top). +The dclasses can change the 'control area' definition. For example: + +The FMX.Objects.TSelection class extends the 'control area' definition relative to BoundsRect. FMX.Objects.TSelection.PointInObjectLocal also returns True if the point belongs to any of small rectangles of the four grip controls used to manage the selection shape. The rectangles of the grip controls are rectangles surrounding the four corners of the TSelection rectangle. The Width and Height of these rectangles are equal to 2 * GripSize. For example, the grip control's rectangle of the upper-right corner UR_Corner of TSelection is defined by the following corners: +(UR_Corner.Top - GripSize, UR_Corner.Right - GripSize)--upper-left corner of the grip. +(UR_Corner.Top + GripSize, UR_Corner.Right + GripSize)--lower-right corner of the grip. +FMX.Objects.TSelectionPoint.PointInObjectLocal returns True if the specified point belongs to the rectangle of the grip control corresponding to the TSelectionPoint object, and False otherwise. + + + Defines the radius of the shown selection point object. +When an application style book does not contain a style-resource for selection points, a selection point in this application is drawn as a circle having radius equal to GripSize. The used GripSize is truncated to 1<= GripSize<=20. When an application style book contains a style-resource for selection points, then all selection point properties are loaded from the style-resource; property values set in the Form Designer or programmatically are ignored. Under some platforms, selection points use predefined platform-specific values. For example, on some mobile platforms GripSize is 16 or 17 and this value cannot be changed programmatically. + + + Defines an offset between the position of the mouse pointer and the shown selection point object when the pressed mouse pointer is moved. +The X and Y values of GripCenter define an offset between the mouse pointer position and the shown selection point object when the pressed mouse pointer is moved. +By default, X and Y equal 0. + + + Defines whether the shape of the TSelectionPoint object should be within the boundaries of the parent control. +When ParentBounds is True, the shape of the TSelectionPoint object cannot be moved outside the boundaries of the parent control. + + + The event handler of the OnChange event is called from the MouseUp method whenever the TSelection object changes. +Write a custom OnChange event handler to perform a specific action when the TSelectionPoint object changes. + + + The event handler of the OnTrack event is called cyclically from the MouseMove method while the TSelectionPoint object is being moved. +Write a custom OnTrack event handler to perform a specific action while the TSelectionPoint object is being moved. + + + + + TObject is the ultimate ancestor of all objects and components. +TObject encapsulates fundamental behavior common to objects by introducing methods that: + +Create, maintain, and destroy instances of the object by allocating, initializing, and freeing required memory. +Respond when object instances are created or destroyed. +Return class-type and instance information on an object and runtime type information (RTTI) about its published properties. +Support message handling. +Support interfaces implemented by the object. +Use TObject as an immediate base class when declaring simple objects that do not need to persist (are not saved and reloaded) and that do not need to be assigned to other objects. +Much of the capability of objects is established by methods that TObject introduces. Many of these methods are used internally by IDEs and are not intended for users to call directly. Others are overridden in descendant objects that have more complex behavior. +Although TObject is the based object of a component framework, not all objects are components. All component classes descend from TComponent. + +Note: TObject is never directly instantiated. Although it does not use programming language features that prevent instantiation, TObject is an abstract class. + + + + + + Internal use only + + + Internal use only + + + TypeInfo of element type + + + Number of element type + + + + + + + + Internal use only + + + Alignment in bytes + + + + + A layout is a container for other graphical objects. +Use the layouts when you need to organize multiple graphical controls under the same parent. +For instance, you can use these layouts when you need to create rich FireMonkey applications with many graphical controls that are grouped on the same layer. You can set the visibility of all the controls on a layout at once by affecting the visibility of the layout. + + + Renders the control's surface. +FMX.Layouts.TLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + A FireMonkey scaled layout is a wrapper over TControl and acts like a layer for other objects with the possibility of scaling its content according to the physical dimensions of the layout. +A scaled layout is a container for other graphical objects that can scale its contents as shown in the following image. + +The label and the button are scaled according to the dimensions of the form that contains the layer aligned as the client so that the layer occupies the entire surface. + + + Performs the alignment of a FireMonkey control. +FMX.Layouts.TScaledLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Returns the children transformation matrix. +FMX.Layouts.TScaledLayout.GetChildrenMatrix inherits from FMX.Controls.TControl.GetChildrenMatrix. All content below this line refers to FMX.Controls.TControl.GetChildrenMatrix. +Returns the children transformation matrix. +The AbsoluteMatrix is calculated as: + + AbsoluteMatrix = (LocalMatrix * Parent.GetChildrenMatrix) * Parent.AbsoluteMatrix + +TScaledLayout overrides GetChildrenMatrix to prescale layout contents. + + + Setter function for the Height property. +FMX.Layouts.TScaledLayout.SetHeight inherits from FMX.Controls.TControl.SetHeight. All content below this line refers to FMX.Controls.TControl.SetHeight. +Setter function for the Height property. Value specifies the new value of the Height property. + + + Setter function for the Width property. +FMX.Layouts.TScaledLayout.SetWidth inherits from FMX.Controls.TControl.SetWidth. All content below this line refers to FMX.Controls.TControl.SetWidth. +Setter function for the Width property. Value specifies the new value of the Width property. + + + Renders the control's surface. +FMX.Layouts.TScaledLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TScaledLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Layouts.TScaledLayout.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies the original width of the scaled layout control. The original width represents the unscaled X dimension of the scaled layout control. + + + Specifies the original height of the scaled layout control. The original height represents the unscaled Y dimension of the scaled layout control. + + + + + + + + This flag is set in the method ContentChanged. Used to optimize ScrollBox + + + + + The base class for controls representing a scrolling area (scroll box). +One use of a scroll box is to group multiple graphical controls (such as buttons, list boxes, edit boxes, radio buttons, and so on) under the same scrollable parent (the scroll box itself). In this way, a smaller form can contain a lot of graphical objects organized in a scrollable manner in order to occupy less space on a graphical user interface (GUI). +Another use of scroll boxes is to create multiple scrolling areas (views) in a form. Views are common in commercial word-processor, spreadsheet, and project management applications. + +Note: Do not anchor the children of a scroll layout (TScrollBox, TVertScrollBox, TFramedScrollBox, and so on) to the right and bottom edges. If the Anchors property of a scroll layout child is set to akBottom, akRight, or both, the child will continue to stretch to keep constant the distance to the layout edges when the layout content size is being calculated. The children of a scroll layout should be anchored only to the left and top edges. +Note: When the size of the area occupied by the Content of a scroll box exceeds the control Size, and, therefore, all Content cannot be shown in the control at one moment, then you can use scroll bars to scroll the Content in the control. Notice that on Windows the scroll bar is shown by default. However, on OS X the scroll bar is not shown by default. On OS X, the scroll bar appears when you try to scroll the Content using the mouse wheel. To enforce the scroll bar to be shown by default, you can use the code like following: +ScrollBox1.AniCalculations.AutoShowing := false; + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +FMX.Layouts.TCustomScrollBox.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Applies the padding to the content of the TScrollBox. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Layouts.TCustomScrollBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TCustomScrollBox.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Performs the realignment of the children controls of the TScrollBox object within the object. +It is called internally every time visual properties of TScrollBox are changed. +The children are realigned taking into account their alignment properties, margins, and padding. +DoRealign calls the inherited TControl.DoRealign and then executes the realignment during the inertial scrolling. + + + Embarcadero Technologies does not currently have any additional information. + + + Virtual method to be implemented in subclasses to provide further functionality when adding AObject to the scroll box. In TScrollBox, ContentAddObject has no implementation. + + + Embarcadero Technologies does not currently have any additional information. + + + Virtual method to be implemented in subclasses to provide further functionality right before removing AObject from the scroll box. In TScrollBox, ContentBeforeRemoveObject has no implementation. + + + Virtual method to be implemented in subclasses to provide further functionality right after removing AObject from the scroll box. In TScrollBox, ContentRemoveObject has no implementation. + + + Internally called when the horizontal scroll bar changes position. Do not call HScrollChange in applications. + + + Internally called when the vertical scroll bar changes position. Do not call VScrollChange in applications. + + + Executed when the viewport position changes. +ViewportPositionChange receives the following parameters: + +OldViewportPosition is the value that the ViewportPosition property had before it changed. +NewViewportPosition is the new value of the ViewportPosition property. +ContentSizeChanged indicates whether the size of the content of the viewport has changed as well (True) or not (False). +ViewportPositionChange calls the handler of the OnViewportPositionChange event. + + + Embarcadero Technologies does not currently have any additional information. + + + OnPainting event dispatcher. +FMX.Layouts.TCustomScrollBox.Painting inherits from FMX.Controls.TControl.Painting. All content below this line refers to FMX.Controls.TControl.Painting. +OnPainting event dispatcher. +Painting defines the drawing area of the control by intersecting Canvas with ClipRect if ClipChildren is True and dispatches the OnPainting event. +It is always called internally before DoPaint. +The Painting method can be overridden by derived controls to establish control-specific rendering conditions. + + + Restores Canvas properties after the painting process. +FMX.Layouts.TCustomScrollBox.AfterPaint inherits from FMX.Controls.TControl.AfterPaint. All content below this line refers to FMX.Controls.TControl.AfterPaint. +Restores Canvas properties after the painting process. +As implemented in TControl, AfterPaint does nothing. +TShape descendants of TControl override AfterPaint to restore Dash and Thickness to default values. + + + Customizes styles in complex objects. +FMX.Layouts.TCustomScrollBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.Layouts.TCustomScrollBox.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + Returns the rectangle that defines the scrolling area. The result value is of type TRectF. + + + Returns the position of the vertical scroll bar. +VScrollBarValue returns a value of 0 if the vertical scroll bar is not required by this scroll box or it is not visible. + + + Returns the position of the horizontal scroll bar. +HScrollBarValue returns a value of 0 if the horizontal scroll bar is not required by this scroll box or it is not visible. + + + Embarcadero Technologies does not currently have any additional information. + + + Constructs a TScrollCalculations type object in which you can set properties and calculate parameters of the inertial scrolling. +CreateAniCalculations calls the TScrollCalculations.Create constructor to create a TScrollCalculations object. The created object is kept in the AniCalculations property of the current TScrollBox instance. Using this TScrollCalculations object you can set the Animation, DecelerationRate, BoundsAnimation, AutoShowing, and Shown properties of inertial scrolling. +TScrollCalculations is the descendant of the TAniCalculations class, which provides methods to calculate parameters of the inertial scrolling. +UpdateAniCalculations calls CreateAniCalculations to create a TScrollCalculations object and then calls +DoUpdateAniCalculations to set the default inertial scrolling properties under the current platform. + + + Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations is called from UpdateAniCalculations to set the default values to the Animation, +TouchTracking, BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + Initializes the inertial scrolling and sets its properties. +UpdateAniCalculations calls +CreateAniCalculations to create a TScrollCalculations object handling calculations of the inertial scrolling and calls DoUpdateAniCalculations to update the +TouchTracking, BoundsAnimation, and AutoShowing properties of the inertial scrolling. + + + Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + Changes the bounding rectangle of the content of the control to the specified rectangle, and realigns its child controls accordingly. + + + Returns the boundaries of the rectangle that defines the scrolling area. The result value is of type TRectF. + + + Internally executed while a mouse button is pressed over the surface of this scroll box. +You can call MouseDown programmatically in applications to simulate a mouse button down event over this scroll box. +The Button parameter specifies the mouse button that has just been pressed (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + Internally executed while the mouse is moved over the surface of this scroll box. +You can call MouseMove programmatically in applications to simulate a mouse move event over this scroll box. +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + Internally executed while a mouse button is released over the surface of this scroll box. +You can call MouseUp programmatically in applications to simulate a mouse button up event over this scroll box. +The Button parameter specifies the mouse button that has just been released (for instance, TMouseButton.mbLeft). +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The X and Y parameters specify the position of the mouse cursor on the screen. + + + OnMouseLeave event dispatcher. +FMX.Layouts.TCustomScrollBox.DoMouseLeave inherits from FMX.Controls.TControl.DoMouseLeave. All content below this line refers to FMX.Controls.TControl.DoMouseLeave. +OnMouseLeave event dispatcher. +DoMouseLeave is called automatically when the mouse pointer leaves the control's area. +DoMouseLeave starts the animation by calling StartTriggerAnimation and applies effects by calling ApplyTriggerEffect to background the control. +Override the protected DoMouseLeave method to provide other responses when the mouse pointer leaves the control's area. + + + Internally executed while the mouse wheel is used over the surface of this scroll box. +You can call MouseWheel programmatically in applications to simulate a mouse wheel spin event over this scroll box. +The Shift parameter specifies the keyboard state (for instance, the CTRL key pressed at the same time with the mouse click). +The WheelDelta parameter specifies the position of the mouse wheel. +The Handled parameter specifies whether the mouse wheel events are handled by this scroll box control. + + + Protected read-only property that specifies the content layout of this scroll box. + + + Keeps an object that represents a scrollable content. +A TScrollBox object uses a TScrollContent object in order to provide an area onto which you can place any other graphical components. Content keeps this TScrollContent object. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the horizontal scroll bar attached to this scroll box. +Read the HScrollBar read-only property to obtain the horizontal scroll bar object attached to this scroll box component. + + + Specifies the vertical scroll bar attached to this scroll box. +Read the VScrollBar read-only property to obtain the vertical scroll bar object attached to this scroll box component. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TCustomScrollBox.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Layouts.TCustomScrollBox.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Allows you to set various parameters that control the inertial scrolling effect animation. +AniCalculations keeps a TScrollCalculations object created by CreateAniCalculations. Using properties of this object you can programmatically set values for inertial scrolling properties in order to emulate on the current platform the inertial scrolling behavior typical for other platforms. For example, you can select the emulation of the iOS scrolling behavior under Windows and vice-versa. +TScrollCalculations is the descendant of the TAniCalculations class, which provides methods to calculate parameters of the inertial scrolling. +By using AniCalculations you can set: + +Whether the scrolling is animated (via the TAniCalculations.Animation property). +The deceleration rate of the inertial scrolling (via the TAniCalculations.DecelerationRate property). +Whether the inertial scrolling is bound to the area (via the TAniCalculations.BoundsAnimation property). +Whether the scrolling bars appear automatically when the scroll action is initiated (via the TAniCalculations.AutoShowing property). +Whether the scrolling bars are hidden automatically when they are not needed (via the TAniCalculations.Shown property). +other properties of the TScrollCalculations object. + + + Coordinates of the origin of the scrolling viewport specified as the offset from the origin of the content layout of this scroll box. +Coordinates are specified as the TPointF point defining the origin of the scrolling viewport in relation to the origin of the content layout of this scroll box. +A scrolling viewport (or viewport) is a rectangle bounding all controls placed on the content layout of this scroll box. + + + Sorts components of the layout based on the comparison function Compare. +TFmxObjectSortCompare is declared as: + +TFmxObjectSortCompare = function(item1, item2: TFmxObject): Integer; + + + Scrolls to the center of the TScrollBox control. +Center only has an effect if the scroll box actually has content beyond the display area and the scroll bars are needed to scroll to view all the content held by this scroll box. + + + Scrolls the view according to the given Dx and Dy offsets (relative to the current position) in the TScrollBox control. +The Dx and Dy parameters specify offsets to the values of the horizontal and vertical scroll bars assigned to the TScrollBox control. This means that the Dx parameter is the change in pixels horizontally (along the X axis), and the Dy parameter is the change in pixels vertically (along the Y axis). +ScrollBy has the effect of scrolling the view, in the TScrollBox control, to the new coordinates defined by the new values of the horizontal and vertical scroll bars. These new values are obtained from the current values of the vertical and horizontal scroll bars by decreasing them by Dx and Dy pixels, respectively. For example, if Dx is a negative value, ScrollBy scrolls the view to the left; if Dx is a positive value, ScrollBy scrolls the view to the right. +ScrollBy only has an effect if the scroll box actually has content beyond the display area, and the scroll bars are needed to view more of the content. + + + Internally used. + + + ClientWidth specifies the width of the components content (in dp). Use it to read or change the width of the component. + +Note: ClientWidth is the components width without decoration. The components could be scrollbars and paddings. + + + ClientHeight specifies the height of the components content (in dp). Use it to read or change the height of the component. + +Note: ClientHeight is the components height without decoration. The components could be scrollbars and paddings. + + + Embarcadero Technologies does not currently have any additional information. + + + Keeps a rectangle bounding all controls in the content of this scroll box. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. +The ContentBounds property is read-only. If the value returned by ContentBounds needs to be changed, you need to override DoCalcContentBounds or to assign the OnCalcContentBounds event handler. + + + Embarcadero Technologies does not currently have any additional information. + + + Realigns the children controls of this scroll box in the scrolling area of this scroll box. +RealignContent can be overridden in subclasses to allow further functionality when performing the alignment of the objects inside the ContentBounds scrolling area of this scroll box. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Raises when the horizontal scrollbar value was changed. +When the scroll position is changing at the ViewportPosition change, this event does not raise. + + + Raises when the vertical scrollbar value was changed. +When the scroll position is changing at the ViewportPosition change, this event does not raise. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Extends TCustomScrollBox declaring published properties. +TScrollBox extends TCustomScrollBox declaring published properties. TScrollBox does not extend the base class with any new functionality. +In difference to TFramedScrollBox, TScrollBox does not draw the edges (top, left, bottom, and right) and does not fill the control rectangle with any special color. Therefore, by default TScrollBox is not highlighted from the background of a parent control. + + + Renders the control's surface. +FMX.Layouts.TScrollBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + + + Represents a TScrollBox restricted to vertical scrolling. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Layouts.TVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +FMX.Layouts.TVertScrollBox.DoCalcContentBounds inherits from FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + Renders the control's surface. +FMX.Layouts.TVertScrollBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations calls the inherited TCustomScrollBox.DoUpdateAniCalculations to set the default values to the Animation, TouchTracking, +BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. In the TVertScrollBox class, DoUpdateAniCalculations permits only vertical TouchTracking if vertical touch tracking is supported under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + + + Represents a TScrollBox restricted to horizontal scrolling. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Layouts.THorzScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +FMX.Layouts.THorzScrollBox.DoCalcContentBounds inherits from FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. All content below this line refers to FMX.Layouts.TCustomScrollBox.DoCalcContentBounds. +Calculates the ContentBounds rectangle bounding all controls in the scrolling region. +DoRealign calls DoCalcContentBounds to calculate the ContentBounds rectangle. If the OnCalcContentBounds event handler is defined, then DoRealign calls this event handler and passes into it the calculated content bounding rectangle for additional calculations. + + + Renders the control's surface. +FMX.Layouts.THorzScrollBox.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Sets the default inertial scrolling properties for the current platform. +DoUpdateAniCalculations calls the inherited TCustomScrollBox.DoUpdateAniCalculations to set the default values to the Animation, TouchTracking, +BoundsAnimation, and AutoShowing properties of the inertial scrolling under the current platform. In the THorzScrollBox class, DoUpdateAniCalculations permits only horizontal TouchTracking if horizontal touch tracking is supported under the current platform. DoUpdateAniCalculations sets the properties of the TScrollCalculations object kept in the AniCalculations property. + + + + + Extends TCustomScrollBox declaring published properties. +TFramedScrollBox extends TCustomScrollBox declaring published properties. TFramedScrollBox does not extend the base class with any new functionality. +In difference to TScrollBox, TFramedScrollBox draws the edges (top, left, bottom, and right) and fills the control rectangle with some special color. Therefore, TFramedScrollBox scroll boxes are highlighted from the background of a parent control. + + + Indicates if the control should update effects when you scroll content. +FMX.Layouts.TFramedScrollBox.IsOpaque inherits from FMX.Layouts.TCustomScrollBox.IsOpaque. All content below this line refers to FMX.Layouts.TCustomScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + + + Represents a TFramedScrollBox with an applied framedscrollboxstyle style lookup. + + + Indicates if the control should update effects when you scroll content. +FMX.Layouts.TFramedVertScrollBox.IsOpaque inherits from FMX.Layouts.TCustomScrollBox.IsOpaque. All content below this line refers to FMX.Layouts.TCustomScrollBox.IsOpaque. +Indicates if the control should update effects when you scroll content. +Its default value is False, meaning that the control does not update effects. +In the TFramedScrollBox and TFramedVertScrollBox classes IsOpaque returns True. + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.Layouts.TFramedVertScrollBox.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + + + A control that arranges child controls in a grid of equally sized cells. +A TGridLayout grid layout is a container for graphical objects that can arrange the objects it contains in a grid, as shown in the following image: + + +The children of a TGridLayout are resized to fit the sizes specified through the ItemHeight and ItemWidth properties. If the orientation is set to Horizontal, the child controls of a TGridLayout are lined one by one until the width of the layout is exceeded when a new line is added to the grid. If the orientation is set to Vertical, the child controls of a TGridLayout are positioned one under another until the height of the layout is exceeded when a new column is added to the grid. +However, you can customize sizes of child controls using the Margins properties of child controls. For example, the following image demonstrates the usage of different margins for Button5, Button6, Button7, and Button8 child controls: + + +Here we set: + +The Top and Bottom margins for Button5. +The Left margin for Button6. +All four Top, Left, Right, and Bottom margins for Button7. +The Top and Left margins for Button8. +Look how child controls are resized and positioned inside the respective grid cells. + +Note: The Align property of the controls within a TGridLayout is ignored. The Position, Height, and Width properties for child controls are automatically set, and explicitly changing their values has no effect. + + + Performs the alignment of a FireMonkey control. +FMX.Layouts.TGridLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TGridLayout.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the control's surface. +FMX.Layouts.TGridLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TGridLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Specifies the height of each cell that holds an item in a grid layout control. +Use ItemHeight in combination with ItemWidth in order to change the aspect ratio of the graphical objects that are part of this grid layout. + + + Specifies the width of each cell that holds an item in a grid layout control. +Use ItemWidth in combination with ItemHeight in order to change the aspect ratio of the graphical objects that are part of this grid layout. + + + Specifies the orientation of the graphical controls that are part of this grid. +The Orientation property can be set to either Horizontal or Vertical in order to change the grid's orientation (and the position of the graphical objects in this grid) to either horizontal (left to right) or vertical (top to bottom). + + + + + Implements a grid panel layout control in which each component is placed within a cell on a grid panel. +In a TGridPanelLayout layout, you specify the number of rows and columns on the grid panel, then each component is placed into the next available cell in the grid panel, regardless of where you place it with the mouse. If each grid panel layout's cell already contains a control and you add more controls, the location for the new controls is determined by the ExpandStyle property. For example, using the default AddRows value of the ExpandStyle property, a new row is added to the grid panel, and each cell in this row can contain a new control. +TGridPanelLayout layouts provide the following behavior: + +You can explicitly set the Height, Width, Align, and Anchors properties of child controls to manually resize and align child controls placed inside cells on a TGridPanelLayout layout: + +You can specify that a child control can span on several merged cells. For example, look at the following figure: + +Here, the B4 button spans on two cells in the rightmost column, the B5 button occupies four cells in two rows and two columns and the B8 button occupies three cells in the bottom row. +To specify that a child control can span on several cells you can use the following trick: + +In the Structure view, locate the desired TGridPanelLayout layout node. +Under this node, locate the respective Control Collection node. +Among control items in this Control Collection, select the control item associated with the desired child control. The Object Inspector shows the properties of this control item. +In the ColumnSpan property, type the number of cells that can be occupied be the control item in the respective column (specified in the Column property). +In the RowSpan property, type the number of cells that can be occupied by the control item in the respective row (specified in the Row property). + + + Performs the alignment of a FireMonkey control. +FMX.Layouts.TGridPanelLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TGridPanelLayout.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Processes the painting of the control. +FMX.Layouts.TGridPanelLayout.DoPaint inherits from FMX.Controls.TControl.DoPaint. All content below this line refers to FMX.Controls.TControl.DoPaint. +Processes the painting of the control. +This method is called internally from PaintTo and PaintChildren. DoPaint defines the drawing area by clipping the Canvas to the areas occupied by the control and its children, paints the children and then the control itself. The call to DoPaint is always preceded by a call to Painting and succeeded by a call to AfterPaint. + + + OnResize event dispatcher. +FMX.Layouts.TGridPanelLayout.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TGridPanelLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.Layouts.TGridPanelLayout.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Keeps the TColumnCollection column collection in the TGridPanelLayout grid panel layout. +The Count property of ColumnCollection defines the number of columns in TGridPanelLayout. + + + Keeps the TControlCollection control collection of TControlItem control items. +Use ControlCollection to add, remove, or access control items in the collection of controls in a TGridPanelLayout grid panel layout. Each control item is identified by its Row and Column properties. + + + Specifies whether to add a row or column to a filled grid panel layout to accommodate additional controls. +The meanings of the options are: + + + +Value + +Meaning + + + +AddRows + + + +TGridPanelLayout is expanded vertically -- only rows are added. + + + + +AddColumns + + + +TGridPanelLayout is expanded horizontally -- only columns are added. + + + + +FixedSize + + + +TGridPanelLayout has a fixed number of rows and columns given by the Count property of both the ColumnCollection and RowCollection collections. + + +The property is used when a new control is added to the ControlCollection using +AddControl with the AColumn and ARow parameters set to -1. For example: + +GridPanelLayout1.ControlCollection.AddControl(AControl,-1,-1); + +where AControl is the control to add to the GridPanelLayout1 grid panel layout. + + + Keeps the TRowCollection row collection in the TGridPanelLayout grid panel layout. +The Count property of RowCollection defines the number of rows in TGridPanelLayout. + + + + + A control that arranges its child controls as if they were words in a paragraph. +The children of a TFlowLayout are lined one by one. When the Width of the layout is exceeded, the remaining child controls are wrapped to the next line and so on until all of the controls are placed. To add a line break, like in a normal text, add a TFlowLayoutBreak to the current TFlowLayout. +The direction of the controls flow can be from left to right or from right to left. To change the direction, set the FlowDirection property. Changing the direction does not change the line of the control, only the order of the controls on each line. +The distance between controls from the same line and the distance between lines can be customized by setting the HorizontalGap and VerticalGap properties. +The TFlowLayout children can be aligned as words in a paragraph: left, right, center, or justified. The alignment can be customized through the Justify property. The alignment of the last line within the layout is treated separately, and can be set through the JustifyLastLine property. If there is a single line, Justify has no effect, the line is treated as a last line, and is aligned according to JustifyLastLine. + +Note: The Align property of the controls within a TFlowLayout is ignored. The Position property for child controls is automatically set, and explicitly changing its value has no effect. +The TFlowLayout can be used to obtain this kind of results: + + + Performs the alignment of a FireMonkey control. +FMX.Layouts.TFlowLayout.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.Layouts.TFlowLayout.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Renders the control's surface. +FMX.Layouts.TFlowLayout.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Setter function for the Justify property. Value specifies the new value of the Justify property. + + + Setter function for the JustifyLastLine property. Value specifies the new value of the JustifyLastLine property. + + + Setter function for the FlowDirection property. Value specifies the new value of the FlowDirection property. + + + Setter function for the HorizontalGap property. Value specifies the new value of the HorizontalGap property. + + + Setter function for the VerticalGap property. Value specifies the new value of the VerticalGap property. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.Layouts.TFlowLayout.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Specifies the justification of all the lines within TFlowLayout, except the last line. +If there is a single line, Justify has no effect, the line is treated as a last line, and is aligned according to JustifyLastLine. + + + Specifies the justification of the last line of a TFlowLayout. +If there is a single line, Justify has no effect, the line is treated as a last line, and is aligned according to JustifyLastLine. + + + Specifies the direction in which the controls are arranged within the TFlowLayout lines. +The direction of the controls flow can be from left to right or from right to left. Changing the direction does not change the line of the control, only the order of the controls on each line. + + + +Value + +Result + + + +LeftToRight + + + + + + + + +RightToLeft + + + Specifies the minimum distance between two adjacent child controls of a TFlowLayout. +If HorizontalGap has a negative value, the child controls are overlapped following the direction specified by the FlowDirection property. + + + +Gap and direction + +Result + + + +Positive Gap + + + + + + + + +Negative Gap; Direction=LeftToRight + + + + + + + + +Negative Gap; Direction=RightToLeft + + + Specifies the minimum distance between two adjacent lines of a TFlowLayout. +If the VerticalGap has a negative value, the lines are overlapped. + + + +Gap + +Result + + + +Positive Gap + + + + + + + + +Negative Gap + + + + + TOpenDialog is a class used to display a file-selection dialog. +Use TOpenDialog to display a dialog box for selecting and opening files. +When the user clicks the Open button, the dialog closes and the selected files are stored in the Files property. + +Note: The dialog does not appear at run time until it is activated by a call to the Execute method. + + + OnCanClose event dispatcher. +DoCanClose is called automatically when the user closes the dialog. +DoCanClose returns True (by default) to allow closing the dialog or False to prevent the dialog from closing. +DoCanClose executes the handler of the OnCanClose event if defined and allows you to set the CanClose parameter of the OnCanClose event handler to True or False. DoCanClose returns the value that CanClose has after the event handler finishes. + + + OnSelectionChange event dispatcher. +DoSelectionChange is called automatically whenever the file selection is changed. +DoSelectionChange executes the handler of the OnSelectionChange event if defined. + + + OnFolderChange event dispatcher. +DoFolderChange is called automatically when the directory whose contents are displayed in the dialog changes. +DoFolderChange executes the handler of the OnFolderChange event if defined. + + + OnTypeChange event dispatcher. +DoTypeChange is called automatically when the selection from the type combo box in the dialog is changed. +DoTypeChange executes the handler of the OnTypeChange event if defined. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Dialogs.TOpenDialog.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Displays the dialog box. +FMX.Dialogs.TOpenDialog.DoExecute inherits from FMX.Dialogs.TCommonDialog.DoExecute. All content below this line refers to FMX.Dialogs.TCommonDialog.DoExecute. +Displays the dialog box. +For TCommonDialog, DoExecute does nothing. +TCommonDialog descendants override the DoExecute method in order to properly display the required dialog box. DoExecute returns a Boolean value, usually True if the user has clicked OK, and False otherwise. + +Note: DoExecute is a protected method for TCommonDialog descendants; therefore, to display the dialog box, call Execute instead. + + + Creates and initializes a TOpenDialog instance. +Create generates a TOpenDialog instance, but the new dialog does not appear on the form at runtime until the Execute method is called. +AOwner is the component that is responsible for freeing the TOpenDialog instance. It becomes the value of the Owner property. + + + Destroys the TOpenDialog object and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free calls Destroy if the TOpenDialog reference is not nil. + + + Represents the list containing the absolute paths of the selected files. +Files represents a string list that contains the absolute path of each selected file. + +Note: In order for the user to select multiple files, set the ofAllowMultiSelect flag in Options. + + + Maintains a list of the previously selected files. Obsolete property. +HistoryList is maintained for compatibility with older versions of TOpenDialog. It is not used. + + + Specifies a default file extension. +DefaultExt specifies a file extension that is appended automatically to the selected file name, unless the selected file name already includes a registered extension. +Extensions longer than three characters are not supported. Do not include the period (.) that separates the file name from the extension. + + + Indicates the absolute path for the last file selected. +The FileName represents the absolute (full) path of the file most recently selected from the dialog. The value of FileName is the same as the first item in the Files property. + + + Represents the file masks (filters) of the dialog. +The file-selection dialog includes a drop-down list of file types on the left of the 'File Name:' edit box. When the user picks a file type from the list, only files of the selected type are displayed in the dialog. You can select only one filter at a time. +In order for Filter to work properly, the assigned string must be formatted as follows: +'<first displayed name>|<first file extension>|<second displayed name>|<second file extension>|...|<n-th displayed name>|<n-th file extension>' +For example, the next code sample will add filters for text and executable files: + + OpenDialog1.Filter:='Applications (*.exe)|*.EXE|Text files (*.txt)|*.TXT'; + + + Determines which filter is selected by default when the dialog opens. +FilterIndex determines which of the file types in Filter is selected by default when the dialog opens. Set FilterIndex to 1 to choose the first file type in the list as default, 2 to choose the second file type as the default, and so on. If the value of FilterIndex is out of range, the last file type listed in Filter is selected by default. + + + Determines which directory is selected by default when the dialog opens. +InitialDir determines the default directory displayed in the file-selection dialog when it opens. +If no value is assigned to InitialDir, or the specified directory does not exist, the initial directory is controlled by a special registry key assigned to your application. + +Note: For Windows, the registry key can be found at HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU\. + + + Determines the appearance and behavior of the file-selection dialog. +Use the Options property to customize the appearance and functionality of the dialog. + + + Augments the Options property with additional flags that determine the appearance and behavior of the file selection dialog. +Use the OptionsEx property to further customize the file open dialog beyond the options covered by the Options property. + + + Specifies the text displayed in the dialog's title bar. +Use Title to set the text that appears in the file-selection dialog's title bar. If no value is assigned to Title, the dialog's title is "Open". + + + Occurs when the user tries to close the dialog. +Write an OnCanClose event handler to provide custom validation of the value of FileName. File selection dialogs provide a number of built-in validations, such as checking for invalid characters, prompting for confirmation before overwriting, checking whether a file or path exists, and so on. These validations can be specified using the Options property. However, applications can provide additional validation of file names in an OnCanClose event handler. +Set the CanClose parameter to False to prevent the dialog from closing. The OnCanClose event handler is responsible for telling the user why the dialog doesn't close. + + + Occurs when the current work directory from the dialog is changed. +The OnFolderChange event occurs when the user changes the directory whose contents are displayed in the dialog. This can happen when the user double-clicks a directory, clicks the Up arrow, or uses the list box at the top of the dialog to navigate through the directory structure. + + + Occurs when file names displayed in the dialog are changed. +The OnSelectionChange event occurs whenever the file selection is changed. This can include opening the file-selection dialog box, highlighting a file or directory, selecting a new filter, selecting a new directory, or creating a new folder. +The currently selected file is stored in the FileName and Files properties. Files is used for multiple file selection. +The Sender parameter is an instance of the TOpenDialog. + + + Occurs when the selection from the type combo box in the dialog is changed. +The OnTypeChange event occurs when the user selects a new filter from the Type combo box at the bottom of the dialog. This includes the moment when the TOpenDialog is displayed. + + + + + A search edit control. +TSearchBox is an edit control that provides search capabilities such as filtering the result in the parent. + + + Returns the name of the default presentation proxy that your presented control uses. +FMX.SearchBox.TSearchBox.DefinePresentationName inherits from FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefinePresentationName. +Returns the name of the default presentation proxy that your presented control uses. +You can handle OnPresentationNameChoosing to specify a presentation proxy name to use instead of the name that DefinePresentationName returns. +DefinePresentationName calls TPresentationProxyFactory.GeneratePresentationName and returns a generated presentation proxy name based on the class name of the presented control and the control type (Styled or Platform) of the presentation layer. For example: + + + +Class name + +Control type + +Result + + +TMyPresentedControl + +Styled + +"MyPresentedControl-Styled" + + +TMyPresentedControl + +Platform + +"MyPresentedControl-Platform" + + See Also +System.TObject.ClassName +FMX.Controls.Presentation.TPresentedControl.ControlType +FMX.Presentation.Factory.TPresentationProxyFactory.Register +FMX.Controls.Presentation.TPresentationProxy +FMX.Controls.Presentation.TPresentedControl.OnPresentationNameChoosing +FMX.Controls.Presentation.TPresentedControl.LoadPresentation + + + Returns a class reference to a data model of this presented control. +FMX.SearchBox.TSearchBox.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. +FMX.SearchBox.TSearchBox.ParentChanged inherits from FMX.Controls.Presentation.TPresentedControl.ParentChanged. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ParentChanged. +Sends a PM_REFRESH_PARENT message to the presentation layer through its presentation proxy when the parent of this control changes. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.ParentChanged +FMX.Controls.Presentation.TPresentedControl.AncestorParentChanged + + + Creates a new instance of TPresentedControl. +FMX.SearchBox.TSearchBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + The data model representing the data used by the presentation of the current control. +FMX.SearchBox.TSearchBox.Model inherits from FMX.Controls.Presentation.TPresentedControl.Model. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Model. +The data model representing the data used by the presentation of the current control. +The constructor of your presented control creates a data model for your presented control. The class of the data model is the class that DefineModelClass returns. + + See Also +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Presentation +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.DefineModelClass + + + Event handler for setting the custom filter on the text of TSearchBox. + + + + + + + + Returns window scale factor. + + + Returns True if Scale is integer value. + + + Window scale factor. + + + + + Specifies the bounds for a control. +TBounds is used in the Margins and Padding properties of TControl and its descendants. TBounds help define the relative position between components on a form, and between the edges of the form and the component. For example, when you set the left bound for a component to 10 pixels, the component will not come closer than 10 pixels to the edge of the container, or to another component on the left edge. The number of pixels by which two components are separated is the sum of the pixels of both components. +You can define the amount of margin that should surround the component on the Top, Left, Bottom, or Right by changing the pixel value for the Margins and Padding properties in the Object Inspector. +Margins and Padding depend on the Align property. To see the effect, set the Margins property on a parent control and set the Align property for the child control to vaClient. + + + Reads and writes otherwise unpublished data the same as a property. + + + Embarcadero Technologies does not currently have any additional information. + + + Constructs a TBounds object and initializes its data before the object is first used. + + + Copies the contents of another similar object to the current instance. + + + Checks whether the current instance and the Obj parameter are equal. +FMX.Types.TBounds.Equals inherits from System.TObject.Equals. All content below this line refers to System.TObject.Equals. +Checks whether the current instance and the Obj parameter are equal. +The function has one Obj parameter of the TObject type. +By default, the Equals method shows whether the addresses corresponding to the current object and the Obj object are identical. The method returns a boolean value that represents the equality between the two addresses. + + +Note: Equals is supposed to be overridden in user-derived classes, to provide consumer objects with an equality determining function. +For example, in the FMX.Types.TBounds class, Equals also returns True if the Rect properties of the current object and of the Obj object are equal. In the FMX.StdActns.TBaseValueRange class, Equals also returns True if all the properties of the current object and of the Obj object are equal. + + + Returns a rectangle defined by the current Rect property and the R parameter. +The PaddingRect function returns a rectangle calculated by adding the Left and Top values and subtracting the Right and Bottom values of the current Rect to or from the corresponding values of the specified R rectangle. +For example, if the current Rect is (10, 20, 50, 30) and R is (20, 10, 40, 50), the result of PaddingRect is (30, 30, -10, 20). See also Padding. + + + Returns a rectangle defined by the current Rect property and the R parameter. +The MarginRect function returns a rectangle calculated by adding the Left and Top values and subtracting the Right and Bottom values of the current Rect to or from the corresponding values of the R rectangle. +For example, if the current Rect is (10, 20, 50, 30) and R is (20, 10, 40, 50), the result of MarginRect is (30, 30, -10, 20). See also Margins. + + + Returns the width of the Rect, as the difference between the Right and Left values. + + + Returns the height of the Rect, as the difference between the Bottom and Top values. + + + Specifies the bounds as a rectangle. +Use the Rect property to set and get the margins. + + + Specifies the default value for the margins. +DefaultValue is automatically set when creating the TBounds instance. + + + Returns True if either the Width or Height of the Rect are empty, and False otherwise. + + + Returns True when the Left, Right, Top, and Bottom properties are simultaneously 0. + + + Returns a string containing the class name. +FMX.Types.TBounds.ToString inherits from System.TObject.ToString. All content below this line refers to System.TObject.ToString. +Returns a string containing the class name. +By default, the ToString returns a string containing the class name of the instance that is being called. +For example, calling ToString on a TButton instance returns a string containing "TButton". + +Note: ToString is intended to be overridden in user-derived classes, to provide consumer objects with a string representation. + + + Specifies the left edge of the margin. +Use the Left property to set and get the left edge of the margin. + + + Specifies the top edge of the margin. +Use the Top property to set and get the top edge of the margin. + + + Specifies the right edge of the margin. +Use the Right property to set and get the right edge of the margin. + + + Specifies the bottom edge of the margin. +Use the Bottom property to set and get the bottom edge of the margin. + + + + + Used for specifying a control's position inside a form. +A TPosition object is used for representing the position of a control inside its parent, or anywhere related X and Y values are needed. The position can be specified through the X and Y values, as a Point. + + + Provides methods to read and write unpublished data. +DefineProperties is implemented so that the position is written as a single string in the .fmx, not as separate X and Y values. +DefineProperties uses the methods of the filer passed as the Filer parameter to assign methods that can load and save the Point property. +Override DefineProperties to persist unpublished properties. Call the DefineBinaryProperty or DefineProperty method of the Filer parameter to assign methods that load or save property values. + +Note: When overriding this method, call the parent class' DefineProperties method first. + + + Reads the coordinates of a point from the given Reader. +ReadPoint transforms the string data from the TReader given as a parameter into TPointF properties and assigns them to the Point property. + + + Writes the properties of the current Point into the given TWriter object. +WritePoint transforms the properties of Point into a string and writes the result in the TWriter given as a parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates and initializes a TPosition instance. +Create generates a new TPosition instance. Create requires a default TPointF value as a DefaultValue for the position. The DefaultValue is usually (0,0), but can have other values also. If the position is the same as the default value, it is not stored in the .fmx file. + + + Copies the contents of another similar object to the current one. +Assign copies the properties from another TPosition instance. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns True if the components are the default ones, False otherwise. +Empty returns True if the X and Y coordinates are both the same as described by the DefaultValue property, False otherwise. + + + Returns the reflection of the current vector across a specified line. +Use the Reflect function to obtain the reflection of the current position across the perpendicular on the point given as parameter. + + + Specifies the coordinates of the current object as a point. +Use the Point property to specify the coordinates of a TPosition object as a point. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the default coordinates of the current object. +Use the DefaultValue property to receive the default coordinates of a TPosition object. + + + Specifies the horizontal coordinate of the object. +Use the X property to receive or to set the horizontal coordinate of the current TPosition object. + + + Specifies the vertical coordinate of the object. +Use the Y property to receive or to set the vertical coordinate of the current TPosition object. + + + + + Used for storing the size of FireMonkey components. +A TControlSize object is used for managing the size of the component. This can be specified through the Size, Width, Height, and PlatformDefault attributes. + + + Dispatcher of the OnChange event. + + + Creates an instance of TControlSize. + + + Copies the contents of another similar object. +FMX.Types.TControlSize.Assign inherits from System.Classes.TPersistent.Assign. All content below this line refers to System.Classes.TPersistent.Assign. +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + Sets the value of the PlatformDefault property without triggering the OnChange notification. This method should be used only in cases where the OnChange notification is triggered by some other mechanism. + + + Sets the Size property to the height and width values of TSizeF and the PlatformDefault property to False. +These changes do not cause any notification. You can change instead the Size and PlatformDefault properties directly, what calls the OnChange event. +This method should be used only in cases where the OnChange notification is triggered by some other mechanism. + + + Represents the default values of the TControlSize Height, Width, and PlatformDefault variables. + + + Sets or gets the width and height of a control as a <TSizeF> record. +Using this method to set the Width and Height allows both dimensions to be updated while triggering only one OnChange notification. + +Note: Setting this property will set PlatformDefault to False. + + + Describes the width of a TControlSize. +Use this property to set or get the width for a TControlSize. + + + Describes the height of a TControlSize. +Use this property to set or get the height for a TControlSize. + + + When this property is set to True, the size and width of the control are set automatically based on pre-defined sizes for the active platform. +Explicitly setting the Width or Height properties automatically sets the PlatformDefault setting to False. + +Note: Changing the value of PlatformDefault triggers an OnChange notification. + + + + + + + + hide the caret + + + if possible (CanShow = True and Visible = True), the caret show. + + + This method is performed after changing the Displayed + + + The update of the "Flasher", if UpdateCount = 0. + + + This property controls the visibility of a caret, for the control in which the input focus. + + + The function returns true, if the control is visible, enabled, + has the input focus and it in an active form + + + This property is set to True, after the successful execution of + method Show, and is set to False after method Hide + + + If this property is 'true', the blinking control is invisible + and does not take values of Visible, Displayed. + When you change the properties, methods DoShow, DoHide, DoDisplayChanged not met. + + + Blinking visual component is displayed. + Usually this line, having a thickness of one or two pixels. + + + + + + + + Marks index for lazy update. + + + Updates index, if it's required only. + + + Clears index. + + + + + The base class for FireMonkey components. +TFmxObject extends TComponent to provide low-level functionality to FireMonkey components, including: + +Creating, destroying, and releasing objects +Cloning, storing, and loading objects from a stream +Child object manipulations (add, remove, search) +Free notifications +Support for FireMonkey styles +Support for FireMonkey animations + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the first item in the children list. This value is usually 0, but for styled objects, which have a style as the first object in the children list, this value is 1. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.Types.TFmxObject.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Embarcadero Technologies does not currently have any additional information. + + + Enumerates all child components. +FMX.Types.TFmxObject.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Sets the parent component. +FMX.Types.TFmxObject.SetParentComponent inherits from System.Classes.TComponent.SetParentComponent. All content below this line refers to System.Classes.TComponent.SetParentComponent. +Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + Forwards notification messages to all owned components. +FMX.Types.TFmxObject.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Calls the action link's Update method if the control is associated with an action link. Override it to customize the way the styled control initiates its associated action. + + + TBasicAction.OnChange event dispatcher. +DoActionChange is called when a TBasicAction.OnChange event occurs. +Do not call DoActionChange explicitly in an application. It is for internal use. + + + Specifies the behavior of a TFmxObject object when Action changes. +By default, ActionChange does nothing. +In descendant classes, for example in descendants of TControl, to customize the behavior of a control when Action changes, override TControl.ActionChange. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the action associated with the control. +Action allows an application to centralize the response to user commands. When a control is associated with an action, the action determines the appropriate properties and events of the control (such as whether the control is enabled or how it responds to an OnClick event). +If an object of the descendant from the TFmxObject class does not support actions, and when this object tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass that should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the containing component. +FMX.Types.TFmxObject.GetParentComponent inherits from System.Classes.TComponent.GetParentComponent. All content below this line refers to System.Classes.TComponent.GetParentComponent. +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + Verifies whether the component has a parent. +FMX.Types.TFmxObject.HasParent inherits from System.Classes.TComponent.HasParent. All content below this line refers to System.Classes.TComponent.HasParent. +Verifies whether the component has a parent. +Call HasParent to determine whether a specific component has a parent. +Derived classes override this method to implement proper handling for parenting. +Use GetParentComponent to retrieve the component reference. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected setter implementation for the Parent property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Notification method called after the parent is changed. ParentChanged is a virtual method to be implemented in subclasses to allow for changing the parent of this FMX object. + + + Notification method called after the creation order is changed. ChangeOrder is a virtual method to be implemented in subclasses to allow for changing the creation order of this FMX object. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Ensures that AComponent is notified that the component is going to be destroyed. +FMX.Types.TFmxObject.FreeNotification inherits from System.Classes.TComponent.FreeNotification. All content below this line refers to System.Classes.TComponent.FreeNotification. +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +FMX.Types.TFmxObject.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +FMX.Types.TFmxObject.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs any necessary actions before the first destructor is called. +FMX.Types.TFmxObject.BeforeDestruction inherits from System.Classes.TComponent.BeforeDestruction. All content below this line refers to System.Classes.TComponent.BeforeDestruction. +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Warning: Release is deprecated. + + +Marks this TFmxObject object for delayed deletion. + + + Sets the Root property of each child in the children list. + + + Sets the csDesigning in TComponentState. Used internally by the IDE. + + + Returns a new cloned instance of this FMX object. +Clone internally creates and returns a new FMX object that is an exact copy of this object. + +Note: The class you want to clone must be registered and be a descendant of TFmxObject. Use RegisterClass or RegisterFMXClasses for your components. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +AddObject internally calls DoAddObject that implements all business functionality of AddObject. +AddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). AddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then AddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. + + + Adds the object provided in the parameter to the FChildren TList of this object (self), at the specified position (index). +The InsertObject method is similar to the AddObject method, except that InsertObject inserts the given object to the given position specified by the Index parameter. + + + Removes a children object from its parent. Calling RemoveObject is equivalent to setting Parent to nil. +RemoveObject has two overloaded methods. The first one removes the object specified through the AObject parameter, which is of type TFmxObject. The second one removes the object whose index is specified through the Index parameter. + +Tip: If you want to use RemoveObject on an object, that object must have been added to the children list through the AddObject method. + + + Removes a children object from its parent. Calling RemoveObject is equivalent to setting Parent to nil. +RemoveObject has two overloaded methods. The first one removes the object specified through the AObject parameter, which is of type TFmxObject. The second one removes the object whose index is specified through the Index parameter. + +Tip: If you want to use RemoveObject on an object, that object must have been added to the children list through the AddObject method. + + + Returns True if the specified object is a direct child. +ContainsObject returns True if the specified object (AObject) is a direct child of this TFmxObject (self). It returns False otherwise. +Unlike IsChild, ContainsObject only returns True when passed a direct child of this object as AObject. For example, if A is a direct child of this object, and B is a direct child of A, ContainsObject returns True when passed A as AObject, but it returns False when passed B. + + + Exchanges two objects from the children list. Exchange exchanges AObject1 with AObject2. + + + Deletes all the children of this FMX object. +DeleteChildren checks whether Children is assigned (children are present) and, if so, it deletes all of them. DeleteChildren also sets Children to nil. + + + Returns True if the specified object is a child. +IsChild returns True if the specified object (AObject) is a child of this TFmxObject (self) or any of its children, grand-children, etc. It returns False otherwise. +Unlike ContainsObject, IsChild not only returns True when passed a direct child of this object as AObject, but also when the specified object is a grand-child, grand-grand-child, and so on of this object. For example, if A is a direct child of this object, and B is a direct child of A, IsChild returns True both when passed A as AObject and when passed B. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Brings this FMX visual object on top of other overlapping visual controls that are on the same form. +You can call BringToFront at run time as in the following code snippet: + + Label1.BringToFront; + +or, at design time, by right-clicking the FMX visual control and selecting Control > Bring to Front from the pop-up menu. + + + Sends this FMX visual object to the background letting other overlapping visual controls that are on the same form to be on top of it. +You can call SendToBack at run time as in the following code snippet: + + Label1.SendToBack; + +or, at design time by right-clicking the FMX visual control and selecting Control > Send To Back from the pop-up menu. + + + Adds the children of this object to the given list. +The AddObjectsToList method adds all objects that are owned by this object (stored in the Children field) and all of the objects owned by them to the TList provided in the AList parameter. + + + Sorts the children in the children list using the specified sorting procedure. + + + Loops through the children of this object, and runs the specified procedure once per object as the first parameter in each call. + + + Stops the animation of the specified property of this FMX object. +StopPropertyAnimation iterates through all the children of this FMX object and, if one of them is of type TFloatAnimation or TColorAnimation and is assigned to the specified property (APropertyName), stops the animation. + + + Adds AObject to the list of objects to be notified when this TFmxObject is destroyed. +The AObject parameter can be any object that implements the IFreeNotification interface, such as a TBrushResource, or a TBrushBitmap. + + + Removes the given object from the free notifications list. +The RemoveFreeNotify method removes the object specified through the AObject parameter, which is of type TFmxObject. + +Tip: If you want to use RemoveFreeNotify on an object, that object must have been added to the free notifications list using the AddFreeNotify method. + + + Returns the style resource object with the specified (AStyleLookup). +If AStyleLookup is empty, FindStyleResource returns nil. If no resource object is linked directly to the control, FindStyleResource looks for the styles of the control's children. If no resource object is found, it returns nil. +Clone determines whether the returned style resource object should be the original style object (False) or a copy of the original (True). + + + Specifies the root parent of this object. +The Root property is a link to the root parent of this object. +By default, the root object is the youngest parent in the hierarchy of the object parents, which supports the IRoot interface. If no parent supports IRoot, then Root = nil. +Notice that a Root object provides the Focused, Hovered, and Captured properties. Therefore, among the Children of the Root object, at each moment, there can only be one: + +Focused control. +Control that has captured the mouse. +Control over which the mouse is hovering. + + + Specifies whether this object is stored in the .XFM file. +Set the Stored property to True to store the object in the .XFM file. Otherwise, set Stored to False. + + + Custom property that stores any object value. + + + Custom property that stores any floating-point value. + + + Custom property that stores any string value. + + + Read-only property that specifies the number of children in the children list. + + + Stores an array of children attached to this parent component. +Use the Children property to access each of the children attached to this parent component. + + + Stores a Tvalue, which is a data structure that can store different kinds of data types. +Data has no predefined meaning. Although Data is used for LiveBinding, any succesor override this behavior. Then, the behaviour of Data is based on the type of its value. + +Note: Do not use this member. It is for internal use only. + + + Specifies the parent component of this FMX object. + +Tip: You cannot set the parent of this component as the component itself (Self (Delphi) or this (C++Builder)). + + + Specifies the index of the child object in the children array attached to this object. + + + Specifies whether the component object has an associated action. +If ActionClient is True, this component object is the client of an associated action. +If ActionClient is False, this component object is not the client of an action. +This property can be checked before calling GetActionLinkClass. + + + Specifies the style name for this FMX component. +Read or set the StyleName property to obtain or to set the name of the style for this FireMonkey component. For instance, a TRectangle object can have StyleName set to 'backgroundstyle' or 'panelstyle'. + + + + + Represents a pop-up menu attachable to graphical controls that support pop-up menus. +The TTextService virtual abstract class represents a pop-up context menu that can be attached to any FireMonkey graphical control that support pop-up menus, such as TImageControl, TPanel, and so on. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs just before the pop-up menu appears. +Write an OnPopup event handler to take specific action just before the pop-up menu appears. For example, use an OnPopup event handler to set the Checked, Enabled, or Visible property of individual items in the menu so that they are appropriate to the PopupComponent. + + + Displays the pop-up menu onscreen. +TCustomPopupMenu descendants implement Popup so that it brings up the pop-up menu onscreen. The menu appears at the screen coordinates indicated by the values (in pixels) of X and Y. + + + Specifies the control for which the current object is a context menu. +Set the PopupComponent value to a control so that the current object will be a context menu for that control. The context menu for a control will appear when you right-click that control. + + + + + + + + Referece to the logger service. + + + Log a debug message. Same arguments as Format. + + + Log a simple debug message. + + + Log a debug message with Tag, object data of Instance, Method that invokes the logger and message Msg. + + + Log a debug message with Tag, object data of Instance and a message Msg + + + Log a time stamp with message Msg + + + Perform a timed execution of Func and print execution times, return function result. + Proc receives a parameter TLogToken which can be used to mark specific points where timestamps should be taken + in addition to complete procedure time. + + + A convenience variant of Trace<TResult> when token is not needed. + + + A convenience variant of Trace<TResult> for procedures. + + + A convenience variant of Trace<TResult> for procedures when token is not needed. + + + Get a basic string representation of an object, consisting of ClassName and its pointer + + + Get a string representation of array using MakeStr function to convert individual elements. + + + Get a string representation of array using TObject.ToString to convert individual elements. + + + Dump complete TFmxObject with all its children. + + + + + + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.THintAction.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + Responds when a client control "fires". +FMX.StdActns.THintAction.Execute inherits from FMX.ActnList.TCustomAction.Execute. All content below this line refers to FMX.ActnList.TCustomAction.Execute. +Responds when a client control "fires". +Execute is called automatically when a client control "fires" (for example, when the user clicks a button or selects a menu item). +Execute first ensures that the action is updated. Then Execute calls the inherited System.Classes.TBasicAction.Execute method. System.Classes.TBasicAction.Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called and the action is Enabled. Otherwise, Execute returns False. + + + + + A base class for standard actions that provides system functionality. +TSysCommonAction extends the TCustomAction class redeclaring properties and events, used in system actions, with the published visibility. +These are the following: CustomText, Enabled, HelpContext, HelpKeyword, HelpType, Hint, SecondaryShortCuts, ShortCut, Visible, UnsupportedArchitectures, OnCanActionExec, OnUpdate. +The published scope of properties and events provides the possibility to use the Object Inspector for editing values of these properties and defining event handlers at design time. +Standard actions descending from TSysCommonAction are the following: + +TFileExit +TWindowClose +TFileHideApp +TFileHideAppOthers. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TSysCommonAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + The event handler of this event can be used for confirmation that the user really wants to accomplish an action. +In descendant classes, the OnCanActionExec event handler can be used to get the user confirmation about executing the corresponding action. For example, in TFileExit, the event handler of this event can be used for confirmation that the user really wants to close an application. You can analyze the value of the ShortCutPressed property to define whether the event is activated by pressing a keyboard key or by mouse clicking. + + + + + The standard action for shutting down the current application. +Add TFileExit to an action list to let users shut down the application using a menu, control, toolbar button, or shortcut. Clients (controls, menu commands, toolbar buttons) linked to this action cause the application to shut down. +TFileExit is not immediate, it calls the method like Terminate that closes the main form. +The default ShortCut for TFileExit is CMD+Q. + + + Returns True if this action can be realized on the current platform. +FMX.StdActns.TFileExit.IsSupportedInterface inherits from FMX.ActnList.TCustomAction.IsSupportedInterface. All content below this line refers to FMX.ActnList.TCustomAction.IsSupportedInterface. +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TFileExit.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.StdActns.TFileExit.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TFileExit.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TFileExit.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + + + The standard action for closing an active modeless form. +TWindowClose is not immediate, it calls the Close method that closes the active modeless form. +The default ShortCut for TWindowClose is CMD+W. + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.StdActns.TWindowClose.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TWindowClose.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TWindowClose.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TWindowClose.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TWindowClose.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + The standard action for hiding and showing (if hidden) a running macOS application. +TFileHideApp hides all windows of the receiver application, and the next application in line is activated. If the windows of the receiver application are hidden, then TFileHideApp restores the hidden windows to the screen and makes the receiver active. +The default ShortCut for TFileHideApp is CMD+H. + +In the current version, TFileHideApp is implemented only for macOS. + + + Returns True if this action can be realized on the current platform. +FMX.StdActns.TFileHideApp.IsSupportedInterface inherits from FMX.ActnList.TCustomAction.IsSupportedInterface. All content below this line refers to FMX.ActnList.TCustomAction.IsSupportedInterface. +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +FMX.StdActns.TFileHideApp.HandlesTarget inherits from System.Classes.TBasicAction.HandlesTarget. All content below this line refers to System.Classes.TBasicAction.HandlesTarget. +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TFileHideApp.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TFileHideApp.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TFileHideApp.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TFileHideApp.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + The standard action for hiding all macOS applications, except the receiver. +The default ShortCut for TFileHideApp is ALT+CMD+H. + +In the current version, TFileHideAppOthers is implemented only for macOS. + + + Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TFileHideAppOthers.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Introduces an interface for a function that is called when the CustomText property for the action changes. +FMX.StdActns.TFileHideAppOthers.CustomTextChanged inherits from FMX.ActnList.TCustomAction.CustomTextChanged. All content below this line refers to FMX.ActnList.TCustomAction.CustomTextChanged. +Introduces an interface for a function that is called when the CustomText property for the action changes. +As implemented in TCustomAction, CustomTextChanged does nothing. +Descendant classes can override CustomTextChanged to provide business functionality. +The announced purpose of this method is to update the Text property when the CustomText property is changed. + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TFileHideAppOthers.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + + + A base class for actions that show a specified component when executed. +FMX.StdActns.TObjectViewAction inherits from FMX.ActnList.TCustomViewAction. All content below this line refers to FMX.ActnList.TCustomViewAction. +A base class for actions that show a specified component when executed. +Descendants of TCustomViewAction can be associated with a component that is made visible when the action executes. +TCustomViewAction extends TCustomAction declaring the component that the action shows when it executes. +TObjectViewAction extends the TCustomViewAction class that defines the FmxObject property and keeps the component value that should be the TFmxObject type object in this case. +Descendants of TObjectViewAction are associated with the TFmxObject type component that is made visible when the action executes. +TVirtualKeyboard and TViewAction are standard actions that descend from TObjectViewAction. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TCustomViewAction (and its descendants) does not distribute changes in values of Caption, Enabled, Checked, GroupIndex, ShortCut, Visible, and OnExecute properties to the respective properties of clients linked with action links. + + See Also +FMX.ActnList.TCustomViewAction.Component +FMX.Types.TFmxObject +FMX.StdActns.TObjectViewAction +FMX.ActnList.TActionLink +System.Actions.TContainedAction.Caption +System.Actions.TContainedAction.Enabled +System.Actions.TContainedAction.Checked +System.Actions.TContainedAction.GroupIndex +System.Actions.TContainedAction.ShortCut +System.Actions.TContainedAction.Visible +System.Classes.TBasicAction.OnExecute + + + Setter for the Component property. +FMX.StdActns.TObjectViewAction.SetComponent inherits from FMX.ActnList.TCustomViewAction.SetComponent. All content below this line refers to FMX.ActnList.TCustomViewAction.SetComponent. +Setter for the Component property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Keeps an FMX object (of the component) that executes an action and whose image becomes visible during the execution of the action. + + + + + Shows a component stored in the FmxObject property and shows the on-screen virtual keyboard over the surface of this component. +TVirtualKeyboard standard action is executed by clients (controls, menu commands, toolbar buttons) linked to this action, and it shows the component stored in the FmxObject property. TVirtualKeyboard shows the on-screen virtual keyboard over the surface of the shown component. +TVirtualKeyboard extends TCustomViewAction by redeclaring some public properties and events as having published visibility, which makes them editable in the Object Inspector. +The following properties are the most important: Enabled, FmxObject, ImageIndex, SecondaryShortCuts, ShortCut, Text, ShortCut, and Visible. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TVirtualKeyboard, as a descendant of TCustomViewAction, does not distribute changes of Visible, Enabled, Checked, GroupIndex, and OnExecute to the linked clients. +Virtual keyboard components are supported by so-called Platform Services. Therefore, this standard action might not be supported for some platforms. For more information, see UnsupportedArchitectures and UnsupportedPlatforms. +To display the on-screen keyboard provided by the TVirtualKeyboard component, do the following: + +Add a TActionList and a TButton to the form. +Double-click the TActionList to open the Action List editor. +Click the arrowhead beside the icon, select New Standard Action > Edit > TVirtualKeyboard, and then click OK. +In the Object Inspector, set the Action property of the TButton to be the TVirtualKeyboard you just added to the TActionList. +Run the project. +The type of the TVirtualKeyboard is set by the KeyboardType property. + +Code Examples +FMX.ScrollableForm Sample +FMX.KeyboardTypes Sample +FMX.KeyboardToolbar Sample + + + Returns True if this action can be realized on the current platform. +FMX.StdActns.TVirtualKeyboard.IsSupportedInterface inherits from FMX.ActnList.TCustomAction.IsSupportedInterface. All content below this line refers to FMX.ActnList.TCustomAction.IsSupportedInterface. +Returns True if this action can be realized on the current platform. +As implemented in TCustomAction, IsSupportedInterface always returns True. +IsSupportedInterface is virtual and can be overridden in descendent classes. + + + Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TVirtualKeyboard.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TVirtualKeyboard.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + Shows a component stored in the FmxObject property. +TViewAction standard action is executed by clients (controls, menu commands, toolbar buttons) linked to this action and it shows the TFmxObject type component stored in the FmxObject property. +TViewAction extends TCustomViewAction by redeclaring some public properties and events as having published visibility, which makes them editable in the Object Inspector. +The following properties are the most important: Enabled, FmxObject, ImageIndex, SecondaryShortCuts, ShortCut, Text, ShortCut, and Visible. +Contrary to ordinary actions (like TAction, TControlAction, TCustomValueRangeAction, and so on) TViewAction, as the TCustomViewAction descendant, does not distribute changes in Visible, Enabled, Checked, GroupIndex, and OnExecute to the linked clients. + + + Setter for the Component property. +FMX.StdActns.TViewAction.SetComponent inherits from FMX.ActnList.TCustomViewAction.SetComponent. All content below this line refers to FMX.ActnList.TCustomViewAction.SetComponent. +Setter for the Component property. + + + Introduces an interface for invoking an action on a target client component or control. +FMX.StdActns.TViewAction.ExecuteTarget inherits from System.Classes.TBasicAction.ExecuteTarget. All content below this line refers to System.Classes.TBasicAction.ExecuteTarget. +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Provides an opportunity to execute centralized code when an application is idle. +FMX.StdActns.TViewAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + + + + + + Minimum permissible value of the floating-point Value range. + + + Maximum permissible value of the floating-point Value range. + + + A changeable floating-point parameter. +The TBaseValueRange class associates a floating-point number Value to its Min and Max ranges. + + + The step of possible Value variations. +Value can be multiple of Frequency, Min, or Max. For example, if + +Min = 0.1 +Max = 2.1 +ViewportSize = 0 +Frequency = 1 + +then Value can be: + +0.1 +1 +2 +2.1 + +but it cannot be: + +Value = 1.1 + + + Used by controls such as TScrollBar to define the thumb size. +Note that the effective maximum value of Value decreases according to Max - ViewportSize. + + + Copies the contents of another similar object. +FMX.StdActns.TBaseValueRange.Assign inherits from System.Classes.TPersistent.Assign. All content below this line refers to System.Classes.TPersistent.Assign. +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + Checks whether the current instance and the Obj parameter are equal. +FMX.StdActns.TBaseValueRange.Equals inherits from System.TObject.Equals. All content below this line refers to System.TObject.Equals. +Checks whether the current instance and the Obj parameter are equal. +The function has one Obj parameter of the TObject type. +By default, the Equals method shows whether the addresses corresponding to the current object and the Obj object are identical. The method returns a boolean value that represents the equality between the two addresses. + + +Note: Equals is supposed to be overridden in user-derived classes, to provide consumer objects with an equality determining function. +For example, in the FMX.Types.TBounds class, Equals also returns True if the Rect properties of the current object and of the Obj object are equal. In the FMX.StdActns.TBaseValueRange class, Equals also returns True if all the properties of the current object and of the Obj object are equal. + + + Checks whether the values of all properties of the current object are close to the values of the corresponding properties of the specified Obj object. +This function is similar to Equals, but it uses the SameValue function to compare values. That is, if between the values there is a difference that is less than the possible rounding error, then the SameValue function estimates the values as equal and Same returns True. + + + + + + + + This virtual method fires the BeforeChange event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned BeforeChange event handler. + + + This virtual method fires the OnChanged event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned OnChanged event handler. + + + This virtual method fires the AfterChange event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned AfterChange event handler. + + + This virtual method fires the OnTrackingChange event. +In descendant classes, you can override this method to provide specific actions instead of calling an assigned OnTrackingChange event handler. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the owner of an object. +FMX.StdActns.TCustomValueRange.GetOwner inherits from System.Classes.TPersistent.GetOwner. All content below this line refers to System.Classes.TPersistent.GetOwner. +Returns the owner of an object. +GetOwner is used by the GetNamePath method to find the owner of a persistent object. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. As implemented in TPersistent, GetOwner returns nil (Delphi) or NULL (C++). +For TOwnedCollection, GetOwner returns the owner of the collection. For TCollectionItem collection items, GetOwner returns the collection object into which the collection item has been inserted. For TComponent, GetOwner returns the value of the Owner property. + + + Returns True if the corresponding property value differs from the default. +The MaxStored virtual function returns True if the Max property value differs from the default. That is, if Max <> DefaultMaxValue. The StdActns unit declares this constant as: + +DefaultMaxValue = 100.0 + + + Returns True if the corresponding property value differs from the default. +The MinStored virtual function returns True if the Min property value differs from the default. That is, if Min <> 0. + + + Returns True if the corresponding property value differs from the default. +The ValueStored virtual function returns True if the Value property value differs from the default. That is, if Value <> 0. + + + Returns True if the corresponding property value differs from the default. +The FrequencyStored virtual function returns True if the Frequency property value differs from the default. That is, if Frequency <> 0. + + + Returns True if the corresponding property value differs from the default. +The ViewportSizeStored virtual function returns True if the ViewportSize property value differs from the default. That is, if ViewportSize <> 0. + + + Constructs an object and initializes its data before the object is first used. +FMX.StdActns.TCustomValueRange.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + + Destroys the TPersistent instance and frees its memory. +FMX.StdActns.TCustomValueRange.Destroy inherits from System.Classes.TPersistent.Destroy. All content below this line refers to System.Classes.TPersistent.Destroy. +Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + Copies the contents of another similar object. +FMX.StdActns.TCustomValueRange.Assign inherits from System.Classes.TPersistent.Assign. All content below this line refers to System.Classes.TPersistent.Assign. +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + Returns the name of the object as it appears in the Object Inspector. +FMX.StdActns.TCustomValueRange.GetNamePath inherits from System.Classes.TPersistent.GetNamePath. All content below this line refers to System.Classes.TPersistent.GetNamePath. +Returns the name of the object as it appears in the Object Inspector. +GetNamePath is for internal use only. It determines the text that the Object Inspector displays for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. Do not call GetNamePath directly. +For components, GetNamePath returns the component name. For TCollectionItem objects it returns the name of the hosting component, the name of the property, and the index into the collection surrounded by brackets. + + + Checks whether any of the current object properties has an assigned value. +Returns True if any of the Value, Min, Max, ViewportSize, and Frequency properties of the current object has an assigned value. + + + Assigns the default values to all properties (Value, Min, Max, and so on). +In TCustomValueRange, Clear assigns the following default values: + +Value = 0, +Min = 0, +Max = 100.0, +ViewportSize = 0, +Frequency = 0. + + + Controls whether the BeforeChange and AfterChange events are fired on each property change. +If Tracking = True, then the BeforeChange and AfterChange events are fired on each property change. If Tracking = False, then the BeforeChange and AfterChange events are not fired. + +Note: The OnChanged and OnTrackingChange events are fired independently from the Tracking value. + + + Recalculates values of properties, fires proper events, and sets IsChanged to False. +Changed is called immediately after the value of any property (Value, Min, Max, ViewportSize, and Frequency) of the current object has been changed. It recalculates values, raises the proper events (if needed), and sets IsChanged to False. If the Owner component of the action is loading (csLoading) or UpdateCount > 0, then no operations are performed and IsChanged is set to True. After loading the Owner component is finished, the component should check the IsChanged property's value and call the Changed method (if needed). +If IgnoreLoading = True, then Changed does not check the loading state (csLoading). + + + Handles whether some properties have been changed, but values are still not recalculated. + + + Keeps the new values of ValueRange properties. +New is the TBaseValueRange type property that keeps the new values of the Value, Min, Max, ViewportSize, and Frequency properties of the current object, declared in the TBaseValueRange class. It can be used in the BeforeChange event handler. + + + Minimum permissible value of the floating-point Value range. +FMX.StdActns.TCustomValueRange.Min inherits from FMX.StdActns.TBaseValueRange.Min. All content below this line refers to FMX.StdActns.TBaseValueRange.Min. +Minimum permissible value of the floating-point Value range. + + + Maximum permissible value of the floating-point Value range. +FMX.StdActns.TCustomValueRange.Max inherits from FMX.StdActns.TBaseValueRange.Max. All content below this line refers to FMX.StdActns.TBaseValueRange.Max. +Maximum permissible value of the floating-point Value range. + + + A changeable floating-point parameter. +FMX.StdActns.TCustomValueRange.Value inherits from FMX.StdActns.TBaseValueRange.Value. All content below this line refers to FMX.StdActns.TBaseValueRange.Value. +A changeable floating-point parameter. +The TBaseValueRange class associates a floating-point number Value to its Min and Max ranges. + + + The step of possible Value variations. +FMX.StdActns.TCustomValueRange.Frequency inherits from FMX.StdActns.TBaseValueRange.Frequency. All content below this line refers to FMX.StdActns.TBaseValueRange.Frequency. +The step of possible Value variations. +Value can be multiple of Frequency, Min, or Max. For example, if + +Min = 0.1 +Max = 2.1 +ViewportSize = 0 +Frequency = 1 + +then Value can be: + +0.1 +1 +2 +2.1 + +but it cannot be: + +Value = 1.1 + + + Used by controls such as TScrollBar to define the thumb size. +FMX.StdActns.TCustomValueRange.ViewportSize inherits from FMX.StdActns.TBaseValueRange.ViewportSize. All content below this line refers to FMX.StdActns.TBaseValueRange.ViewportSize. +Used by controls such as TScrollBar to define the thumb size. +Note that the effective maximum value of Value decreases according to Max - ViewportSize. + + + The Value-based position of the thumb in the scrollable control. +The RelativeValue property is calculated relatively to Value, according to the following expression: + +RelativeValue = (Value-Min)/(Max-Min-ViewportSize) + +It can be in the range from 0 through 1. It can be used for positioning a thumb in a scrollable control, whose parameters are defined by the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency). + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + The owner component of this class instance. + + + Called when the ValueRange properties start to update. +The BeginUpdate method is called when the object starts to change values of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency). +BeginUpdate increments the UpdateCount property's value by 1. + + + Called when the ValueRange properties have finished updating. +The EndUpdate method is called when the object accomplishes to change values of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency). +EndUpdate decrements the UpdateCount property value by 1. + + + Counter of how many times update changes of the ValueRange properties have been started and not accomplished. +If UpdateCount > 0, then no update changes will be actually implemented, and +all (Value, Min, Max, ViewportSize, and Frequency) properties will have old values. Update changes will be actually implemented only after calls to the EndUpdate method decrement UpdateCount to 0. +To set new values to these properties, use the New property. + + + This property identifies that the TCustomValueRange type object is recalculating property values. + + + This event is fired before new values of the ValueRange properties become effective. +The BeforeChange event is fired before new values of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency) become effective. For example, Min still contains an old value, while the new value is kept only in the New.Min parameter. The BeforeChange event is fired if Tracking = True. + + + This event is fired after a value of any ValueRange property has changed. +The OnChanged event is fired independently from the Tracking value, after a value of any of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency) has changed. + + + This event is fired after a value of any ValueRange property has changed, but only if Tracking = True. +The AfterChange event is fired after a value of any of the ValueRange properties (Value, Min, Max, ViewportSize, and Frequency) has changed, but only if Tracking = True. + + + This event is fired after a value of the Tracking property has changed, independently from UpdateCount. + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +FMX.StdActns.TCustomValueRangeAction.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Instantiates and initializes a FireMonkey TCustomAction object. +FMX.StdActns.TCustomValueRangeAction.Create inherits from FMX.ActnList.TCustomAction.Create. All content below this line refers to FMX.ActnList.TCustomAction.Create. +Instantiates and initializes a FireMonkey TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action list component using New Action in the Action List editor at design time. +If you want to create an action at run time, assign a TActionList component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create calls an inherited System.Actions.TContainedAction.Create constructor and then initializes the Supported property with True . + + + Destroys the instance of the contained action. +FMX.StdActns.TCustomValueRangeAction.Destroy inherits from System.Actions.TContainedAction.Destroy. All content below this line refers to System.Actions.TContainedAction.Destroy. +Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + Provides access to a floating-point value and its permitted ranges. +ValueRange provides access to the Value, Min, Max, Frequency, ViewportSize, and +RelativeValue properties and to the methods handling consistency of these properties. + + + + + + + + Embarcadero Technologies does not currently have any additional information. + + + + + + + + DoRootChanging is executed when the root container (typically a form) is defined or changes. +For example, DoRootChanging is executed when this control is added to a form or moved from one form to another. +When this control works as an accelerator key receiver, DoRootChanging overrides TControl.DoRootChanging to: + +Register this control to a specific form when the text control is added to the form. +Unregister and register this control from one form to another when this control is moved between forms. + + + Filters the string contained in the Text property. +For example, you can use DoFilterPresentedText to filter the ampersand symbol of the accelerator key character. +If the control is registered as an accelerator key receiver, you can override this method to do your own filtering to the accelerator keys. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TPresentedTextControl.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Customizes styles in complex objects. +FMX.StdCtrls.TPresentedTextControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TPresentedTextControl.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Indicates that the control needs to update the style and calls Repaint. +FMX.StdCtrls.TPresentedTextControl.DoStyleChanged inherits from FMX.Controls.TStyledControl.DoStyleChanged. All content below this line refers to FMX.Controls.TStyledControl.DoStyleChanged. +Indicates that the control needs to update the style and calls Repaint. +FMX calls DoStyleChanged after the style was changed. + + + This property is used to change the displayed text. + + + Sets a new value to the Text property in TPresentedTextControl. +Use SetTextInternal to set a value to the text property without calling DoTextChanged. + + + Sets the value of the Name property. +FMX.StdCtrls.TPresentedTextControl.SetName inherits from System.Classes.TComponent.SetName. All content below this line refers to System.Classes.TComponent.SetName. +Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TPresentedTextControl.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TPresentedTextControl.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TPresentedTextControl.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TPresentedTextControl.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Returns the resource object that is linked to the current text object. + + + Updates the text of the TextObject. +UpdateTextObject accepts the following parameters: + +TextControl: TextObject. +Str: Text. +DoChanged calls UpdateTextObject. + + + The control that displays the data of the control. + + + Executed when text is changed. +SetText calls DoTextChanged. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the bounds of the TextObject according to the current alignment values of that TextObject. +The parameters serve as variables where CalcTextObjectSize puts the calculated bounds: + +MaxWidth: The maximum width of the text object. +Size: The actual width and height of the text object. + + + Setter method for the TextSettings property. + + + Setter method for the StyledSettings property. + + + Updates the representation of the text that is displayed on the control. +Call this method to apply your changes to the text representation. + + + Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +StyledSettingsStored returns True when the set of styled text representation properties stored in +StyledSettings differs from the default set of styled text representation properties for this control. +When StyledSettingsStored returns True, then values of text representation properties of this control are stored in the corresponding FMX file. + + + Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TPresentedTextControl.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Determines whether the object reacts to the accelerator key or not. +FMX.StdCtrls.TPresentedTextControl.CanTriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey. +Determines whether the object reacts to the accelerator key or not. +Use CanTriggerAcceleratorKey for objects that are not intended to react to the accelerator key, for example: a hidden tab page or a hidden submenu. The object triggers the action if CanTriggerAcceleratorKey is True. Otherwise, the object cannot trigger the action. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey + + + Returns the index of the accelerator character within the text string of the receiver object. +FMX.StdCtrls.TPresentedTextControl.GetAcceleratorChar inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex. +Returns the index of the accelerator character within the text string of the receiver object. +Use GetAcceleratorCharIndex to highlight the accelerator character when the text string contains several times the same character. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar + + + Returns the character key that serves as the keyboard accelerator for the receiver object. +FMX.StdCtrls.TPresentedTextControl.GetAcceleratorCharIndex inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorChar. +Returns the character key that serves as the keyboard accelerator for the receiver object. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.GetAcceleratorCharIndex + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TPresentedTextControl.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TPresentedTextControl.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TPresentedTextControl.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + Returns a string containing the class name. +FMX.StdCtrls.TPresentedTextControl.ToString inherits from System.TObject.ToString. All content below this line refers to System.TObject.ToString. +Returns a string containing the class name. +By default, the ToString returns a string containing the class name of the instance that is being called. +For example, calling ToString on a TButton instance returns a string containing "TButton". + +Note: ToString is intended to be overridden in user-derived classes, to provide consumer objects with a string representation. + + + Specifies the text that will be displayed over the surface of this control. +In the Text property you can define an accelerator key. On Windows platforms, an accelerator key is shown as an underlined letter. To specify an accelerator key, precede an <accelerator_letter> with an ampersand & character. The letter after the ampersand appears underlined. For example, to set the S character as an accelerator key for a Save button, type &Save. On Windows platforms, accelerator keys enable the user to access controls pressing Alt+<accelerator_letter> key combination. When run on not Windows platforms, a single ampersand is simply stripped from the text. To show a single ampersand & character in a Text property specify doubled ampersand && characters. + + + Stores a TTextSettings type object that keeps the default values of the text representation properties. +DefaultTextSettings is set during the loading of the style in the ApplyStyle method. + + + Keeps the values of styled text representation properties that are set in the Object Inspector or programmatically. +TextSettings references a TTextSettings type object that handles values of styled text representation properties that are set in the Object Inspector or programmatically. TextSettings references a TTextSettings type object, which handles styled text representation properties to be used for drawing texts in this control. +TTextSettings type objects provide all styled text representation properties and methods to manage them. +The styled text representation properties are +FontColor, TextAlign, +VertTextAlign, +Trimming, WordWrap, and Font (TFont.Family, TFont.Size, and TFont.Style). +TTextSettings objects provide both styled text representation properties, whose values are loaded from a style (specified in StyledSettings), so all other styled text representation properties, whose values can be set manually, and methods to manage these text representation properties. The text representation properties identified in StyledSettings are loaded from the style and cannot be set manually. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Defines the set of styled text representation properties whose values are loaded from the current style and cannot be changed manually. +Text representation properties are used as parameters for drawing texts in controls. +The StyledSettings property is used in FMX controls such as TButton, TSpeedButton, TCheckBox, and others. +Styles, for example Metropolis UI styles, define the default values of the text representation properties like font name, font size, word-wrapping, and others. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +StyledSettings can contain the Family, Size, Style, FontColor, and +Other values defined in TStyledSetting. The "Relation between TStyledSetting constants and TTextSettings properties" table shows which of the TStyledSetting constants control the handling of these TTextSettings text representation properties. +Keep in mind that the values of all styled text representation properties listed in the StyledSettings are taken from a style and cannot be changed manually. For example, if you set a new value of the FontColor property of a TTextControl control, then the real updating of the font color takes place only if the StyledSettings property of this control does not contain TStyledSetting.FontColor. For more details, see the example in Setting Text Parameters in FireMonkey. +To switch OFF a font property for a control, select the control in the Form Designer. In the Object Inspector, expand the StyledSettings property. Clear the check mark before the property. For example, the following figure shows a TButton control with Size turned OFF (for Button1) and ON (for Button2): + +With StyledSettings you can also use the DefaultStyledSettings constant that defines the values of the styled properties that are taken from a style by default. +Remember that the HorzAlign and VertAlign text representation properties stored in the TextSettings property of a control correspond to the TextAlign and +VertTextAlign properties of the control. + + + Keeps final values of text representation properties. These values are really used to draw texts in a control. +ResultingTextSettings keeps a TTextSettings object that manages the final values of the text representation properties. These values are really used to draw texts in a control. +To obtain values stored in ResultingTextSettings, a control uses the StyledSettings property. For example, if StyledSettings contains the TStyledSetting.Family value, then the TFont.Family value is taken from the DefaultTextSettings. (That is the font family name defined in the loaded style is used. The font family name defined by the programmer in the Object Editor is ignored.) Oppositely, if StyledSettings does not contain TStyledSetting.Family, then the font family name defined by the programmer in the Object Editor is used and the font family name defined in the loaded style is ignored. +The TTextSettings class define properties keeping values of the FontColor, TextAlign, VertTextAlign, Trimming, WordWrap, and Font (TFont.Family, TFont.Size, TFont.Style) elements defining visual parameters of a text representation. +RecalculateTextSettings updates the ResultingTextSettings. + + + Calls DoChanged when any of the styled text representation properties of the control changes. + + + Specifies the font to use when displaying the text. + + + Specifies the font color to use when displaying the text. +This property sets or returns a value of the TAlphaColor type. + + + Specifies the vertical alignment of the text in this control. +This property can take values of the TTextAlign enumeration. + + + Specifies the horizontal alignment of the text in this control. +This property can take values of the TTextAlign enumeration. + + + Specifies whether to wrap the text inside the control when the text length exceeds the text area width. + + + Specifies how the text is trimmed when it exceeds the edges of the text area in this control. +This property sets or returns a value of the TTextTrimming type. + + + Determines whether the ampersand character (&) is considered as a special prefix character. +The default value is TPrefixStyle.HidePrefix, which means that the (first) ampersand is hidden at run-time. + + + + + Represents a generic general-purpose panel used to hold multiple controls for organizing purposes. +Use TPanel components when you need to provide the user with a way of placing multiple graphical components on a surface for organizing purposes. +Panels have methods to help manage the placement of child controls embedded in the panel. You can also use panels to group controls together, similarly to the way you can use a group box. Panels are typically used for groups of controls within a single form. Panels with no borders are useful as docking sites when writing applications that use drag-and-dock. + + + Getter of DefaultSize. +FMX.StdCtrls.TPanel.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TPanel.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TPanel.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + A container for extra information relevant to another item, with a visual indicator pointing to that item. +A call-out often takes the form of a pull-quote, in which a particular snippet of text in a document is duplicated to attract attention: in a larger size, with a different typeface, in a colored box, with stylized quote marks, etc. With illustrations, boxed text will refer to different elements of interest, and each box will be drawn with extra lines that point to its element. +Use TCalloutPanel to create a call-out for elements in the user interface. The call-out may be transient, like a heavy-duty tool tip. +The default style is a TCalloutRectangle, a rectangle with a triangular "peak" on one of four sides. A custom style that is not a TCalloutRectangle at the root should contain one with the ResourceName "background", so that the size and position properties for the triangle can be applied. The bounds of the control includes that peak: the longer the peak, the shorter the rectangle, and vice versa. + + + Customizes styles in complex objects. +FMX.StdCtrls.TCalloutPanel.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TCalloutPanel.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Updates the properties of the CalloutRectangle. +UpdateCallout updates the following properties of the CalloutRectangle: + +CalloutLength +CalloutWidth +CalloutPosition +CalloutOffset + + + Updates the padding based on the values of CalloutLength and CalloutPosition. + + + Saves the current padding. + + + Restores a previously-saved padding. + + + Executed right after the value of the Padding property changes. +FMX.StdCtrls.TCalloutPanel.PaddingChanged inherits from FMX.Controls.TControl.PaddingChanged. All content below this line refers to FMX.Controls.TControl.PaddingChanged. +Executed right after the value of the Padding property changes. +The control does not execute PaddingChanged if you assign Padding the same value that it already has. + + See Also +FMX.Controls.TControl.ClipChildrenChanged +FMX.Controls.TControl.EffectEnabledChanged +FMX.Controls.TControl.EnabledChanged +FMX.Controls.TControl.HandleSizeChanged +FMX.Controls.TControl.HitTestChanged +FMX.Controls.TControl.ParentChanged +FMX.Controls.TControl.VisibleChanged +FMX.Controls.TControl.AncestorVisibleChanged +FMX.Controls.TControl.AncestorParentChanged +FMX.Controls.TControl.ChildrenAlignChanged + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCalloutPanel.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + A reference to a TCalloutRectangle style object. + + + The width of the visual element that points at the area of interest. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer as an isosceles triangle on one of its sides. +CalloutWidth is the length of the base of the triangle. + + + The length of the visual element that points at the area of interest. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer as an isosceles triangle on one of its sides. CalloutLength is the height of this triangle. +The triangle is included in the bounding rectangle ShapeRect of the TCalloutPanel object; therefore, the longer CalloutLength is, the smaller the height (or width) of the callout panel itself is, and vice versa. Keeping the bounding rectangle the same size while changing the length of the triangle CalloutLength requires changing the height or width of the callout panel TCalloutPanel itself, depending on which side the triangle appears. + + + Defines the side where the callout pointer appears. +Set CalloutPosition to one of the Top, Left, Bottom, or Right constants predefined in TCalloutPosition to define the side on which the callout pointer should appear. +By default, the callout pointer appears on the top side CalloutPosition = Top. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer--the visual element that points at the area of interest--as an isosceles triangle on one of its four sides. + + + The position of the callout pointer, relative to the center or edges of the side on which it appears. +By default, TCalloutPanel uses TCalloutRectangle, which renders its callout pointer--visual element that points at the area of interest--as an isosceles triangle on one of its sides. The CalloutPosition defines the side on which the triangle appears. +CalloutOffset is the offset of the callout pointer implemented according to the following conditions: + +If CalloutOffset is zero, then the callout pointer is centered on the specified side. +If CalloutOffset is positive, then the closest point to a corner of the callout pointer has the CalloutOffset offset on the following sides: +Top--offset to the right from the upper-left corner. +Left--offset to the bottom from the upper-left corner. +Right--offset to the bottom from the upper-right corner. +Bottom--offset to the right from the lower-left corner. +If CalloutOffset is negative, then the closest point to a corner of the callout pointer has the CalloutOffset offset on the following sides: +Top--offset to the left from the upper-right corner. +Left--offset to the top from the lower-left corner. +Right--offset to the top from the lower-right corner. +Bottom--offset to the left from the lower-right corner. + + + + + Represents a graphical control used to display text in FireMonkey forms. +A TLabel control shows a text. The user cannot edit this text. A TLabel control can be used to label another control and can set focus to this control when the user presses an accelerator key assigned to the TLabel control. +TLabel controls cannot receive focus. +The Text property can be used to set an accelerator key to a TLabel control. The FocusControl property keeps the control that receives the focus when the accelerator key is pressed. +To add an object to a form that displays text that a user can scroll or edit, use a TEdit. + + + Forwards notification messages to all owned components. +FMX.StdCtrls.TLabel.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TLabel.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TLabel.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TLabel.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TLabel.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Getter of DefaultSize. +FMX.StdCtrls.TLabel.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + OnResize event dispatcher. +FMX.StdCtrls.TLabel.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Updates the representation of the text that is displayed on the control. +FMX.StdCtrls.TLabel.DoChanged inherits from FMX.StdCtrls.TPresentedTextControl.DoChanged. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.DoChanged. +Updates the representation of the text that is displayed on the control. +Call this method to apply your changes to the text representation. + + + Customizes styles in complex objects. +FMX.StdCtrls.TLabel.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TLabel.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TLabel.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TLabel.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TLabel.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether TLabel control is auto-sized based on the length of the text. +Set the AutoSize property to True to automatically resize the TLabel control according to the length of the Text. +Set the AutoSize property to False to lock autoresize of the TLabel control. + +Tip: The size of the TLabel control readjusts when the Font property changes. +When both AutoSize and WordWrap are set to True, the label's width does not change, and the height increases to show the full Text. So, the text might occupy several lines. +When AutoSize is set to True and WordWrap is set to False, the label's width changes to display the text in one line, while the height does not change. + + + Keeps the control that receives the focus when the accelerator key of the current label control is used. +Links the label control with another control. +If the Text property includes an accelerator key, the control specified by FocusControl receives focus when the accelerator is pressed. + + + + + Represents the base class for all buttons. +TCustomButton is the base class for all button components such as TButton. If you need to create a custom button for your application, then you should consider deriving your component from TCustomButton, as it already implements basic button drawing and operating functionality. + + + Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TCustomButton.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Responds to user clicks. +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. +Call Click in applications to simulate a mouse OnClick event. +If ModalResult is defined, the ModalResult property of its parent form is set to the same value as the button's ModalResult property. + + + Responds to user double-clicks. +DblClick is an event handler for the OnDblClick event. It is automatically called when the left mouse button is pressed and released twice consecutively with the pointer over the control. +Call DblClick in applications to simulate a mouse OnDblClick event. +If ModalResult is defined, the ModalResult property of its parent form is set to the same value as the button's ModalResult property. + + + Customizes styles in complex objects. +FMX.StdCtrls.TCustomButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TCustomButton.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Embarcadero Technologies does not currently have any additional information. + + + Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TCustomButton.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + Internally executes every 100 milliseconds to perform the OnClick event, if the RepeatClick property is True. +If the RepeatClick property is True, each time 100 milliseconds pass, DoRepeatDelayTimer is executed and the DoRepeatTimer method is internally called to perform this button's OnClick event. + + + Internally executes every 100 milliseconds if the RepeatClick property is True. +If the RepeatClick property is True, each time 100 milliseconds pass, DoRepeatDelayTimer is executed and the DoRepeatTimer method is internally called to perform the button's OnClick event. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TCustomButton.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TCustomButton.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TCustomButton.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TCustomButton.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TCustomButton.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TCustomButton.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + Getter of DefaultSize. +FMX.StdCtrls.TCustomButton.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TCustomButton.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Allows you to apply a tint to a button component. +This property is a value of the TAlphaColor type. + +Note: Some buttons might not have the tint support. In the Object Inspector, the RAD Studio IDE automatically displays/hides the TintColor property when you change the button's StyleLookup property. Currently, the TintColor property is only available for mobile platforms (iOS and Android). For more information, see Using Styled and Colored Buttons on Target Platforms. + + + Embarcadero Technologies does not currently have any additional information. + + + Allows you to apply a tint to a button icon. +This property is a value of the TAlphaColor type. + +Note: Some buttons might not have the tint support. In the Object Inspector, the IDE automatically displays/hides the IconTintColor property as appropriate when you change the button's StyleLookup property. Currently, the IconTintColor property is only available for mobile platforms (iOS and Android). For more information, see Using Styled and Colored Buttons on Target Platforms. + + + Embarcadero Technologies does not currently have any additional information. + + + Should be called when the component needs to redraw the image. +ImagesChanged should be called +when you change the Images reference to the TCustomImageList object or +the object itself or when you change the ImageIndex property. + + + Returns True when the ImageIndex property needs to be stored in the fmx-file. + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TCustomButton.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TCustomButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TCustomButton.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + Specifies whether this button remains in a pressed state once you click it. +Set the StaysPressed property to True to force this button to remain in a pressed state once you click it. The button comes back to its initial depressed state once you click it again. +If StaysPressed is set to False, then this button behaves like a standard push button that comes back to its initial state once you release the mouse button over its surface. + + + Specifies whether the default state of this button is pressed or not. +Set the IsPressed property to True in order to force this button's default state to be pressed. The button comes back to its initial unpressed state once you click it. + +Tip: Setting the IsPressed property only has an effect if the StaysPressed property is set to True. + + + Determines whether and how the button closes its (modal) parent form. +Setting the ModalResult property of a button is an easy way to make clicking the button to close the parent modal form. When a button is clicked, the ModalResult property of its parent form is set to the same value as the ModalResult property of a button. +For example, if a dialog box has OK and Cancel buttons, their ModalResult properties could be set at design time to mrOk and mrCancel, respectively. At run time, clicking the OK button changes the ModalResult property of the dialog box to mrOk, and clicking the Cancel button changes the ModalResult property of the dialog box to mrCancel. Unless further processing is required, no OnClick event handlers are required for the buttons. +The following table lists the constants defined in the System.UITypes unit to be used for the ModalResult property of the TModalResult type. + + + +Constant + +Value + +Meaning + + + +mrNone + + + +0 + + + +None. Used as a default value before the user exits. + + + + +mrOk + + + +idOK = 1 + + + +The user exited with the OK button. + + + + +mrCancel + + + +idCancel = 2 + + + +The user exited with the CANCEL button. + + + + +mrAbort + + + +idAbort = 3 + + + +The user exited with the ABORT button. + + + + +mrRetry + + + +idRetry = 4 + + + +The user exited with the RETRY button. + + + + +mrIgnore + + + +idIgnore = 5 + + + +The user exited with the IGNORE button. + + + + +mrYes + + + +idYes = 6 + + + +The user exited with the YES button. + + + + +mrNo + + + +idNo = 7 + + + +The user exited with the NO button. + + + + +mrClose + + + +idClose = 8 + + + +The user exited with the CLOSE button. + + + + +mrHelp + + + +idHelp = 9 + + + +The user exited with the HELP button. + + + + +mrTryAgain + + + +idTryAgain = 10 + + + +The user exited with the TRY AGAIN button. + + + + +mrContinue + + + +idContinue = 11 + + + +The user exited with the CONTINUE button. + + + + +mrAll + + + +mrContinue + 1 (12 or $C) + + + +The user exited with the ALL button. + + + + +mrNoToAll + + + +mrAll +1 (13 or $D) + + + +The user exited with the NO TO ALL button. + + + + +mrYesToAll + + + +mrNoToAll +1 (14 or $E) + + + +The user exited with the YES TO ALL button. + + +You can check a ModalResult value using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions, and use the StripAllFromResult function to convert ModalResult values that refer to "ALL" buttons to identifying values corresponding to simple buttons (Ok, No, or Yes). + + + Specifies whether to automatically repeat the button click after a preset time. +Set the RepeatClick property to True to make the button automatically repeat the clicking event, thus executing its OnClick event cyclically, after a preset time has passed since the last OnClick execution. +The timer interval starts with 500 milliseconds for the first wait and then moves to 100 milliseconds per wait cycle. This interval cannot be modified by the user. +Each time 100 milliseconds pass, DoRepeatDelayTimer is executed. DoRepeatDelayTimer internally calls the DoRepeatTimer method to perform the button's OnClick event. + + + Defines the reference to a TCustomImageList list of images to be used to draw images on the component. +If the TCustomImageList list is empty, then Images is nil/null. +Call ImagesChanged when Images is changed. + + + Defines the zero-based index enumerating images in the Images list of images. +If you use a non-existing ImageIndex value to access an image in the Images list, then no image is retrieved and no exception is raised. The usual default value is -1. Call ImagesChanged when ImageIndex is changed. + + + + + Represents a push button that contains a text caption. +A TButton is a general-purpose push button for use in applications. Buttons can be enabled, disabled, pressed, and can respond to control keys such as ESCAPE and ENTER. These buttons can receive TAB focus. +Buttons can have a modal result attached, which is useful if these buttons are the main validating controls for a dialog box, for instance OK -- save and close; Cancel -- quit, no save; and so on. +The Text property can be used to define an accelerator key to a control. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the font to use when displaying the text. + + + Specifies the horizontal alignment of the text in this control. +This property can take values of the TTextAlign enumeration. + + + Specifies how the text is trimmed when it exceeds the edges of the text area in this control. +This property sets or returns a value of the TTextTrimming type. + + + Specifies whether to wrap the text inside the control when the text length exceeds the text area width. + + + Determines whether the button's OnClick event handler executes when the ESCAPE key is pressed. +If Cancel is True, the button's OnClick event handler executes when you press the ESCAPE key. Although an application can have more than one Cancel button, the form calls the OnClick event handler only for the first visible button in the tab order. + + + Determines whether the button's OnClick event handler executes when the ENTER key is pressed. +If Default is True, the button's OnClick event handler executes when the you press the ENTER key. Although an application can have more than one Default button, the form calls the OnClick event handler only for the first visible button in the tab order. Moreover, any button that has focus becomes the Default button temporarily; hence, if you select another button before pressing ENTER, the selected button's OnClick event handler executes instead. + + + + + Represents a push button that contains a text caption, for usage in various toolbars that you might employ into your applications. +A TSpeedButton is a general-purpose push button for use in an application's toolbar. These buttons can be enabled, disabled, pressed, and can respond to control keys such as ESCAPE and ENTER. +These speed buttons can also have a modal result attached to them. +Their distinctive appearance differentiates them from other buttons. Also, speed buttons cannot receive TAB focus. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TSpeedButton.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TSpeedButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TSpeedButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Embarcadero Technologies does not currently have any additional information. + + + + + Represents a TCustomButton control and, additionally, provides the tools to customize shapes of TCustomCornerButton control's corners. +Use Corners to specify the corners to be customized. Use CornerType, XRadius, and YRadius to customize corners. See also TRectangle. + + + Customizes styles in complex objects. +FMX.StdCtrls.TCustomCornerButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomCornerButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TCustomCornerButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Specifies the distance from a corner to the start point of the corner shape customization, on the horizontal sides of the button. +How corners are customized is defined by the Corners, +CornerType, XRadius, and YRadius properties. + + + Specifies the distance from a corner to the start point of the corner shape customization, on the vertical sides of the button. +How corners are customized is defined by the Corners, +CornerType, XRadius, and YRadius properties. + + + Specifies which corners are customized by the CornerType, XRadius, and YRadius properties. +By default, all four corners are customized. +Corners contains a set of values defined in the TCorner type: TopLeft, TopRight, BottomLeft, and BottomRight. Use the AllCorners constant to select all corners. +If Corners is an empty set, then no corner shape customization is used. + + + Specifies the type of the corner customization in the TCustomCornerButton control. +Values of CornerType are defined in the TCornerType: Round, Bevel, InnerRound, and InnerLine. These values define the following types of corner shape customizations: + + +CornerType applies to corners specified in the Corners set. +XRadius and YRadius specify the distance from a corner to the start point of the corner customization, on the horizontal and vertical sides. + +Note: If Corners is an empty set, or any of the XRadius and YRadius properties is zero, modifying the CornerType property has no visual effect. + + + Specifies which sides of the control to display. +A side is a button boundary between two adjacent corners or end points of corner customizations. End points of corner customizations are defined by XRadius and YRadius. A corner customization applies to corners included into the Corners set. +By default, all sides of the control are displayed. +Sides can contain a set of values defined in TSide: Top, Left, Bottom, and Right. +Use the AllSides constant to select all sides. + + + + + Represents a button with customizable corners. +Use the Corners property to choose the corners to be customized and the CornerType, XRadius, and YRadius properties to customize the corners. + + + Represents a FireMonkey styled check box that can be either on (selected) or off (cleared). +TCheckBox represents a FireMonkey styled check box that can be either on (selected) or off (cleared). A TCheckBox component presents you an option. Select the box to turn on the option, or clear it to turn off the option. +A FireMonkey TCheckBox control supports linking to a Boolean database field. The Boolean field can be null, so there are actually three states: True, False, Null. The TCheckBox control treats the Null state as False. +The Text property can be used to define an accelerator key to a control. The accelerator key behavior for TCheckBox is to check and uncheck the box control. + + + Sends a PM_RESET_FOCUS message to the presentation layer through its presentation proxy, followed by a PM_DO_EXIT message. +FMX.StdCtrls.TCheckBox.DoExit inherits from FMX.Controls.Presentation.TPresentedControl.DoExit. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoExit. +Sends a PM_RESET_FOCUS message to the presentation layer through its presentation proxy, followed by a PM_DO_EXIT message. +For details about the circumstances that trigger this procedure, see TControl.DoExit. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoExit + + + Customizes styles in complex objects. +FMX.StdCtrls.TCheckBox.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TCheckBox.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Protected getter implementation for the Data property. +GetData overrides FMX.Types.TFmxObject.GetData and returns the value of IsChecked. + + + Protected setter implementation for the Data property. +SetData overrides FMX.Types.TFmxObject.SetData and sets the value of IsChecked. +Value may be any of the following: + +A Boolean value. IsChecked is assigned that value. +A String Boolean. IsChecked is assigned that value. +An event handler to be assigned to OnChange. IsChecked remains unchanged. + + + Specifies the behavior of a TCheckBox menu item when Action changes. +ActionChange calls the inherited TTextControl.ActionChange method and then, depending on the CheckDefaults value, ActionChange uses the Checked property of the Sender action to set the new value of the +IsChecked property. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Getter of DefaultSize. +FMX.StdCtrls.TCheckBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TCheckBox.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Checks whether the provided Value is a Boolean or a Boolean String. +TryValueIsChecked returns True if Value is a Boolean or a Boolean String, False otherwise. +The out parameter IsChecked is assigned the the value of Value or False if Value is not a Boolean or a Boolean String. + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TCheckBox.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCheckBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TCheckBox.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TCheckBox.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TCheckBox.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TCheckBox.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TCheckBox.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + Reads the pressed state of this check box. +The IsPressed read-only property is True when this check box is pressed, False otherwise. + + + Specifies whether the default state of this check box is selected or cleared. +Set the IsChecked property to True in order to force this check box's default state to be selected. The check box becomes cleared once you click it again. + + + Occurs when the state of TCheckBox is changed. +Usually, the OnChange event happens when the check box's state is changed. This can happen: + +When the state is altered programmatically by setting the IsChecked property. +By user interaction, after the box is clicked by mouse. +When the control has keyboard focus, by pressing SPACE or ENTER. +Write an OnChange event handler to customize what happens when the box is selected. + +Tip: The OnClick event happens before the OnChange event. + + + + + Represents a radio (option) button. +TRadioButton, also called option button, presents a set of mutually exclusive choices. You can create individual radio buttons using TRadioButton or use a group to automatically arrange radio buttons into groups. You can group radio buttons to let the user select one from a limited set of choices. +A selected radio button is displayed as a circle filled in the middle. When not selected, the radio button shows an empty circle. Assign the value True or False to the IsChecked property to change the visual state of the radio button. +The Text property can be used to define an accelerator key to the control. The accelerator key behavior for TRadioButton is to select the radio button. + + + Customizes styles in complex objects. +FMX.StdCtrls.TRadioButton.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TRadioButton.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Protected getter implementation for the Data property. +GetData overrides FMX.Types.TFmxObject.GetData and returns the value of IsChecked. + + + Protected setter implementation for the Data property. +SetData overrides FMX.Types.TFmxObject.SetData and sets the value of IsChecked. +Value is the new Boolean value of IsChecked, or an event handler to be assigned to OnChange. + + + Specifies the behavior of a TRadioButton menu item when Action changes. +ActionChange calls the inherited TTextControl.ActionChange method and then, depending on the CheckDefaults value, ActionChange uses properties of the Sender action to set new values to the +IsChecked and GroupName properties of TRadioButton. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Getter of DefaultSize. +FMX.StdCtrls.TRadioButton.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TRadioButton.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Allows the object to perform an action when the accelerator key is pressed. +FMX.StdCtrls.TRadioButton.TriggerAcceleratorKey inherits from FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. All content below this line refers to FMX.AcceleratorKey.IAcceleratorKeyReceiver.TriggerAcceleratorKey. +Allows the object to perform an action when the accelerator key is pressed. +Use TriggerAcceleratorKey to trigger an action as a response to the accelerator key. For example, use TriggerAcceleratorKey to set focus to the acceleration key receiver control. + + See Also +FMX.AcceleratorKey.IAcceleratorKeyReceiver.CanTriggerAcceleratorKey + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TRadioButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TRadioButton.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Sets a new Scene for the current control. +Sets a new Scene for the current control. +FMX.StdCtrls.TRadioButton.SetNewScene inherits from FMX.Controls.TControl.SetNewScene. All content below this line refers to FMX.Controls.TControl.SetNewScene. +Sets a new Scene for the current control. +AScene specifies the new scene. If AScene is empty, SetNewScene does nothing. +SetNewScene sets the same scene for the control's children. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TRadioButton.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TRadioButton.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TRadioButton.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TRadioButton.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + Reads the pressed state of this radio button. +The IsPressed read-only property is True when this radio button is pressed, False otherwise. + + + Specifies the name of the group this radio button is part of. +Set the GroupName property to the name of the group this radio button belongs to. If multiple radio buttons are part of the same group, that is, all of them have the same GroupName, when you click one of them, it becomes selected, while the others in this group become cleared. + + + Specifies whether the default state of this radio button is selected or cleared. +Set the IsChecked property to True to force this radio button's default state to be selected. The button comes back to its initial cleared state once you click it. + + + Occurs when the state of TRadioButton is changed. +Usually, an OnChange event happens when the radio button state is changed. +This can happen: + +When the state is altered programmatically by setting the IsChecked property. +By user interaction, after the radio button is clicked. +When the control has keyboard focus, by pressing SPACE or ENTER. +Selecting the state of a radio button will clear all the other radio buttons within the defined GroupName, causing their respective OnChange events. OnChange will not occur on those TRadioButtons whose state would not have changed. +TRadioButtons that have their GroupName undefined form a default group of radio buttons. + +Tip: The OnClick event happens before the OnChange event. + + + + + Represents a graphical control used to arrange multiple related graphical controls on the surface of a form. +Use TGroupBox whenever you need to arrange multiple related controls on a form (for instance, multiple radio buttons or check boxes). The most commonly grouped controls are radio buttons. After placing a group box on a FireMonkey form, select components from the Tool Palette and place them in the group box. The Text property contains text that labels the group box at run time. + +Similar components are: + +TPanel (without the frame and text caption) +TExpander (additionally provides collapse/expand functionality) + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TGroupBox.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Getter of DefaultSize. +FMX.StdCtrls.TGroupBox.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +FMX.StdCtrls.TGroupBox.StyledSettingsStored inherits from FMX.StdCtrls.TPresentedTextControl.StyledSettingsStored. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.StyledSettingsStored. +Indicates whether the set of styled text representation properties stored in StyledSettings differs from the default set for this control. +StyledSettingsStored returns True when the set of styled text representation properties stored in +StyledSettings differs from the default set of styled text representation properties for this control. +When StyledSettingsStored returns True, then values of text representation properties of this control are stored in the corresponding FMX file. + + + Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TGroupBox.GetTextSettingsClass inherits from FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. All content below this line refers to FMX.StdCtrls.TPresentedTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TGroupBox.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + Represents a status bar component for use in FireMonkey forms. +The status bar is usually aligned at the bottom of a form, and displays information about an application as it runs. A status bar can display a size grip, so if your form is sizable, there is no need to add a TSizeGrip component as long as you have a status bar already. +The status bar can also intercept hints. See Using Hints to Show Contextual Help in a FireMonkey Application for more information on how to use hints. + + + Applies the style to this status bar component. +Do not call ApplyStyle explicitly in an application. It is called when a style specified by StyleLookup is applied or when the control is visually changed. To check whether a style exists, use the FindStyleResource method. +For an example of the ApplyStyle implementation, see Style Contracts. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TStatusBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Getter of DefaultSize. +FMX.StdCtrls.TStatusBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + A reimplementation of TFmxObject.DoRootChanging. +Allows the control to be unregistered from the old root and registered to the new root. This is useful for a control to be registered on unregistered as a hint receiver. + + + Triggers the hint event. +TriggerOnHint calls DoHint + + + Triggers the OnHint event. + + + Creates an instance of the TStatusBar class and places a status bar component on the form. + + + Specifies whether the status bar displays its size grip or not. + + + Indicates whether the OnHint event is enabled. +Set this property to False to disable the OnHint event. + + + Occurs when a hint is triggered. +See Using Hints to Show Contextual Help in a FireMonkey Application for more information on how to use hints. + + + + + Represents a toolbar component for use in FireMonkey forms. +The toolbar is usually aligned at the top of a form, and has a bunch of buttons that represent shortcuts or ways to access the functionality embedded into your application. A toolbar holds essentially speed buttons, but any other FireMonkey control can sit inside a toolbar. All tool buttons on a toolbar should maintain a uniform width and height for consistency. +Typically, the tool buttons correspond to items in an application's menu and give the user more direct access to the application's commands, but they can access other functionality implemented into your application. + + + Customizes styles in complex objects. +FMX.StdCtrls.TToolBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TToolBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TToolBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Getter of DefaultSize. +FMX.StdCtrls.TToolBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TToolBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Embarcadero Technologies does not currently have any additional information. + + + Allows you to apply a tint to a toolbar. +This property is a value of the TAlphaColor type. + +Note: Currently, the TintColor property is only available for mobile platforms (iOS and Android). For more information, see Using Styled and Colored Buttons on Target Platforms. + + + + + Represents a graphical control used to dynamically resize FireMonkey forms. +Use a TSizeGrip component in a FireMonkey form to add a custom-placed size grip used to dynamically resize the form. + +It is better that you position this size grip control in the bottom-rightmost position of the form, for consistency. If your FireMonkey form already contains a TStatusBar component, there is no need to add a TSizeGrip, because the status bar can display the size grip for your resizable form. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TSizeGrip.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TSizeGrip.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + TSplitter divides the client area of a FireMonkey form into resizable panes. +Add a splitter to a form between two aligned controls to allow users to resize the controls at run time. The splitter sits between a control aligned to one edge of the form and the controls that fill up the rest of the client area. Give the splitter the same alignment as the control that is anchored to the edge of the form. When the user moves the splitter, it resizes the anchored control. This, in turn, changes the client area of the form, and the controls that fill up the rest of the client area resize accordingly. +Use each control on the form as a separate pane. After each pane is placed, place a splitter with the same alignment to allow that pane to be resized. The last pane to be placed on the form should be client-aligned, so that it resizes automatically to fill up the remaining space after all other panes are resized. + + + Customizes styles in complex objects. +FMX.StdCtrls.TSplitter.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TSplitter.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Renders the control's surface. +FMX.StdCtrls.TSplitter.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Setter function for the Align property. +FMX.StdCtrls.TSplitter.SetAlign inherits from FMX.Controls.TControl.SetAlign. All content below this line refers to FMX.Controls.TControl.SetAlign. +Setter function for the Align property. Value specifies the new value of the Align property. + + + Internally used to locate the controls that are about to be resized. + + + Internally used for calculating the new dimensions of the controls that are being split. + + + Internally called whenever you change the position of this splitter. +UpdateSize internally calls CalcSplitSize to update the dimensions of the controls that are being split by this splitter. + + + Internally used to know whether the controls that are about to be resized can actually be resized. + + + Internally used for updating the size of the controls that are being split. + + + Getter of DefaultSize. +FMX.StdCtrls.TSplitter.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TSplitter.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TSplitter.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TSplitter.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TSplitter.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Specifies the minimum size, in pixels, of the controls that are being split in case of sliding the splitter to the maximum of one of the left, right, top, or bottom margins. +Use MinSize to set the minimum width or height of the controls that are being split using this splitter. + + + Specifies whether to show the grip control of the TSplitter. +Set the ShowGrip property to False to hide the grip control from the TSplitter component. The default value is True so the TSplitter shows the grip by default. + + + + + Represents an animated progress bar indicator for general progress indication. +Use a TProgressBar in applications where you need to inform the user about the progress of one or multiple tasks effectuated by your application. A TProgressBar control can display its progress (Value) in the range specified by Min and Max. + +Metropolis UI ProgressBar: + +When a task with an indefinite amount of time or operations is in progress, we recommend that you use a TAniIndicator to illustrate the progress. + + + Returns an adjust type based on the provided FixedSize. +FMX.StdCtrls.TProgressBar.ChooseAdjustType inherits from FMX.Controls.TStyledControl.ChooseAdjustType. All content below this line refers to FMX.Controls.TStyledControl.ChooseAdjustType. +Returns an adjust type based on the provided FixedSize. +FixedSize is the value of the FixedSize property of the control that is passed to AdjustFixedSize. + + See Also +System.Types.TSize +FMX.Controls.TControl.FixedSize +FMX.Types.TAdjustType +FMX.Controls.TStyledControl.AdjustFixedSize + + + Customizes styles in complex objects. +FMX.StdCtrls.TProgressBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TProgressBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TProgressBar.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TProgressBar.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TProgressBar.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + Returns the associated action link class. +FMX.StdCtrls.TProgressBar.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Specifies the behavior of a TProgressBar control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +value range property of TProgressBar. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TProgressBar.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Getter of DefaultSize. +FMX.StdCtrls.TProgressBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TProgressBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TProgressBar.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TProgressBar.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Specifies the maximum value for this progress bar. As you place a TProgressBar component on a form, the default value for the Max property is set to 100. + + + Specifies the minimum value for this progress bar. The default value for the Min property is 0. + + + Specifies the orientation (Horizontal or Vertical) for the progress bar. + + + Specifies the current position of the progress bar. +You can read Value to determine the progress from Min to Max. +Set a needed value for the Value property, and the progress bar will display a position between Min and Max. For example, when the process completes, set Value to Max so that it appears completely filled. +By default, the Min and Max values of the progress bar are represented in percentage terms, where Min is 0 (0% complete) and Max is 100 (100% complete). + + + + + Represents a thumb control for use with track bars. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TThumb.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TThumb.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TThumb.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TThumb.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the state of this thumb component (pressed or unpressed). +Use the IsPressed property to specify the status of this thumb (pressed - True; unpressed - False). + + + + + Base class for all track bar components. +TCustomTrack is the base class for all track bar components such as TTrackBar. +If you need to create your own custom track bar, then you should derive your component from TCustomTrack, as it already implements functionality for drawing and manipulating the track bar. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TCustomTrack.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TCustomTrack.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Protected setter implementation for the Orientation property. + + + Returns a TRectF with the coordinates of the area that the thumb has access to. + + + Returns a TRectF with the coordinates of the area that the thumb has access to. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TCustomTrack.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TCustomTrack.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +FMX.StdCtrls.TCustomTrack.KeyDown inherits from FMX.Controls.Presentation.TPresentedControl.KeyDown. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.KeyDown. +Sends a PM_KEYDOWN message to the presentation layer through its presentation proxy when a key is pressed down while your presented control has the focus. +The message includes a TKeyInfo record that contains the data of the parameters (AKey, AKeyChar, AShift). + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.Presentation.TKeyInfo +FMX.Controls.TControl.KeyDown +FMX.Forms.TCommonCustomForm.KeyDown +FMX.Controls.Presentation.TPresentedControl.KeyUp + + + Customizes styles in complex objects. +FMX.StdCtrls.TCustomTrack.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TCustomTrack.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Returns an adjust type based on the provided FixedSize. +FMX.StdCtrls.TCustomTrack.ChooseAdjustType inherits from FMX.Controls.TStyledControl.ChooseAdjustType. All content below this line refers to FMX.Controls.TStyledControl.ChooseAdjustType. +Returns an adjust type based on the provided FixedSize. +FixedSize is the value of the FixedSize property of the control that is passed to AdjustFixedSize. + + See Also +System.Types.TSize +FMX.Controls.TControl.FixedSize +FMX.Types.TAdjustType +FMX.Controls.TStyledControl.AdjustFixedSize + + + Embarcadero Technologies does not currently have any additional information. + + + Executes internally each time the OnClick event of the attached TThumb component fires. + + + Executes internally each time the OnDblClick event of the attached TThumb component fires. + + + Returns the size of the thumb. The thumb size represents the percentage of the viewport relative to the content size. + + + Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TCustomTrack.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + Indicates whether the Thumb that is associated with this TCustomTrack is pressed. +This is a read-only property. +The following table shows the value of IsTracking in some common scenarios: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + Returns the associated action link class. +FMX.StdCtrls.TCustomTrack.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Specifies the behavior of a TCustomTrack control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +ValueRange property of TCustomTrack. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TCustomTrack.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of DefaultSize. +FMX.StdCtrls.TCustomTrack.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + OnResize event dispatcher. +FMX.StdCtrls.TCustomTrack.Resize inherits from FMX.Controls.TControl.Resize. All content below this line refers to FMX.Controls.TControl.Resize. +OnResize event dispatcher. +A control calls Resize when the dimensions of the control change. +Derived classes can override the protected Resize method to implement specific responses to control resizing. + + + Forwards notification messages to all owned components. +FMX.StdCtrls.TCustomTrack.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomTrack.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TCustomTrack.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TCustomTrack.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + Provides access to the Value value, to its Min and Max boundaries, and to the Frequency and ViewportSize properties. + + + Specifies the minimum value of this track bar, for the minimum position of the slider. +Use the Min property to set a minimum value down to which the slider of this track bar can go. For instance, if Min is set to 0 (a default value), then attempting to move the slider to the minimum will result in a Value of 0. + + + Specifies the maximum value of this track bar for the maximum position of the slider. +Use the Max property to set a maximum value up to which the slider of this track bar can go. For instance, if Max is set to 100 (a default value), then attempting to move the slider to the maximum will result in a Value of 100. + + + Specifies the number of positions the slider advances with each move. +Use the Frequency property to specify how many steps at once the slider advances with each move. For instance, if you set Frequency to 10, Min to 0, and Max to 100, then there are only 10 steps for this slider to move within the 0 to 100 range; Value is incremented or decremented with 10 divisions. +Frequency is a floating-point Single value; setting Frequency to 0 enables this track bar to increment or decrement by 0.01 divisions by step. Setting Frequency to any integer value (for instance 1, or 5, and so on) will enable this track bar to increment or decrement by the specified value. +However, please take into consideration that if you set Frequency to any value greater than 0 and you try to programmatically assign a value to Value, then your value will be converted to the nearest multiple of Frequency. +For instance, setting Frequency to 5 and then attempting to programmatically set Value to 12 will actually set Value to 10. + + MyTrackBar.Frequency := 5; + MyTrackBar.Value := 12; { actually sets Value to 10 } + + MyTrackBar->Frequency = 5; + MyTrackBar->Value = 12; /* actually sets Value to 10 */ + + + Controls the number of positions that the Thumb of the TCustomTrack moves each time the user presses on a free area. + + + Specifies the current value of this track bar. +Set or get Value to specify or obtain the current value of this track bar. You can set Value programmatically or visually at run time, with any value within the interval delimited by Min and Max. + + + Specifies the size, in pixels, of the area that the slider cannot span to the left or right of this track bar. +Use the ViewportSize property to specify the size of the view port of this track bar, that is, the area, in pixels, that the slider of this track bar cannot span. As an example, the picture below shows two track bars, one with ViewportSize set to 0 and the other with ViewportSize set to 50. + + +Tip: Changing the ViewportSize property does not affect the limits (Min or Max) or the Value of this track bar. + + + Specifies the orientation of this track bar (from left to right or from bottom to top). +Use the Orientation property to specify how this track bar will be displayed in terms of left-to-right orientation or bottom-to-top orientation. Orientation can have one of the following values: + + + +Value + +Meaning + + + +Vertical + + + +The track bar is rendered with the bottom-to-top orientation. + + + + +Horizontal + + + +The track bar is rendered with the left-to-right orientation. + + + Indicates whether thumb tracking is active or not. The default value of Tracking is True. +The following table shows how the value of Tracking impacts the behavior of a track bar and the related events: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + The part of a track bar that you move to change the value of the track bar. +The default appearance of the Thumb depends on the platform: + +Windows: The Thumb is a rectangle. +OS X: The Thumb is a circle. +iOS: The Thumb is a circle. +Android: The Thumb is a circle. + + + Occurs immediately after the position of the slider of this track bar changes. +Write an OnChange event handler to provide additional functionality when changing the position of the slider of this track bar component. +The OnTracking is very similar to OnChange. The following table shows the difference in the behavior of these events in certain scenarios: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + Occurs immediately after the position of the slider of this track bar changes. +Write an OnTracking event handler to provide additional functionality when changing the position of the slider of this track bar component. +The OnTracking is very similar to OnChange. The following table shows the difference in the behavior of these events in certain scenarios: + + + +Tracking + +Scenario + +Behaviour + +Events fired + +IsTracking + + + +True or False + + + +Press an arrow key on the keyboard. + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +True + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each "step" of the movement: + +OnTracking +OnChange + + +True + + + + +False + + + +Click on the Thumb of the track bar and move the Thumb. + + + +The Thumb moves as much as you move it. + + + +For each step of the movement: + +OnTracking +After you release the Thumb + +OnChange + + +True + + + + +True + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves for one "step". + + + +OnTracking +OnChange + + +False + + + + +False + + + +Click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + +True or False + + + +Hold the Shift button and click anywhere on the track bar (excluding the Thumb). + + + +The Thumb moves to the position where you click. + + + +OnTracking +OnChange + + +False + + + + + Is a TCustomTrack with a set of published properties. +TTrack publishes a set of properties from the TCustomTrack base component, but is not registered to the Tool Palette, so it cannot be added directly to a FireMonkey form. +You can derive your own custom track bar component from TTrack. + + + Represents a general-purpose track bar for use in applications where tracking is required. +TTrackBar represents a FireMonkey styled track bar that can be used for various types of tracking operations; for instance, it is useful for adjusting properties such as color, volume, and brightness. Move the slide indicator by dragging it to a particular location or click in the bar to change its Value. Adjust this track bar's view port by affecting the value of the ViewportSize property. + +Use the Max and Min properties to set the upper and lower range of the track bar. The Orientation property determines whether this track bar is vertical or horizontal. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TTrackBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + Represents a track bar similar to that implemented by TTrackBar. +TBitmapTrackBar is not registered to the IDE, thus it cannot be dragged and dropped from the tool palette. You can manually instantiate such component, override the constructor, and create a track bar that can display bitmaps. +TBitmapTrackBar is intended for component designers as a base component for other custom track bars. +Use TTrackBar in applications, instead. + + + Customizes styles in complex objects. +FMX.StdCtrls.TBitmapTrackBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TBitmapTrackBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +FMX.StdCtrls.TBitmapTrackBar.DoRealign inherits from FMX.Controls.Presentation.TPresentedControl.DoRealign. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DoRealign. +Sends a PM_REALIGN message to the presentation layer through its presentation proxy. +For details about the circumstances that trigger this procedure, see TControl.DoRealign. + + See Also +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Controls.TControl.DoRealign + + + Protected getter implementation for the DefaultStyleLookupName property. +FMX.StdCtrls.TBitmapTrackBar.GetDefaultStyleLookupName inherits from FMX.Controls.TStyledControl.GetDefaultStyleLookupName. All content below this line refers to FMX.Controls.TStyledControl.GetDefaultStyleLookupName. +Protected getter implementation for the DefaultStyleLookupName property. +When you Create a styled FireMonkey component by extending an existing component, override this method, if you want your component to inherit styles from the parent component. See Step 2 - Implement a Property to Specify the Format: Inheriting Styles of the Parent Component for more information and example code. + + + Internally executed whenever there is a need to update this component's bitmap image. The bitmap image is updated when it is changed, when the orientation of this bitmap track bar control changes, or when it needs a repaint. + + + Draws the bitmap behind this track bar. +The FillBitmap virtual method is provided in order to be overridden in derived classes to allow for custom drawing of the bitmap image behind this track bar. + + + Protected setter implementation for the Orientation property. +FMX.StdCtrls.TBitmapTrackBar.SetOrientation inherits from FMX.StdCtrls.TCustomTrack.SetOrientation. All content below this line refers to FMX.StdCtrls.TCustomTrack.SetOrientation. +Protected setter implementation for the Orientation property. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TBitmapTrackBar.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TBitmapTrackBar.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + + + + + + Invokes OnSwitch event handler + + + Invokes OnSwitch event handler + + + Property representing the boolean value of the switch. When the switch is On, the boolean value is + True. When the switch is Off, the boolean value is False. + + + + + + + + Sends a message to the presentation layer of the presentation proxy when the Action property changes. +FMX.StdCtrls.TCustomSwitch.ActionChange inherits from FMX.Controls.Presentation.TPresentedControl.ActionChange. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.ActionChange. +Sends a message to the presentation layer of the presentation proxy when the Action property changes. +The presentation layer receives a message with PM_ACTION_CHANGE as MsgID and an instance of TActionInfo as Value with the following data: + + + +Property + +Data + + + +Value.Sender + + + +ASender + + + + +Value.CheckDefaults + + + +ACheckDefaults + + + See Also +FMX.Controls.TControl.ActionChange +FMX.Controls.Presentation.TPresentedControl.PresentationProxy +FMX.Presentation.Messages.TMessageSender.SendMessage +FMX.Presentation.Messages.TMessageSender.Receiver +System.TObject.Dispatch +FMX.Presentation.Messages.TDispatchMessageWithValue +FMX.Presentation.Messages.TDispatchMessageWithValue.MsgID +FMX.Presentation.Messages.TDispatchMessageWithValue.Value +FMX.Controls.Presentation.TActionInfo +FMX.Controls.Presentation.TActionInfo.Sender +FMX.Controls.Presentation.TActionInfo.CheckDefaults + + + Returns the associated action link class. +FMX.StdCtrls.TCustomSwitch.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Embarcadero Technologies does not currently have any additional information. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TCustomSwitch.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TCustomSwitch.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TCustomSwitch.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + Responds to user clicks, key pressing, and input on touch devices (gestures). +FMX.StdCtrls.TCustomSwitch.Click inherits from FMX.Controls.TControl.Click. All content below this line refers to FMX.Controls.TControl.Click. +Responds to user clicks, key pressing, and input on touch devices (gestures). +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. Click also can be called in DialogKey and other methods handling an input from keyboards and touch devices. +Call Click in applications to simulate an OnClick mouse event. +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise executes the OnClick event handler. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a class reference to a data model of this presented control. +FMX.StdCtrls.TCustomSwitch.DefineModelClass inherits from FMX.Controls.Presentation.TPresentedControl.DefineModelClass. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.DefineModelClass. +Returns a class reference to a data model of this presented control. +Returns a class reference to a data model class that the constructor of this presented control uses to create a data model for the control. +By default DefineModelClass returns TDataModel. Descendant classes reimplement DefineModelClass to determine the data model class that a descendant presented control uses for its data model. + + See Also +FMX.Controls.Model.TDataModelClass +FMX.Controls.Model.TDataModel +FMX.Controls.Presentation.TPresentedControl.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Presentation.Style.TStyledPresentation.DefineModelClass +Class References + + + Updates the action of the switch and calls the handler of the OnSwitch event. +Called by the DoChanged procedure of the data model of the control when the value of the switch control changes. + + + Getter of DefaultSize. +FMX.StdCtrls.TCustomSwitch.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TCustomSwitch.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + A data model for this control. + + + Indicates if the Switch is turned on or off. +IsChecked is True if the Switch is turned on, False otherwise. + + + Event handler that is invoked when Switch changes the value of IsChecked. + + + + + Represents a two-way on-off switch for use in applications. +Use a TSwitch whenever you need to provide the user with a two-way on-off switch. + + + Represents a standard scroll bar that is used to scroll the contents of a window, form, or a control. +TScrollBar adds a free-standing scroll bar to a form. Many controls have properties that add scroll bars that are an integral part of the control. However, TScrollBar allows controls that do not have integrated scroll bars or groupings of controls to be scrolled when the user manipulates the TScrollBar object. + + + Executes internally each time the min button is pressed. + + + Executes internally each time the max button is pressed. + + + Customizes styles in complex objects. +FMX.StdCtrls.TScrollBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TScrollBar.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TScrollBar.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TScrollBar.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Provides a response when a key is pressed down while the control has the keyboard focus. +FMX.StdCtrls.TScrollBar.KeyDown inherits from FMX.Controls.TControl.KeyDown. All content below this line refers to FMX.Controls.TControl.KeyDown. +Provides a response when a key is pressed down while the control has the keyboard focus. +If the pressed key is the Applications key (Key = vkApps), then KeyDown shows the context menu of the control. Otherwise, KeyDown calls the OnKeyDown event handler if one is assigned. +TCommonCustomForm and descendant of TControl classes--like TCustomGrid--call KeyDown from their methods handling key pressing. They decode the message parameters into the key code, character code, and shift state. They pass them into the called KeyDown method in the Key, KeyChar, and Shift parameters, respectively: + + + +Parameters + +Descriptions + + + +Key + + + +Is the scan code of the pressed keyboard key or $0. +If a pressed key combination can be a shortcut, then Key <> 0 is a virtual key and KeyChar = #0. +Physical scan codes of the same key can differ under different platforms (Windows or iOS). +Platform-specific units (for example FMX.Platform.Mac.pas) should translate native scan codes to corresponding Windows codes defined in the UITypes unit. For example, + +vkReturn = $0D; { 13 } corresponds to the RETURN keyboard key. +vkF2 = $71; { 113 } corresponds to the F2 keyboard key. + + + +KeyChar + + + +Is the pressed character (digit) or #0. +If a pressed key combination can be treated as a printable character or digit, then Key = 0 and KeyChar contains a pressed symbol according to the current keyboard's input language, keyboard mode (CAPS LOCK and NUM LOCK keys), keyboard Shift state, and IME state. Editors can use this symbol to add into a text being edited. + + + + +Shift + + + +Indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the specified key was pressed with the control in focus. + + +If the control has successfully processed the pressed key combination and no additional processing is required, then KeyDown assigns Key = 0 and KeyChar = #0. +Override the protected KeyDown method to provide other responses when a key is down while the control has keyboard input focus. +See TCommonCustomForm.KeyDown for more information about parameters. + + + Returns the associated action link class. +FMX.StdCtrls.TScrollBar.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the behavior of a TScrollBar control when Action changes. +ActionChange uses the Action property of the Sender object to set Action for the Track control of TScrollBar. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TScrollBar.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Getter of DefaultSize. +FMX.StdCtrls.TScrollBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Initializes the component after the form file has been read into memory. +FMX.StdCtrls.TScrollBar.Loaded inherits from FMX.Controls.TControl.Loaded. All content below this line refers to FMX.Controls.TControl.Loaded. +Initializes the component after the form file has been read into memory. +Loaded inherits TComponent.Loaded, realigns the children, if any, and updates the tab list. +For details, see TComponent.Loaded. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TScrollBar.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TScrollBar.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Responds after the last constructor has executed. +FMX.StdCtrls.TScrollBar.AfterConstruction inherits from System.TObject.AfterConstruction. All content below this line refers to System.TObject.AfterConstruction. +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + Provides access to the Value value, to its Min and Max boundaries, and to the ViewportSize property. + + + Specifies the maximum value of this scroll bar for the maximum position of the slider. +Use the Max property to set a maximum value up to which the slider of this scroll bar can go. For instance, if Max is set to 100 (a default value), then attempting to move the slider to the maximum will result in a Value of 100. + + + Specifies the minimum value of this scroll bar for the minimum position of the slider. +Use the Min property to set a minimum value down to which the slider of this scroll bar can go. For instance, if Min is set to 0 (a default value), then attempting to move the slider to the minimum will result in a Value of 0. + + + Specifies the current value of this scroll bar. +Set or get Value to specify or obtain the current value of this scroll bar. You can set Value programmatically or visually, at run time, with any value within the interval delimited by Min and Max. + + + Specifies the size, in pixels, of the slider of this scroll bar. +Use the ViewportSize property to specify the size of the viewport of this scroll bar, that is, the area, in pixels, of the slider of this scroll. As an example, the picture below shows two scroll bars, one with ViewportSize set to 0 and the other with ViewportSize set to 50. + + +Tip: Changing the ViewportSize property does not affect the limits (Min or Max) of the Value of this scroll bar. + + + Controls the number of positions this scroll bar's slider moves on each pressing of the min or max button. +Use the SmallChange property to control the number of positions the slider of this scroll bar forwards or backwards in respect to pressing the max or min buttons. +For instance, setting SmallChange to 10 causes each push of the max or min button make the slider move with exactly 10 positions forwards or backwards. + +Tip: If the current position of the slider (reflected by Value) is a number lower than SmallChange, then pressing the min button will bring Value to 0. + + + Specifies the orientation of this scroll bar (left to right or bottom to top). +Use the Orientation property to specify how this scroll bar will be displayed (left to right or bottom to top). Orientation can have one of the following values: + + + +Value + +Meaning + + + +Vertical + + + +The scroll bar is rendered with the bottom-to-top orientation. + + + + +Horizontal + + + +The scroll bar is rendered with the left-to-right orientation. + + + Occurs immediately after the position of the slider on this scroll bar changes. +Write an OnChange event handler to provide additional functionality when changing the position of the slider on this scroll bar component. + + + + + Represents a variation of a standard scroll bar. +A TSmallScrollBar component is a trimmed-down standard TScrollBar without the min and max buttons. Otherwise the behavior is the same. + + + Customizes styles in complex objects. +FMX.StdCtrls.TSmallScrollBar.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Getter of DefaultSize. +FMX.StdCtrls.TSmallScrollBar.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TSmallScrollBar.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + Represents an animated spinning indicator used for illustrating an indefinite waiting time for application processes. +Use a TAniIndicator in applications where you need to inform the user that a task that takes an indefinite amount of time is in progress. Enable or disable the spinning effect by controlling the state of the Enabled property (True or False). +An animated spinning indicator can be rendered as lines or as circles: + +You can also style TAniIndicator to be a Metropolis UI indeterminate ring progress bar (Windows 8 style): + +For more information about the Metropolis UI indeterminate ring progress indicator, see Creating an Animated Indeterminate Progress Ring and Developing Metropolis UI Applications. + +Note: +When a task with a definite amount of time or operations is in progress, we recommend that you use a TProgressBar to illustrate the progress. + + + Customizes styles in complex objects. +FMX.StdCtrls.TAniIndicator.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TAniIndicator.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Setter of Enabled. +FMX.StdCtrls.TAniIndicator.SetEnabled inherits from FMX.Controls.TControl.SetEnabled. All content below this line refers to FMX.Controls.TControl.SetEnabled. +Setter of Enabled. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TAniIndicator.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Renders the control's surface. +FMX.StdCtrls.TAniIndicator.Paint inherits from FMX.Controls.TControl.Paint. All content below this line refers to FMX.Controls.TControl.Paint. +Renders the control's surface. +The Paint method is called by DoPaint when a control is being painted by the PaintTo method. Before DoPaint, Painting is called. AfterPaint is called immediately after. +FireMonkey internally calls Paint to paint the control when the window is being painted. You must not call Paint explicitly. +The base class TControl implements an empty Paint. The descendants of TControl override Paint to provide specific rendering of the respective controls. +For example, Paint methods in classes of the FMX.Objects unit draw and fill shapes using the properties defined in these classes. See the descriptions of these classes to find the properties of the respective shapes. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TAniIndicator.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TAniIndicator.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies the way this animated indicator looks (either linear or circular). +Use the Style property to specify how this animated indicator looks. You can set its look as a linear indicator (Linear) or a circular indicator (Circular). The following picture illustrates the two rendering modes. + +Enable or disable the rotating effect by setting the Enabled property to either True or False. + + + + + Represents a general-purpose knob-style rotating button. +Use a TArcDial button in applications wherever you need to provide the user with a rotating button that resembles a knob. This arc dial control variates its Value in degrees, so if you want to use it as a linear control for varying the progress of a progress bar, for instance, you need to programmatically make a conversion from degrees to linear movement. + +Control whether this arc dial component displays the value or not using the FMX.StdCtrls.TArcDial.ShowValue property. + + + Used internally to determine the rotation angle. + + + Used internally to render the text that displays the value of this arc dial component. + + + Customizes styles in complex objects. +FMX.StdCtrls.TArcDial.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TArcDial.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TArcDial.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + Initializes the control after the form file has been read into memory and loads its presentation. +FMX.StdCtrls.TArcDial.Loaded inherits from FMX.Controls.Presentation.TPresentedControl.Loaded. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Loaded. +Initializes the control after the form file has been read into memory and loads its presentation. +For details, see TControl.Loaded. + + See Also +FMX.Controls.Presentation.TPresentedControl.LoadPresentation +FMX.Controls.TControl.Loaded + + + Returns the associated action link class. +FMX.StdCtrls.TArcDial.GetActionLinkClass inherits from FMX.Types.TFmxObject.GetActionLinkClass. All content below this line refers to FMX.Types.TFmxObject.GetActionLinkClass. +Returns the associated action link class. +Returns the class reference for the TActionLink class or for one of its descendants. +In TFmxObject, GetActionLinkClass always returns nil. +In descendant classes, GetActionLinkClass should return the appropriate class type for the action link used with the class object. When a control object of the descendant from the TFmxObject class tries to assign a value to the Action property, the setter method for Action calls GetActionLinkClass. If GetActionLinkClass returns a non-nil value, then the action object is assigned to Action. If the control object does not support actions, then GetActionLinkClass should return nil. In this case, attempting to set a value to the Action property raises the following exception: + +StrEActionNoSuported = 'Class %s does not support the action' + + + Specifies the behavior of a TArcDial control when Action changes. +Depending on the CheckDefaults value, ActionChange uses the TValueRangeAction.ValueRange property of the Sender action to set the new value to the +ValueRange property of TArcDial. Then ActionChange calls the inherited TControl.ActionChange method. +Do not call ActionChange explicitly in an application. It is for internal use. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of DefaultSize. +FMX.StdCtrls.TArcDial.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TArcDial.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + Destroys this instance of TPresentedControl. +FMX.StdCtrls.TArcDial.Destroy inherits from FMX.Controls.Presentation.TPresentedControl.Destroy. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Destroy. +Destroys this instance of TPresentedControl. + + See Also +FMX.Controls.Presentation.TPresentedControl.Create + + + Responds after the last constructor has executed and loads the control presentation. +FMX.StdCtrls.TArcDial.AfterConstruction inherits from FMX.Controls.Presentation.TPresentedControl.AfterConstruction. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.AfterConstruction. +Responds after the last constructor has executed and loads the control presentation. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. + + + Provides access to the Value and Frequency properties. + + + OnMouseDown event dispatcher. +FMX.StdCtrls.TArcDial.MouseDown inherits from FMX.Controls.TControl.MouseDown. All content below this line refers to FMX.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +A control calls MouseDown in response to any of mouse-down messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively: + +Button determines which mouse button is pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the user pressed the mouse button. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. If Button is mbLeft, MouseDown sets PressedPosition as a TPointF(X,Y). +Override the protected MouseDown method to provide other responses when a mouse button is down while the cursor is over the control. + + + OnMouseMove event dispatcher. +FMX.StdCtrls.TArcDial.MouseMove inherits from FMX.Controls.TControl.MouseMove. All content below this line refers to FMX.Controls.TControl.MouseMove. +OnMouseMove event dispatcher. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation: + +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the mouse cursor is over the control. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseMove method to provide other responses when the mouse cursor moves over the control. + + + OnMouseUp event dispatcher. +FMX.StdCtrls.TArcDial.MouseUp inherits from FMX.Controls.TControl.MouseUp. All content below this line refers to FMX.Controls.TControl.MouseUp. +OnMouseUp event dispatcher. +A control calls MouseUp in response to any of mouse-up messages, decoding the message parameters into the shift-key state and position, which it passes in the Shift, X and Y parameters, respectively: + +Button determines which mouse button was previously pressed: left, right, or middle. +Shift indicates which shift keys--SHIFT, CTRL, ALT, and CMD (only for Mac)--were down when the pressed mouse button is released. +X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +Override the protected MouseUp method to provide other responses when the mouse button previously pressed is released while the cursor is over the control. + + + Specifies whether this arc dial component displays a text with the current value. +Use the ShowValue property to enable or disable the display of a text in the middle of this arc dial component that contains the current value (in degrees) of this arc dial component. + + + Specifies whether thumb tracking is active or not. + + + Specifies the value (in degrees) of this arc dial component. +Read or write the Value property to get or set the value (in degrees) of this arc dial component. Use the ShowValue property to enable or disable the display of this value inside the surface of this arc dial component. + + + Specifies the number of positions this arc dial advances with each move. +Use the Frequency property to specify how many steps at once this arc dial advances (rotates) with each move. For instance, if you set Frequency to 10, then rotating the arc dial to either the left or the right produces an advancement of only 10 divisions at a time (0 degrees, 10 degrees, 20 degrees, and so on). + + + Occurs immediately after the position of this arc dial control changes. +Write an OnChange event handler to provide additional functionality when changing the position of this arc dial component. + + + + + Represents a collapse/expand button used exclusively by the TExpander component. + + + Creates a new instance of TPresentedControl. +FMX.StdCtrls.TExpanderButton.Create inherits from FMX.Controls.Presentation.TPresentedControl.Create. All content below this line refers to FMX.Controls.Presentation.TPresentedControl.Create. +Creates a new instance of TPresentedControl. +AOwner takes ownership of the control and becomes responsible of destroying the control once the control is no longer necessary. +The control constructor creates a data model for the control. DefineModelClass determines the default class of data model for each subclass of TPresentedControl. +Create also sets the value of the CanUseDefaultPresentation property to True. + + See Also +System.Classes.TComponent.Create +FMX.Controls.Presentation.TPresentedControl.Model +FMX.Controls.Presentation.TPresentedControl.DefineModelClass +FMX.Controls.Presentation.TPresentedControl.Destroy +FMX.Controls.Presentation.TPresentedControl.CanUseDefaultPresentation + + + + + Represents a graphical control used to hold multiple graphical controls with the possibility to expand or contract its display area. +Use TExpander components when you need to provide the user with a way of placing graphical components on a surface that can be expanded or collapsed in order to show or hide its contents. + +Collapse or expand this expander control by clicking its collapse/expand button. + + + Default header height + + + Customizes styles in complex objects. +FMX.StdCtrls.TExpander.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TExpander.FreeStyle inherits from FMX.Controls.TTextControl.FreeStyle. All content below this line refers to FMX.Controls.TTextControl.FreeStyle. +Frees the style of TStyledControl. +FreeStyle frees some TTextControl-specific style resources like TextObject and TextSettings, then calls the inherited TStyledControl.FreeStyle. + + + Performs the alignment of a FireMonkey control. +FMX.StdCtrls.TExpander.DoRealign inherits from FMX.Controls.TControl.DoRealign. All content below this line refers to FMX.Controls.TControl.DoRealign. +Performs the alignment of a FireMonkey control. + + See Also +FMX.Types.AlignObjects + + + Calls the inherited TStyledControl.DoStyleChanged, then tries to translate the Text. +FMX.StdCtrls.TExpander.DoStyleChanged inherits from FMX.Controls.TTextControl.DoStyleChanged. All content below this line refers to FMX.Controls.TTextControl.DoStyleChanged. +Calls the inherited TStyledControl.DoStyleChanged, then tries to translate the Text. +DoStyleChanged calls the inherited TStyledControl.DoStyleChanged to set that the control needs to update the style, then calls Repaint to redraw the control, and then tries to translate the control's Text calling Translate. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TExpander.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Protected method that sets the vertical size (height) of the content display area of this expander, based on what is read from the given Reader. + + + Protected method that writes the vertical size (height) of the content display area of this expander to the given Writer. + + + Adds the AObject object to the Children list of children attached to this parent object (self). +FMX.StdCtrls.TExpander.DoAddObject inherits from FMX.Types.TFmxObject.DoAddObject. All content below this line refers to FMX.Types.TFmxObject.DoAddObject. +Adds the AObject object to the Children list of children attached to this parent object (self). +DoAddObject adds the object provided in the AObject parameter to the list of children stored in the Children property of this object (self). DoAddObject changes the parent of AObject to this object (self) and sets the root of AObject to the Root object of this object (self). +Descendant classes, like TCommonCustomForm and TControl, additionally handle tab stop lists keeping ordered lists of objects to which the user can tab. If such descendant class supports the ITabStopController interface and AObject is an object of a class supporting the IControl interface, then DoAddObject of this descendant adds AObject to the TabList tab stop lists of the (self) object. +DoAddObject is internally called from AddObject. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of DefaultSize. +FMX.StdCtrls.TExpander.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + DoExpandedChanging is called when the expanded state is changing. + + + DoExpandedChanged is called when the expanded state just has changed. + + + DoCheckedChanged is called when the checked state just has changed. + + + Returns the class type that instance represents the used text settings. +FMX.StdCtrls.TExpander.GetTextSettingsClass inherits from FMX.Controls.TTextControl.GetTextSettingsClass. All content below this line refers to FMX.Controls.TTextControl.GetTextSettingsClass. +Returns the class type that instance represents the used text settings. +GetTextSettingsClass returns the TTextSettingsInfo.TCustomTextSettingsClass (or its descendant) class reference. An instance of such class provides the DefaultTextSettings, TextSettings, StyledSettings, ResultingTextSettings, and other properties handling the text representation settings of a control. +You can override the method in descendant classes to modify the default behavior. +Typical implementations of GetTextSettingsClass returns the class declaring properties like the Font, FontColor, HorzAlign, and WordWrap. Some of these properties can be declared as published to be editable in the Object Inspector. + + See Also +FMX.Controls.TTextSettingsInfo +FMX.Controls.TTextSettingsInfo.TCustomTextSettingsClass +FMX.Controls.TTextSettingsInfo.DefaultTextSettings +FMX.Controls.TTextSettingsInfo.TextSettings +FMX.Controls.TTextSettingsInfo.StyledSettings +FMX.Controls.TTextSettingsInfo.ResultingTextSettings + + + It allows to set the header height. + + + Returns the calculated header height. +Default value is -1. +When the value is -1, if the style defines a header element style, the element height will be taken for default. If style element is not defined, it takes the FMX.StdCtrls.TExpander.cDefaultHeaderHeight value. + + + Evaluates the header height that will be used based on style availability and property value. + + + Evaluates the default header height based on style availability. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TExpander.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Embarcadero Technologies does not currently have any additional information. + + + Allows to customize header height. Default value is -1. +When the value is -1, if the style defines a header element style, the element height will be taken for default. If style element is not defined, it takes the FMX.StdCtrls.TExpander.cDefaultHeaderHeight value. + + + Specifies whether the expander's check box is selected or not. +Set the IsChecked property to True to select the expander's check box. Set IsChecked to False in order to clear the expander's check box. +The default value for the IsChecked property is True. + + + Specifies whether the expander control is expanded or not. +Set the IsExpanded property to True to expand the contents of the expander in order to show all the items it contains. Set IsExpanded to False in order to collapse the expander. +The default value for the IsExpanded property is True. +You can programatically expand and collapse the expander as shown in the following code snippet: + +var + Expander1: TExpander1; + +begin + { expand the expander control } + Expander1.IsExpanded := True; + + { collapse the expander control } + Expander1.IsExpanded := False; +end; + + + Specifies whether the expander control shows a check box in the upper-right corner. +Set the ShowCheck property to True to show a check box in the upper-right corner of the expander object. Set ShowCheck to False to hide the check box. + + + Occurs every time this expander's check box changes its state. +Write an OnCheckChange event to specify what happens every time the check box attached to this expander changes its state from True to False and vice versa. + + + OnExpandedChanging is called when the checkbox state is about to change. +You can cancel OnExpandedChanging with EAbort. + + + Occurs when IsExpanded value has changed. + + + + + Represents a graphical control used to display images on a FireMonkey form. +Use a TImageControl whenever you need to put an image on a FireMonkey form. You can use the Bitmap property to specify the image that will be displayed. + + + Protected getter implementation for the Data property. +FMX.StdCtrls.TImageControl.GetData inherits from FMX.Types.TFmxObject.GetData. All content below this line refers to FMX.Types.TFmxObject.GetData. +Protected getter implementation for the Data property. + + + Protected setter implementation for the Data property. +FMX.StdCtrls.TImageControl.SetData inherits from FMX.Types.TFmxObject.SetData. All content below this line refers to FMX.Types.TFmxObject.SetData. +Protected setter implementation for the Data property. + + + For internal use only. +Do not use this member. It is for internal use only. + + + Customizes styles in complex objects. +FMX.StdCtrls.TImageControl.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TImageControl.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Responds to user clicks, key pressing, and input on touch devices (gestures). +FMX.StdCtrls.TImageControl.Click inherits from FMX.Controls.TControl.Click. All content below this line refers to FMX.Controls.TControl.Click. +Responds to user clicks, key pressing, and input on touch devices (gestures). +Click is an event handler for the OnClick event. It is automatically called when the left mouse button is pressed and released with the pointer over the control. Click also can be called in DialogKey and other methods handling an input from keyboards and touch devices. +Call Click in applications to simulate an OnClick mouse event. +If EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute), then Click executes the assigned Action, otherwise executes the OnClick event handler. + + + OnDragOver event dispatcher. +FMX.StdCtrls.TImageControl.DragOver inherits from FMX.Controls.TControl.DragOver. All content below this line refers to FMX.Controls.TControl.DragOver. +OnDragOver event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor within the client area of the control. +Operation is the operation parameter (None, Move, Copy, Link) that specifies the action to perform when an item is dragged over the object. + +None is the default. No action takes place, it does not display any name. +Move - the word Move is displayed once an item is dragged over the object. +Copy - the word Copy is displayed once an item is dragged over the object. +Link - the word Link is displayed once an item is dragged over the object. +A control calls DragOver when a dragged object is over the control area. +Override the protected DragOver method to provide other responses when a dragged object is over the control area. + + + OnDragDrop event dispatcher. +FMX.StdCtrls.TImageControl.DragDrop inherits from FMX.Controls.TControl.DragDrop. All content below this line refers to FMX.Controls.TControl.DragDrop. +OnDragDrop event dispatcher. +Data specifies the dragged object. +Point specifies the current point of the mouse cursor, within the client area of the control. +A control calls DragDrop when a dragged object is dropped on the control area. +Override the protected DragDrop method to provide other responses when a dragged object is dropped on the control area. + + + Executes internally each time the OnChange event fires. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of DefaultSize. +FMX.StdCtrls.TImageControl.GetDefaultSize inherits from FMX.Controls.TControl.GetDefaultSize. All content below this line refers to FMX.Controls.TControl.GetDefaultSize. +Getter of DefaultSize. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TImageControl.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TImageControl.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a TBitmap picture to be displayed onto the surface of this image control component. +Use Bitmap to specify the image for the TImageControl component. Bitmap is a reference to a FMX.Graphics.TBitmap object. +Setting Bitmap at design time brings up the Bitmap Editor, which can be used to specify the file that contains the image you want to display. + + + For future use only. + + + Occurs immediately after the bitmap picture of this image control changes. +Write an OnChange event handler to provide additional functionality when changing the bitmap picture of this image control component. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Represents a graphical control used to display information contained in TPathData within FireMonkey forms. +Use TPathLabel components in FireMonkey forms to add TPathData display capabilities. +For instance, the following image displays three rectangles by using a TPathData object. + +var + PathData: TPathData; + +begin + PathData:= TPathData.Create; + PathData.AddRectangle(RectF(20, 20, 80, 80), 0, 0, AllCorners); + PathData.AddRectangle(RectF(10, 10, 90, 90), 0, 0, AllCorners); + PathData.AddRectangle(RectF(0, 0, 100, 100), 0, 0, AllCorners); + PathLabel1.Data := PathData; + + { ... other instructions ... } + + +To add an object to a form that displays text, use a TLabel. + + + Customizes styles in complex objects. +FMX.StdCtrls.TPathLabel.ApplyStyle inherits from FMX.Controls.TStyledControl.ApplyStyle. All content below this line refers to FMX.Controls.TStyledControl.ApplyStyle. +Customizes styles in complex objects. +TStyledControl descendants override it to apply styles in concordance with their primitive components. +Do not call ApplyStyle explicitly in an application. It is called by the ApplyStyleLookup method when object styles are updated. +For an example of an ApplyStyle implementation, see "TCalloutPanel:Style Contracts" in FireMonkey Component Design. + + + Frees the style of TStyledControl. +FMX.StdCtrls.TPathLabel.FreeStyle inherits from FMX.Controls.TStyledControl.FreeStyle. All content below this line refers to FMX.Controls.TStyledControl.FreeStyle. +Frees the style of TStyledControl. +Override it to free additional component-specific style resources. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +FMX.StdCtrls.TPathLabel.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Allocates memory and constructs a safely initialized instance of a component. +Allocates memory and constructs a safely initialized instance of a component. +FMX.StdCtrls.TPathLabel.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Disposes of the component and its owned components. +FMX.StdCtrls.TPathLabel.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Stores a Tvalue, which is a data structure that can store different kinds of data types. +FMX.StdCtrls.TPathLabel.Data inherits from FMX.Types.TFmxObject.Data. All content below this line refers to FMX.Types.TFmxObject.Data. +Stores a Tvalue, which is a data structure that can store different kinds of data types. +Data has no predefined meaning. Although Data is used for LiveBinding, any succesor override this behavior. Then, the behaviour of Data is based on the type of its value. + +Note: Do not use this member. It is for internal use only. + + + Specifies the way the contents of this path label will be drawn. +WrapMode can take one of the following values: + + + +Value + +Meaning + + + +Fit + + + +The graphical path contents fit the entire area of this path label. + + + + +Original + + + +The graphical path contents show at their original size in this path label. + + + + +Stretch + + + +The graphical path contents stretch to fit the entire area of this path label. + + + + +Tile + + + +The graphical path contents tile one or multiple times to fill the entire area of this path label. + + + + + TBitConverter class implements converter of an array of bytes + into Delphi native data types and backward. + + + RangeCheckError is a helper used to raise a range check exception + if a conversion (From or Into) accesses memory outside the bounds of the + Byte array. + NOTE: Only used by C++; Delphi calls System.Error(reRangeError) directly. + + + UnsafeFrom method converts Value of T type into array of bytes B. + The value will be written into B at Offset offset. The method does not check + that value will fit into B at Offset. + + + From method converts Value of T type into array of bytes B. + The value will be written into B at Offset offset. The method checks that + value will fit into B at Offset. If not, then range check exception is raised. + + + UnsafeInTo method converts array of bytes B into value of T type. + The value will be read from B at Offset offset. The method does not check + that value fits into B at Offset. + + + InTo method converts array of bytes B into value of T type. + The value will be read from B at Offset offset. The method checks that + value fits into B at Offset. If not, then range check exception is raised. + + + + + Abstract base class fully implemented in System.Classes and returned by IAsyncResult.GetAsyncWaitEvent. + This class allows for blocking with any number of these events using WaitForAll() and WaitForAny() + While this class can be implemented by creating a descendant, it is expected that the implementation + will be provided by System.Classes. Any attempt at creating an alternate implementation must adhere to + the "contracts" laid out in the abstract virtual methods. + + + This class variable will be set by a single descendent. The expectation is that one and only one descedent + of this class exists. That one descendent provides the actual implementation. This class variable is + used by the static class function Create to construct an instance of that one class that implements the + needed functionality. + + + Abstract virtual class overridden in descendant classes to create the proper type for the instance. + + + Since This unit doesn't cannot use System.SysUtls, this virtual allows descendants which do have access to + System.SysUtils to provide a means for this base ancestor class to raise exceptions when validating arguments. + + + Since This unit doesn't cannot use System.Classes, this virtual allows descendants which do have access to + System.Classes to provide a means for this base ancestor to call System.Classes.TThread.GetTickCount64. + + + Overridden in descendents. This explicitly locks this specific instance. + + + Overridden in descendents. This explicitly unlocks this specific instance. + + + Overridden in descendents. Notifies all current waiters this event is signaled. + + + Overridden in descendents. Clears the storage used for the waiters. + + + Overridden in descendents. Add a new waiter to the list of waiters. + + + Overridden in descendents. Removed a waiter from the list of waiters. + + + Overridden in descendents. Returns the current number of waiters in the list of waiters. + + + Overridden in descendents. Returns the index'th waiter from the waiter list. + + + Current number of threads waiting on this event. + + + Array of PWaitInfo references which contain information about each waiting thread. + + + Wait for this event instance to be signaled or Timeout is reached. + + + Explicitly set the event as signaled. This procedure is typically called by the implementation of + a specific IAsyncResult. + + + Explicitly reset the event as unsignaled. This procedure is rarely if ever called. If it is called, it + is called by the implementation of a specific IAsyncResult. + + + Wait until all of the indicated TMultiWaitEvents are signaled or Timeout is reached + + + Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached + + + Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached. + Index out parameter is set to the index of the TMultiWaitEvent in the provided array which was signaled. + More than one event may be signaled; Index only indicates which one caused the function to return. Index is undefined if + Timeout was reached. + + + Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached. + Returns the TMultiWaitEvent instance which was signaled and caused the function to return. Event is + undefined if Timeout is reached. + + + + diff --git a/Modules/DelphiFMX/uMain.pas b/Modules/DelphiFMX/uMain.pas index 471bdb51..e5124854 100644 --- a/Modules/DelphiFMX/uMain.pas +++ b/Modules/DelphiFMX/uMain.pas @@ -1,59 +1,61 @@ -unit uMain; - -interface - -uses PythonEngine; - -function PyInit_DelphiFMX: PPyObject; cdecl; - -implementation - -uses - System.SysUtils, WrapDelphi, WrapDelphiFMX; - -var - gEngine : TPythonEngine; - gModule : TPythonModule; - gDelphiWrapper : TPyDelphiWrapper; - -// This must match the pattern "PyInit_[ProjectName]" -// So if the project is named DelphiFMX then -// the function must be PyInit_DelphiFMX -function PyInit_DelphiFMX: PPyObject; -begin - try - gEngine := TPythonEngine.Create(nil); - gEngine.AutoFinalize := False; - gEngine.UseLastKnownVersion := true; - - gModule := TPythonModule.Create(nil); - gModule.Engine := gEngine; - // This must match the ProjectName and the function name pattern - gModule.ModuleName := 'DelphiFMX'; - - gDelphiWrapper := TPyDelphiWrapper.Create(nil); - gDelphiWrapper.Engine := gEngine; - gDelphiWrapper.Module := gModule; - - gEngine.LoadDllInExtensionModule(); - except - on E: Exception do begin - WriteLn('An error has occurred: ' + E.Message); - end; - end; - Result := gModule.Module; -end; - -initialization - gEngine := nil; - gModule := nil; - gDelphiWrapper := nil; - -finalization - gEngine.Free; - gModule.Free; - gDelphiWrapper.Free; - -end. - - +unit uMain; + +interface + +uses PythonEngine; + +function PyInit_DelphiFMX: PPyObject; cdecl; + +implementation + +uses + System.SysUtils, WrapDelphi, WrapDelphiFMX, PythonDocs; + +var + gEngine : TPythonEngine; + gModule : TPythonModule; + gDelphiWrapper : TPyDelphiWrapper; + +// This must match the pattern "PyInit_[ProjectName]" +// So if the project is named DelphiFMX then +// the function must be PyInit_DelphiFMX +function PyInit_DelphiFMX: PPyObject; +begin + try + gEngine := TPythonEngine.Create(nil); + gEngine.AutoFinalize := False; + gEngine.UseLastKnownVersion := true; + + gModule := TPythonModule.Create(nil); + gModule.Engine := gEngine; + // This must match the ProjectName and the function name pattern + gModule.ModuleName := 'DelphiFMX'; + + gDelphiWrapper := TPyDelphiWrapper.Create(nil); + gDelphiWrapper.Engine := gEngine; + gDelphiWrapper.Module := gModule; + + gEngine.LoadDllInExtensionModule(); + except + on E: Exception do begin + WriteLn('An error has occurred: ' + E.Message); + end; + end; + Result := gModule.Module; +end; + +initialization + gEngine := nil; + gModule := nil; + gDelphiWrapper := nil; + PyDocServer := TPythonDocServer.Create(); + +finalization + PyDocServer := nil; + gEngine.Free; + gModule.Free; + gDelphiWrapper.Free; + +end. + + diff --git a/Modules/DelphiVCL/DelphiVCL.dproj b/Modules/DelphiVCL/DelphiVCL.dproj index c4794793..d5e67c5b 100644 --- a/Modules/DelphiVCL/DelphiVCL.dproj +++ b/Modules/DelphiVCL/DelphiVCL.dproj @@ -1,139 +1,177 @@ - - - True - Library - Release - None - DelphiVCL.dpr - Win32 - {7E56095C-46B8-4F28-87A2-EEA8D9D2448D} - 19.2 - 3 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - DelphiVCL - .\dcu\$(Config)\$(Platform) - .\pyd\$(Config)\$(Platform) - 00400000 - System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) - ..\..\Source;..\..\Source\VCL;$(DCC_UnitSearchPath) - true - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= - 1033 - - - Debug - .\dcu\$(Config)\$(Platform) - .\pyd\$(Config)\$(Platform) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - (None) - - - Debug - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - - - 0 - RELEASE;$(DCC_Define) - false - 0 - - - (None) - - - (None) - - - DEBUG;$(DCC_Define) - true - false - - - (None) - - - - MainSource - - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - - - - - DelphiVCL.dpr - - - - - False - False - False - False - True - True - False - False - - - 12 - - - - - + + + True + Library + Release + None + DelphiVCL.dpr + Win32 + {7E56095C-46B8-4F28-87A2-EEA8D9D2448D} + 19.5 + 3 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + DelphiVCL + .\dcu\$(Config)\$(Platform) + .\pyd\$(Config)\$(Platform) + 00400000 + System;Xml;Data;Datasnap;Web;Soap;Vcl;$(DCC_Namespace) + ..\..\Source;..\..\Source\VCL;$(DCC_UnitSearchPath) + true + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName= + 1033 + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + Debug + .\dcu\$(Config)\$(Platform) + .\pyd\$(Config)\$(Platform) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + (None) + + + Debug + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + + + 0 + RELEASE;$(DCC_Define) + false + 0 + + + (None) + + + (None) + + + DEBUG;$(DCC_Define) + true + false + + + true + + + true + + + (None) + + + + MainSource + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + + + + + DelphiVCL.dpr + + + + + False + False + False + False + False + False + False + True + True + + + 12 + + + + + diff --git a/Modules/DelphiVCL/TestVCL.py b/Modules/DelphiVCL/TestVCL.py index fba8f36a..2641d390 100644 --- a/Modules/DelphiVCL/TestVCL.py +++ b/Modules/DelphiVCL/TestVCL.py @@ -1,45 +1,45 @@ -from DelphiVCL import * - -class MainForm(Form): - - def __init__(self, Owner): - self.Caption = "A VCL Form..." - self.SetBounds(10, 10, 500, 400) - - self.lblHello = Label(self) - self.lblHello.SetProps(Parent=self, Caption="Hello Python") - self.lblHello.SetBounds(10, 10, 300, 24) - - self.edit1 = Edit(self) - self.edit1.SetProps(Parent=self) - self.edit1.SetBounds(10, 30, 250, 24) - - self.button1 = Button(self) - self.button1.Parent = self - self.button1.SetBounds(270,24,100,30) - self.button1.Caption = "Add" - self.button1.OnClick = self.Button1Click - - self.lb1 = ListBox(self) - self.lb1.Parent = self - self.lb1.SetBounds(10,60,300,300) - - self.OnClose = self.MainFormClose - - def MainFormClose(self, Sender, Action): - Action.Value = caFree - - def Button1Click(self, Sender): - self.lb1.Items.Add(self.edit1.Text) - self.edit1.Text = "" - -def main(): - Application.Initialize() - Application.Title = "MyDelphiApp" - f = MainForm(Application) - f.Show() - FreeConsole() - Application.Run() - -main() - +from DelphiVCL import * + +class MainForm(Form): + + def __init__(self, Owner): + self.Caption = "A VCL Form..." + self.SetBounds(10, 10, 500, 400) + + self.lblHello = Label(self) + self.lblHello.SetProps(Parent=self, Caption="Hello Python") + self.lblHello.SetBounds(10, 10, 300, 24) + + self.edit1 = Edit(self) + self.edit1.SetProps(Parent=self) + self.edit1.SetBounds(10, 30, 250, 24) + + self.button1 = Button(self) + self.button1.Parent = self + self.button1.SetBounds(270,24,100,30) + self.button1.Caption = "Add" + self.button1.OnClick = self.Button1Click + + self.lb1 = ListBox(self) + self.lb1.Parent = self + self.lb1.SetBounds(10,60,300,300) + + self.OnClose = self.MainFormClose + + def MainFormClose(self, Sender, Action): + Action.Value = caFree + + def Button1Click(self, Sender): + self.lb1.Items.Add(self.edit1.Text) + self.edit1.Text = "" + +def main(): + Application.Initialize() + Application.Title = "MyDelphiApp" + f = MainForm(Application) + f.Show() + FreeConsole() + Application.Run() + +main() + diff --git a/Modules/DelphiVCL/doc/Data.Bind.Components.xml b/Modules/DelphiVCL/doc/Data.Bind.Components.xml new file mode 100644 index 00000000..3c0e6e0c --- /dev/null +++ b/Modules/DelphiVCL/doc/Data.Bind.Components.xml @@ -0,0 +1,34373 @@ + + + + + exprUnspecified + + + + + exprPosSource + + + + + exprPosControl + + + + + exprFill + + + + + exprParse + + + + + exprFormat + + + + + exprClear + + + + + exprFormatColumn + + + + + exprOther1 + + + + + exprOther2 + + + + + exprOther3 + + + + + exprFormatControl + + + + + dirSourceToControl + + + + + dirControlToSource + + + + + dirBidirectional + + + + + mtUnknown + + + + + mtText + + + + + mtInteger + + + + + mtFloat + + + + + mtBitmap + + + + + mtMemo + + + + + mtBoolean + + + + + mtBCD + + + + + mtUInteger + + + + + mtDateTime + + + + + mtCurrency + + + + + mtObject + + + + + mtVariant + + + + + mtDate + + + + + mtTime + + + + + mtChar + + + + + mtTValue + + + + + cbUnchecked + + + + + cbChecked + + + + + cbGrayed + + + + + fmFill + + + + + fmInsert + + + + + fmAdd + + + + + fmUpdate + + + + + linkBidirectional + + + + + linkDataToControl + + + + + linkControlToData + + + + + eaInclude + + + + + eaExclude + + + + + colExpressions + + + + + colCollections + + + + + exprControlToSource + + + + + exprSourceToControl + + + + + exprBidirectional + + + + + biBindsComponent + + + + + biBindsComponentProperty + + + + + biBindsOther + + + + + dbcoptAddDataBindingsProperty + + + + + dbcoptApplyToDescendents + + + + + moTrack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter method for the BindingsList property. + + + + + + +Reads the state of this component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + + + + +Protected getter method for the ControlComponent property. + + + + + + +Protected setter method for the ControlComponent property. + + + +Verifies whether the control component is assigned. +If the ControlComponent is nil, then CheckControlComponent raises an exception. + + + + + + +Protected getter implementation for the DisplayName property. + + + + + + +Returns whether this component is in design mode. + + + + + + +Returns whether this component is in loading mode. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. + + + + + + + +Returns whether the control component can be set a given value. +As implemented in TContainedBindComponent, CanSetControlComponent always returns True, but in descendants it actually returns whether the given Value (that is itself a TComponent) can be assigned to the control component. + + + + + + +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. + + + + + + +Verifies whether the contained binding component has a parent. +HasParent returns True if the contained binding component has a parent, False otherwise. + + + + + + +Sets the parent component of this component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. + + +Specifies a list that holds the binding expressions. + + + + + + +Returns the index of this component in the bindings list. + + +Specifies the component that will be bound to the source component, by means of LiveBindings. + + +Returns a string containing the name of this component. + + +Specifies a category for this component. +For example, for a binding expression called BindExpressionForm121, of type TBindExpression, the following code: + + ShowMessage(BindExpressionForm121.Category); + +shows the following message: Binding Expressions. + + + +Base class for all common binding components descending from it. +TContainedBindComponent is an abstract class that is the base class for TCommonBindComponent. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + exprUnspecified + + + + + + + + + + + exprUnspecified + + + + + + + + + + + + exprUnspecified + + + + + + + + + + + + exprUnspecified + + + + + + + + + + + + + + + + + + + + + + + Describe the component/property that a binding component depends upon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TCustomBindingsList.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TCustomBindingsList.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Data.Bind.Components.TCustomBindingsList.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Enumerates all child components. +Data.Bind.Components.TCustomBindingsList.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + +Specifies a list of available methods. For more information about these methods, read the LiveBindings Methods topic. + + +Specifies a list of available output converters. For more information about output converters, read the LiveBindings Output Converters help topic. + + + + + + +Returns a TComponent enumerator. +Data.Bind.Components.TCustomBindingsList.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Specifies whether the bindings list uses the global application manager for managed bindings. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Represents the base class for the binding list. +The TCustomBindingsList class implements a list of binding expressions, output converters, method scopes, and other binding list-related functionality. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of dependencies on components and properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Describe the component/property that a binding component depends upon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Describe the component/property that a binding component depends upon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Implements the bindings list component. TBindingsList is built on the TCustomBindingsList component and publishes additional properties that can be accessed from within the Object Inspector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editors implement these methods to support the expression ListItemIndex(Self). + + + + + + + + + + + + + + + Get or set the list item index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Update component properties with a control is modified by user input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Update component properties with a control is modified by user input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate an assignment from a data source to an editor. May use a shortcut or expression engine. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Enumerator of data source records, such as records in a dataset. + + + + + Data source member name, such as a FieldName. + + + + + Editor for a list, such as a FMX TListView. + + + + + Member name for a list, such as "Text". + + + + + Indicate whether the assignment can be evaluated without expression engine. + + + + + Expression engine description of assignment. + + + + + Event to execute when the expression engine raises an exception + + + + + Indicate whether the expression has been customized. A customized expression must + be evaluated with expression engine, rather than by shortcut. + + + + + + + Evaluate an value from a data source. May use a shortcut or expression engine. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Enumerator of data source records, such as records in a dataset. + + + + + Data source member name, such as a FieldName. + + + + + Indicate whether the assignment can be evaluated without expression engine. + + + + + Expression engine description of expression to evaluate. + + + + + Event to call when the expression engine raises an exception + + + + + Indicate whether the expression has been customized. A customized + expression must be evaluated with expression engine, rather than as a shortcut + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate expressions to fill a break header + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Is a binding component that wraps one or more other binding components. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Informs the wrapper binding component that a delegate (or contained) binding component has been activated. + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Used internally for observing purposes. + + + + + + + + +Returns an array of scopes for the source component. + + + + + + + + + +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + + + + +Returns True if this binding component delegate supports evaluation shortcuts or False otherwise. +Subclasses of TBindComponentDelegate that support evaluation shortcuts must reimplement GetUseEvalShortcuts to return True. + + + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + +Event that occurs as an expression is evaluated and is assigning to a value of an object member. Event handlers can intercede in the assignment operation. + + +Event that occurs after an expression has been evaluated and has assigned a value to an object member. + + +Event that occurs when an exception is raised while evaluating an expression, such as a conversion error. Event handlers can intercede and raise a different exception. + + +Event that occurs when activating the binding expressions of this delegate wrapper. + + +Event that occurs when the binding expressions of this delegate wrapper have been activated. + + + + + +Is a binding component that wraps another binding component and references a control. +The TLinkControlDelegate class implements a binding component that wraps another binding component and references a control. +For more information regarding the delegates, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected getter method for the ControlComponent property. + + + + + + +Protected setter method for the ControlComponent property. + + + + + + +Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + + + + +Activates or deactivates the bind control value of this link delegate wrapper. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Returns whether the given parameter can be used as the control component of this binding component. +CanSetControlComponent returns whether the given Value (that is itself a TComponent) can be used as the control component of this binding component. + + + + + +Is a binding component that wraps another binding component and references a control, data source, and field. +The TLinkControlToFieldDelegate class implements a binding component that wraps another binding component and references a control, a data source, and a field. +For more information regarding the delegates, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected setter implementation for the DataSource property. + + + + + + Base class for scope with supports linking + + + + +Protected getter implementation for the DataSource property. + + + + + + +Protected setter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use SetSourceMember as the setter implementation. + + + + + + +Protected getter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use GetSourceMember as the getter implementation. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies a TBaseLinkingBindSource object to which this delegate component links. +Use DataSource to determine or set the TBaseLinkingBindSource object that connects to a specific dataset. + + + + + + Direction of data flow for a TLinkControlToFieldDelegate + + + + + + + +Represents the base class for linking a control to a field. +The TCustomLinkControlToField class implements the functionality for linking a control to a field in a data source. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Direction of data flow for a TLinkControlToFieldDelegate + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TCustomLinkControlToField.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + +Returns an array of scopes for the source component. +Data.Bind.Components.TCustomLinkControlToField.GetSourceScopes inherits from Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. +Returns an array of scopes for the source component. + + + + + + + + + +Used for renaming a member of this binding component. +Data.Bind.Components.TCustomLinkControlToField.MemberRenaming inherits from Data.Bind.Components.TBindComponentDelegate.MemberRenaming. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.MemberRenaming. +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Used internally for observing purposes. +Data.Bind.Components.TCustomLinkControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + +Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + +Setter of UseEvalShortcuts. + + + + + + + + +Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + + + +Links a list control to a field. +The TLinkListControlToField class extends TCustomLinkListControlToField with published properties. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Link a control to a field, fill the control with possible values + If the direction is bidirectiona then the control must support IEditLinkObserver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents the base class for linking a list control to a field. +The TCustomLinkListControlToField class implements the functionality for linking a list control, such as TListBox, to a field. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkListControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + + + + +Returns a string containing the name of the control component member. +Data.Bind.Components.TCustomLinkListControlToField.GetControlComponentMemberName inherits from Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. +Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkListControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Used internally for observing purposes. +Data.Bind.Components.TCustomLinkListControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + +Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkListControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +Data.Bind.Components.TCustomLinkListControlToField.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Setter of UseEvalShortcuts. + + + + + + + + +Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkListControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies additional optional expressions to use when filling the list control. Use this collection when multiple expressions are needed to fill an item in the list. +For instance, you can use FillExpressions in order to populate a FireMonkey list box item Text and Detail properties. Use the FillDisplayCustomFormat and FillDisplayCustomFormat properties in order to fill the Text property and add an item to the FillExpressions collection, for the Detail property. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies a collection of expressions to fill a list header. This property is optional. + + +Specifies the field used to determine a break. This property is optional. + + +Specifies a custom expression that is used with the field defined by the FillBreakFieldName property. For instance, the expression StrCopy(%s, 0, 1); causes a break when the first character of the field is different. This property is optional. + + +Specifies the field to display in the list header. If FillBreakFieldName and FillBreakCustomFormat are blank, then the value determined using FillHeaderFieldName and FillBreakCustomFormat controls breaks. This is the only required field to cause breaking. + + +Specifies a custom expression that is used with the field defined by the FillHeaderFieldName property. For instance, the expression StrCopy(%s, 0, 1); displays the first character of the field in the header. This property is optional. + + +Specifies a collection of break value ranges. The break value falls within an item in this collection. The display value associated with the item is displayed in the header. This property is optional. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + + + +Links a list control to a field. +The TLinkListControlToField class extends TCustomLinkListControlToField with published properties. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Is a binding component that wraps another binding component and references a component property, data source, and field name. +The TLinkPropertyToFieldDelegate class implements a binding component that wraps another binding component and references a component property, a data source, and a field name. +For more information regarding the delegates, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected setter implementation for the DataSource property. + + + + + + Base class for scope with supports linking + + + + +Protected getter implementation for the DataSource property. + + + + + + +Protected setter implementation for the FieldName property. + + + + + + +Protected getter implementation for the FieldName property. + + + + + + +Protected getter implementation for the Component property. + + + + + + +Protected setter implementation for the Component property. + + + + + + +Protected setter implementation for the ComponentProperty property. + + + + + + +Protected setter implementation for the Active property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies a TDataSource object to which this delegate component links. +Use DataSource to determine or set the TDataSource object that connects to a specific dataset. + + +Specifies the component that this wrapping binding component references. + + +Specifies the name of the property of the component that this wrapping binding component references. + + +Specifies the field name that this wrapping binding component references. + + + + + +Represents the base class for linking a property of a component to a field. +The TCustomLinkPropertyToField class implements the functionality for linking a property of a component to a field. + +Tip: The user input to this component is not monitored using an observer. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Protected setter implementation for the Active property. +Data.Bind.Components.TCustomLinkPropertyToField.SetActive inherits from Data.Bind.Components.TLinkPropertyToFieldDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkPropertyToFieldDelegate.SetActive. +Protected setter implementation for the Active property. + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TCustomLinkPropertyToField.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + + + +Returns an array of scopes for the source component. +Data.Bind.Components.TCustomLinkPropertyToField.GetSourceScopes inherits from Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. +Returns an array of scopes for the source component. + + + + + + + + + +Used for renaming a member of this binding component. +Data.Bind.Components.TCustomLinkPropertyToField.MemberRenaming inherits from Data.Bind.Components.TBindComponentDelegate.MemberRenaming. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.MemberRenaming. +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + + + + +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkPropertyToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + + + + + +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkPropertyToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + + + + +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkPropertyToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + + + + +Used internally for observing purposes. +Data.Bind.Components.TCustomLinkPropertyToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + +Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkPropertyToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + +Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkPropertyToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + + + +Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkPropertyToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkPropertyToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Links the property of a component to a field. +The TLinkPropertyToField class extends TCustomLinkPropertyToField with published properties. + +Tip: The user input to this component is not monitored using an observer. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binds a value of a control to a component property + The control must implement IEditObserver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binds a value of a control to a component property + The control must implement IEditObserver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binds a value of a control to a component property + The control must implement IEditObserver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binds a value of a control to a component property, fill the control with possible values + The control must implement IEditObserver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provide member names to use in generated expressions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Protected setter implementation for the ScopeMappings property. + + + + + + + +Adds the given scope mapping to the ScopeMappings list. The scope mapping to be added is given through the AScope parameter. + + + + + + + +Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the binding scope for this source component. +The GetScope method returns the binding scope for this source component. This binding scope allows expressions to access properties and methods of the source component, as opposed to GetMemberScope, which allows expressions to access properties and methods of a member of the source component, such as a field. + + + + + + + +Returns the binding scope for the given member name. +The GetMemberScope method returns the binding scope for the member name given through the AMemberName parameter. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + + + + +Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.Components.TBaseBindScopeComponent.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Activates or deactivates all the binding expressions of this binding scope component at once. +The ActivateExpressions method activates or deactivates, depending on the value of the AValue parameter, all the binding expressions contained by this binding scope component at once. + +Tip: If one or more of the binding expressions does not support one of the IBindLink, IBindPosition, or IBindActivate interfaces, then ActivateExpressions does nothing for that particular binding expression. + +Specifies a list of binding components that are using this source component. + + +Specifies an owned collection of scope mappings. +The ScopeMappings property specifies an owned collection whose elements are scope mappings. ScopeMappings are used to add name/value pairs that can be referenced by expressions that reference this source component. + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TBaseBindScopeComponent.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Data.Bind.Components.TBaseBindScopeComponent.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Base class for the binding scope component. TBaseBindScopeComponent is the ancestor for the TCustomBindScope component. TBaseBindScopeComponent provides functionality for adding scope mappings, getting scope members and values, returning the scope itself or the scope of a member. It also provides properties for accessing the binding expressions in this scope and the scope mappings. + + + + Base class for scope with supports linking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + colExpressions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for evaluator shortcuts, that assign a value from data source to an editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate expression to assign a value from a data source to an editor + + + + + + + + + + Base class for evaluator shortcuts that retrieve a value from a data source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaluate an expression to retrieve a value from a data source + + + + + + + + + + + + + + + + + Base class for a factory of shortcut evaluators + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provide an evaluator for assigning from data source to editor + + + + + + + + + + Indicate whether this factory can provide an evaluator for assigning from data source to editor + + + + + + + + + Provide an evaluator for retrieving a value from a data source + + + + + + + + + + Indicate whether this factory can provide an evaluator for retrieving a value from a data source to editor + + + + + + + + + + + Singleton class for registering factories of shortcut evaluators, and instantiating shortcut evaluators + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provide an evaluator for assigning from data source to editor + + + + + + + + + + Indicate whether a factory can provide an evaluator for assigning from data source to editor + + + + + + + + + Provide an evaluator for retrieving a value from a data source + + + + + + + + + + Indicate whether a factory can provide an evaluator for assigning from a data source to editor + + + + + + + + + Register an evaluator shortcut factory + + + + + + + + Unregister an evaluator shortcut factory + + + + + + + + Singleton instance property. Use this property to access instance methods. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Get the expresss that is used to set and get the value list item + For example, "Text" is used to set the value of a listbox item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Get the property that is used to set and get the value of a control + For example, the Text property is used to get and set the value of TEdit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Register the member which is the value of an observable control + Text is the value property of TEdit + + + + + + + + + + + Register options for observable components + + + + + + + + + + Register the property which is the value of an non-observable component + Caption is the value property of TGroupBox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Register the expression which is the value of list control item + Selected(Text) is the value property of TEdit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Data.Bind.ObjectScope.xml b/Modules/DelphiVCL/doc/Data.Bind.ObjectScope.xml new file mode 100644 index 00000000..2f277041 --- /dev/null +++ b/Modules/DelphiVCL/doc/Data.Bind.ObjectScope.xml @@ -0,0 +1,15510 @@ + + + + + ftString + + + + + ftInteger + + + + + ftSingle + + + + + ftBoolean + + + + + ftBitmap + + + + + ftUInteger + + + + + ftCurrency + + + + + ftDateTime + + + + + ftTStrings + + + + + ftDate + + + + + ftTime + + + + + ftChar + + + + + optShuffle + + + + + optRepeat + + + + + seInactive + + + + + seBrowse + + + + + seEdit + + + + + seInsert + + + + + aaFail + + + + + aaAbort + + + + + aaRetry + + + + + optAllowModify + + + + + optAllowApplyUpdates + + + + + optAllowCancelUpdates + + + + + loptAllowInsert + + + + + loptAllowDelete + + + + + loptAllowModify + + + + + loptAllowApplyUpdates + + + + + loptAllowCancelUpdates + + + + + Event signature for creating an adapter + + + + +Is a bind source that supports adapters to connect to different types of data. +The TBaseObjectBindSource class implements a bind source that supports adapters to connect to different types of data. The adapter can be provided by setting a property (InternalAdapter) or by implementing the OnCreateAdapter event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Returns the member for the given member name. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetMember inherits from Data.Bind.Components.TBaseBindScopeComponent.GetMember. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.GetMember. +Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + + + + + + +Forwards notification messages to all owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + +Initializes the component after the form file has been read into memory. +Data.Bind.ObjectScope.TBaseObjectBindSource.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + +Adds the given bind component to the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.AddExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.AddExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.AddExpression. +Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + + + + +Removes the given binding component from the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.RemoveExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. +Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + $FFFFFFFF + + + + + +Returns a TComponent enumerator. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates whether the bind source adapter is positioned in the last record. +Read Eof (end of file) to determine if ItemIndex is located in the last record. If Eof is True, the bind source has an adapter and the active record is the last one or there are no records. Eof is False if the ItemIndex is located in any other position. + + +Indicates whether the bind source adapter is positioned in the first record. +Read BOF (beginning of file) to determine if ItemIndex is located in the first record. If BOF is True, the bind source has an adapter and the active record is the first one. BOF is also True if there is no active record. BOF is False in all other cases. + + +Specifies whether the bind source has permission to modify the data. +Check CanModify to determine if data can be edited. When CanModify is set to True, the bind source can edit the data. When CanModify is set to False, the bind source cannot edit the data. + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TBaseObjectBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + + +Disposes of the component and its owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + +Specifies whether the bind source adapter is active. +Read Active to determine whether the bind source adapter is active. By default, the Active property is set to True. +When Active is False, the bind source does not have an adapter or its adapter is not active. When Active is True, the bind source has an active adapter. + + +Specifies whether the bind source is automatically activated. Set AutoActive to True for automatic activation. + + +Specifies the index of the current record. +ItemIndex holds the index of the current record of the dataset the bind source adapter is currently on. The first item has the index 0, the second item has the index 1, and so on. If no item is selected, the value of ItemIndex is -1. + + +Indicates whether the data is in edit mode. +Read Editing to determine whether the bind source adapter can currently edit the data. If the Editing property is True, the data provided by the bind source adapter is in editing mode. Otherwise, it is False. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Returns the internal adapter of the bind source. +The InternalAdapter property holds the internal adapter of the bind source. InternalAdapter uses the GetInternalAdapter method to return the internal adapter of the bind source. + +Note: The GetInternalAdapter method always returns nil. Descendant classes must override this method to return the internal adapter. + + + + + Bind source which delegates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bind source which supports adapters to connect to different types of data + Adapter my be provided by setting a property or by implementing + the OnCreateAdapter event + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + + + + + + + + + + + + + + + + + Bind source which supports adapters to connect to different types of data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TCustomPrototypeBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Is a base class that implements a bind source for creating sample data. +If you want to create your own custom prototype bind source, then you should derive your class from TCustomPrototypeBindSource. When designing applications, TPrototypeBindSource is available from the Tool Palette. + + + +Is a bind source for creating sample data. +If you want to create your own custom prototype bind source, then you should derive your class from TCustomPrototypeBindSource. When designing applications that make use of the LiveBindings framework, you can use a TPrototypeBindSource component readily available in the Tool Palette to generate sample data for your bindings. +These tutorials in the Tutorials section describe the use of TPrototypeBindSource: + +Tutorial: Using TPrototypeBindSource and the LiveBindings Designer +Mobile Tutorial: Using LiveBindings to Populate a ListView (iOS and Android) +Tutorial: Using LiveBindings and DataModules with the Metropolis UI +Mobile Tutorial: Using LiveBindings to Populate a ListBox in Mobile Applications (iOS and Android) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + State of a scope adapter + + + + + + + + + Interface for retrieving the underlying object exposed an adapter field + + + + + + + + + + Type information about an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter base class for providing data to a TAdapterBindScope + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter to provide a generic TList to TAdapterBindSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + Adapter to provide an arbitrary object to TAdapterBindSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + Base class to get a value using RTTI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class to get a value of a particular type using RTTI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Use RTTI to read the value of a field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Use RTTI to read the value of a property + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class to set a value using RTTI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Use RTTI to set the value of a field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Use RTTI to set the value of a property + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter field which supports reading + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter field which supports reading and writing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter field which supports an object property + The members of the object are also exposed as fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class for an adapter field + + + + + + + + + + Custom scope to allow the expression engine to access field names as if they are members of the + wrapped TBindSourceAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Custom scope to allow the expression engine to access field names as if they are members of the + wrapped field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Implementation of IGetMemberObject to get the object associated with an adapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Implementation of IGetMemberObject to get the object associated with object field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adapter to provide a generic TList to TAdaptiveBindScope + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + nil + + + + + Base class for an adapter field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modes which allow editing + + + [seEdit..seInsert] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/System.Actions.xml b/Modules/DelphiVCL/doc/System.Actions.xml new file mode 100644 index 00000000..dce91bfb --- /dev/null +++ b/Modules/DelphiVCL/doc/System.Actions.xml @@ -0,0 +1,2250 @@ + + + + + + Status invisible. The input fields are displayed as well as before the + new properties. + + + + saNone + + + + + + Displays the normal field in the normal state. + + + + saTrivial + + + + + + This field contains the default value + + + + saDefault + + + + + + Required field that has not yet filled. + + + + saRequiredEmpty + + + + + + Required field is already filled. + + + + saRequired + + + + + + Field been tested and it contains a valid value. + + + + saValid + + + + + + The field has been tested and it contains an invalid value. + + + + saInvalid + + + + + + Running some long operation. + + + + saWaiting + + + + + + Perhaps the field contains an invalid value. + + + + saWarning + + + + + + The field value is not used in this case. + + + + saUnused + + + + + + This field value is calculated. + + + + saCalculated + + + + + + The field value is incorrect + + + + saError + + + + + + Another state (user defined) + + + + saOther + + + + + asNormal + + + + + asSuspended + + + + + asSuspendedEnabled + + + + + The class of errors that appear when working with actions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Current status of the input field. This value can be used in different + type-validators on your own. + + + + + + Status invisible. The input fields are displayed as well as before the + new properties. + + + + + + + Displays the normal field in the normal state. + + + + + + + This field contains the default value + + + + + + + Required field that has not yet filled. + + + + + + + Required field is already filled. + + + + + + + Field been tested and it contains a valid value. + + + + + + + The field has been tested and it contains an invalid value. + + + + + + + Running some long operation. + + + + + + + Perhaps the field contains an invalid value. + + + + + + + The field value is not used in this case. + + + + + + + This field value is calculated. + + + + + + + The field value is incorrect + + + + + + + Another state (user defined) + + + + + + + + This is the base class that implements the operation with + a list of keyboard shortcuts. Should be established descendants + of this class (see TContainedAction.CreateShortCutList) for each platform (VCL, FMX), which should be overridden the method Add. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TContainedAction is the base class for actions that can be grouped by category and that can appear in action lists. +TContainedAction introduces properties and methods that enable actions to appear in an action list. The properties of TContainedAction contain information about the relationship between the action and its action list. Methods of TContainedAction override those of the base class to take into account the action list that owns the action. +TContainedAction defines the published Category property. +Objects of type TContainedAction can be associated with a Category of actions. This category is used at design time to organize the actions in an action list using the Action List editor or the Action Manager editor (only available for VCL). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This is the base class that implements the operation with + a list of keyboard shortcuts. Should be established descendants + of this class (see TContainedAction.CreateShortCutList) for each platform (VCL, FMX), which should be overridden the method Add. + + + + + + + + + + + + + + + + + + + + + + + + +Reads the state of the action. +ReadState is used internally in the actions system. It is not necessary to call it directly. +ReadState calls the inherited System.Classes.TComponent.ReadState procedure. Then +ReadState checks whether the Parent of Reader (Reader.Parent) is an action list, then ReadState sets that the action belongs to this action list (ActionList). + + + +Retrieves whether the list stored in the SecondaryShortCuts property is created. +SecondaryShortCutsCreated returns True if the SecondaryShortCuts list is created. + + + + + + + + + + This is the base class that implements the operation with + a list of keyboard shortcuts. Should be established descendants + of this class (see TContainedAction.CreateShortCutList) for each platform (VCL, FMX), which should be overridden the method Add. + + + + +Introduces an interface for creating the ShortCutList object for the action. +As implemented in TContainedAction, CreateShortCutList does not create any shortcut list object and just returns nil. + + + + +Stores the value of the Enabled property when the action is suspended. +The System.Actions.TContainedActionList.SetState method uses SavedEnabledState internally: + +When System.Actions.TContainedActionList.SetState changes State from asSuspendedEnabled to asNormal, then the value stored in SavedEnabledState is used to set the Enabled property. +When System.Actions.TContainedActionList.SetState sets State to asSuspendedEnabled, then the value of the Enabled property is saved in SavedEnabledState and Enabled is set to True. + + + + + +Copies the properties of this action to a destination action. +Dest specifies the destination action. AssignTo ensures the correct assignment of property values. +If Dest is nil or Dest is not of the TContainedAction type, then an error is raised. + + + + + + +Executes the action when the user types one of its shortcuts. +HandleShortCut calls System.Classes.TBasicAction.Execute to cause the action to perform its function. HandleShortCut returns the value that System.Classes.TBasicAction.Execute returns. +Descendant classes can override HandleShortCut to respond in other ways when the user types the action's shortcut keys. + + + + + + + + +Sets the specified Value to the AutoCheck property of the action, and propagates this Value to all clients of the action. + + + + + + +Sets the specified Value to the Caption property of the action, and propagates this Value to all the clients of the action. + + + + + + +Sets the Name and Caption properties of the action. +SetName calls the inherited System.Classes.TComponent.SetName method to set the specified Value to the Name property of the action. If the action does not have any clients and the current values of the Name and Caption properties of the action are equal, then SetName sets Value to the Caption property of the action also. + +Warning: Using SetName to change the name of an action at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + + + +Sets the specified Value to the Checked property of the action, and propagates this Value to all clients of the action. +If the action has a GroupIndex value greater than 0, then setting Checked to True causes all other actions in the group to have their Checked property set to False. + + + + + + +Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +The behavior of SetEnabled depends upon the State of the ActionList action list: + +If the value of State is asSuspended, then SetEnabled sets to the specified Value only the Enabled property of the action. +If the value of State is asSuspendedEnabled, then SetEnabled sets to True the Enabled property of the action and of all clients of the action. +Otherwise, SetEnabled sets to the specified Value the Enabled property of the action and propagates this Value to all clients of the action. + + + + + +Sets the specified Value to the GroupIndex property of the action and properly handles the ON or OFF state of the Checked properties of all actions in the group specified by Value. +SetGroupIndex sets the specified Value to the GroupIndex property of the action. If the Checked property of this action is True, then SetGroupIndex sets the Checked property to False for all the other actions in the group defined by the specified Value. +When Value is greater than 0, the group of actions with the GroupIndex property having this Value forms a group of actions that act like a group of radio buttons. When the Checked property of any action in this group is True, the Checked properties of all other actions in the group are False. That is, one and only one action in the group is checked ON at a time. + +Note: All actions in a group must be listed by the same action list. + + + + + +Sets the Help context ID for the action and action's clients. +SetHelpContext sets the new Value of the integer help context ID, stored in the HelpContext property, for the action. +SetHelpContext always propagates this Value to all clients of the action. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help in your application, you need to enable Help in your application. + + + + + +Defines the Help keyword for the action and action's clients. +SetHelpKeyword sets the new Value of the string help keyword, stored in the HelpKeyword property, for the action. +SetHelpKeyword always propagates this Value to all clients of the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + + + + + + +Sets the HelpType property for the action and action's clients. +SetHelpType sets the new Value of the HelpType property for the action. +SetHelpType always propagates this Value to all clients of the action. + + + + + + +Sets the Hint property for the action and action's clients to a new Value. +SetHint sets the new Value of the Hint property for the action. +SetHint always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the Visible property for the action and action's clients. +SetVisible always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the ShortCut property for the action and action's clients. +SetShortCut always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the ImageIndex property for the action and action's clients. +SetImageIndex always propagates this Value to all clients of the action. + + + + + + +Sets the new Value of the StatusAction property for the action and action's clients. +SetStatusAction always propagates this Value to all clients of the action. + + + + + + +Instantiates and initializes a TContainedAction object. +Applications do not need to call Create directly. Actions are created automatically when you choose New Action in the Action List editor. +Create calls the inherited System.Classes.TBasicAction.Create constructor and then +initializes the Enabled (setting it to True), Visible (setting it to True), and ImageIndex (setting it to -1) properties. + + + + + +Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + + + + + + +Returns the action list containing the action. +GetParentComponent returns the action list containing the action. This action list is stored in the ActionList property. If ActionList stores nil, then GetParentComponent calls the inherited System.Classes.TComponent.GetParentComponent method. + + + + + + +Indicates whether the action is contained in an action list. +HasParent returns True if the action is contained in an action list stored in the ActionList property. If ActionList stores nil, then HasParent calls the inherited System.Classes.TComponent.HasParent method. + + + + + + +Sets the action list containing the action. +SetParentComponent sets the specified AParent action list as the action list containing the action. This action list is stored in the ActionList property. + + +Holds the action list to which the action belongs. + + + + + + +Returns True if the action list of the action is suspended. + + +Specifies the index of the action in its action list. +Index indicates the position of the action in its action list. You can change the action's Index at design time using one of the IDE editors to handle actions. +The index of actions determines the order in which they appear in user interface elements such as menus and tool bars. +Index is zero-based. When Index is -1, this means that the ActionList property does not contain any list. + + +Indicates whether the action's clients should be disabled if no OnExecute event handler is found. +DisableIfNoHandler defines whether to set the Enabled property of the action to False if no OnExecute event handler is set for the action. Setting Enabled to False disables all the action's clients. +See, for example, how FMX.Forms.TApplication.UpdateAction uses DisableIfNoHandler to define whether to set Enabled to False if the OnExecute event handler is not defined to the action. +For example, setting DisableIfNoHandler to False can be useful when managing submenus. In this case, pointing to a command on the main menu, which causes the submenu to open, does not need any OnExecute event handler. Then, if DisableIfNoHandler is True, this main menu command becomes disabled and the submenu cannot be opened. In such cases it can be convenient to use actions of types FMX.Controls.TControlAction and Vcl.Controls.TControlAction. Objects of these classes have the value of DisableIfNoHandler set to False, by default. + + +Controls whether the Checked property toggles when the action executes. +AutoCheck causes the Checked property to toggle when the action executes. This allows the Checked property of the action to remain in sync with the Checked property of the client (or an equivalent). +If the client has an AutoCheck property of its own, the AutoCheck property of the action is propagated to the AutoCheck property of the client. + + +Represents the caption of the action. +Caption holds the string that is used as the caption of the action, when it is set. The value of Caption can be propagated to all client controls and client menu items linked to the action. + + +Indicates whether client controls and menu items appear checked. +Checked specifies the checked state for the action. The value of Checked can be propagated to all client controls and client menu items linked to the action. + +Note: If the action has a GroupIndex value greater than 0, then setting Checked to True sets to False the Checked properties of all other actions in the GroupIndex group. +Tip: Use the AutoCheck property to ensure that the action's Checked property toggles when the action executes. + +Specifies the enabled state for the action. +The value of Enabled can be propagated to all client controls and client menu items linked to the action. + + +Indicates a group of actions in one action list. Actions in this group act like the group of radio buttons. +The value of GroupIndex is used to define groups of actions. Actions in each group act like groups of radio buttons. When GroupIndex is greater than 0, this value identifies the group to which some actions belong. The value of GroupIndex can be propagated to all client controls and client menu items linked to the action. +When the Checked property of any action in that group is set to True, the Checked properties of all other actions in the group are set to False. That is, only one action in the group can be checked at a time. + +Note: All actions in a group must be listed by the same action list. + +Keeps the integer context ID that identifies the Help topic for the action. +HelpContext specifies the integer context ID to identify the Help topic to show when invoking Help for the action. The value of HelpContext can be propagated to all client controls and client menu items linked to the action. See also IsHelpLinked. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the value of the HelpContext property to invoke the online Help that shows the topic with this context ID. The target topic is uniquely identified by a HelpContext context ID value. + +Contains the keyword string that identifies the Help topic for the action. +The value of HelpKeyword can be propagated to all client controls and client menu items linked to the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the HelpKeyword property's value to invoke the online Help showing the topic with this keyword. + +Keeps whether to use the HelpContext or HelpKeyword property to identify the Help topic. +The value of HelpType can be propagated to all client controls and client menu items linked to the action. +HelpType can keep one of the following constants: + +htContext � instructs to use the HelpContext property to identify the Help topic to show when invoking Help. +htKeyword � instructs to use the HelpKeyword property to identify the Help topic to show when invoking Help. + +Stores the Help hint text. +Hint holds the hint string indicating the hint text for the action. +Hint contains the text strings that appear in a pop-up box (or in a status bar) when the user moves the mouse over screen elements. +This hint string can be propagated to clients of the action � to controls, menu items, and other GUI elements. + +Note: VCL controls support hint strings containing three parts that can be shown in separate locations (see Vcl.Controls.TControl.Hint). + +Stores whether the action representation is visible. +Visible specifies the visible state for the action (True means visible, False means invisible). +This Visible value is propagated to a client of the action if IsVisibleLinked method of the action link linking the client to the action returns True. +If the Visible of an action is False and IsVisibleLinked of an action link returns True, then the Visible of the client (a control, menu item, or others) is also set False and this client is also invisible. Typically, IsVisibleLinked of an action link returns False if the action belongs to TCustomViewAction. Otherwise, when the action belongs to TAction, then IsVisibleLinked of an action link returns True. That is, TCustomViewAction is used when one need to provide visible representation of clients of actions that have Visible set True. + + +Shortcut that triggers the action. +The value of Shortcut can be propagated to all client controls and client menu items linked to the action. + + +Stores shortcuts (in addition to ShortCut) for triggering the action. +Actions can execute in response to multiple shortcut key combinations. SecondaryShortCuts lists all the shortcut key combinations (other than the one specified by the ShortCut property) that can trigger the action. This lets you provide additional, secondary shortcuts. +When the user types one of the key combinations listed in SecondaryShortCuts, the action's Execute method is called. + + +Stores an index in a list of images. +ImageIndex is a zero-based index in a list of images. TContainedAction does not provide the actual list of images, only implementations of actions in GUI application frameworks provide such a property. In general, this list of images contains images that are associated with controls and menu items that use this action. +The value of ImageIndex can be propagated to all client controls and client menu items linked to the action. + +Note: When ImageIndex is -1, this means that the list does not contain any images. +In typical implementations of controls, an image is drawn at the leftmost position in the control, and a control's text is drawn to the right of the image. If ImageIndex is -1, then a control does not offset the text to the right to reserve a placeholder for the image. Otherwise, if ImageIndex is not -1, then the control's text is always drawn with the offset to the right to reserve a place for drawing an image. + + + + + + +Calls the OnHint event handler. +Typically, applications do not call the DoHint method. It is called automatically when the user pauses the mouse on one of the action's client controls or menu items. DoHint is called by the action's client when the client asks to show the hint. + +DoHint checks for an OnHint event handler and passes HintStr to it, if the event handler exists. The OnHint event handler can change the specified hint string HintStr. DoHint returns True if no event handler is assigned or if OnHint returns True. DoHint can be used to determine which hint text should be shown. For example, Vcl.Controls.TControlActionLink.DoShowHint calls DoHint internally, and if DoHint returns True, then Vcl.Controls.TControlActionLink.DoShowHint appends the action's shortcut specification to the hint text to display. + +Occurs when the mouse pauses over a client control or menu item. +Use OnHint to override the default hint that appears when the user pauses the mouse over a client control or menu item. The OnHint event handler can change the hint that appears (by changing the string stored in the client's Hint property), or display the hint in an application-specific way. + + + +Stores the status for an input field in an action. +StatusAction holds the status for an input field in the action, when it is set. +The value of StatusAction can be propagated to all client controls and client menu items linked to the action. + + + +Group or category where the action belongs. +IDE editors for actions group together actions that share the same category. In the VCL, if you are using an action manager, you can generate user interface elements that correspond to action categories. +Action categories group actions by similarities, usually of behavior or functionality. Standard categories are Edit, Format, Help, Windows, and others. At design time you can modify or set the Category for an action by selecting the action from the action list or object tree view, and choosing Category in the Object Inspector. + + + + + + This class is designed to communicate with some of the object. + It implements to work with common properties for all platforms (FMX, VCL). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Auxiliary class for enumeration actions in TContainedActionList + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The ancestor class of actions, that contained in the TContainedActionList + It implements to work with common properties for all platforms (FMX, VCL). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The base class for list of actions, without the published properties. +Implement TContainedActionList to work with common properties for all GUI application frameworks. +Actions lists the actions maintained by the action list. +The ActionCount property returns the number of actions in the list. +OnStateChange sends a notification when the State changes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The ancestor class of actions, that contained in the TContainedActionList + It implements to work with common properties for all platforms (FMX, VCL). + + + + + + + + + + + + + + + + + + + + +Returns True if the internal list of actions of the TContainedActionList instance has been created. It returns False otherwise. +The internal list of actions is created when you create the TContainedActionList instance. + + + +Raises an EActionError exception if the internal list of actions of the TContainedActionList has not been created. + + + + + + +Adds an action to the list. +Applications cannot call this protected method. AddAction is used internally to add an action to the Actions property array. +To add an action to an action list, set the action's ActionList property. + + + + + + +Removes an action from the list. +Applications cannot call this protected method. RemoveAction is used internally to remove an action from the Actions property array. RemoveAction removes the action and sets its ActionList property to nil (Delphi) or NULL (C++). +To remove an action from an action list, change the action's ActionList property. + + + +Triggers the OnChange event on the action list and then on all its actions. +The internal list of actions is created when you create the TContainedActionList instance. + + + + + + + +Handles notifications about the removal of one of the actions of the list. +If AComponent is an action of the list and Operation is opRemove, the action is removed from the list. + + + + + + + +Sets the order in which actions are passed to a callback by the GetChildren method. +SetChildOrder specifies the order in which the component streaming system loads and saves the action components owned by this action list. It ensures that the actions are loaded and saved in the same order that they appear in the Actions property array. You should not need to call this method directly. + + + + + + +Sets the State property for the action list. +If Value is asSuspendedEnabled, then SetState also sets Enabled to True for all the actions in the action list. This is useful when designing in the Action Manager. +If the OnStateChange event handler is set, then SetState calls this event handler. + + +Occurs when a change occurs in the action list. +Write an OnChange event handler to update your application in response to changes in the action list. Changes to the action list that trigger an OnChange event include changes to an action category or to the action list's image list. + +Note: The action list automatically informs the actions in the list when an OnChange event occurs. You need only provide an OnChange event handler for application-specific responses. +OnChange is an event handler of type TNotifyEvent. + + +Occurs when a client object triggers an action in the list. +Write an OnExecute event handler to respond when an action in the list fires. +When the user invokes a client object, the action list�s OnExecute event is the first event to occur in response. If the OnExecute event handler sets its Handled parameter to True, the action is considered handled, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class in response to the user action. +If the OnExecute event handler does not set its Handled parameter to True, the application�s OnActionExecute event occurs next. If the OnActionExecute event does not respond to the user input, the action object�s OnExecute event occurs. Finally, if the action does not have an OnExecute event handler, the application locates a target object and executes any predefined response implemented by the action object. + + +Occurs when the application is idle so that the action list can update a specific action in the list. +Write an OnUpdate event handler to configure the properties of a specified action in the list so that it reflects current conditions. +When the application is idle, it cycles through every action in turn, giving it a chance to update itself to reflect current conditions. For each action, the first event to occur in this sequence is the action list's OnUpdate event. If the OnUpdate event handler sets its Handled parameter to True, the action is considered updated, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class. +If the OnUpdate event handler does not set its Handled parameter to True, the application's OnActionUpdate event occurs next. If the OnActionUpdate event does not update the action, the action object's OnUpdate event occurs. Finally, if the action does not have an OnUpdate event handler, the application executes any predefined update method implemented by the action object. + + + + + + + + True + + + + + +Returns True if the Source and Dest categories are the same. If IncludeSubCategory is True, this function also returns true if Dest is a subcategory of Source. +These are some examples of calls to this function: + + + +Source + +Dest + +IncludeSubCategory + +Result + + +File + +File + +True + +True + + +File.Recent + +File + +True + +False + + +File + +File.Recent + +True + +True + + +File + +File + +False + +True + + +File.Recent + +File + +False + +False + + +File + +File.Recent + +False + +False + + + + + + +Creates an instance of TContainedActionList. +This creator is inherited from TComponent, see TComponent.Create for more information. + + + + + +Destroys an instance of TContainedActionList. +This destructor is inherited from TComponent, see TComponent.Destroy for more information. + + + + + + + +Generates an OnExecute event. +Typically, applications do not call the ExecuteAction method. Instead, the action indicated by the Action parameter calls ExecuteAction in response to a user command. It is possible, however, to call ExecuteAction to generate an OnExecute event even though no client control has been triggered. +ExecuteAction invokes the OnExecute event handler for the action list. It returns True if the event handler handles the action, False otherwise. + + + + + + + +Calls a specified method for each child action of the action list. +GetChildren is used by the component streaming system. For each action in the action list, GetChildren calls the method passed in Proc. The actions are passed to the callback in the order that they are loaded or saved by the component streaming system. + + + + + + + + + Auxiliary class for enumeration actions in TContainedActionList + + + + + +Returns a TContainedActionList enumerator, a TActionListEnumerator reference that enumerates the actions in the list. +To process all actions, read Current from the enumerator within a �while MoveNext do� loop. + + + + + + + +Generates an OnUpdate event. +Typically, applications do not call the UpdateAction method. Instead, the action indicated by the Action parameter calls UpdateAction when informed by the application that it can update itself. It is possible, however, to call UpdateAction to generate an OnUpdate event even though this has not been initiated by the application. +UpdateAction invokes the OnUpdate event handler for the action list. It returns True if the event handler updates the action, False otherwise. + + + + + + + + True + + + + + +Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + + + + + + True + + + + + +Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + +Indicates the number of actions in the action list. +ActionCount indicates how many actions are contained in the action list. + + +Indicates whether the actions in the action list respond when the user triggers a client object. +State can be one of the constants defined in the TActionListState type: +asNormal, asSuspended, and asSuspendedEnabled. + + +Occurs after the State property's value is changed. +Write an OnStateChange event handler to respond after the State property's value is changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/System.Classes.xml b/Modules/DelphiVCL/doc/System.Classes.xml new file mode 100644 index 00000000..514ac792 --- /dev/null +++ b/Modules/DelphiVCL/doc/System.Classes.xml @@ -0,0 +1,25017 @@ + + + + + $7FFFFFF + + + + + $0 + + + + + $1 + + + + + $2 + + + + + soBeginning + + + + + soCurrent + + + + + soEnd + + + + + + + + + + + $FF00 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $1000 + + + + + $2000 + + + + + $4000 + + + + + $8000 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $4 + + + + + $8 + + + + + $8 + + + + + $10 + + + + + $10 + + + + + $10 + + + + + $20 + + + + + $40 + + + + + $40 + + + + + $80 + + + + + $100 + + + + + $200 + + + + + $400 + + + + + $800 + + + + + $800 + + + + + $1000 + + + + + $2000 + + + + + $4000 + + + + + $8000 + + + + + $8000 + + + + + $10000 + + + + + $20000 + + + + + $40000 + + + + + $80000 + + + + + $394DF + + + + + $3 + + + + + $21004 + + + + + $10448 + + + + + $8010 + + + + + $80 + + + + + dupIgnore + + + + + dupAccept + + + + + dupError + + + + + taLeftJustify + + + + + taRightJustify + + + + + taCenter + + + + + bdLeftToRight + + + + + bdRightToLeft + + + + + bdRightToLeftNoAlign + + + + + bdRightToLeftReadingOnly + + + + + taAlignTop + + + + + taAlignBottom + + + + + taVerticalCenter + + + + + ssShift + + + + + ssAlt + + + + + ssCtrl + + + + + ssLeft + + + + + ssRight + + + + + ssMiddle + + + + + ssDouble + + + + + ssTouch + + + + + ssPen + + + + + ssCommand + + + + + ssHorizontal + + + + + htKeyword + + + + + htContext + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lnAdded + + + + + lnExtracted + + + + + lnDeleted + + + + + laCopy + + + + + laAnd + + + + + laOr + + + + + laXor + + + + + laSrcUnique + + + + + laDestUnique + + + + + sdDelimiter + + + + + sdQuoteChar + + + + + sdNameValueSeparator + + + + + sdLineBreak + + + + + sdStrictDelimiter + + + + + soStrictDelimiter + + + + + soWriteBOM + + + + + soTrailingLineBreak + + + + + soUseLocale + + + + + soReference + + + + + soOwned + + + + + vaNull + + + + + vaList + + + + + vaInt8 + + + + + vaInt16 + + + + + vaInt32 + + + + + vaExtended + + + + + vaString + + + + + vaIdent + + + + + vaFalse + + + + + vaTrue + + + + + vaBinary + + + + + vaSet + + + + + vaLString + + + + + vaNil + + + + + vaCollection + + + + + vaSingle + + + + + vaCurrency + + + + + vaDate + + + + + vaWString + + + + + vaInt64 + + + + + vaUTF8String + + + + + vaDouble + + + + + ffInherited + + + + + ffChildPos + + + + + ffInline + + + + + tpIdle + + + + + tpLowest + + + + + tpLower + + + + + tpNormal + + + + + tpHigher + + + + + tpHighest + + + + + tpTimeCritical + + + + + opInsert + + + + + opRemove + + + + + csLoading + + + + + csReading + + + + + csWriting + + + + + csDestroying + + + + + csDesigning + + + + + csAncestor + + + + + csUpdating + + + + + csFixups + + + + + csFreeNotification + + + + + csInline + + + + + csDesignInstance + + + + + csInheritable + + + + + csCheckPropAvail + + + + + csSubComponent + + + + + csTransient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + laCopy + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + + + + +Provides an interface for a method that reads and writes otherwise unpublished data. +Descendants of TPersistent override DefineProperties to designate a method for storing the object's unpublished data to a stream such as a form file. By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method. +When overriding DefineProperties, consider including some or all of the following: + +A call to the inherited method +Calls to the filer object's DefineProperty method +Calls to the filer object's DefineBinaryProperty method +DefineProperties is virtual, so descendant classes can override it as necessary but are not required to do so. + + + + + + +Returns the owner of an object. +GetOwner is used by the GetNamePath method to find the owner of a persistent object. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. As implemented in TPersistent, GetOwner returns nil (Delphi) or NULL (C++). +For TOwnedCollection, GetOwner returns the owner of the collection. For TCollectionItem collection items, GetOwner returns the collection object into which the collection item has been inserted. For TComponent, GetOwner returns the value of the Owner property. + + + + + +Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + + + + +Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + + + +Returns the name of the object as it appears in the Object Inspector. +GetNamePath is for internal use only. It determines the text that the Object Inspector displays for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. Do not call GetNamePath directly. +For components, GetNamePath returns the component name. For TCollectionItem objects it returns the name of the hosting component, the name of the property, and the index into the collection surrounded by brackets. + + + +TPersistent is the ancestor for all objects that have assignment and streaming capabilities. +TPersistent encapsulates the behavior common to all objects that can be assigned to other objects, and that can read and write their properties to and from a form file (.xfm or .dfm file). For this purpose, TPersistent introduces methods that can be overridden to: + +Define the procedure for loading and storing unpublished data to a stream. +Provide the means to assign values to properties. +Provide the means to assign the contents of one object to another. +Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Warning: Added is deprecated. + + +Responds when items are added to the collection. +Applications cannot call the protected Added method. It is called automatically immediately after items are added to the collection. +Item is the item that was just added to the collection. +Added is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + + + + + + +Warning: Deleting is deprecated. + + +Responds when items are deleted from the collection. +Applications cannot call the protected Deleting method. The Delete method calls Deleting immediately before it removes an item from the collection. +Item is the item that is about to be removed. +Deleting is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + +Specifies a unique ID that can be assigned to the next added collection item. +TCollection uses NextID internally to assign unique identifiers to collection items. When a new item is added to the collection, its ID property is given the value of NextID and NextID is incremented. + + + + + + + +Responds when items are added to or removed from the collection. +Notify is called automatically when the items in the collection change. +Item is the item that was just added to or that is about to be removed from the collection. +Action indicates whether the item was added, is about to be extracted or is about to be deleted. +As implemented in TCollection, Notify calls Added when Action is cnAdded and calls Deleting when Action is cnDeleting. TCollection ignores the cnExtracting action. Descendant classes can override Notify to modify this behavior. + + + + + + +Returns the number of custom attributes associated with items in the collection. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. GetAttrCount returns the number of distinct attributes assigned to each item in the collection. +As implemented in TCollection, GetAttrCount always returns 0, because TCollection defines no custom attributes. + + + + + + + +Returns the name of a custom attribute that can be retrieved using the GetItemAttr method. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. The GetAttr method returns the name of an attribute. +Index identifies the attribute whose name is requested. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +As implemented by TCollection, GetAttr always returns an empty string, because TCollection defines no custom attributes. + + + + + + + + +Returns the value of a custom attribute assigned to one of the collection's items. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and -- for each item in the collection -- a value, which is a string. GetItemAttr returns the value of one of these attributes for a specified item in the collection. +Index identifies which of the attribute's values is desired. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +ItemIndex identifies the item whose attribute value is desired. This is an index into the Items property array. +As implemented in TCollection, GetItemAttr always returns an empty string, because TCollection defines no custom attributes. + + + +Responds when the collection or any of its items changes. +Changed is called automatically when items in the collection change or when the EndUpdate method signals that an update is complete. It checks the value of UpdateCount, and if it is 0, calls the Update method, which performs any necessary updates. +When writing a TCollection descendant, there is no need to call Changed. Instead, bracket any changes by calls to BeginUpdate and EndUpdate. + + + + + + + +Returns a specified item in the collection. +GetItem is the protected read implementation of the Items property. + + + + + + + +Copies the properties of another item to a specified item in the collection. +SetItem is the protected write implementation of the Items property. It calls the Assign method of the item specified by Index, so that the properties of the item specified by Value are copied to that item. + + + + + + +Initializes the name of a newly inserted collection item. +The Insert method calls SetItemName to initialize the Name property of items when it inserts them into the collection. +As implemented in TCollection, SetItemName does nothing. Some TCollection descendants override this method to provide collection items with default names. + + + + + + +Updates the collection to reflect changes to its items. +Override Update in a descendent class to make any necessary changes when the items in the collection change. This method is called automatically when an update is complete. +Item identifies the item that changed. If the Item parameter is nil (Delphi) or NULL (C++), then the change affects more than one item in the collection. +As implemented in TCollection, Update does nothing. Descendent classes override this method to make any necessary adjustments. + + +Specifies the name of the property that the collection implements. +The GetNamePath method uses this protected property to assemble the name of the collection as it appears in the Object Inspector. It identifies the name of the property in the object returned by the protected GetOwner method that is implemented using this collection object. + + +Counts the number of times BeginUpdate was called without a corresponding call to EndUpdate. +UpdateCount keeps track of calls to BeginUpdate and EndUpdate so that they can be nested. Every call to BeginUpdate increments UpdateCount. Every call to EndUpdate decrements it. When UpdateCount returns to 0, the collection updates itself to reflect all changes that occurred since the first call to BeginUpdate. + + + + + + +Creates and initializes a collection. +Call Create to instantiate a TCollection object at run time. Typically, TCollection descendants are created by a component that uses the collection to implement a property. +ItemClass identifies the TCollectionItem descendants that must be used to represent the items in the collection. The Add method uses this class to create items of the appropriate type. + + + + + +Destroys the collection and each item in it. +Destroy uses the Clear method to free each item referenced in the Items array, then destroys the collection itself. + + + + + + +Returns the Owner of the collection. +Call Owner to obtain a reference to the object that owns this collection. Typically, the owner uses the collection to implement one of its properties. + + + + + + +Creates a new TCollectionItem instance and adds it to the Items array. +Call Add to create an item in the collection. The new item is placed at the end of the Items array. +Add returns the new collection item. + + + + + + +Copies the contents of the Source collection to the current object. +Use Assign to copy the contents of one TCollection instance to another. The Assign method deletes all items from the destination collection (the object where it is executed), then adds a copy of each item in the source collection's Items array. +Source is another object (typically another collection) that contains the items that replace this collection's items. + + + +Signals the start of an update operation. +Call BeginUpdate before starting an operation that performs changes to TCollection. After completing all the changes, call EndUpdate to signal the end of the operation. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, the method is used to suspend screen repainting until changes to a component that involves TCollection are completed. + + + +Deletes all items from the collection. +Clear empties the Items array and destroys each TCollectionItem. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Deletes a single item from the collection. +Delete removes the specified collection item, moving up any items that come after that item in the Items property array. +Index identifies the item to delete. This is the index of the item in the Items property array. 0 specifies the first item, 1 specifies the second item, and so on. + + + +Signals the end of an update operation. +Call EndUpdate after completing an operation that was preceded by a call to the BeginUpdate method. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, use EndUpdate to re-enable screen repainting that was turned off with the BeginUpdate method for the components that involve TCollection. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + +Returns the item with the specified ID. +The FindItemID method returns the item in the collection whose ID property is passed to it as a parameter. If no item has the specified ID, FindItemID returns nil (Delphi) or NULL (C++). + + + + + + +Returns a TCollection enumerator. +GetEnumerator returns a TCollectionEnumerator reference, which enumerates all items in the collection. +To do so, call the TCollectionEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Returns a string used by the Object Inspector. +If the collection has no owner, GetNamePath returns the name of the collection's actual (runtime) type. If the collection is owned, GetNamePath returns the owner's name followed, if applicable, by a dot and the name of the owner's property that holds the collection. For example, GetNamePath might return "TreeView1.Items". + +Note: For a collection to have an owner, it must override the GetOwner method. + + + + + + +Creates a new TCollectionItem instance and adds it to the Items array. +Call Insert to add a new item at a specified position in the collection. Existing items (starting from the specified position) are moved up in the Items array. +Insert returns the new collection item. + + +Provides access to the internal TList.Capacity property. +The Capacity property specifies the allocated size of the array of pointers maintained by the TList object. This value is set to the number of pointers the list will need to contain. + + + + +Returns the number of items in the collection. +Count contains the number of items in the Items array. Since Items is indexed starting with 0, the value of Count is always one greater than the index of the last member of Items. + + +Indicates the class to which the collection's items belong. +ItemClass is the class (descended from TCollectionItem) to which the items in the collection belong. For example, in an instance of the TCollection descendant THeaderSections, the value of the ItemClass property is THeaderSection. + + + + +TCollection is a container for TCollectionItem objects. +Each TCollection holds a group of TCollectionItem descendants. TCollection maintains an index of the collection items in its Items array. The Count property contains the number of items in the collection. Use the Add and Delete methods to add items to the collection and delete items from the collection. +Objects descended from TCollection can contain objects descended from TCollectionItem. Thus, for each TCollection descendant, there is a corresponding TCollectionItem descendant. +The following table lists some typical descendants of TCollection with the corresponding TCollectionItem descendant and the component that uses each pair: + + + +TCollection descendant + +TCollectionItem descendant + +Component + + + +TBitmapLinks + + + +TBitmapLink + + + +TCustomStyleObject + + + + +TAggregates + + + +TAggregate + + + +TClientDataSet + + + + +TCookieCollection + + + +TCookie + + + +TWebResponse + + + + +TCoolBands + + + +TCoolBand + + + +TCoolBar + + + + +TDBGridColumns + + + +TColumn + + + +TDBGrid + + + + +TDependencies + + + +TDependency + + + +TService + + + + +THeaderSections + + + +THeaderSection + + + +THeaderControl + + + + +TListColumns + + + +TListColumn + + + +TListView + + + + +TParams + + + +TParam + + + +many datasets + + + + +TStatusPanels + + + +TStatusPanel + + + +TStatusBar + + +The controls that use TCollection and TCollectionItem descendants have a published property that holds a collection. (For example, the Panels property of TStatusBar holds a TStatusPanels.) A standard property editor, referred to generically as the Collection editor, can be invoked from the Object Inspector to edit the items in the collection. + +Note: When writing a TCollection descendant that is used by another control, be sure to override the protected GetOwner method of the collection so that the descendant class instances can appear in the Object Inspector. +Note: TCollection has the TOwnedCollection descendant that maintains information about its owner. TOwnedCollection implements the GetOwner method. Therefore, classes derived from TOwnedCollection do not need to add anything in order to appear in the Object Inspector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reads and writes the Strings property as if it were published. +TStrings overrides DefineProperties so that the strings in the list can be loaded and saved with a form file as if the Strings property were published. + + + + + + + +Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + + + + + +Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + + + + + +Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + + + + + +Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + + + + +Returns a string given its index. +Get is the protected read implementation of the Strings property. +In TStrings Get is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the string with the specified index. + + + + + + +Returns the currently allocated size of the list of strings. +GetCapacity is the protected read implementation of the Capacity property. In TStrings, GetCapacity returns the value of the Count property. Descendants of TStrings can override this property to let a string list allocate memory for entries that have not been added to the list. + + + + + + +Returns the number of strings in the list +GetCount is the protected read implementation of the Count property. +In TStrings GetCount is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the number of strings that have been added to the list. + + + + + + + +Returns the object associated with the string at a specified index. +GetObject is the protected read implementation of the Objects property. +Index is the index of the string with which the object is associated. +In TStrings, GetObject always returns nil (Delphi) or NULL (C++). This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override GetObject to return the specified object. + + + + + + +Returns the value of the Text property. +GetTextStr is the protected read implementation of the Text property. It returns a string that lists all the strings in the list, with individual strings separated by the string terminator characters LineBreak. By default, LineBreak is a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. + + + + + + + +Changes the value of the string with a specified index. +Put is the protected write implementation of the Strings property. +Put changes the value of the string with the index specified by Index to S. Put does not change the object at the specified position. That is, any object associated with the previous string becomes associated with the new string. + + + + + + + +Changes the object associated with the string at a specified index. +PutObject is the protected write implementation of the Objects property. +As implemented in TStrings, PutObject does nothing. This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override PutObject to change the specified object. + + + + + + +Changes the amount of memory allocated to hold strings in the list. +SetCapacity is the protected write implementation of the Capacity property. +NewCapacity is the number of strings the list can hold after the capacity has changed. +In TStrings, the SetCapacity method does nothing. Descendent classes must override this method to change the number of strings that the list can hold. + +Note: For descendent classes that implement SetCapacity, assigning a value smaller than Count removes strings from the end of the list. Assigning a value greater than Count allocates space for more strings to be added. + + + + + +Protected setter of the Encoding property. +If Value is one of standard encoding values, SetEncoding sets the Encoding property to Value. Otherwise, SetEncoding sets the Encoding property to default. +Internally, Assign and LoadFromStream call SetEncoding. + + + + + + +Sets the Text property. +GetTextStr is the protected write implementation of the Text property. It replaces the list with the strings specified by the Value parameter. SetTextStr adds strings one at a time to the list, using the carriage returns or linefeed characters in Value as delimiters indicating when to add a new string. + + + + + + +Performs internal adjustments before or after a series of updates. +SetUpdateState is called at the beginning or end of a series of updates. When the BeginUpdate method is first called and the TStrings object is not already in the middle of an update, TStrings calls SetUpdateState internally, with Updating set to true. When the EndUpdate method is called and it cancels out the last unmatched call to BeginUpdate, TStrings calls SetUpdateState internally, with Updating set to false. +As implemented in TStrings, SetUpdateState does nothing. Descendant classes can override this method to optimize the response to updates. + + + + + + + + +Compares two strings. +TStrings uses CompareStrings internally to compare the values of strings that appear in the list. For example, the IndexOf and IndexOfName methods use CompareStrings to compare a specified string with the strings in the list. +S1 and S2 are the strings to compare. +CompareStrings returns a value less than 0 if S1 < S2, 0 if S1 == S2, and a value greater than 0 if S1 > S2. +As implemented in TStrings, CompareStrings uses the global AnsiCompareText function, which compares strings case insensitively. Some descendant classes override this method to change the way strings are compared (for example, to introduce case sensitivity). + + +Indicates the number of calls to BeginUpdate that have not been matched by a call to EndUpdate. +TStrings uses UpdateCount to keep track of calls to the BeginUpdate and EndUpdate methods. Every time a call is made to BeginUpdate, TStrings increments the value of UpdateCount. Every call to EndUpdate causes TStrings to decrement UpdateCount. +When UpdateCount changes from 0 to 1, TStrings calls the SetUpdateState method with a parameter of true. When UpdateCount changes from 1 to 0, TStrings calls the SetUpdateState method with a parameter of false. This allows descendant classes to perform optimizations when handling multiple updates. + + + + + +Creates an instance of a TStrings object. +Do not call the Create method for TStrings directly. TStrings is an abstract class and its constructor should only be called as an inherited method from the constructor of a derived class. + + + + + + +Destroys the TStrings instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + + + + + +Adds a string at the end of the list. +Call Add to add a string to the end of the list. Add returns the index of the new string. + + + +Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + + + + + + + +Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + + + + + + + + + + + + + +Adds a string to the list, and associates an object with the string. +Call AddObject to add a string and its associated object to the list. AddObject returns the index of the new string and object. + +Note: The TStrings object does not own the objects you add this way. Objects added to the TStrings object still exist even if the TStrings instance is destroyed. They must be explicitly destroyed by the application. + + + + + +Adds a string to the list. +Append is the same as the Add method, except that it does not return a value. Use Append when there is no need to know the index of the string after it has been added, or with descendants of TStrings for which the index returned is not meaningful. +For example, the TStrings descendant used by memo objects uses an index to determine where to insert a string, but the inserted string does not necessarily end up as a single string in the list. Part of the inserted text may become part of the previous string, and part may be broken off into a subsequent string. The index returned by Add is not meaningful in this case. +Use Append rather than Add as a parameter for a function requiring a TGetStrProc. + + + + + + +Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + + + + + + + + + + + +Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + + + + + + + + + + + + + + + + +Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + + + + +Sets the strings in the Strings array, possibly associated Objects, and some other properties of the current TStrings object, from the Source object. +Use Assign to set the properties of the TStrings object from the Source object. If Source is of the TStrings type, Assign copies the following properties: + +Strings +Objects +DefaultEncoding +Encoding +LineBreak +Delimiter +QuoteChar +NameValueSeparator +Options +If Source is not of the TStrings type, the inherited Assign will set the value of the string array from any object that supports TStrings in its AssignTo method. + + + +Sets the strings from another TStrings object to the list of strings. +Use SetStrings to assign the value of the TStrings object from another TStrings object (Source). + +Note: SetStrings is similar to Assign, but Assign also copies multiple additional properties. + + + + + + +Enables the TStrings object to track when the list of strings is changing. +BeginUpdate is called automatically by any property or method that changes the list of strings. Once the changes are complete, the property or method calls EndUpdate. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + +Introduces an abstract (Delphi) or pure virtual (C++) method to empty the list and any associated objects. +Descendants of TStrings implement a Clear method to delete all the strings in the list, and to remove any references to associated objects. + + + + + + +Introduces an abstract (Delphi) or pure virtual (C++) method to delete a specified string from the list. +Descendants of TStrings implement a Delete method to remove a specified string from the list. If an object is associated with the string, the reference to the object is removed as well. Index gives the position of the string, where 0 is the first string, 1 is the second string, and so on. + + + +Enables the TStrings object to keep track of when the list of strings has finished changing. +EndUpdate is called automatically by any property or method that changes the list of strings. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + + + + + +Compares the list of strings to the list from another TStrings object and returns true if the two lists match. +Call Equals to compare the lists in two TStrings objects. Equals compares only the strings, not any references to associated objects. Equals returns true if the lists for both TStrings objects have the same number of strings and the strings in each list match. Equals returns false if the lists are different in length, if they contain different strings, or if the order of the strings in the two lists differ. + +Note: The Equals method uses an overridden Get method to perform the compare, thus it does not provide a context-insensitive option. + + + + + + +Swaps the position of two strings in the list. +Call Exchange to rearrange the strings in the list. The strings are specified by their index values in the Index1 and Index2 parameters. Indexes are zero-based, so the first string in the list has an index value of 0, the second has an index value of 1, and so on. +If either string has an associated object, Exchange changes the position of the object as well. + + + + + + +Returns a TStrings enumerator. +GetEnumerator returns a TStringsEnumerator reference, which enumerates the strings in a TStrings object. +To process all these strings, call the TStringsEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Allocates a text buffer and fills it with the value of the Text property. +Call GetText to obtain a dynamically allocated character buffer containing all of the strings in the list. Individual strings are separated by a carriage return (#13) on the OS X operating system, or by a carriage return and a line feed (#13#10) on Windows operating systems. The caller is responsible for freeing the returned value using the StrDispose procedure. + + + + + + + +Returns the position of a string in the list. +Call IndexOf to obtain the position of the first occurrence of the S string. IndexOf is not case-sensitive; this means that the given string may differ in case from the string in the list. For example: + +String1 := MyStrings.Items.IndexOf('My First String'); + +is equivalent to + +String1 := MyStrings.Items.IndexOf('My FIRST String'); + +IndexOf returns the 0-based index of the string. Thus, if S matches the first string in the list, IndexOf returns 0, if S is the second string, IndexOf returns 1, and so on. If the string is not in the string list, IndexOf returns -1. + +Note: If the string appears in the list more than once, IndexOf returns the position of the first occurrence. + + + + + + +Returns the position of the first name-value pair with the specified name. +Call IndexOfName to locate the first occurrence of a name-value pair where the name part is equal to the Name parameter or differs only in case. IndexOfName returns the 0-based index of the string. If no string in the list has the indicated name, IndexOfName returns -1. + +Note: If there is more than one name-value pair with a name portion matching the Name parameter, IndexOfName returns the position of the first such string. + + + + + + +Returns the index of the first string in the list associated with a given object. +Call IndexOfObject to locate the first string in the list associated with the object AObject. Specify the object you want to locate as the value of the AObject parameter. IndexOfObject returns the 0-based index of the string and object. If the object is not associated with any of the strings, IndexOfObject returns -1. + + + + + + + +Introduces abstract (Delphi) or pure virtual (C++) method to insert a string at a specified position. +Descendants of TStrings implement an Insert method to add the string S to the list at the position specified by Index. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. +All methods that add strings to the list use the Insert method to add the string. +If the string has an associated object, use the InsertObject method instead. + + + + + + + + +Inserts a string into the list at the specified position, and associates it with an object. +Call InsertObject to insert the string S into the list at the position identified by Index, and associate it with the object AObject. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. + + + + + + +Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + + + + + +Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + + + + +Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + + + + + +Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + + + + + +Changes the position of a string in the list. +Use Move to move the string at position CurIndex so that it occupies the position NewIndex. The positions are specified as 0-based indexes. For example, the following lines of code move the string in the first position to the last position: +For Delphi: + +MyStringsObject.Move(0, MyStringsObject.Count - 1); + +For C++: + +MyStringsObject->Move(0, MyStringsObject->Count - 1); + +If the string has an associated object, the object remains associated with the string in its new position. + + + + + + +Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + + + + + +Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + + + + +Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + + + + + +Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + + + + +Sets the Text property. +Call SetText to replace the list with the strings specified by the Text parameter. SetText adds strings one at a time to the list, using the carriage returns or linefeed characters in Text as delimiters indicating when to add a new string. + + + + + + +Converts a TStrings descendant to a string array. + +Use ToStringArray to obtain an array of strings for each string in the list. + + + + + + +Returns the TObject array associated with Strings. + +Use ToObjectArray to obtain the array of TObject associated with Strings. + +Note: TStrings is an abstract class and this method has no effect. Descendent classes can associate objects with strings. +Note: The TStrings object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the TStrings object is destroyed. They must be explicitly destroyed by the application. + + +Indicates whether or not the list of strings is in the middle of an update. + + + +Indicates the number of strings the TStrings object can hold. +Read Capacity to determine the currently allocated size of the string list. For the TStrings object, reading Capacity returns the Count property, and setting Capacity does nothing. Descendants of TStrings can override this property to allow a string list to allocate memory for entries that have not been added to the list. + + +Lists the strings in the TStrings object in a single comma-delimited string. +Use CommaText to get or set all the strings in the TStrings object in a single comma-delimited string. The single comma-delimited string format is also known as the system data format (SDF). +When retrieving CommaText, any string in the list that include spaces, commas or double quotes will be contained in double quotes, and any double quotes in a string will be repeated. For example, if the list contains the following strings: + +Stri,ng1 +Stri"ng2 +String 3 +String4 + +CommaText will return: + +"Stri,ng1","Stri""ng2","String 3",String4 + +When assigning CommaText, the value is parsed as SDF formatted text. For SDF format, strings are separated by commas or spaces, and optionally enclosed in double quotes. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored. For example, suppose CommaText is set to: + +"Stri,ng 1","Stri""ng 2",String 3,String4 + +The list will then contain: + +Stri,ng 1 +Stri"ng 2 +String +3 +String4 + +Note: CommaText is the same as the DelimitedText property with a delimiter of ',' and a quote character of '"'. +Including a trailing comma in the source string causes a blank item to be included in the string list. For example, if CommaText is set to + +"String1,String2,String3, " + +the string list will contain + +String1 +String2 +String3 +<Blank> + + +Introduces an abstract property to represent the number of strings in the list. +Descendants of TStrings implement a Count property to indicate the number of strings in the list. +Use the Count property when iterating over all the strings in the list, or when trying to locate the position of a string relative to the last string in the list. + + +The default encoding for the current object. +DefaultEncoding is used when the nil encoding is specified in a call to LoadFromStream or SaveToStream. +By default, DefaultEncoding is set to Default. The user can change DefaultEncoding if another default encoding is desired for LoadFromStream or SaveToStream. + + +Specifies the delimiter used by the DelimitedText property. +Use Delimiter to get or set the delimiter used by the DelimitedText property. DelimitedText represents all of the strings in the TStrings object as a single string, with individual strings separated by the character that is the value of Delimiter. +The default delimiter is represented by comma (,). + + +Represents all the strings in the TStrings object as a single delimited string. +Use DelimitedText to get or set all the strings in the TStrings object in a single string, separated by the character specified by the Delimiter property. +When retrieving DelimitedText, any string in the list that includes spaces or the delimiter and quotation marks characters specified in the Delimiter and QuoteChar properties will be surrounded (before and after) by the quotation mark character (QuoteChar). In addition, any QuoteChar character contained in an individual string will be repeated. +When retrieving DelimitedText, the resulting value delimits individual strings in two ways: each string is surrounded (before and after) by the quotation marks character specified by the QuoteChar property. In addition, individual strings are separated by the character specified by the Delimiter property. +When assigning DelimitedText, individual strings must be separated using Delimiter marks, and optionally enclosed in QuoteChar characters. +When assigning DelimitedText, the value is parsed as SDF formatted text. For SDF format, strings are separated by Delimiter characters or spaces, and optionally enclosed in QuoteChar characters. QuoteChar marks that are part of the string are repeated to distinguish them from the QuoteChar characters that surround the string. Spaces and Delimiter characters that are not contained within QuoteChar marks are delimiters. Two Delimiter characters next to each other will indicate an empty string, but spaces that appear next to another Delimiter character are ignored. +If StrictDelimiter is set to False, the space character is also interpreted as a delimiter, regardless of the value of Delimiter. This is not true when the space character occurs between quotation marks. + +Note: CommaText is the same as the DelimitedText property when Delimiter is ',' and QuoteChar is '"'. Including a trailing Delimiter in the source string causes a blank item to be included in the string list. + +Character encoding determined during reading from a stream or file. +Encoding is a read-only property that contains the value of the character encoding detected when the LoadFromStream or LoadFromFile methods are called. If a file or stream does not contain a BOM (the encoding value cannot be detected) then Encoding is set to the value specified in the DefaultEncoding property. +Encoding is used in the SaveToStream and SaveToFile methods. + + +Defines line-break characters. +The LineBreak property is used internally in TStrings to set the string terminator characters. Set or read the LineBreak property to determine the string terminator characters in multistring output operations. +For example, the GetText method returns a long string containing all TStrings strings, each of which is terminated by the LineBreak value. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on Android, Linux, macOS and iOS it is just a line feed (#10). + + + + + When the list of strings includes strings that are name-value pairs or just names, + read Keys to access the name part of a string. If the string is not a name-value + pair, Keys returns full string. Assigning Keys will write new name for name-value + pair. This is in contrast to Names property. + + + + + +Specifies the quote character used by the DelimitedText property. +Use QuoteChar to get or set the quote character that is used to enclose individual strings in the DelimitedText property. +When QuoteChar is set to the null character, then DelimitedText does the following: + +At reading, does not return quoted list items. +At assigning, does not check an assigning value for quote char. +That is, you can set QuoteChar to the null character to disable quoting in DelimitedText. To set the QuoteChar to the null character, do the following: + + +Delphi: + +MyStringList.QuoteChar := #0; + + + +C++: + +MyStringList->QuoteChar = '\0'; + + + + + +Indicates the character used to separate names from values. +Strings that contain the NameValueSeparator character are considered name-value pairs. NameValueSeparator defaults to the equal sign (=). TStrings defines various methods for accessing names and values and for searching for specific names. +Strings that are name-value pairs consist of a name part, the separator character, and a value part. Any spaces around the separator character are part of the name or value. This convention corresponds to the format used in many initialization files. For example: + +DisplayGrid=1 +SnapToGrid=1 +GridSizeX=8 +GridSizeY=8 + + +Determines how the Delimiter property is used. +If StrictDelimiter is True, individual strings in DelimitedText are only separated by Delimiter or quoted between QuoteChar. If StrictDelimiter is False, spaces and non-printable character are also used as delimiters. + +Tip: You can set QuoteChar to the null character (#0 in Delphi, '\0' in C++) if you do not want quoted strings to be extracted as if they where surrounded by Delimiter. + + + + +Lists the strings in the TStrings object as a single string with the individual strings delimited by carriage returns and line feeds. +Use Text to get or set all the strings in the TStrings object in a single string delimited by carriage return, line feed pairs. +When setting Text, the value will be parsed and separated into substrings whenever the LineBreak value is encountered. For backward compatibility, on POSIX, if the LineBreak separator is LF, then LF, CR, or CRLF are treated as separators. On Windows if the LineBreak separator is CRLF, then LF, CR, or CRLF are treated as separators. +If the strings in the list contain carriage return or linefeed characters, a less ambiguous format for the strings is available through the CommaText or DelimitedText property. + + +Implements an IStringsAdapter interface for the TStrings object. + +StringsAdapter specifies the attached TStringsAdapter when it is used in OLE applications. + +Note: To create a StringsAdapter you can use GetOleStrings and SetOleStrings instead of creating an instance of TStringsAdapter. StringsAdapter is used internally with OLE applications. + +Will cause SaveToStream and SaveToFile to write a BOM. +Set WriteBOM to True to cause SaveToStream to write a BOM (byte-order mark) to the stream and to cause SaveToFile to write a BOM to the file. + + + +Determines whether to add a line Break after the last line of the Text property or not. +Use TrailingLineBreak to add a finishing line break to Text. Set TrailingLineBreak to True to add a line Break after the last line of Text. Set TrailingLineBreak to False to finish Text without a line Break. Default is True. + + + + +Determines the implementation that the list of strings must use for string comparison. +Set UseLocale to True to use AnsiCompareStr and AnsiCompareText to compare strings. +Set UseLocale to False to use CompareStr and CompareText. Default is True. + + + + +Controls a set of boolean properties of TStrings. +Use Options to specify the value of the following boolean properties of the list of strings: + + + +Option + +Property + + +soStrictDelimiter + +StrictDelimiter + + +soWriteBOM + +WriteBOM + + +soTrailingLineBreak + +TrailingLineBreak + + +soUseLocale + +UseLocale + + + + +TStrings is the base class for objects that represent a list of strings. +Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated. +Descendants of TStrings can represent several individual strings, such as the individual lines that appear in a list box. Some objects use descendants of TStrings to represent one long body of text so that it can be manipulated in smaller chunks. +TStrings introduces many properties and methods to: + +Add or delete strings at specified positions in the list. +Rearrange the strings in the list. +Access the string at a particular location. +Read the strings from or write the strings to a file or stream. +Associate an object with each string in the list. +Store and retrieve strings as name-value pairs. +For an explanation of name-value pairs, refer to the NameValueSeparator property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This constructor creates new string list with specified QuoteChar + and Delimiter property values. + + + + + + + + + + + This constructor creates new string list with specified QuoteChar, + Delimiter and Options property values. + + + + + + + + + + + + This constructor creates new string list with specified Duplicates, + Sorted and CaseSensitive property values. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Methods responsible for reading up to Count bytes of data from the stream into Buffer. +Descendant stream classes can define its own Read methods that read data from its particular storage medium (such as memory or a disk file) into a Buffer buffer. +Read is used in cases where the number of bytes to read from the stream is not necessarily fixed. +Read attempts to read, into Buffer, up to Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. Read returns the number of bytes actually read, which may be less than Count. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +All the other data-reading methods of a stream (ReadBuffer, ReadData) call Read to do their actual reading. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +Write attempts to write up to Count bytes from the Buffer to the current position in the stream, and returns the number of bytes written. +After writing to the stream, Write advances the current position by the number of bytes written. +Offset specifies a zero-based position in Buffer of the first byte to write. +All other data-writing methods of a stream (WriteBuffer, WriteData) call Write to do their actual writing. +Each descendent stream object defines a Write method that writes data to its particular storage medium (such as memory or a disk file). + + + + + + + + + +Methods responsible for reading up to Count bytes of data from the stream into Buffer. +Descendant stream classes can define its own Read methods that read data from its particular storage medium (such as memory or a disk file) into a Buffer buffer. +Read is used in cases where the number of bytes to read from the stream is not necessarily fixed. +Read attempts to read, into Buffer, up to Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. Read returns the number of bytes actually read, which may be less than Count. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +All the other data-reading methods of a stream (ReadBuffer, ReadData) call Read to do their actual reading. + + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +Write attempts to write up to Count bytes from the Buffer to the current position in the stream, and returns the number of bytes written. +After writing to the stream, Write advances the current position by the number of bytes written. +Offset specifies a zero-based position in Buffer of the first byte to write. +All other data-writing methods of a stream (WriteBuffer, WriteData) call Write to do their actual writing. +Each descendent stream object defines a Write method that writes data to its particular storage medium (such as memory or a disk file). + + + + + + + + +Methods responsible for reading up to Count bytes of data from the stream into Buffer. +Descendant stream classes can define its own Read methods that read data from its particular storage medium (such as memory or a disk file) into a Buffer buffer. +Read is used in cases where the number of bytes to read from the stream is not necessarily fixed. +Read attempts to read, into Buffer, up to Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. Read returns the number of bytes actually read, which may be less than Count. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +All the other data-reading methods of a stream (ReadBuffer, ReadData) call Read to do their actual reading. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +Write attempts to write up to Count bytes from the Buffer to the current position in the stream, and returns the number of bytes written. +After writing to the stream, Write advances the current position by the number of bytes written. +Offset specifies a zero-based position in Buffer of the first byte to write. +All other data-writing methods of a stream (WriteBuffer, WriteData) call Write to do their actual writing. +Each descendent stream object defines a Write method that writes data to its particular storage medium (such as memory or a disk file). + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + + + + + + +Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Moves to a specified position in the streamed resource. +Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file). +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + + +Seek returns the new value of the Position property. +Seek is called by the Position and Size properties. + +Note: As implemented in TStream, the two versions (the 32-bit or 64-bit syntax) call each other. Descendent stream classes must override at least one of these versions, and the override must not call the inherited default implementation. + + + + + + + +Moves to a specified position in the streamed resource. +Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file). +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + + +Seek returns the new value of the Position property. +Seek is called by the Position and Size properties. + +Note: As implemented in TStream, the two versions (the 32-bit or 64-bit syntax) call each other. Descendent stream classes must override at least one of these versions, and the override must not call the inherited default implementation. + + + + + + + +Moves to a specified position in the streamed resource. +Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file). +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + + +Seek returns the new value of the Position property. +Seek is called by the Position and Size properties. + +Note: As implemented in TStream, the two versions (the 32-bit or 64-bit syntax) call each other. Descendent stream classes must override at least one of these versions, and the override must not call the inherited default implementation. + + + + + + +Reads Count bytes from the stream into Buffer. +Use ReadBuffer to read Count bytes from the stream into a Buffer buffer in cases where the number of bytes to read is known and fixed, for example when reading in structures. ReadBuffer is used internally for loading from a stream and copying from a stream. +Read attempts to read exactly Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +ReadBuffer calls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadError exception is raised. + + + + + + + +Reads Count bytes from the stream into Buffer. +Use ReadBuffer to read Count bytes from the stream into a Buffer buffer in cases where the number of bytes to read is known and fixed, for example when reading in structures. ReadBuffer is used internally for loading from a stream and copying from a stream. +Read attempts to read exactly Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +ReadBuffer calls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadError exception is raised. + + + + + + + + +Reads Count bytes from the stream into Buffer. +Use ReadBuffer to read Count bytes from the stream into a Buffer buffer in cases where the number of bytes to read is known and fixed, for example when reading in structures. ReadBuffer is used internally for loading from a stream and copying from a stream. +Read attempts to read exactly Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +ReadBuffer calls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadError exception is raised. + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + + + + + +Writes Count bytes from Buffer onto the stream. +WriteBuffer attempts to write Count bytes from the Buffer to the current position in the stream, then WriteBuffer advances the current position by Count. If the stream fails to write all the requested bytes, an EWriteError exception is raised. +Offset specifies a zero-based position in Buffer of the first byte to write. +Use WriteBuffer to save data to a stream. WriteBuffer is used in cases, where the number of bytes to write is known and required, for example when writing in structures. Use WriteBuffer for standard file I/O streaming. +WriteBuffer is used internally for writing to a stream. It is used by other objects, such as strings and lists, for writing strings stored in a buffer. +WriteBuffer calls Write to handle the actual writing. + + + + + + + +Writes Count bytes from Buffer onto the stream. +WriteBuffer attempts to write Count bytes from the Buffer to the current position in the stream, then WriteBuffer advances the current position by Count. If the stream fails to write all the requested bytes, an EWriteError exception is raised. +Offset specifies a zero-based position in Buffer of the first byte to write. +Use WriteBuffer to save data to a stream. WriteBuffer is used in cases, where the number of bytes to write is known and required, for example when writing in structures. Use WriteBuffer for standard file I/O streaming. +WriteBuffer is used internally for writing to a stream. It is used by other objects, such as strings and lists, for writing strings stored in a buffer. +WriteBuffer calls Write to handle the actual writing. + + + + + + + + +Writes Count bytes from Buffer onto the stream. +WriteBuffer attempts to write Count bytes from the Buffer to the current position in the stream, then WriteBuffer advances the current position by Count. If the stream fails to write all the requested bytes, an EWriteError exception is raised. +Offset specifies a zero-based position in Buffer of the first byte to write. +Use WriteBuffer to save data to a stream. WriteBuffer is used in cases, where the number of bytes to write is known and required, for example when writing in structures. Use WriteBuffer for standard file I/O streaming. +WriteBuffer is used internally for writing to a stream. It is used by other objects, such as strings and lists, for writing strings stored in a buffer. +WriteBuffer calls Write to handle the actual writing. + + + + + + + +Writes up to 4 four or Count bytes from Buffer onto the stream. +WriteBufferData works using the following algorithms: + +If Count <= 4, then WriteBufferData tries to write up to Count bytes to the stream starting at the current position and advances the current position in the stream by the number of bytes transferred. +If Count > 4, then WriteBufferData tries to write up to 4 four bytes to the stream, starting at the current position, and then advances the current position in the stream until Count number of bytes from the initial position that was before the starting of WriteBufferData execution. + + + + + + $0 + + + + + $100000 + + + + + +Copies a specified number of bytes from one stream to another. +Use CopyFrom to copy data from one stream to a different one. Using CopyFrom eliminates the need to create, read into, write from, and free a buffer when copying data. +CopyFrom copies Count bytes from the stream specified by Source into the stream. It then moves the current position by Count bytes and returns the number of bytes copied. +If Count is 0, CopyFrom sets Source position to 0 before reading and then copies the entire contents of Source into the stream. If Count is greater than or less than 0, CopyFrom reads from the current position in Source. +Because the CopyFrom method uses ReadBuffer and WriteBuffer to do the effective copying, if the Count is greater than the SourceStream size, ReadBuffer throws an exception stating that a stream read error has occured. + + + + + + + +Initiates streaming of components and their properties. +ReadComponent is called indirectly by the global routine ReadComponentRes, by the ReadComponentRes method, or it can be called directly to initiate component streaming. +ReadComponent reads data values from the stream and assigns them to Instance's properties. It then constructs a reader object and calls the reader's ReadRootComponent method to read the Instance's property values and construct child objects defined in the stream as children of Instance. ReadComponent returns the component. +If Instance is nil (Delphi) or NULL (C++), ReadComponent constructs a component based on the type information in the stream and returns the newly-constructed component. + + + + + + + +Reads components and their properties from a stream in a resource file format. +ReadComponentRes is called automatically by the global routine ReadComponentResFile. It can also be called directly if the current position of the stream points to a component written using the WriteComponentRes method. +ReadComponentResFile creates a file stream object, which then calls its ReadComponentRes method. +ReadComponentRes first calls the ReadResHeader method to read a resource header from the stream. If the stream does not contain a resource header at the current position, ReadResHeader will raise an EInvalidImage exception. ReadComponentRes then calls ReadComponent to read the properties that must be set on Instance. + + + + + + +Initiates the writing of components and their properties to a stream. +WriteComponent is used internally in the component streaming system, but can also be called directly when writing components to memory streams or database blobs. +WriteComponent constructs a writer object and calls its WriteRootComponent method to write the component specified by Instance, and its owned objects, to the stream. + + + + + + + +Writes components and their properties to a stream from a resource file format. +WriteComponentRes is used internally in the streaming system, but can also be called directly when sending data to other applications on disk. WriteComponentRes is used for streaming components that need data, such as a bitmap or icon to be stored in a resource-file format. +WriteComponentRes calls WriteDescendentRes, passing in nil (Delphi) or NULL (C++) as the Ancestor. Therefore, WriteDescendentRes initiates the remainder of the streaming process for a component that, in this case, is not a descendant. +To read a component written with WriteComponentRes, call the ReadComponentRes method. + + + + + + + +Streams components and their properties in inherited forms. +Do not call WriteDescendent directly. WriteDescendent is called automatically by WriteComponent. +WriteDescendent constructs a writer object, then calls the writer object's WriteDescendent method to write the component passed in Instance to the stream. Instance is either an inherited form descended from Ancestor or nil (Delphi) or NULL (C++). However, WriteDescendent is never used to write owned components, only to initiate streaming on the root component. + + + + + + + + +Streams components and their properties in inherited forms. +Do not call WriteDescendentRes directly. WriteDescendentRes is called automatically by WriteComponentRes. +WriteDescendentRes writes a resource-file header to the stream, using the resource name passed in ResName as the name of the resource. It then calls WriteDescendent to write Instance to the stream as a descendant of Ancestor. + + + + + + + +Writes a resource-file header to the stream. +Do not call WriteResourceHeader; it is used internally. The WriteDescendentRes method calls WriteResourceHeader before writing a component to the stream. This method writes the resource-file header, using the value passed as ResName for the name of the resource. It returns a position in FixupInfo that must be used to adjust the header after the size of the resource is known. WriteDescendentRes calls FixupResourceHeader with the value returned as FixupInfo after streaming out the component. + + + + + + +Patches the resource header for a resource that has been written to the stream. +Do not call FixupResourceHeader� it is used internally. The WriteDescendentRes method calls FixupResourceHeader after writing a component to the stream. This method then uses the current position to determine the size of the resource just written and adjust the resource header accordingly. +The FixupInfo parameter is the value returned by WriteResourceHeader when it writes the resource header (before WriteDescendentRes streams out the component.) + + + +Reads a resource-file header from the stream. +Do not call ReadResHeader directly. It is called automatically by ReadComponentRes before reading a component from a resource file. +After reading the resource-file header, ReadResHeader moves the current position of the stream to just beyond the header. If the stream does not contain a valid resource-file header, ReadResHeader raises an EInvalidImage exception. + + +Indicates the current offset into the stream for reading and writing. +Use Position to obtain the current position of the stream. This is the number of bytes from the beginning of the streamed data. + + +Indicates the size in bytes of the stream. +Use Size to find the size of the stream. Size is used internally in routines that read and write to and from the stream. Setting the Size property of TStream does nothing. However, descendants of TStream can override this property to allow applications to change the size of the resource accessed using the stream. +The Size property typically indicates the size of the stream in bytes. But a descendent of TStream can use -1 to indicate an unknown size. When the size is unknown, use the return value from TStream.Read to determine end of the stream. + +Example of Stream Size using DataSnap and DBX +When you are reading a DataSnap stream in blocks, the actual TStream descendant that is used to read the stream is TDBXStreamReaderStream. TDBXStreamReaderStream overrides methods of TStream such as the method System.Classes.TStream.GetSize, which is the reader for the property Size. +DBX connections support reading streams in block. The default block size is 32K. Streams can be passed from the client to the server, or from the server to the client. When the receiver is reading the stream (whether the receiver is the client or the server), the stream is passed from the sender to the receiver in blocks. When the stream is large enough to require multiple block readings, the Size property of the receiver's stream will be -1, which indicates that the size of the stream is unknown. As the receiver reads the stream, DataSnap makes a request to the sender for the next block, as needed. To read the stream, the client calls the Read() method until the return value is less than the value requested. +The following code shows how to read a stream to the end, by checking the return value from Read(): + +var + LBuffer: TArray<Byte>; + LReadCount: Integer; +begin + SetLength(LBuffer, 1024*10); // 10K buffer for this example. The buffer size can be larger or smaller. + repeat + LReadCount := AStream.Read(LBuffer[0], Length(LBuffer)); + if LReadCount > 0 then + begin + // Process buffer + end; + until LReadCount < Length(LBuffer); + + + +TStream is the base class type for stream objects that can read from or write to various kinds of storage media, such as disk files, dynamic memory, and so on. +Use specialized stream objects to read from, write to, or copy information stored in a particular medium. Each descendant of TStream implements methods for transferring information to and from a particular storage medium, such as a disk file, dynamic memory, and so on. In addition to methods for reading, writing, and copying bytes to and from the stream, stream objects permit applications to seek to an arbitrary position in the stream. Properties of TStream provide information about the stream, such as its size and the current position in the stream. +TStream also introduces methods that work in conjunction with components and filers for loading and saving components in simple and inherited forms. These methods are called automatically by global routines that initiate component streaming. They can also be called directly to initiate the streaming process. Note, however, that component streaming always involves two additional objects: + +A component object that is passed as a parameter to the stream's methods. +A filer object that is automatically created by the stream, and associated with the stream. +Descendant stream objects, such as memory and file streams used for component streaming, are created automatically by the global functions ReadComponentRes and WriteComponentRes. For streaming other kinds of information, choose a descendent class according to the specific data and storage needs. These include: + +TFileStream -- for working with files. +TStringStream -- for manipulating in-memory strings. +TMemoryStream -- for working with a memory buffer. +TWinSocketStream -- for reading and writing over a socket connection. +TOleStream -- for using a COM interface to read and write. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sets the end of the file marker to truncate the resource at the indicated position. +Call SetSize to set the size of the resource. SetSize calls Seek to go to the indicated position, and then writes an end of file marker. If the size of the resource cannot be changed, an exception is raised. For example, calling SetSize for a file handle that was opened in fmOpenRead mode will raise an exception. + + + + + + +Sets the end of the file marker to truncate the resource at the indicated position. +Call SetSize to set the size of the resource. SetSize calls Seek to go to the indicated position, and then writes an end of file marker. If the size of the resource cannot be changed, an exception is raised. For example, calling SetSize for a file handle that was opened in fmOpenRead mode will raise an exception. + + + + + + +Creates an instance of THandleStream. +Call Create to instantiate a THandleStream for a given handle. +The handle must be obtained by opening or creating the resource in the appropriate mode. For example, to create a handle stream for reading from a file, obtain the file handle by opening the file with an fmOpenRead or fmOpenReadWrite mode. To create a handle stream for writing to a file, obtain the file handle by opening the file with an fmOpenWrite or fmOpenReadWrite mode. + + + + + + + + +Reads up to Count bytes of data from the resource associated with the handle stream into Buffer. +Use Read to read data from the resource associated with the handle stream when the number of bytes in the file is not known. Read transfers up to Count bytes from the resource, starting at the current position, and then advances the current position in the resource by the number of bytes actually transferred. Read returns the number of bytes actually transferred, which may be less than Count if the end of file marker is encountered. +All other data-reading methods of a handle stream (ReadBuffer, ReadComponent) call Read to do the actual reading. + + + + + + + + +Writes Count bytes from the Buffer to the current position in the resource. +Use Write to write Count bytes to the resource associated with the handle stream, starting at the current position. After writing to the resource, Write advances the current position by the number bytes written, and returns the number of bytes written. +All other data-writing methods of a handle stream (WriteBuffer, WriteComponent) call Write to do the actual writing. + + + + + + + + +Resets the current position of the handle stream. +Use Seek to move the current position within the resource associated with the handle stream by the indicated offset. Seek allows an application to read from or write to a particular location within the resource. +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soFromBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soFromCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soFromEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + +Or you can also use TSeekOrigin and its values to indicate where to start a seek operation. +Seek returns the new value of the Position property, the new current position in the resource. + + +Specifies the handle for the communications resource the stream reads from and writes to. +Read Handle to get the handle for file management functions. To read from or write to the resource, use the methods of the THandleStream object. +Handle is a read-only property. The handle property cannot be changed to allow the handle stream to switch from reading to writing or vice versa. For example, to change from a file handle that is opened in read-only mode to one that is opened in write mode: + +Free the stream object. +Call FileClose to close the file. +Reopen the file in write mode and use the handle to create a new instance of a handle stream. Alternately, open a TFileStream object for the file, specifying a write mode for the stream. +Note: Do not call the FileClose function on the Handle until after the THandleStream object has been destroyed. + + +THandleStream enables applications to read from and write to communications resources identified by a handle. +Use THandleStream to access files, sockets, named pipes, mailslots, or other communications resources that provide a handle when opened. For example, the FileOpen function provides a handle for a file on disk. THandleStream allows applications to use a uniform stream interface when performing I/O using a handle. +To avoid the overhead of managing file handles, use TFileStream to work with disk files. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates an instance of TFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +If the file cannot be opened, Create raises an exception. + + + + + + + + +Creates an instance of TFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +If the file cannot be opened, Create raises an exception. + + + + + +Destroys an instance of TFileStream. +Do not call Destroy directly in an application. Instead, call Free, which checks that the TFileStream reference is not nil and only then calls Destroy. +Destroy closes the Handle for the file stream before freeing the object. + + +Preserves the file name of the file associated with the file stream. +Use FileName to display the name of the file that TFileStream has accessed from disk. This is a read only property. + + + + + +TFileStream enables applications to read from and write to a file on disk. +Use TFileStream to access the information in disk files. TFileStream will open a named file and provide methods to read from or write to it. If an application already has a handle to the file, opened in the appropriate mode, use THandleStream instead. + + + +TBufferedFileStream adds buffering support to TFileStream. +TBufferedFileStream optimizes multiple consecutive small reads or writes. However, TBufferedFileStream can be used as a drop-in replacement for TFileStream, enabling applications to read from and write to a file on a disk. + +Note: TBufferedFileStream will not give performance gain for random position reads or writes, or large reads or writes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sets the end of the file marker to truncate the resource at the indicated position. +System.Classes.TBufferedFileStream.SetSize inherits from System.Classes.THandleStream.SetSize. All content below this line refers to System.Classes.THandleStream.SetSize. +Sets the end of the file marker to truncate the resource at the indicated position. +Call SetSize to set the size of the resource. SetSize calls Seek to go to the indicated position, and then writes an end of file marker. If the size of the resource cannot be changed, an exception is raised. For example, calling SetSize for a file handle that was opened in fmOpenRead mode will raise an exception. + + + +Writes the buffered data that have not yet been written to the file. +When using a buffered file stream, call SyncBuffer to empty the buffer and write to the file the buffered data that are still not written. +The ReRead parameter specifies whether the buffer is repopulated or not before the call to SyncBuffer. The possible ReRead values are: + +True -- The buffer is refilled with the corresponding data from the file. +False -- The buffer will remain empty until the next read or write operation. + + + + + + + + + + + $8000 + + + + +Creates an instance of TBufferedFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +The BufferSize parameter determines the size of the buffer used to read from or write to the file. +If the file cannot be opened, Create raises an exception. + + + + + + + + + $8000 + + + + +Creates an instance of TBufferedFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +The BufferSize parameter determines the size of the buffer used to read from or write to the file. +If the file cannot be opened, Create raises an exception. + + + + + +Destroys this instance of TBufferedFileStream. + + + +Writes the buffered data that have not yet been written to the file. +When using a buffered file stream, call FlushBuffer to write to the file the data from the buffer that are still not written. +Once you call FlushBuffer, the buffer will remain empty until the next read or write operation. + + + + + + + + + +Reads up to Count bytes of data from the resource associated with the handle stream into Buffer. +System.Classes.TBufferedFileStream.Read inherits from System.Classes.THandleStream.Read. All content below this line refers to System.Classes.THandleStream.Read. +Reads up to Count bytes of data from the resource associated with the handle stream into Buffer. +Use Read to read data from the resource associated with the handle stream when the number of bytes in the file is not known. Read transfers up to Count bytes from the resource, starting at the current position, and then advances the current position in the resource by the number of bytes actually transferred. Read returns the number of bytes actually transferred, which may be less than Count if the end of file marker is encountered. +All other data-reading methods of a handle stream (ReadBuffer, ReadComponent) call Read to do the actual reading. + + + + + + + + +Writes Count bytes from the Buffer to the current position in the resource. +System.Classes.TBufferedFileStream.Write inherits from System.Classes.THandleStream.Write. All content below this line refers to System.Classes.THandleStream.Write. +Writes Count bytes from the Buffer to the current position in the resource. +Use Write to write Count bytes to the resource associated with the handle stream, starting at the current position. After writing to the resource, Write advances the current position by the number bytes written, and returns the number of bytes written. +All other data-writing methods of a handle stream (WriteBuffer, WriteComponent) call Write to do the actual writing. + + + + + + + + +Resets the current position of the handle stream. +System.Classes.TBufferedFileStream.Seek inherits from System.Classes.THandleStream.Seek. All content below this line refers to System.Classes.THandleStream.Seek. +Resets the current position of the handle stream. +Use Seek to move the current position within the resource associated with the handle stream by the indicated offset. Seek allows an application to read from or write to a particular location within the resource. +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soFromBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soFromCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soFromEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + +Or you can also use TSeekOrigin and its values to indicate where to start a seek operation. +Seek returns the new value of the Position property, the new current position in the resource. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Replaces the memory buffer associated with the memory stream. +Use SetPointer to set the internal memory buffer, Memory, to be the value passed in by Ptr. Size is the number of bytes Ptr points to. +Descendants of TCustomMemoryStream should use SetPointer to associate the memory stream with the memory buffer that holds the data for the memory stream. + +Note: SetPointer does not free the existing value of Memory, if any, when it replaces the memory buffer. Descendants of TCustomMemoryStream that use SetPointer to replace the stream's memory pool should free the memory pointed to by the Memory property before calling SetPointer to replace the memory buffer. + + + + + + + +Reads up to Count bytes from the memory stream into Buffer and advances the current position of the stream by the number of bytes read. +Use Read to read the contents of the memory stream into a buffer, starting at the current position. Read will read up to Count bytes from the current position in Memory. If Count bytes extends beyond the end of the memory buffer, Read will only transfer the data up to the end of the associated memory buffer. Read returns the number of bytes actually transferred to Buffer, and advances the current position accordingly. If the return value is less than Count, it means that reading reached the end of the stream data. +All the other data-reading methods of the memory stream (ReadBuffer, ReadComponent) call Read to do the actual reading. + +Note: Read treats Count as an upper bound. The ReadBuffer method, by contrast, raises an exception if Count bytes cannot be read. + + + + + + + +Moves the current position of the stream by Offset bytes, relative to the origin specified by Origin. +Use Seek to move the current position within the memory stream by the indicated offset. Seek allows an application to read from or write to a particular location within the Memory associated with the memory stream. +If Offset is a negative number, the seeking is backward from the specified origin. The following table shows the different values of Origin and their meanings for seeking: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of Memory. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of Memory. Offset must be <= 0 to indicate a number of bytes before the end of the memory buffer. + + +Seek returns the new value of the Position property. + +Note: Seek does no error checking on the value provided for Offset. Do not call Seek with an offset that would move the current position less than 0 (before the start of Memory) or greater than Size (beyond the end of the memory buffer). + + + + + +Writes the entire contents of the memory stream to the stream object specified by Stream. +Use SaveToStream to copy data that is stored in memory into another storage medium. SaveToStream writes the entire contents of Memory into the indicated stream object, starting at the current position in the stream that was passed as a parameter. +When the Stream parameter is a TFileStream object, SaveToStream does much the same thing as the SaveToFile method. However, SaveToStream writes to the current position in the target stream. Thus, for example, SaveToStream can be used to append the contents of Memory to a file stream, rather than replace the contents of the file the way SaveToFile does. +If the entire contents of the memory stream cannot be written to the target stream, SaveToStream raises an EWriteError exception. + + + + + + +Writes the entire contents of the memory stream to the file with a given file name. +Use SaveToFile to write the contents of Memory to a file. SaveToFile allows an application to write out the contents of the memory stream without having to explicitly create and free a file stream object. In case the file already exists, the current file contents will be completely replaced with the new. If the named file cannot be created or opened, SaveToFile raises an EFCreateError exception. + + +Provides direct access to the memory pool allocated for the memory stream. +Use Memory to get access to the memory for the stream. The memory for the stream holds the data that is being transferred by means of the memory stream. Size is the number of bytes of Memory that were allocated, and Position is the current position within Memory. + +Note: Memory is a read-only property. Memory can be used to change the contents of the memory, but to set the actual memory the stream works with, descendants of TCustomMemoryStream must assign a pointer to a memory buffer by calling the SetPointer method. + + +TCustomMemoryStream is an abstract base class used as the common ancestor for memory streams. +Use TCustomMemoryStream as a base class when defining a stream object that can transfer data that is stored in memory. Memory streams are useful for providing file-like access to data that is stored in a less accessible medium. Data can be moved to an internal memory buffer when the memory stream is created. After manipulating the data in a memory stream, the data can be written out to its actual storage medium when the memory stream is destroyed. +Do not instantiate an instance of TCustomMemoryStream. It is an abstract class that implements behavior common to all memory streams. To work with an instance of a memory stream, use one of the descendants of TCustomMemoryStream, such as TMemoryStream or TResourceStream. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Sets the size of the internal buffer to the given capacity. +Realloc is used by the memory stream to resize the internal buffer to the new capacity. Realloc requires a parameter that specifies the new capacity of the internal buffer. A pointer to the start of the internal buffer is returned. If Realloc cannot resize the memory block, an EStreamError error is raised. + + +Specifies the buffer size allocated for the memory stream. +Use the Capacity property to read or change the capacity of the memory stream. +Capacity is different from the Size property, which is the size of the stream, in bytes. The value of Capacity is always greater than or equal to the value of Size. + + + + + +Destroys an instance of TMemoryStream. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMemoryStream reference is not nil, and only then calls Destroy. +Destroy a TMemoryStream object when it is no longer needed to store or write data. Destroy calls Clear to free the memory buffer before calling the inherited destructor. + + + +Frees the memory buffer, discarding all data associated with the memory stream. +Use Clear to empty the memory buffer for the memory stream and free all associated memory. In addition to freeing the memory associated with the memory buffer, Clear: + +Sets the Memory property to nil (Delphi) or NULL (C++). +Sets the Position property to 0. +Sets the Size property to 0. + + + + + +Loads the entire contents of a stream into the memory buffer. +Use LoadFromStream to fill the memory stream with the contents of the stream specified by the Stream parameter. LoadFromStream always sets the Position of the source stream to 0, before streaming in the number of bytes indicated by the source stream's Size property. +LoadFromStream reallocates the memory buffer so that the contents of the source stream will exactly fit. It sets the Size property accordingly, and then reads the entire contents of the source stream into the memory buffer. Thus, LoadFromStream will discard any pre-existing data stored in the memory stream. +If the source stream is a TFileStream object, LoadFromStream does the same thing as LoadFromFile, except that the application must create and free the TFileStream object. LoadFromStream also allows applications to fill a memory stream object from other types of stream objects. + + + + + + +Loads the entire contents of a file into the memory buffer. +Use LoadFromFile to fill the memory stream with the contents of a file. Pass the name of the file as the FileName parameter. LoadFromFile allows an application to read the contents of a file into the memory stream without having to explicitly create and free a file stream object. +LoadFromFile reallocates the memory buffer so that the contents of the file will exactly fit. It sets the Size property accordingly, and then reads the entire contents of the file into the memory buffer. Thus, LoadFromFile will discard any pre-existing data stored in the memory stream. + + + + + + +Sets the Size property of the memory stream. +Use SetSize to set the Size of a memory stream before filling it with data. SetSize allocates the memory buffer to hold NewSize bytes, preserving as much of the existing data as possible. +Use SetSize before filling the memory buffer with data from various sources, or from a portion of another stream. If the intended contents of the memory stream is exactly the same as the contents of another stream or file, use LoadFromStream or LoadFromFile instead. + + + + + + +Sets the Size property of the memory stream. +Use SetSize to set the Size of a memory stream before filling it with data. SetSize allocates the memory buffer to hold NewSize bytes, preserving as much of the existing data as possible. +Use SetSize before filling the memory buffer with data from various sources, or from a portion of another stream. If the intended contents of the memory stream is exactly the same as the contents of another stream or file, use LoadFromStream or LoadFromFile instead. + + + + + + + + +Writes Count bytes from Buffer to the current position in the memory buffer and updates the current position by Count bytes. +Use Write to insert Count bytes into the memory buffer of the memory stream, starting at the current position. Write will increase the size of the memory buffer, if necessary, to accommodate the data being written in. If the current position is not the end of the memory buffer, Write will overwrite the data following the current position. +Write updates the Size property to Position + Count, and sets the Position property to the new value of Size. Thus, any data that was stored in the memory stream in the Count bytes after the current position is lost when calling Write. +Write always writes the Count bytes in the Buffer, unless there is a memory failure. Thus, for TMemoryStream, Write is equivalent to the WriteBuffer method. +All other data-writing methods of a memory stream (WriteBuffer, WriteComponent) call Write to do the actual writing. + + + +TMemoryStream is a stream that stores its data in dynamic memory. +Use TMemoryStream to store data in a dynamic memory buffer that is enhanced with file-like access capabilities. TMemoryStream provides the general I/O capabilities of a stream object while introducing methods and properties to manage a dynamic memory buffer. +Memory streams are useful as intermediary objects that can hold information as well as read it from or write it to another storage medium. They provide a useful format for comparing the contents of streams, or for manipulating data that is stored in a less accessible medium. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sets the size of the internal buffer to the given capacity. +Realloc is used by the memory stream to resize the internal buffer to the new capacity. Realloc requires a parameter that specifies the new capacity of the internal buffer. A pointer to the resized stream of bytes is returned. If Realloc cannot resize the memory block, an EStreamError error is raised. + + + + + + +Constructs an object and initializes its data before the object is first used. +System.Classes.TBytesStream.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + +Specifies the stored data. +The Bytes property returns the buffer in which the data is stored. Use the Size property to find the actual amount of data in the buffer. + + + +TBytesStream is a stream that stores its data in bytes. +Use TBytesStream to store data as bytes in a memory buffer. +Memory streams are useful as intermediary objects that can hold information as well as read it from or write it to another storage medium. They provide a useful format for comparing the contents of streams, or for manipulating data that is stored in a less accessible medium. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + + + + +Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + + + + +Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + +Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + + + + + True + + + + + + + + + + +Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + + + + +Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + +Destroys an instance of TMemoryStream. +System.Classes.TStringStream.Destroy inherits from System.Classes.TMemoryStream.Destroy. All content below this line refers to System.Classes.TMemoryStream.Destroy. +Destroys an instance of TMemoryStream. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMemoryStream reference is not nil, and only then calls Destroy. +Destroy a TMemoryStream object when it is no longer needed to store or write data. Destroy calls Clear to free the memory buffer before calling the inherited destructor. + + + + + + + + + + +Returns a string that consists of up to Count bytes from the current position in the string stream, and advances the current position of the stream by the number of bytes read. +Use Read to read the contents of the string stream into a string, starting at the current position. If Count extends beyond the end of the DataString, the returned string will only contain the characters up to the end of DataString, and the current position is advanced accordingly. + +Note: ReadString does the same thing as Read, except that it returns a string rather than filling a buffer. + + + + + +Concatenates a specified string to the current position in the string stream, and updates the current position accordingly. +Use WriteString to replace the end of the string from the current position on with the string specified by the AString parameter. WriteString changes the Size property to reflect the new length of the DataString. + + +Provides direct access to the string that stores the text represented by the TStringStream object. +Use DataString to get access to the text of the stream. The text represents the information that is being transferred by means of the string stream. Size is the number of bytes in the string, and Position is the current position within DataString. + +Note: DataString is a read-only property. DataString can be used to change the contents of the string, but applications can't change the DataString itself. + +Represents the encoding used internally by the TStringStream instance to store the data. +Encoding represents the encoding that is used to get the corresponding array of bytes from a given string, or to obtain the corresponding string from the contained array of bytes. (A string stream contains an array of bytes.) +The encoding of a stream string is set in the constructor (you can specify what encoding to use). + + + +TStringStream provides file-like access to information stored as a long string. +Use TStringStream to store data as a long string enhanced with I/O capabilities. TStringStream is useful as an intermediary object that can hold text as well as read it from or write it to another storage medium. TStringStream provides a mechanism for manipulating text that is obtained from a less accessible medium. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates an instance of TResourceStream associated with a particular resource name and type. +Call Create to instantiate a TResourceStream, passing in parameters that identify the resource in a specified instance. TResourceStream finds the resource data and loads it into the Memory buffer for the TResourceStream. +The Instance parameter is the instance handle associated with the executable or shared library that contains the resource. +In the first constructor syntax, the ResName is the string associated with the resource in the .rc file that was compiled with the application. If the resource is associated with an integer ID rather than a string, use the string representation of the integer after a pound sign. Thus, for example, a resource with an integer identifier of 128 be identified by a ResName of #128. + +Note: Specifying resources by ID requires less memory than specifying resources by name. +The ResType parameter is a string identifying the type of the resource. Applications can define their own resource types and identify them by name in the .rc file. In addition, there are a number of predefined resource types (which reflect Windows resource types). To identify a resource that is one of the predefined resource types, set ResType to the appropriate value from the following table: + + + + + +ResType + +Type of resource + + + +RT_ACCELERATOR + + + +Accelerator table + + + + +RT_BITMAP + + + +Bitmap resource + + + + +RT_DIALOG + + + +Dialog box + + + + +RT_FONT + + + +Font resource + + + + +RT_FONTDIR + + + +Font directory resource + + + + +RT_MENU + + + +Menu resource + + + + +RT_RCDATA + + + +Application-defined resource (raw data) + + + + +RT_STRING + + + +String-table entry + + + + +RT_MESSAGETABLE + + + +Message-table entry + + + + +RT_CURSOR + + + +Hardware-dependent cursor resource + + + + +RT_GROUP_CURSOR + + + +Hardware-independent cursor resource + + + + +RT_ICON + + + +Hardware-dependent icon resource + + + + +RT_GROUP_ICON + + + +Hardware-independent icon resource + + + + +RT_VERSION + + + +Version resource + + + + + + + + + + + + + + + + +Destroys an instance of TResourceStream. +Do not call Destroy directly in an application to destroy an instance of TResourceStream. Instead, call Free. Free verifies that the TResourceStream reference is not nil, and only then calls Destroy. +Destroy frees the memory buffer that stores the resource before calling the inherited destructor. + + + + + + + + +Overrides the inherited method to raise an exception when an attempt is made to write the resource back to the application. +Applications should not use a TResourceStream to write the resources of the running application. Write overrides the inherited method to raise an EStreamError exception when an application tries to write to the application's resources. +As all other data-writing methods of TResourceStream (WriteBuffer, WriteComponent) call Write to do the actual writing, calling any of the data-writing methods of TResourceStream will raise an exception. + + + +TResourceStream is a memory stream that provides access to the compiled resources in an application. +Use TResourceStream to read the resources of an application. An instance of TResourceStream holds the value of a single resource in a memory buffer where it is accessible to the application. +The global ReadComponentRes function uses TResourceStream to access the compiled resources used by the application. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + soReference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDHAS10BYTES + NEXTGEN + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Queue the method to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + + + + + + $0 + + + + + + + + Queue the procedure to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + + + + + + $0 + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + $FFFFFFFF + + + + + + + NEXTGEN + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns True if after AStartTime the specified ATimeout is passed. + When ATimeout <= 0, then timeout is inifinite and function always returns False. + + + + + + + + + + + + + + + + + + + + + + The currently executing thread. This is the same as TThread.CurrentThread. + + + + + + + The currently executing thread. This is the same as TThread.Current. + Please use TThread.Current, which is more clear and less redundant. + + + + + + + The number of processor cores on which this application is running. This will include virtual + "Hyper-threading" cores on many modern Intel CPUs. It is ultimately based on what the underlying + operating system reports. + + + + + + + Simple Boolean property to quickly determine wether running on a single CPU based system. + + + + + + + Event handler, which is called before each Synchronize or Queue call. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + MSWINDOWS + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base class used for implementing all asynchronous procedure calls. Never pass this instance around as + an instance reference. The intent is that this object is only ever referenced through the IAsyncResult + interface. Failure to heed this warning will result in unpredictable behavior. See the information about the + Invoke method. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This field will hold the acquired exception instance raised from the execution of the async method call. + It will be re-raised in the context of the invoking thread when the corresponding EndXXXX method is called. + + + + + + + Override this method to dispatch the actual asynchronous procedure call. Descendants will use whatever context + or other state information contained in the instance to pass along to the procedure or function. + + + + + + + Override this method to perform any extra state or signaling required by the descendant. The descendant must + call this inherited method in order to properly set the completion and possibly signal the FAsyncHandle if + previously created. Failure to call this method can result in a dead lock or hang. + + + + + + + Calls the actual target asynchronous method within the context of however it is scheduled. This could be + in the context of the main or GUI thread, or within a background thread. This depends on the implementation + of a specific asynchronous BeginXXXX method call. + + + + + + + Override this method to schedule the asynchronous procedure call in the manner specific to + a given instance, component or class. By default, this will schedule the async procedure onto + the main thread or execute the procedure synchronously if already on the main thread. + Other classes may schedule the procedure call into a separate thread or thread pool. + + + + + + + This constructor must be called from a descendent protected constructor. + + + + + + + + + + Opaque user-supplied context. This context is available via the IAsyncResult.GetAsyncContext and descendents + if this class. + + + + + + + Returns true if the operation can be cancelled. When cancelling the async operation, do any additional processing. + + + By default, all Async cannot be cancelled. If descendants support cancelling asynchronous tasks, + they must override this behaviour and do the required processing; + + + + + + + + + + This constructor should never be called directly. Only descendents should be constructed using the + protected Create constructor above. Calling this constructor will raise an exception. + + + + + + + + + + + + + Cancels the async operation. Returns True when the asynchronous operation can be cancelled. + + + + + + + + + + This method must be called prior in order to return itself as an IAsyncResult and actually schedule/invoke the + async call. + + + + + + + + + + As long as the rules for only ever accessing this object through the IAsynsResult interface, this method + should only ever be called by a given "EndInvoke" method by casting the IAsyncResult interface instance + back to a specific descendant instance of this class. Never call this method directly outside the context + of an "EndInvoke" style method. + + + + + + + This method is called from VCL.TControl (and possibly other similar) descendants in order to call the + asynchronous procedure/function as a result of a posted Window message. + + + + + + + + + + Set to True when the asynchronous call has been cancelled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + + + + + + + + + +Sets the private, internal storage for the Name property to the string passed in NewName. +Do not use ChangeName directly in an application. Instead, use the Name property. + +Note: The property setter for Name -- SetName-- uses ChangeName to change the component's name. ChangeName is not virtual; do not override it. + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + +Returns the owner of a child component being read from a stream. +GetChildOwner is used internally by the component streaming system. It is rarely necessary to call it directly. +In TComponent, GetChildOwner always returns nil (Delphi) or NULL (C++), indicating that the owner is the root component currently being read (usually a form or data module). The Owner of a component is responsible for destroying it. + + + + + + +Returns the parent or, if there is no parent, returns the owner of a child component being read from a stream. +GetChildParent is used internally in the component streaming system. It is not necessary to call it directly. +As implemented in TComponent, GetChildParent returns Self (Delphi) or this (C++). If GetChildParent returns nil (Delphi) or NULL (C++), the parent is assumed to be the root component currently being read (usually a form). + + + + + + +Returns the owner of a component. +GetOwner is called by GetNamePath to find the owner of a component. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. For TComponent, GetOwner returns the value of the Owner property. + + + +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Reads the state of the component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Getter of Observers. + + + + + + + + +Clears or sets csAncestor state in the component's ComponentState property. +SetAncestor is used internally in the component streaming system. It is not necessary to call it directly. +If Value is set to True, the csAncestor flag is included into the component state; otherwise, it is excluded. + + + + + + + True + + + + +Ensures that components inserted at design time have their design-mode flag set. +SetDesigning is used internally by the Form designer. Do not call SetDesigning directly. +SetDesigning sets the csDesigning flag in the ComponentState property if Value is True; otherwise, it removes csDesigning. +If the SetChildren parameter is True, SetDesigning then calls the SetDesigning methods of any owned components, passing Value, so that the owned components' ComponentState properties are synchronized with the owner's. +The InsertComponent and RemoveComponent methods call SetDesigning for inserted or removed components to ensure that their design-mode flags are set properly. + + + + + + +Sets the csInline bit of the component's ComponentState property. +SetInline is used internally to indicate whether the component can act as a root component in the designer but also be embedded in a form. +SetInline sets the csInline flag in the ComponentState property if Value is True; otherwise, it removes csInline. + + + + + + +Ensures that components inserted at design time have their design-mode flag set. +SetDesignInstance is used internally by the Form designer to identify objects that act as a design surface. Do not call SetDesignInstance directly. +SetDesignInstance sets the csDesignInstance flag in the ComponentState property if Value is +True; otherwise, it removes csDesignInstance. + + + + + + +Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + + + + +Sets the visual ordering of a child control. +SetChildOrder is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to actually implement the ordering. TWinControl uses this ordering information to Z-align the controls. + + + + + + +Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + +Sets the csUpdating state in the component's ComponentState property. +Do not call Updating directly. It is used internally to indicate that the component is about to be updated. A call to Updating, which sets the csUpdating flag, is always followed by a call to Updated, which clears the flag. + + + +Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + + + + + + +Provides the interface for a method that adds type library and version information to the Registry on components that implement COM interfaces. +Do not call UpdateRegistry directly. It is for internal use only. + + + + + + + + + + +Ensures that renaming an owned component does not create a name conflict. +ValidateRename checks whether a component can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the Components list, ValidateRename raises an EComponentError exception. +ValidateRename is used internally when the Name property is modified. It is not necessary to call it directly. + + + + + + +Determines whether an object can be inserted into a container. +ValidateContainer is called by a component when it is about to be inserted into a container object. By default, ValidateContainer calls the ValidateInsert method of the component specified by the AComponent parameter. +Descendent components can override ValidateContainer to disallow a component from being inserted into specific containers. To disallow an insertion, raise an exception in the derived method. + + + + + + +Provides the interface for a method that validates a child component before it is inserted. +ValidateInsert does nothing in TComponent. Descendent classes can override it to disallow a component from accepting an object as a child. By default, ValidateInsert allows any object to be inserted into the component. +If a component needs to validate only certain objects, descendent classes can override ValidateInsert to filter out those objects. To disallow an insertion, raise an exception in the derived method. + + + + + + +Writes the state of the component. +WriteState is used internally in the component streaming system. It is not necessary to call it directly. +This method expects a TWriter object that is used for storing the state of the component. + + + +Notifies all owned components of the owner component's imminent destruction. +The RemoveFreeNotifications method notifies all owned components of the owner component's imminent destruction. RemoveFreeNotifications is called automatically when the component is destroyed. + + + + + + + + + + +Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + + + +Called when an application uses a component interface. +_AddRef is a basic implementation of the IInterface method, _AddRef. + +Note: If the component is a wrapper for a COM object, _AddRef calls the _AddRef method of that COM object, and returns the resulting reference count. +In all other cases, _AddRef simply returns �1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _AddRef to implement reference counting. + + + + + + +Called when an application releases a component interface. +_Release is a basic implementation of the IInterface method, _Release. +_Release returns the resulting value of the reference count for the component's interface. + +Note: In all other cases, _Release simply returns �1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _Release to implement reference counting. + + + + + + +Returns the number of type information interfaces that an object provides (either 0 or 1). +GetTypeInfoCount implements the IDispatch interface GetTypeInfoCount method. For components that support interfaces, GetTypeInfoCount calls this method for the interface supported by the component. The Count parameter points to a location that receives the number of type information interfaces provided by the object. If the object provides type information, this number is 1; otherwise the number is 0. + + + + + + + + + +Retrieves the type information for an object. +GetTypeInfo implements the IDispatch interface GetTypeInfo method. For components that support interfaces, GetTypeInfo calls the GetTypeInfo method for the interface supported by the component, passing it the specified parameters. Use the returned value to get the type information for an interface implemented by the component. + + + + + + + + + + + +Maps a single member and an optional set of argument names to a corresponding set of integer dispatch identifiers (dispIDs). +GetIDsOfNames implements the IDispatch interface GetIDsOfNames method. For components that support interfaces, GetIDsOfNames calls this method for the interface supported by the component, passing the specified parameters. The returned value can be used on subsequent calls to the Invoke method. + + + + + + + + + + + + + + +Provides access to Automation properties and methods when the component wraps an Automation object. +Invoke is the standard mechanism for accessing the exposed properties and methods of an Automation object. For components that wrap the IDispatch interface of an Automation object, Invoke calls the Invoke method for the interface supported by the component, passing it the parameters specified by the function. + + + + + + + +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + + +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + +Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + nil + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + + + + + nil + + + + + +Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + +Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + + + + + +Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + + + + + + +Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. The result type corresponds to a TObject class type. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + + + + + + +Destroys all owned components. +DestroyComponents iterates through the components owned by the component, removing each from the list of owned components and destroying it. +It is not necessary to call DestroyComponents directly. DestroyComponents is automatically called when the component is destroyed. + + + +Indicates that the component and its owned components are about to be destroyed. +Destroying sets the csDestroying flag in the ComponentState property. It then calls the Destroying method for each owned component so that its csDestroying flag is also set. If csDestroying is already set, Destroying does nothing. +It is not necessary to call Destroying directly. Destroying is automatically called when the component is destroyed. + + + + + + + +Executes an action. +ExecuteAction executes an action for the component. Action is a TBasicAction or any descendant of TBasicAction. +ExecuteAction first checks whether the provided action is compatible with the component and then executes the action. The return value is a Boolean. A value of True is returned if the action was executed; otherwise, False is returned. +Derived classes can override this method to implement a distinct way of handling actions. + + + + + + + +Indicates whether a given component is owned by the component. +FindComponent returns the component in the Components property array with the name that matches the string in the AName parameter. Use FindComponent to determine whether a given component is owned by another. +Component name matches are not case sensitive. + + + + + + +Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + + + + +Disables the destruction notification that was enabled by FreeNotification. +RemoveFreeNotification removes the component specified by the AComponent parameter from the internal list of objects to be notified that the component is about to be destroyed. AComponent is added to this list by a previous call to the FreeNotification method. +Most applications have no need to call RemoveFreeNotification. It is used by TComponent to detect loops where two components are notifying each other of their impending destruction. + + + +Frees the interface reference for components that were created from COM classes. +FreeOnRelease is called when an interface implemented by the component is released. FreeOnRelease is used internally and calls the corresponding interface method. It should not be necessary to call FreeOnRelease directly. + + + + + + +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + + + + +Returns a string used by the Object Inspector. +GetNamePath is used to determine the text to display in the Object Inspector for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. TComponent overrides GetNamePath to return the component's name. Do not call GetNamePath directly. + + + + + + +Verifies whether the component has a parent. +Call HasParent to determine whether a specific component has a parent. +Derived classes override this method to implement proper handling for parenting. +Use GetParentComponent to retrieve the component reference. + + + + + + +Establishes the component as the owner of a specified component. +InsertComponent adds the component passed in the AComponent parameter to the end of the Components array property. The inserted component must have no name (no specified Name property value), or the name must be unique among all others in the Components list. +When the owning component is destroyed, AComponent is also destroyed. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use InsertComponent when manually adding components to another Owner component's Components list. + + + + + + +Removes a specified component specified from the component's Components list. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use RemoveComponent to programmatically delete the component specified by AComponent from its Owner component. + + + + + + +Identifies whether the component is a subcomponent. +Call SetSubComponent to indicate whether this component is a subcomponent. A subcomponent is a component whose Owner is a component other than the form or data module in which it resides. Unless such a component calls SetSubComponent with IsSubComponent set to True, its published properties will not be saved to the form file. +IsSubComponent indicates whether the component is a subcomponent (True) or not (False). +SetSubComponent is called at design time: + +Either from the constructor of a component that always acts as a subcomponent. In this case, the component calls its own SetSubComponent method from the constructor with IsSubComponent set to True. +Or immediately after constructing an instance of the subcomponent. In this case, the Owner calls the SetSubComponent method of a component it has just instantiated, with IsSubComponent set to True. + + + + + + + +Handles exceptions in methods declared using the safecall calling convention. +SafeCallException handles exceptions in methods that use the safecall calling convention. Some classes that implement interfaces override this method to handle errors that might occur. TComponent calls the implementation of this method for the interface supported by the component, if it exists. If the component does not support interfaces, this method calls the SafeCallException method inherited from TObject, which returns E_UNEXPECTED. This is a default return value that is appropriate for classes that do not support any interfaces. + + + + + + + +Updates the state of an action. +UpdateAction is used to update the state of an action. Action is a TBasicAction or any descendant. +UpdateAction first checks whether the provided action is compatible with the component and then updates it. The return value is a Boolean. A value of True is returned if the action was updated, and a value of False, otherwise. +Derived classes can override this method to implement a distinct way of handling action updates. + + + + + + + +Indicates whether the component implements a specified interface. +Call IsImplementorOf to determine whether the component (or, if the component aggregates its interface with other components, whether the controlling component) supports the interface specified by I. IsImplementorOf is similar to the QueryInterface method, but it can handle a request for a nil (Delphi) or NULL (C++) interface, and it does not return an interface pointer. +The streaming system that loads and saves components uses IsImplementorOf to resolve property values that are interfaces. + + + + + + + + +Establishes or removes internal links that cause this component to be notified when the implementer of a specified interface is destroyed. +Component writers use ReferenceInterface to ensure that properties whose values are interfaces are informed when the objects that implement those interfaces are destroyed. This notification must be in place for a property whose value is an interface to be saved with the component in a form file (that is, for such a property to persist as a published property). +I is an interface pointer that is the value of the published property of interest. +Operation indicates whether the notification link to the implementer of the interface should be established (opInsert) or removed (opRemove). +ReferenceInterface returns True if it is successful in establishing or removing the notification link. If ReferenceInterface returns False when called with Operation set to opInsert, the specified interface cannot be stored as the value of a published property. + +Note: A result of False does not necessarily indicate an error, merely that the interface cannot be stored by the property streaming system. For example, ReferenceInterface returns False when the specified interface employs true reference counting, independent of component lifetimes. + +Specifies the interface reference implemented by the component. +Use ComObject to assign a COM interface implemented by a component to an interface reference. This property is used by components that support COM interfaces. +If the component is not a wrapper for a COM component, trying to read ComObject causes TComponent to raise an EComponentError exception. + + + +Indicates the number of components owned by the component. +Use the ComponentCount property to determine the number of components owned by a component, for example, when iterating through the components list to perform an action on all owned components. The ComponentCount property equals the number of items in the components list. This value is one more than the highest Components index, because the first components index is 0. + + +Indicates the position of the component in its owner's Components property array. +Use ComponentIndex when iterating through the Components list of the component's owner to perform an action on owned components. It can be used in conjunction with ComponentCount. ComponentIndex is used internally for iterative assignment procedures. + +Note: The first component in the list has a ComponentIndex value of 0, the second has a value of 1, and so on. Therefore, when using ComponentIndex with ComponentCount, note that ComponentCount is always 1 more than the highest Components index. + +Describes the current state of the component, indicating when a component needs to avoid certain actions. +ComponentState is a set of constants defined in the TComponentState type. +Components use the ComponentState property to detect states in which certain kinds of actions are allowed or disallowed. For example, if a component needs to avoid certain behaviors at design time that it performs at run time, it can check for the csDesigning flag. +ComponentState is read-only and its flags are set automatically when appropriate. + + +Governs the behavior of the component. +ComponentStyle governs how the component interacts with the streaming system and the Object Inspector. ComponentStyle is a read-only property. Typically, the value of the various component style flags are part of a component definition, specified in a component constructor. The one exception to this is the csSubComponent style, which can be set by calling the SetSubComponent method. + + +Contains information used by the Form designer. +DesignInfo is used internally. Do not use this property in applications. + + +Indicates the component that is responsible for streaming and freeing this component. +Use Owner to find the owner of a component. The Owner of a component is responsible for two things: +The memory for the owned component is freed when its owner's memory is freed. This means that when a form is destroyed, all the components on the form are also destroyed. +The Owner is responsible for loading and saving the published properties of its owned controls. +By default, a form owns all components that are on it. In turn, the form is owned by the application. Thus, when the application shuts down and its memory is freed, the memory for all forms (and all their owned components) is also freed. When a form is loaded into memory, it loads all of the components that are on it. +The owner of a component is determined by the parameter passed to the constructor when the component is created. For components created in the form designer, the form is automatically assigned as the Owner. + +Warning: If a component has an Owner other than a form or data module, it will not be saved or loaded with its Owner unless you identify it as a subcomponent. To identify a component as a subcomponent, call the SetSubComponent method. + +Represents information used internally by components that support COM. +VCLComObject is for internal use only. + + +Indicates the TObservers object added to the TComponent. +Observers is a read-only property that returns the TObservers added to the TComponent, in order to use the notifications provided by the observers either with LiveBindings or for the developers' own purposes. + + +Specifies the name of the component as referenced in code. +Use Name to change the name of a component to reflect its purpose in the current application. By default, the IDE assigns sequential names based on the type of the component, such as 'Button1', 'Button2', and so on. +Use Name to refer to the component in code. + +Warning: Changing Name at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + +Stores a NativeInt integral value as a part of a component. +Tag has no predefined meaning. The Tag property can store any additional integer value for the convenience of developers. Often, Tag stores a pointer. A Tag value can be typecast to the appropriate pointer type. Notice that on 64-bit platforms, all pointer types are 8 bytes in size, while on 32-bit platforms, pointer types are 4 bytes. These pointer sizes correspond to sizes of NativeInt integral values on 64-bit and 32-bit platforms. + + + + + +TComponent is the common ancestor of all component classes. +TComponent is the base class for all components. Components are persistent objects that have the following capabilities: + +IDE integration. The ability to appear on an IDE palette and be manipulated in a Form Designer. +Ownership. The ability to manage other components. If component A owns component B, then A is responsible for destroying B when A is destroyed. +Streaming and filing. Enhancements of the persistence features inherited from TPersistent. +COM support. Components can be converted into ActiveX controls or other COM objects using wizards provided with Windows products. Components can serve as wrappers for COM objects. +Note: COM features are present in all implementations of TComponent, including those provided for compatibility with OS X. However, COM features are Windows only and cannot be used in multi-device (cross-platform) applications. +TComponent does not provide any user interface or display features. These features are provided by two classes that directly descend from TComponent: + +TControl, in the FMX.Types unit, is the base class for visual components in applications built with the FireMonkey (FMX) framework. +TControl, in the Vcl.Controls unit, is the base class for visual components in Windows-only (VCL) applications. +Note: Only the FMX.Types unit and other FireMonkey-specific units can be used with OS X applications. That is, you cannot use VCL units in multi-device applications. +Components that can be visible at run time are sometimes called visual components. Other components, which are never visible at run time, are sometimes called non-visual components. However it is more common to refer to visual components as controls and non-visual components simply as components. +Do not create instances of TComponent. Use TComponent as a base class when declaring non-visual components that can appear on the component palette and be used in the Form Designer. Properties and methods of TComponent provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Generates an OnChange event. +Change is called automatically when the action's properties change. This method calls the OnChange event handler, if one is assigned. + + + + + + +Assigns an OnExecute event handler for the action and for all clients. +SetOnExecute is the property write method for the OnExecute event. +In addition to assigning the specified Value event handler to the OnExecute event, SetOnExecute propagates the assignment of this event handler to all clients linked to the action and generates an OnChange event. + + +Occurs when one of the action's properties changes. +Applications cannot use the protected OnChange event. It is used internally to manage the relationship between the properties of the action and the corresponding properties of the action's clients. +Component writers can use OnChange in descendent objects to respond when the action's properties change. + + + + + + + +Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + +Stores the number of elements in the Clients list of action links associated with the action. + + + + + + + +Associates the action with an action link. +RegisterChanges is called when the action and action link are connected, for example, when a new action link is set to an action. Value is the action link with which the action associates itself. The link is added to the action's client list. + + + + + + +Breaks the association between the action and the action link. +UnRegisterChanges is called when the action and the action link should no longer be associated. UnRegisterChanges is called, for example, in the action destructor or when the action link is unassociated from the action. Value is the action link with which the association is broken. + + + + + + +Instantiates and initializes a TBasicAction object. +Applications do not need to instantiate TBasicAction directly. Actions are created automatically when you choose New Action in the Action List editor. +If you want to create an action at run time, you should call the Create constructor of a FireMonkey action (FMX.ActnList.TAction) or VCL action (Vcl.ActnList.TAction), or any of their subclasses. The Create constructors assign a TActionList component to the ActionList property of the created action. +Create calls the inherited constructor and then creates a list of clients of the created action. + + + + + +Disposes of an instance of a TBasicAction object. +You do not need to call the destructor for an action. An action is a component and is automatically destroyed by its owner, which was passed to the constructor when it is created. If you must destroy an action manually, call Free instead, which safely invokes the destructor. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + + + + +Introduces an interface for a method of notifying a client when the action updates itself. +UpdateTarget does nothing in TBasicAction. UpdateTarget was introduced in TBasicAction so that descendants can override it to correspondingly update a target when the action updates. + + + + + + +Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + + + + +Generates an OnExecute event. +Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called, False otherwise. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + +Stores the client component that caused this action to execute. +Use ActionComponent to discern which client component caused this action to execute. For example, examine ActionComponent from an OnExecute event handler if you need to know what user action triggered this action. +When the user clicks a client control, that client sets ActionComponent before calling the action's Execute method. After the action executes, the action resets ActionComponent to nil (Delphi) or NULL (C++). + + +Occurs when the execute event, of a client linked to the action, fires. +Write an OnExecute event handler when you want to respond when the user triggers the client object's default event (typically an OnClick event). +For most target clients, OnExecute is associated with the OnClick event. The Click method triggers the associated Action if EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute). +OnExecute is called in the Execute method. +OnExecute also occurs when the user types the shortcut (or one of the secondary shortcuts) associated with the action or its client. + +Warning: If you assign an OnExecute event handler to a predefined action, the default behavior of that action will not occur. + +Occurs when the application is idle or when the action list updates. +Write an OnUpdate event handler to execute centralized code while an application is idle. For example, actions may want to update enabling and disabling, or checking and unchecking of client targets. + + + +TBasicAction is the ancestor class for all action objects. +TBasicAction introduces the fundamental behavior for an action. Descendants of TBasicAction add functionality for containment in an action list, for being categorized, and for specializing their behavior tailored to particular clients such as controls or menu items. Use TBasicAction if you want to create an action for an object that is neither a menu item nor a control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + axrComponentOnly + + + + + axrIncludeDescendants + + + + + + + + + + + + + + + + + + + + + + + + + sofUnknown + + + + + sofBinary + + + + + sofText + + + + + sofUTF8Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + False + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1000 + + + + + + + + + + False + + + + + + + + + + + + $1000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + $1000 + + + + + + + + + + + + + + + + + + + + + + False + + + + + $1000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DefaultUsrPw + + + + + DefaultUsrPwDm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cnAdding + + + + + cnAdded + + + + + cnExtracting + + + + + cnExtracted + + + + + cnDeleting + + + + + cnRemoved + + + + + Helper class for reading/writing a segment of another stream. + For example, it is used by TZipFile to provide access to a "stored" file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + nil + + + + + + + + NEXTGEN + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/System.xml b/Modules/DelphiVCL/doc/System.xml new file mode 100644 index 00000000..8e546421 --- /dev/null +++ b/Modules/DelphiVCL/doc/System.xml @@ -0,0 +1,7570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + True + + + + + $7FFFFFFF + + + + + $7FFFFFFF + + + + + 35 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTERNALLINKER + PC_MAPPED_EXCEPTIONS + ARITH_PUREPASCAL + ASSEMBLER + ARITH_PUREPASCAL + + + 35 + + + + + True + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $10 + + + + + $11 + + + + + $12 + + + + + $13 + + + + + $13 + + + + + $14 + + + + + $15 + + + + + $24 + + + + + $48 + + + + + $49 + + + + + $4A + + + + + $100 + + + + + $101 + + + + + $102 + + + + + $FFF + + + + + $2000 + + + + + $4000 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $E + + + + + $F + + + + + $10 + + + + + $11 + + + + + $0 + + + + + CPP_ABI_SUPPORT + + + $0 + + + + + CPP_ABI_SUPPORT + CPU64BITS + + + $FFFFFFA8 + + + + + $FFFFFFAC + + + + + $FFFFFFB0 + + + + + $FFFFFFB4 + + + + + $FFFFFFB8 + + + + + $FFFFFFBC + + + + + $FFFFFFC0 + + + + + $FFFFFFC4 + + + + + $FFFFFFC8 + + + + + $FFFFFFCC + + + + + $FFFFFFD0 + + + + + $FFFFFFD4 + + + + + $FFFFFFD8 + + + + + $FFFFFFDC + + + + + $FFFFFFE0 + + + + + $FFFFFFE4 + + + + + $FFFFFFE8 + + + + + $FFFFFFEC + + + + + $FFFFFFF0 + + + + + $FFFFFFF4 + + + + + $FFFFFFF8 + + + + + $FFFFFFFC + + + + + $0 + + + + + $4 + + + + + $8 + + + + + $C + + + + + CPU64BITS + + + $4 + + + + + $0 + + + + + vcPrivate + + + + + vcProtected + + + + + vcPublic + + + + + vcPublished + + + + + + + + + + + [vcPublic..vcPublished] + + + + + [vcPrivate..vcPublished] + + + + + [vcPublic..vcPublished] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU64BITS + + + + + + False + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + +Destroys an object and frees its associated memory, if necessary. +Use Free to destroy an object. Free automatically calls the destructor if the object reference is not nil. Any object instantiated at run time that does not have an owner should be destroyed by a call to Free, so that it can be properly disposed of and its memory released. Unlike Destroy, Free is successful even if the object is nil; if the object was never initialized, Free would not result in an error. +When you call Free for a component, it calls Free for all components that it owns�that is, all components in its component list. Since a form owns all the controls and other components that are created on it in design mode, those components are automatically freed when the form is freed. By default, all forms are owned by the Application object; when the application terminates, it frees the Application object, which frees all forms. For objects that are not components, or for components created with a nil owner, be sure to call Free after you are finished with them; otherwise the allocated memory will not be usable until after the application terminates. + +Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, do not free a button or the form that owns the button in its OnClick event handler. +To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing. + +Note: In C++ code, do not use Free to destroy an object. Use the delete keyword. + + +DisposeOf forces the execution of the destructor code in an object. +It was an artifact from previous versions when the Delphi Mobile compilers supported Automatic Reference Counting. In current versions of Delphi, DisposeOf is used as a wrapper that invokes TObject.Free. + +type + TMySimpleClass = class + private + stringMember: String; + constructor Create(const Text: String); + destructor Destroy; + end; + +constructor TMySimpleClass.Create(const Text: String); +begin + stringMember := Text; +end; + +destructor TMySimpleClass.Destroy; +begin + // this will be executed on calling the DisposeOf method. +end; + +var + myObject: TMySimpleClass; +begin + myObject := TMySimpleClass.Create('This is a code snippet indicating the usage of the DisposeOf method'); + try + // Use 'myObject' here + finally + myObject.DisposeOf; + end; +end. + + + + + + + +Initializes a newly allocated object instance to all zeros and initializes the instance's virtual method table pointer. +You should not call InitInstance directly. InitInstance is called by NewInstance when an object is created. When overriding NewInstance, be sure to call InitInstance as the last statement. +InitInstance is not virtual, so you cannot override it. Instead, initialize any data for an object in the constructor. + + + +Performs finalization on long strings, variants, and interface variables within a class. +Do not call CleanupInstance directly. CleanupInstance is called automatically when the object instance is destroyed. +CleanupInstance releases all long strings and variants. It sets long strings to empty and variants to Unassigned. + + + + + + + +Returns the class reference for the object's class. + +Note: ClassType dynamically determines the type of an object and returns its class reference, or metaclass. +Avoid using ClassType in application code. + +Note: In Delphi code, use the is or as operators instead of ClassType. +Note: In C++ code, use a dynamic cast or the InheritsFrom method instead of ClassType. + + + + + +Returns a string indicating the type of the object instance (as opposed to the type of the variable passed as an argument). +Use ClassName to obtain the class name from an object instance or class reference. This is useful for differentiating object instances that are assigned to a variable that has the type of an ancestor class. + +Note: In C++ code, call ClassName as a method to obtain an object's class name. Use the global static function to obtain the class name from a metaclass object. + + + + + + +Determines whether an object is of a specific type. +ClassNameIs determines whether an object instance or class reference has a class name that matches a specified string. This is useful to query objects across modules or shared libraries. + +Note: In C++ code, call ClassNameIs as a method to compare an object's class name. Use the global static function to compare the class name from a metaclass object. + + + + + +Returns the type of the immediate ancestor of a class. +ClassParent returns the name of the parent class for an object instance or class reference. For TObject, ClassParent returns nil (Delphi) or NULL (C++). +Avoid using ClassParent in application code. + +Note: In Delphi code, use the is or as operators instead of ClassParent. +Note: In C++ code, use a dynamic cast or the InheritsFrom method instead of ClassParent. + + + + + +Returns a pointer to the run-time type information (RTTI) table for the object type. +ClassInfo provides access to the RTTI table for a given object type. +Some classes do not provide run-time type information. For these classes, ClassInfo returns nil (Delphi) or NULL (C++). All classes descended from TPersistent do provide run-time type information. + + + + + + +Returns the size in bytes of each instance of the object type. +InstanceSize indicates how many bytes of memory are required for a class's instance data. InstanceSize is called from methods that allocate and deallocate memory. InstanceSize is not a virtual method, so it cannot be overridden. InstanceSize should be called only when implementing a custom version of NewInstance. + + + +Determines the relationship of two object types. +Use InheritsFrom to determine whether a particular class type or object is an instance of a class or one of its descendants. InheritsFrom returns True if the object type specified in the aClass parameter is an ancestor of the object type or the type of the object itself. Otherwise, it returns False. + +Note: InheritsFrom is similar to the Delphi is operator, but applies to class references. +Note: In C++ code, a nonstatic version of InheritsFrom is provided. This call is useful in determining whether a descendant class method or property can be used, given a variable of a base class. For example, use InheritsFrom to determine whether the Sender parameter in an event handler is of a particular class type or one of its descendants. + + + + + + + +Returns the address of a class method by name. + +Note: You can use MethodAddress for published methods only. +There are situations when it is useful to invoke an object method without hard coding the method name in advance. Call MethodAddress to dynamically retrieve the address of such a method by specifying the method Name as a string. +An easy way to invoke the method is to define a procedure or function data type, such as: + +type TProc = procedure of object; + +Assign the object name and the MethodAddress method to a TMethod variable, such as: + +MethodVar.Data�:= Pointer(ObjectInstanceName); +MethodVar.Code�:= ObjectInstanceName.MethodAddress('MethodNameString'); + +Pass this in a call to a variable of the procedure or function type: + +Proc�:= TProc(MethodVar); +Proc; + + + + + + + + + + + + +Returns the address of a class method by name. + +Note: You can use MethodAddress for published methods only. +There are situations when it is useful to invoke an object method without hard coding the method name in advance. Call MethodAddress to dynamically retrieve the address of such a method by specifying the method Name as a string. +An easy way to invoke the method is to define a procedure or function data type, such as: + +type TProc = procedure of object; + +Assign the object name and the MethodAddress method to a TMethod variable, such as: + +MethodVar.Data�:= Pointer(ObjectInstanceName); +MethodVar.Code�:= ObjectInstanceName.MethodAddress('MethodNameString'); + +Pass this in a call to a variable of the procedure or function type: + +Proc�:= TProc(MethodVar); +Proc; + + + + + + + +Returns the name of a class method by address. +There are situations when it is useful to invoke an object method without hard coding the method name in advance. Call MethodAddress to dynamically retrieve the address of such a method by specifying the method name as a string. +MethodName is the opposite of this process--by supplying an Address method, the name of the method is returned as a string. + + + + + + + + +Returns the qualified name of the class. +QualifiedClassName returns the class's unit scope concatenated with the class name. Example: + +uses + SysUtils, SyncObjs; + +begin + Writeln(TEvent.QualifiedClassName); // displays System.SyncObjs.TEvent + + + +Returns the address of a published object field. +FieldAddress is used internally by the component streaming system to access a specified published field of an object. FieldAddress returns a pointer to the field, if it exists. If the object has no published field by that name, FieldAddress returns nil (Delphi) or NULL (C++). +Programs should access and manipulate fields by using properties instead of FieldAddress. + + + + + + + + + + + + + + +Returns the address of a published object field. +FieldAddress is used internally by the component streaming system to access a specified published field of an object. FieldAddress returns a pointer to the field, if it exists. If the object has no published field by that name, FieldAddress returns nil (Delphi) or NULL (C++). +Programs should access and manipulate fields by using properties instead of FieldAddress. + + + + + +Retrieves a specified interface. +GetInterface retrieves the interface designated by a GUID or type name. The basic implementation of GetInterface uses the GUID specified in the IID parameter. If the specified interface is supported by the class, it is returned in the Obj parameter, and GetInterface has a return value of True. Otherwise, Obj contains nil (Delphi) or NULL (C++), and GetInterface returns False. + +Note: In Delphi code, IID can be an interface name. The compiler automatically translates this name into the corresponding GUID. +Note: In C++ code, use the templated version of GetInterface to obtain an interface from a DelphiInterface object. +GetInterface is equivalent to the as operator (Delphi) and dynamic casts (C++), except that GetInterface does not raise an exception if the interface is not supported. + + + + + + + + + + + + + +Returns the entry for a specific interface implemented in a class. +GetInterfaceEntry returns the class entry for the interface specified by the IID parameter. + +Note: In Delphi Code, IID can be an interface name. The compiler replaces this name with the actual GUID. +Note: COM objects can use GetInterfaceEntry to automate dispatch calls to a dual-IDispatch interface. + + + + + + + +Returns a pointer to a structure containing all of the interfaces implemented by a given class. +GetInterfaceTable returns the interface entries for the class. This list contains only interfaces implemented by this class, not its ancestors. To find the ancestor list, iteratively call ClassParent and then call GetInterfaceTable on the value it returns. To find the entry for a specific interface, use the GetInterfaceEntry method instead. + + + + + + +Returns the name of the unit where the class is defined. +UnitName can be used to obtain the unit where a specific class is defined. For example, calling UnitName on TButton returns the Vcl.StdCtrls string. + + + + + + +Returns the class's unit scope. +The class's unit scope is currently equivalent with the class's unit name. + +uses + SysUtils, SyncObjs; + +begin + Writeln(TEvent.UnitScope); // displays System.SyncObjs + // ... + + + + + + + +Checks whether the current instance and the Obj parameter are equal. +The function has one Obj parameter of the TObject type. +By default, the Equals method shows whether the addresses corresponding to the current object and the Obj object are identical. The method returns a boolean value that represents the equality between the two addresses. + + +Note: Equals is supposed to be overridden in user-derived classes, to provide consumer objects with an equality determining function. +For example, in the FMX.Types.TBounds class, Equals also returns True if the Rect properties of the current object and of the Obj object are equal. In the FMX.StdActns.TBaseValueRange class, Equals also returns True if all the properties of the current object and of the Obj object are equal. + + + + + + + +Returns an integer containing the hash code. +By default, calling GetHashCode on an object returns an integer representing the virtual address at which the object is stored. + +Notes: +GetHashCode is supposed to be overridden in user-derived classes, to provide consumer objects with an integer hash code representation. +The sign of the hash code depends on the address of the particular object instance. Negative hash code can appear for object instances that reside at higher memory locations. + + + + + +Returns a string containing the class name. +By default, the ToString returns a string containing the class name of the instance that is being called. +For example, calling ToString on a TButton instance returns a string containing "TButton". + +Note: ToString is intended to be overridden in user-derived classes, to provide consumer objects with a string representation. + + + + + + + +Handles exceptions in methods declared using the safecall calling convention. +SafeCallException handles exceptions in methods that use the safecall calling convention. Some classes that implement interfaces override this method to handle possible errors. +As implemented in TObject, SafeCallException simply returns E_UNEXPECTED. This is the appropriate response for classes that do no support interfaces. + + + + + +Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + +Responds before the first destructor executes. +BeforeDestruction is called automatically before the object's first destructor executes. Do not call it explicitly in your applications. +The BeforeDestruction method implemented in TObject does nothing. Override this method when creating a class that performs an action before the object is destroyed. For example, TCustomForm overrides BeforeDestruction to generate an OnDestroy event. + +Note: BeforeDestruction is not called when the object is destroyed before it is fully constructed. That is, if the object's constructor raises an exception, the destructor is called to dispose of the object, but BeforeDestruction is not called. + + + + + +Calls message-handling methods for the object, based on the contents of the Message parameter. +Call Dispatch to automatically pass messages to the appropriate message handler. +Dispatch determines whether a message is in the list of message handlers declared for the object. If the object does not handle the message, Dispatch then examines the message-handler list of the ancestor class, and continues checking ancestors until it either finds a specific handler or runs out of ancestors, in which case it calls DefaultHandler. +The only assumption Dispatch makes about the data in Message is that the first two bytes contain a message ID�that is, an integer that determines which message handler Dispatch calls. Although any kind of data can be passed to Dispatch, most TObject descendants expect a message record such as TMessage or a specific data structure type. + + + + + + +Provides the interface for a method that processes message records. +DefaultHandler is called by Dispatch when it cannot find a method for a particular message. DefaultHandler provides message handling for all messages for which an object does not have specific handlers. Descendant classes that process messages override DefaultHandler according to the types of messages they handle. + +Note: In a Delphi message-handling method, calling inherited results in a call to the ancestor's DefaultHandler method only if that ancestor does not specify a message method for the particular message being handled. Otherwise, calling inherited results in a call to the specific handler for that type of message. + + + + + +Allocates memory for an instance of an object type and returns a pointer to that new instance. +All constructors call NewInstance automatically. NewInstance calls InstanceSize to determine how much memory containing a particular instance to allocate from the heap. Do not call NewInstance directly. +Override NewInstance only for special memory allocation requirements. For example, when allocating a large number of identical objects that all need to be in memory at the same time, you can allocate a single block of memory for the entire group, then override NewInstance to use part of that larger block for each instance. +If you override NewInstance to allocate memory, you may need to override FreeInstance to deallocate the memory. + +Note: By default, NewInstance calls InitInstance. + + +Deallocates memory allocated by a previous call to the NewInstance method. +All destructors call FreeInstance automatically to deallocate memory that was allocated by overriding NewInstance. +Do not call FreeInstance directly. FreeInstance should be overridden if NewInstance was overridden to change the way the object's instance data was allocated. +Like NewInstance, FreeInstance uses the value returned from InstanceSize to deallocate the object's memory. + + + + + +Disposes of an object instance. +Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy. +The Destroy method defined by TObject deallocates memory. Descendent objects usually define a destructor that is customized for that particular kind of object. +When declaring a Destroy method in a descendant, always add the override directive to the declaration and call the inherited Destroy as the last statement in the overriding method. Because Destroy is a virtual method, overriding it ensures that the proper inherited behavior occurs. + +Note: If an exception escapes from the constructor, the destructor is called to destroy the partially constructed object instance that failed to initialize completely. Therefore, destructors should check that allocated resources such as handles were actually allocated before trying to release them, since their value might be zero. +Destroy should be implemented so that it calls Free on all subobjects created within the object's constructor (that is, allocated by the constructor). Unlike Destroy, Free provides a safeguard when destroying objects that are nil. + + + +Getter for the Disposed property. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Disposed is a read-only property that shows the current state of this object. +The Disposed property returns True if the object has been disposed using the DisposeOf method. Otherwise, it returns False. + +type + TMySimpleClass = class + private + // + stringMember: String; + constructor Create(Text: String); + destructor Destroy; + end; + +constructor TMySimpleClass.Create(Text: String); +begin + stringMember := Text; +end; + +destructor TMySimpleClass.Destroy; +begin + // this will be executed on calling the DisposeOf method. +end; + +var + myObject: TMySimpleClass; +begin + myObject := TMySimpleClass.Create + ('This is a code snippet illustrating the functionality for the DisposeOf method and Disposed property'); + if not myObject.Disposed then + myObject.DisposeOf; + //Starting here, the object has entered the Disposed state. +end. + +Note: The System.TObject.DisposeOf method is supported by the Delphi mobile compilers. The Disposed state only takes effect under compilers that use Automatic Reference Counting, such as DCCIOSARM.EXE, DCCIOSARM64.EXE, and DCCIOS32.EXE. + + +TObject is the ultimate ancestor of all objects and components. +TObject encapsulates fundamental behavior common to objects by introducing methods that: + +Create, maintain, and destroy instances of the object by allocating, initializing, and freeing required memory. +Respond when object instances are created or destroyed. +Return class-type and instance information on an object and runtime type information (RTTI) about its published properties. +Support message handling. +Support interfaces implemented by the object. +Use TObject as an immediate base class when declaring simple objects that do not need to persist (are not saved and reloaded) and that do not need to be assigned to other objects. +Much of the capability of objects is established by methods that TObject introduces. Many of these methods are used internally by IDEs and are not intended for users to call directly. Others are overridden in descendant objects that have more complex behavior. +Although TObject is the based object of a component framework, not all objects are components. All component classes descend from TComponent. + +Note: TObject is never directly instantiated. Although it does not use programming language features that prevent instantiation, TObject is an abstract class. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU64BITS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + $2 + + + + + $4 + + + + + $8 + + + + + $10 + + + + + + + + + + + + + + + + + + + + + + For internal use only. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal use only + + + + + Internal use only + + + + + + + + + + + TypeInfo of element type + + + + + Number of element type + + + + + + + Internal use only. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal use only + + + + + + + + + + Alignment in bytes + + + + + + + + + + + + + + + + + + $A + + + + + $14 + + + + + $5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + $0 + + + + + $1 + + + + + $80004002 + + + + + $8000FFFF + + + + + $80004001 + + + + + tkUnknown + + + + + tkInteger + + + + + tkChar + + + + + tkEnumeration + + + + + tkFloat + + + + + tkString + + + + + tkSet + + + + + tkClass + + + + + tkMethod + + + + + tkWChar + + + + + tkLString + + + + + tkWString + + + + + tkVariant + + + + + tkArray + + + + + tkRecord + + + + + tkInterface + + + + + tkInt64 + + + + + tkDynArray + + + + + tkUString + + + + + tkClassRef + + + + + tkPointer + + + + + tkProcedure + + + + + tkMRecord + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $80000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU64BITS + + + + CPU64BITS + + + + + + CPU64BITS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $E + + + + + $F + + + + + $10 + + + + + $11 + + + + + $12 + + + + + $13 + + + + + tkChar + + + + + tkWChar + + + + + tkUString + + + + + tkLString + + + + + tkWString + + + + + tkString + + + + + $37 + + + + + csUnallocated + + + + + csAllocated + + + + + csReserved + + + + + csSysAllocated + + + + + csSysReserved + + + + + mba8Byte + + + + + mba16Byte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + $2 + + + + + $3 + + + + + $4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tlbsLF + + + + + tlbsCRLF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $D7B0 + + + + + $D7B1 + + + + + $D7B2 + + + + + $D7B3 + + + + + $1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $20 + + + + + $10 + + + + + $8 + + + + + $4 + + + + + $1 + + + + + $3F + + + + + $2 + + + + + $20 + + + + + $10 + + + + + $8 + + + + + $4 + + + + + $1 + + + + + $3F + + + + + $2 + + + + + $0 + + + + + $800 + + + + + $400 + + + + + $C00 + + + + + $C00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fsZero + + + + + fsNZero + + + + + fsDenormal + + + + + fsNDenormal + + + + + fsPositive + + + + + fsNegative + + + + + fsInf + + + + + fsNInf + + + + + fsNaN + + + + + + + + + + + + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EXTENDEDIS10BYTES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + reNone + + + + + reOutOfMemory + + + + + reInvalidPtr + + + + + reDivByZero + + + + + reRangeError + + + + + reIntOverflow + + + + + reInvalidOp + + + + + reZeroDivide + + + + + reOverflow + + + + + reUnderflow + + + + + reInvalidCast + + + + + reAccessViolation + + + + + rePrivInstruction + + + + + reControlBreak + + + + + reStackOverflow + + + + + reVarTypeCast + + + + + reVarInvalidOp + + + + + reVarDispatch + + + + + reVarArrayCreate + + + + + reVarNotArray + + + + + reVarArrayBounds + + + + + reAssertionFailed + + + + + reExternalException + + + + + reIntfCastError + + + + + reSafeCallError + + + + + reMonitorNotLocked + + + + + reNoMonitorSupport + + + + + rePlatformNotImplemented + + + + + reObjectDisposed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $FDE8 + + + + + $FDE9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1 + + + + + + + + + + + + $1 + + + + + + + + MSWINDOWS + + + + + + + $1 + + + + + + + + POSIX + POSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + POSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PIC + PIC + PUREPASCAL + + + + + + + + + PUREPASCAL + PIC + PIC + PUREPASCAL + + + + + + + + PUREPASCAL + PIC + PIC + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + NEXTGEN + + + + + + + + + + $3F + + + + + + + + defined(CPUX86) or !defined(CPUX64) + + + + + $3F + + + + + + + + defined(CPUX86) or !Defined(CPUX64) + + + + + + True + + + + + + + defined(CPUX86) or !Defined(CPUX64) + + + + + + + + defined(CPUX86) or !defined(CPUX64) + + + + + + + + + + + + $3F + + + + + + + + defined(CPUX86) or !Defined(CPUX64) + + + + + $3F + + + + + + + + defined(CPUX86) or !Defined(CPUX64) + NEXTGEN + + + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + PIC + PIC + + + + + + + + PIC + PIC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + + + + + + + + + + + + + + EXTENDEDHAS10BYTES + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PC_MAPPED_EXCEPTIONS + PC_MAPPED_EXCEPTIONS + PUREPASCAL + + + + + + + + + + + + + + + + + + + PUREPASCAL + + + + + + + + + + + + + + + MSWINDOWS + + + + + + + + + + + + + + + MSWINDOWS + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + MSWINDOWS and !POSIX + + + + + + + + + + + + $1 + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + $7FFFFFFF + + + + + + + + PUREPASCAL and !MANAGED_RECORD + + + + + + + + + + Move fields in Record. + MoveRecord is equivalent to calling CopyRecord(Dest, Souce, TypeInfo) + then FinalizeRecord(Source, TypeInfo) + + + + + + + + + + Move Count items in Array. + MoveArray is equivalent to calling CopyArray(Dest, Souce, TypeInfo, Count) + then FinalizeArray(Source, TypeInfo, count) + + + + + + + + + + + PUREPASCAL + PUREPASCAL + Copy Count items in Array. + + + + + + + + + + + PUREPASCAL + PUREPASCAL + Finalize Count items in Array. + + + + + + + + + + PUREPASCAL + PUREPASCAL + Copy fields in Record. + + + + + + + + + + PUREPASCAL + PUREPASCAL + Finalize fields in Record. + + + + + + + + + PUREPASCAL + PUREPASCAL + Call Initialize operator for Dest if exist. + Otherwise call per each managed record member of the record. + + + + + + + + + Call Finalize operator per each elements of the array. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MSWINDOWS and !POSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LINUX + + + + + + + + + + + + + + + + + + + + LINUX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.ActnList.xml b/Modules/DelphiVCL/doc/Vcl.ActnList.xml new file mode 100644 index 00000000..4e10cdfe --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.ActnList.xml @@ -0,0 +1,2512 @@ + + + + The usual list of actions (without published properties) in VCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TActionList maintains a list of actions that can be used by components and controls such as menu items and buttons. +Use Action lists to centralize the response to user commands (actions). Action list components maintain a list of actions that are available to the client controls in an application. Add action list components to your form or data module from the standard page of the component palette. Double-click the action list to display the Action List editor, from which you can add, delete, and rearrange actions. + +Note: While it is possible to maintain the actions for an application using TActionList, it can be simpler to use Vcl.ActnMan.TActionManager instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This class is designed to communicate with some of the object in VCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of additional combinations of hot keys in VCL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TCustomAction is the base class for VCL actions intended to be used with menu items and controls. +TCustomAction introduces support for the properties, events, and methods of menu items and controls that are clients of action objects. +Most properties and events introduced in TCustomAction are public; therefore, use TCustomAction as a base class when deriving your own actions that publish specific subset of properties of associated controls. +Action objects centralize the response to user commands (actions) and represent user interface elements in applications that use actions. They provide an easy way to synchronize, for example, the enabled state and caption of a speed button and a menu item, and handle the response when users click these components. Each such component, called the client, has its properties dynamically updated by the action and forwards user actions to the action for a response. +At design time, you can work in the Action List editor with actions contained in an action list or in the Action Manager editor of the action manager. The action list or action manager is a container for actions, which it organizes into categories. +Component and control public properties and events that are supported in TCustomAction, either directly or through an ancestor, are: + +Caption +Checked +Enabled +HelpType +HelpContext +HelpKeyword +Hint +ImageIndex +ShortCut +Visible +OnHint +OnUpdate +OnExecute +Because the OnHint, OnUpdate, and OnExecute events are public, they do not appear in the Object Inspector. That is, the Object Inspector does not support generating custom event handlers for these events. +TCustomAction can also act as the base class for predefined action classes. You can derive from TCustomAction if you want to retain the public scope of supported properties and events or modify the public scope to the published scope. +For predefined actions that augment the behavior of TCustomAction, see the action classes in the Vcl.StdActns, Vcl.DBActns, and Vcl.ExtActns units. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The usual list of actions (without published properties) in VCL + + + + + + + + + + + + + + + + +Copies the properties of this action to a destination object. +AssignTo is overridden so that existing objects of type TCustomAction can be copied to other action objects of the same type. AssignTo ensures the correct assignment of property values. + + + + + + +Creates the TShortCutList object for the action. +CreateShortCutList creates an empty VCL shortcut list object for the current action. +Notice that implementations of shortcuts are FireMonkey or VCL framework-specific. + + + + + + +Sets the new Value of the ImageIndex property for the action and action's clients. +Vcl.ActnList.TCustomAction.SetImageIndex inherits from System.Actions.TContainedAction.SetImageIndex. All content below this line refers to System.Actions.TContainedAction.SetImageIndex. +Sets the new Value of the ImageIndex property for the action and action's clients. +SetImageIndex always propagates this Value to all clients of the action. + + + +Generates an OnChange event. +Vcl.ActnList.TCustomAction.Change inherits from System.Classes.TBasicAction.Change. All content below this line refers to System.Classes.TBasicAction.Change. +Generates an OnChange event. +Change is called automatically when the action's properties change. This method calls the OnChange event handler, if one is assigned. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the component after the form file has been read into memory. +Vcl.ActnList.TCustomAction.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + +Instantiates and initializes a VCL TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action manager (in the Action Manager editor) or action list component (in the Action List editor) at design time. +If you want to create an action at run time, assign a +TActionList or TActionManager component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create simply calls an inherited System.Actions.TContainedAction.Create constructor. + + + + + +Frees an instance of TCustomAction. +Do not call the destructor directly in an application. Instead, call Free. Free ensures that the action is not nil before calling the destructor. +If the action is contained in an action list or action manager, Destroy removes the action from that list. + + + + + + +Responds when a client control "fires". +Execute is called automatically when a client control "fires" (for example, when the user clicks a button or selects a menu item). It returns True if an event handler is found to handle the action, False if there was no event handler or if the action was not enabled. +Execute first ensures that the action is updated. Then, if the Enabled property is True, it attempts to handle the action by generating an OnExecute event on the action list that contains this action (if the action belongs to an action list). If the action list's OnExecute event handler does not handle the action, Execute generates an OnActionExecute event on the application itself. If neither the action list nor the application handles the action in response to these events, Execute generates an OnExecute event on itself. If this action has no OnExecute event handler, Execute instructs the application to locate the current target control and call the ExecuteTarget method, which is the mechanism by which predefined action classes perform their function. + + + + + + +Provides an opportunity to execute centralized code when an application is idle. +Vcl.ActnList.TCustomAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Displays the name of linked items from the Image Collection. + + + + +Holds the action list to which the action belongs. +Vcl.ActnList.TCustomAction.ActionList inherits from System.Actions.TContainedAction.ActionList. All content below this line refers to System.Actions.TContainedAction.ActionList. +Holds the action list to which the action belongs. + + + + + +TAction is the base class for VCL action objects. TAction implements actions to be used with menu items and controls. The published properties and events of TAction actions can be managed in the Object Inspector at design time. +The TAction class is almost the same as TCustomAction. TAction extends only the following features of TCustomAction: + +Changes the public scope to published for the AutoCheck, Caption, Checked, Enabled, GroupIndex, HelpType, HelpContext, HelpKeyword, Hint, ImageIndex, SecondaryShortCuts, ShortCut, and Visible properties. +Sets the published scope for the OnExecute, OnUpdate, and OnHint events. +The published scope of these properties and events provides the possibility to use the Object Inspector assistance for editing values of these properties and events. +The DisableIfNoHandler property is set to True while an action is created, that is, the action is inaccessible if it does not have an OnExecute event handler. +TAction is a generic action component. It can be added to action lists when there is no predefined action class that implements the desired response to user commands. Unlike predefined action classes, which have built-in methods that respond when users click the client controls, TAction has no built-in response to user commands. Instead, when using TAction, you can provide the response when the action "fires" by writing (using the Object Inspector's assistance) an OnExecute event handler, and configure the properties of TAction to reflect the current conditions by writing an OnUpdate event handler. +Action objects are used to centralize the response to user commands (actions) and to represent user interface elements in applications that use action lists or action bands. +TAction can also act as a base class for predefined action classes. You can derive from TAction if you want to retain the published scope of the supported properties and events. If you want to use the public scope to some of the supported properties and events, you can derive from TCustomAction. +For predefined actions that augment the behavior of TAction, see the action classes in the Vcl.StdActns, Vcl.DBActns, and Vcl.ExtActns units. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList or TActionManager component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Buttons.xml b/Modules/DelphiVCL/doc/Vcl.Buttons.xml new file mode 100644 index 00000000..86904708 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Buttons.xml @@ -0,0 +1,6201 @@ + + + + blGlyphLeft + + + + + blGlyphRight + + + + + blGlyphTop + + + + + blGlyphBottom + + + + + bsUp + + + + + bsDisabled + + + + + bsDown + + + + + bsExclusive + + + + + bsAutoDetect + + + + + bsWin31 + + + + + bsNew + + + + + bkCustom + + + + + bkOK + + + + + bkCancel + + + + + bkHelp + + + + + bkYes + + + + + bkNo + + + + + bkClose + + + + + bkAbort + + + + + bkRetry + + + + + bkIgnore + + + + + bkAll + + + + + nsAllowTimer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Updates the button control to reflect changes in its associated action. +Vcl.Buttons.TBitBtn.ActionChange inherits from Vcl.StdCtrls.TButtonControl.ActionChange. All content below this line refers to Vcl.StdCtrls.TButtonControl.ActionChange. +Updates the button control to reflect changes in its associated action. +ActionChange is called automatically when the associated action changes. It updates the button control to reflect the action's current Checked state. Then it calls the inherited method, which checks the associated properties for that client type. +The Sender parameter is the associated action. The CheckDefaults parameter specifies whether properties and event handlers should be changed if they differ from the default values. When CheckDefaults is true, properties and event handlers are only changed when the current values are the default values (that is, when the values have not been previously changed). When CheckDefaults is false, properties and event handlers are changed, regardless of their current values. + + + + + + + +Copy any TGraphic from a TImageList into the Glyph property of a TBitBtn. +CopyImage can be used to display any TGraphic on a TBitBtn. You can use any image that can be loaded into an imagelist using an Image List Editor. + + + +Creates underlying screen object. +Vcl.Buttons.TBitBtn.CreateHandle inherits from Vcl.Controls.TWinControl.CreateHandle. All content below this line refers to Vcl.Controls.TWinControl.CreateHandle. +Creates underlying screen object. +CreateHandle creates the Microsoft Windows screen object that underlies the control. if it does not already exist. The new window handle becomes the value of the Handle property. +CreateHandle creates or locates the parent control's window before it creates a window for the control itself. + +Note: If the Parent property is nil (Delphi) or NULL (C++), CreateHandle raises an exception. + + + + + + + + + +Initializes a window-creation parameter data structure. +Vcl.Buttons.TBitBtn.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + + + + + + +Returns the appropriate action link class that is associated with button controls. +Vcl.Buttons.TBitBtn.GetActionLinkClass inherits from Vcl.StdCtrls.TButtonControl.GetActionLinkClass. All content below this line refers to Vcl.StdCtrls.TButtonControl.GetActionLinkClass. +Returns the appropriate action link class that is associated with button controls. +GetActionLinkClass is used to get the appropriate class type for the action link used with button controls. GetActionLinkClass is used internally to create action link objects for clients when a button control has an associated action. The action link is used to link the action to the button control client. Each Action link class type is designed to link specific actions to clients based upon the types of properties the client supports. For button controls, GetActionLinkClass returns the TButtonActionLink class type. + + + + + + +Returns the handle to a palette for use by the control. +Vcl.Buttons.TBitBtn.GetPalette inherits from Vcl.Controls.TControl.GetPalette. All content below this line refers to Vcl.Controls.TControl.GetPalette. +Returns the handle to a palette for use by the control. +As implemented in TControl, GetPalette returns a null handle, indicating that the control does not have a palette. Override GetPalette to implement derived objects that use a palette. Create a palette handle for the control by a call to the Windows API function CreatePalette. GetPalette should return the palette handle for the control. +Specifying the palette for a control tells the application that the control's palette needs to be realized and designates the palette to use for realization. +GetPalette is called only if the run-time video mode requires color palette support, for example, in 256-color mode. + + + + + + +Sets the Style property for a button. +Vcl.Buttons.TBitBtn.SetButtonStyle inherits from Vcl.StdCtrls.TCustomButton.SetButtonStyle. All content below this line refers to Vcl.StdCtrls.TCustomButton.SetButtonStyle. +Sets the Style property for a button. +The SetButtonStyle method is called to change the Style property according to the button's state, whenever a button changes its focus state. + + + + + +Called when the StyleElements property changes. +Vcl.Buttons.TBitBtn.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + +Rebuilds the image list associated with the button. +Vcl.Buttons.TBitBtn.UpdateImageList inherits from Vcl.StdCtrls.TCustomButton.UpdateImageList. All content below this line refers to Vcl.StdCtrls.TCustomButton.UpdateImageList. +Rebuilds the image list associated with the button. +The UpdateImageList method is called to update the image list associated with the button control. + + + +Updates the image list associated with the button. +Vcl.Buttons.TBitBtn.UpdateImages inherits from Vcl.StdCtrls.TCustomButton.UpdateImages. All content below this line refers to Vcl.StdCtrls.TCustomButton.UpdateImages. +Updates the image list associated with the button. +The UpdateImages method is called to add images to the image list associated with the button control. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Constructs an instance of the button control and initializes its values. +Use Create to programmatically instantiate a button. Buttons added using the form designer are created automatically. +The AOwner parameter specifies the component, typically a form, that is responsible for freeing the button. + + + + + +Destroys the bitmap button object. +Do not call Destroy directly in an application. Instead, call Free. Free checks that the bitmap button is not nil, and only then calls Destroy. + + + +Simulates a mouse click, as if the user had clicked the button. +Use Click to simulate a mouse click. Click performs the following tasks: + +If the value of the Kind property is bkClose, Click closes the form. +If the value of Kind is bkHelp, Click displays the Help screen assigned with the HelpContext property. +Any associated action fires, or, if there is no associated action, any code attached to the OnClick event is executed. + + + + + + + + + + + + + + + + + + + + + + +Specifies the bitmap that appears on the bitmap button. +Use the Open dialog box that appears as an editor in the Object Inspector to choose a bitmap file (with a .BMP extension) to use on the button, or specify a TBitmap object at runtime. +You can provide up to four images within a single bitmap. All images must be the same size and next to each other in a row. Bit buttons display one of these images depending on their state. + + + + + +Image position + +Button state + +Description + + + +First + + + +Up + + + +This image appears when the button is up (unselected). This image is also used when the button has focus (for example, if the user tabs to it); in this case, a focus rectangle is drawn around the button. If no other images exist in the bitmap, bit buttons also use this image for all other states. + + + + +Second + + + +Disabled + + + +This image usually appears dimmed to indicate that the button can't be selected. + + + + +Third + + + +Clicked + + + +This image appears when the button is clicked. The Up image reappears when the user releases the mouse button. + + + + +Fourth + + + +Down + + + +This image appears when the button stays down (indicating that it remains selected). + + + + +If only one image is present, bit buttons attempt to represent the other states by altering the image slightly for the different states, although the Down state is always the same as the Up state. If you aren't satisfied with the results, you can provide additional images in the bitmap. +If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the Num Glyphs property. + +Note: The lower left pixel of the bitmap is reserved for the "transparent" color. Any pixel in the bitmap which matches that lower left pixel will be transparent. + +Specifies the kind of bitmap button. +Use Kind to specify the appearance of the TBitBtn control and its response when the user clicks the button. A standard set of buttons are included and operate as expected without the addition of code. However, you can write additional code in the button events, if you want to. This does not include the Custom button kind, which can be programmed in any way you like. +The images (such as the green check mark on the OK button) appear on the button when using this version of TBitBtn. + + +Specifies where the image appears on the bitmap button. +Layout indicates whether the text appears on the left of the button (blGlyphLeft), the right of the button (blGlyphRight), the top (blGlyphTop) or the bottom (blGlyphBottom). + + +Specifies the number of pixels between the edge of the image (specified in the Glyph property) and the edge of the button. +The margin is the space between the image edge and the button edge. The format of the edges depends on the layout of the image and text (specified in the Layout property). For example, if Layout is blGlyphLeft, the margin appears between the left edge of the image and the left edge of the button. If Margin is 3, three pixels separate the image and the button edges. If Margin is 0, there is no space between the image and the button edges. +If Margin is -1 (the default value), the image and text (specified in the Caption property) are centered. The number of pixels between the image and button edge is equal to the number of pixels between the opposite edge of the button and the text. + + + +Indicates the number of images that are in the graphic specified in the Glyph property. +If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the NumGlyphs property. The default value is 1. + + + + + + + + + + + + +Determines the appearance of a bitmap button. +Style indicates whether the TBitBtn control uses the modern button look, or reflects the look of a 16-bit Windows pushbutton. + + +Determines where the image and text appear on a bitmap or speed button. +Spacing determines the number of pixels between the image (specified in the Glyph property) and the text (specified in the Caption property). The default value is 4 pixels. +If Spacing is a positive number, its value is the number of pixels between the image and text. If Spacing is 0, no pixels will be between the image and text. If Spacing is -1, the text appears centered between the image and the button edge. The number of pixels between the image and text is equal to the number of pixels between the text and the button edge opposite the glyph. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TBitBtn is a push button control that can include a bitmap on its face. +Bitmap buttons exhibit the same behavior as button controls. Use them to initiate actions from forms and dialog boxes. +Bitmap buttons implement properties that specify the bitmap images, along with their appearance and placement on the button. You can choose from predefined bitmap buttons styles or use your own customized bitmap for the button. Although the button can be associated with only one bitmap, the bitmap (glyph property) can be subdivided into four equal-sized portions, which are displayed based on the state of the button: up, down, disabled, and clicked. +The Kind property of TBitBtn provides commonly used buttons, such as OK, Cancel, Help, and so on. These predefined button types have corresponding graphical images and default behaviors, so you can easily add them to your application with little or no coding necessary. +The recommended way to implement the response of other button kinds to user clicks is to assign an action from an action list as the value of the Action property. By setting the Action property, you make the button a client of the action, and the action handles updating the button's properties and responding when the user clicks the button. +If you are not using the built-in response to a specific kind of button or an action to respond when the user clicks the button, then you can specify the button's response by writing an OnClick event handler. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $190 + + + + + $64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.ComCtrls.xml b/Modules/DelphiVCL/doc/Vcl.ComCtrls.xml new file mode 100644 index 00000000..af4b527e --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.ComCtrls.xml @@ -0,0 +1,52358 @@ + + + + dowMonday + + + + + dowTuesday + + + + + dowWednesday + + + + + dowThursday + + + + + dowFriday + + + + + dowSaturday + + + + + dowSunday + + + + + dowLocaleDefault + + + + + htAbove + + + + + htBelow + + + + + htNowhere + + + + + htOnItem + + + + + htOnButton + + + + + htOnIcon + + + + + htOnIndent + + + + + htOnLabel + + + + + htOnRight + + + + + htOnStateIcon + + + + + htToLeft + + + + + htToRight + + + + + tpTop + + + + + tpBottom + + + + + tpLeft + + + + + tpRight + + + + + tsTabs + + + + + tsButtons + + + + + tsFlatButtons + + + + + psText + + + + + psOwnerDraw + + + + + pbNone + + + + + pbLowered + + + + + pbRaised + + + + + dtControl + + + + + dtItem + + + + + dtSubItem + + + + + cdPrePaint + + + + + cdPostPaint + + + + + cdPreErase + + + + + cdPostErase + + + + + cdsSelected + + + + + cdsGrayed + + + + + cdsDisabled + + + + + cdsChecked + + + + + cdsFocused + + + + + cdsDefault + + + + + cdsHot + + + + + cdsMarked + + + + + cdsIndeterminate + + + + + cdsShowKeyboardCues + + + + + cdsNearHot + + + + + cdsOtherSideHot + + + + + cdsDropHilited + + + + + hsText + + + + + hsOwnerDraw + + + + + tsTrackBegin + + + + + tsTrackMove + + + + + tsTrackEnd + + + + + hsButtons + + + + + hsFlat + + + + + nsCut + + + + + nsDropHilited + + + + + nsFocused + + + + + nsSelected + + + + + nsExpanded + + + + + ncsNone + + + + + ncsUnchecked + + + + + ncsChecked + + + + + ncsPartial + + + + + ncsDimmed + + + + + ncsExclusion + + + + + naAdd + + + + + naAddFirst + + + + + naAddChild + + + + + naAddChildFirst + + + + + naInsert + + + + + taAddFirst + + + + + taAdd + + + + + taInsert + + + + + ndtDefault + + + + + ndtDefault2 + + + + + ndt32bit + + + + + ndt64bit + + + + + ndt232bit + + + + + ndt264bit + + + + + tviDisabled + + + + + tviFlat + + + + + stNone + + + + + stData + + + + + stText + + + + + stBoth + + + + + msControlSelect + + + + + msShiftSelect + + + + + msVisibleOnly + + + + + msSiblingOnly + + + + + csPartial + + + + + csDimmed + + + + + csExclusion + + + + + trHorizontal + + + + + trVertical + + + + + tmBottomRight + + + + + tmTopLeft + + + + + tmBoth + + + + + tsNone + + + + + tsAuto + + + + + tsManual + + + + + ptNone + + + + + ptTop + + + + + ptLeft + + + + + ptBottom + + + + + ptRight + + + + + pbHorizontal + + + + + pbVertical + + + + + pbstNormal + + + + + pbstMarquee + + + + + pbsNormal + + + + + pbsError + + + + + pbsPaused + + + + + atSelected + + + + + atDefaultText + + + + + sstNone + + + + + sstSubscript + + + + + sstSuperscript + + + + + caBold + + + + + caColor + + + + + caFace + + + + + caItalic + + + + + caSize + + + + + caStrikeOut + + + + + caUnderline + + + + + caProtected + + + + + caBackColor + + + + + caCharset + + + + + caDisabled + + + + + caHidden + + + + + caLink + + + + + caOffset + + + + + caRevAuthor + + + + + caSubscript + + + + + caWeight + + + + + nsNone + + + + + nsBullet + + + + + cpaAlignment + + + + + cpaNumbering + + + + + cpaFirstIndent + + + + + cpaLeftIndent + + + + + cpaRightIndent + + + + + cpaTabStops + + + + + stWholeWord + + + + + stMatchCase + + + + + udLeft + + + + + udRight + + + + + udHorizontal + + + + + udVertical + + + + + btNext + + + + + btPrev + + + + + updNone + + + + + updUp + + + + + updDown + + + + + hkShift + + + + + hkCtrl + + + + + hkAlt + + + + + hkExt + + + + + hcNone + + + + + hcShift + + + + + hcCtrl + + + + + hcAlt + + + + + hcShiftCtrl + + + + + hcShiftAlt + + + + + hcCtrlAlt + + + + + hcShiftCtrlAlt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Calculates the control's display area given a rectangle. +AdjustClientRect is called internally when the tab control needs accurate information on where to place child controls within the client area. As implemented in TCustomTabControl, returns the DisplayRect property as the Rect parameter. + + + + + + +Change permission event dispatcher. +CanChange is called automatically when an attempt is made to change the selected tab. CanChange generates an OnChanging event so that an OnChanging event handler can prevent the selection from changing. If there is no OnChanging event handler, CanChange returns true, allowing the change. +Override CanChange to specify additional processing before the OnChanging event handler executes or to block the OnChanging event. + + + + + + + +Selection permission event dispatcher. +CanShowTab is called automatically when an attempt is made to show a tab. CanShowTab is exposed as a protected method so that descendants can override this method to provide application-specific criteria that determines whether a tab is accessible. +TabIndex is the index of the tab in the list of labels maintained by the Tabs property. +CanShowTab returns a Boolean value that indicates whether the tab specified in TabIndex can be accessed. + +Tip: CanShowTab can be used with such methods as CanFocus (TWinControl) to determine whether the tab can both be accessed and can receive focus. Criteria for an overridden CanShowTab might include checking whether the tab is enabled. + + +Pending tab change event dispatcher. +Change is called automatically when the selected tab changes. Override Change to specify additional processing before the OnChange event handler executes, or to block the OnChange event. + + + + + + + + +Resize and reposition children and self. +Vcl.ComCtrls.TCustomTabControl.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + + + + +Sets up the window-creation parameters for the tab control. +Tab controls call CreateParams internally when the window for the tab control must be generated. CreateParams overrides the inherited method to specify a tab control window with the current property settings. + + + +Creates the window for a tab control. +CreateWnd is called automatically when the tab control's window is recreated. CreateWnd calls the inherited method, before assigning any saved tab text strings in internal storage. + + + + + + + + +Tab drawing event dispatcher. +Override DrawTab in a derived class to control the painting of tabs. +TabIndex is the index of the tab that requires painting. +Rect is the area in which the tab should be painted. +Active is whether the tab is active. +Use the Canvas property to paint the tab. + + + + + + + +Generates an OnGetImageIndex event +Override GetImageIndex in a derived class to specify the index of the image to display for a particular tab. +TabIndex is the index of the tab that is about to be displayed. +The Return Value is an integer that is the index of the image in the Images property that will be displayed in the tab. + + + +Form load event dispatcher. +The protected Loaded method is called automatically when the form that contains the tab control is loaded into memory. It provides an opportunity for the tab control to perform any initializations after the control and all other components in the form are loaded into memory, but before the first paint operation. +In TCustomTabControl, Loaded ensures that the layout of the tabs accommodate the images specified by the Images property. + + + +Updates the tab images. +UpdateTabImages is called automatically to update the tab images after streaming in the control. + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the bounding rectangle of a tab control client area. +Use DisplayRect to obtain the coordinates, in pixels, of the portion of the tab control that represents the contents of the tab pages. The appearance of this portion of the tab control does not change when different tabs are selected. +Use DisplayRect rather than the ClientRect property to determine the portion of the tab control that can contain other objects. + + +Determines whether labels on the tab under the mouse are automatically highlighted. +Set HotTrack to true to provide visual feedback to the user about which tab would be selected if the mouse button is clicked. HotTrack is especially useful when the tab control contains multiple rows of tabs. + + +Specifies the images drawn in tabs. +Images specifies the images that are drawn in tabs. For disabled tabs, grayed versions of the images are used. +In the implementation of TCustomTabControl, the order of images in image list properties directly corresponds to the associated tabs in the control. In the descendant class, TPageControl, this behavior is replaced by support for individual TTabSheet objects, each with an ImageIndex property. In any case, the application programmer can define customized image displays by defining an OnGetImageIndex event handler. + + +Determines whether the tabs can appear on more than one row. +Use MultiLine to determine how the tabs are displayed. If MultiLine is true, the tabs are displayed on more than one row when the number of tabs exceeds the number that fits across the top of the tab control. How many rows is determined by how many tabs are in the tab control. If MultiLine is false, the tabs are displayed on one row only, and the user must scroll the displayed scroll arrows to view all the tabs. + + +Specifies whether multiple tabs can be selected. +Use MultiSelect to get or set whether multiple tabs can be selected. +MultiSelect can only be true if Style is tsFlatButtons or tsButtons. + + + + + + + +Event dispatcher for creation and destruction of child objects. +Notification checks whether the notification indicates that the component that implements the Images property is about to be destroyed, and if so, sets that property to nil (Delphi) or NULL (C++). + + + + + + +Sets the TabIndex property. +SetTabIndex is called to change the value of the TabIndex property. Descendant classes should override SetTabIndex to provide special implementations of this property. + + +Specifies whether the tab control handles its own painting. +Set OwnerDraw to true to override any default painting behavior. + + +Specifies whether rows of tabs stretch to fill the width of the control. +Use RaggedRight to get or set whether rows of tabs stretch to fill the width of the control. + + + + +Determines how the rows of tabs are scrolled in a multi-line tab control. +Set ScrollOpposite to determine where previous rows of tabs in a multi-line tab control move when the user selects a tab in another row. When ScrollOpposite is true, previous rows of tabs are moved to the bottom of the tab control if TabPosition is tpTop, or to the top if TabPosition is tpBottom. When ScrollOpposite is false, previous rows of tabs are moved to the back of all other rows of tabs. +For example, in a tab control with three rows of tabs at the top, if the user selects a tab in the second row, ScrollOpposite determines where the first row moves. If ScrollOpposite is true, the second row now appears at the front (bottom) row on top of the tab control, followed by the third row behind (above) it. The first row moves to the bottom of the tab control. If ScrollOpposite is false, the first row moves to the back (top), so that the tab control displays the second row in front (at the bottom of the tab region), followed by the third row (now in the middle), followed by the first row. + +Note: Setting ScrollOpposite to true automatically sets the MultiLine property to true. + +Specifies the style of the tab control. +Use Style to determine the appearance of the tabs. These can appear as notebook tabs or as buttons. + + + + +Specifies the height, in pixels, of the tabs in the tab control. +Set TabHeight to control the height of the tabs that appear above the client region of the tab control. The TabHeight property is the vertical size in pixels of the individual tabs. If TabHeight is set to 0, the tabs automatically size themselves to fit their text. + + +Identifies the selected tab on a tab control. +Read TabIndex to determine which tab was selected by the user. TabIndex is the index of the tab in the list of labels maintained by the Tabs property. The first (leftmost) tab has a TabIndex of 0, the next has 1, and so on. If no tabs are selected, TabIndex has a value of -1. +Set TabIndex to programmatically change the selected tab in the tab control. + + +Determines whether tabs appear at the top or bottom. +Set TabPosition to tpTop to display the tabs at the top of the tab control. Set TabPosition to tpBottom to display the tabs at the bottom. If the ScrollOpposite property is True, tabs can appear at both top and bottom, with the row containing the current tab and all subsequent rows on the side indicated by TabPosition. +Due to a limitation in the windows common control, if TabPosition is tpLeft or tpRight, Font must be a True Type font. Otherwise, tab text may paint incorrectly. + + +Contains the list of text strings that label the tabs of the tab control. +Tabs contains a TStrings, a list of strings that label the tabs in the tab control. To add new tabs to the tab control or to edit the tabs themselves, add a new string or edit the strings currently in the Tabs property. (To open the String List editor, double-click the Tabs property in the Object Inspector.) To rearrange the tabs, rearrange the list of strings. +Tabs can also contain objects associated with the labels, using the System.Classes.TStrings.Objects property. + + +Specifies the horizontal size, in pixels, of the tabs in the tab control. +TabWidth specifies a fixed width for all tabs. If TabWidth is 0, then each tab is automatically made wide enough to show its caption. + + +Occurs after a new tab is selected. +Write an OnChange event handler to take specific action immediately after the selected tab changes. Use the TabIndex property to determine which tab is now selected. This is the opportunity to make any changes to the control that reflect the new state implied by the selected tab. +Before the value of TabIndex changes, an OnChanging event occurs. + +Note: The event is not called if you change the active page in code, for example, by setting the value of ActivePage. + + + +Occurs immediately before a new tab is selected. +Write an OnChanging event handler to take specific action immediately before the selected tab changes. Set the AllowChange parameter to False to prevent the change. +Use an OnChanging event handler to prevent the user from leaving a tab setting until certain conditions have been met. An OnChanging event handler can also be used to save information about the current state of the tab control before it is changed by a new tab selection. + +Note: The event is not called if you change the active page in code, for example, by setting the value of TPageControl.ActivePage. +OnChanging is an event handler of type Vcl.ComCtrls.TTabChangingEvent. + + +Occurs when a tab is about to be drawn. +Use OnDrawTab to customize the painting of tabs. +You can paint the tab using the Canvas property. +OnDrawTab is an event handler of type Vcl.ComCtrls.TDrawTabEvent. See TDrawTabEvent for a description of the parameters. + + +Occurs when a tab is about to display its associated image. +Write an OnGetImageIndex event handler to specify the ImageIndex for a given TabIndex. +On entry to the event handler, the ImageIndex parameter is the same as the TabIndex parameter, where TabIndex is the index of the tab which is about to display its image. Change the ImageIndex parameter to specify the index into the Images property that specifies the image that should be painted. +OnGetImageIndex is an event handler of type Vcl.ComCtrls.TTabGetImageEvent. + + + + + + +Creates and initializes an instance of TCustomTabControl. +Call Create to instantiate a tab control at runtime. Tab controls placed on forms at design time are created automatically. Create calls the inherited Create method and sets the initial values for the tab control, including the creation of a tab list that contains the text strings for the tabs. +AOwner is a component, typically the form, that is responsible for freeing the tab control. It becomes the value of the Owner property. + + + + + +Destroys an instance of TCustomTabControl. +Do not call Destroy directly in an application. Instead, use Free. Free checks that the tab control is not nil, and only then calls Destroy. Destroy frees the tab list that holds the list of text strings for the tabs and calls the inherited destructor. + + + + + + + + +Indicates the index of the tab at a specified point. +Use IndexOfTabAt to locate which tab is at the point specified by X and Y. If the point with X-coordinate X and Y-coordinate Y is over a tab, IndexOfTabAt returns the 0-offset index of that tab in the Tabs property (TTabControl) or in the Pages property (TPageControl). If the point defined by X and Y is not over a tab, IndexOfTabAt returns 1. + + + + + + + + +Returns information about the location of a point relative to the client area of the tab control. +Call GetHitTestInfoAt to determine what portion of the tab control, if any, sits under the point specified by the X and Y parameters. +GetHitTestInfo returns a THitTests type. This set describes the possible elements under the mouse. When interpreting these values, each tab can be considered an "item" of the tab control. + + + + + + + +Returns the bounding rectangle for a specified tab. +Use TabRect to determine the current position of the tab with the specified index. Index is the 0-offset index of a tab in the Tabs property (TTabControl) or in the Pages property (TPageControl). TabRect returns the bounding rectangle (in client coordinates) of the specified tab. + + + + + + +Sets TabIndex property. +RowCount is called to change the value of the TabIndex property. Descendant classes should override RowCount to provide special implementations of this property. + + + + + + +Scrolls the tabs that are visible when the tab control is not multi-line. +Call ScrollTabs to change the tabs that are visible in the tab control. When Delta is positive, Delta additional tabs to the right are scrolled into view. When Delta is negative, the tabs to the left are scrolled into view, with the absolute value of Delta indicating how many tabs are scrolled. If there are fewer than the absolute value of Delta tabs in the indicated direction, ScrollTabs scrolls as far as possible. +ScrollTabs has no effect if there are no scrolled tabs, either because the control is wide enough to display all tabs or because the MultiLine property is true. + +Note: ScrollTabs scrolls the visible tabs. It does not change the current selection. Calling ScrollTabs may scroll the selected tab out of view. + +Gives access to the tab control's canvas. +Use Canvas to paint to the tab control's canvas during the OnDrawTab event. + + + + +TCustomTabControl is the base type for tab control components such as TTabControl and TPageControl. +Use TCustomTabControl as a base class when defining a control that includes a set of notebook style tabs across the top. TCustomTabControl introduces many properties, methods, and events to manage appearance and behavior of the tabs, and to respond when the user selects one of the tabs. + +Note: When using one of the page controls, if you want to restrict a user from switching to a tab, you cannot set TTabSheet.Enabled to false to accomplish that restriction. Instead, use the OnChanging event to prevent the user from selecting a tab. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TTabControl is a tab set that has the appearance of notebook dividers. +Use TTabControl to add a control with multiple tab settings to a form. Unlike a page control, TTabControl is not made up of several pages that contain different controls. Instead, TTabControl is a single object. When the current tab changes, the tab control must directly update its contents to reflect the change in an OnChange event handler. +Disabling a TTabControl object disables all tabs because it is one control. To disable individual tabs, use TPageControl and disable the individual TTabSheet controls that represent the pages. + +Note: When using one of the page controls, if you want to restrict a user from switching to a tab, you cannot set TTabSheet.Enabled to false to accomplish that restriction. Instead, use the OnChanging event to prevent the user from selecting a tab. +The Tabs property can be used to define an accelerator key to a tab item of the TTabControl. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Initializes window-creation parameters for the tab sheet. +The tab sheet calls CreateParams internally when the tab sheet must be generated. CreateParams overrides the inherited method to specify the type of window for the tab sheet. + + + +Called when the user selects another tab. +Generates an OnHide event. DoHide is called automatically when the TabVisible property changes to false. Override DoHide in a derived class to perform class-specific actions when the tab sheet is temporarily removed from its page control, or to block the OnHide event. + + + +Called when the user selects another tab. +Generates an OnShow event. DoShow is called automatically when the TabVisible property changes to false. Override DoShow in a derived class to perform class-specific actions when the tab sheet appears in its page control after being temporarily hidden, or to block the OnHide event. + + + + + + +Renders the image of a windowed control. +Vcl.ComCtrls.TTabSheet.PaintWindow inherits from Vcl.Controls.TWinControl.PaintWindow. All content below this line refers to Vcl.Controls.TWinControl.PaintWindow. +Renders the image of a windowed control. +Call PaintWindow to repaint the control. PaintWindow sends a WM_PAINT message to the windowed control's DefaultHandler method, setting the message record's WParam field to the value passed in DC and the other parameter and result fields to zeros. + + + + + + +Prepare control to be initialized from a stream. +TTabSheet reimplements in order to assign Reader's parent as the Tab Sheet's parent. + + + + + + + + + +Updates the original size of the parent control. +Vcl.ComCtrls.TTabSheet.UpdateControlOriginalParentSize inherits from Vcl.Controls.TWinControl.UpdateControlOriginalParentSize. All content below this line refers to Vcl.Controls.TWinControl.UpdateControlOriginalParentSize. +Updates the original size of the parent control. +UpdateControlOriginalParentSize is a protected method that updates the original size of the parent control. It is used internally to update the anchor rules of the control. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Sets the parent of the control. +Vcl.ComCtrls.TTabSheet.SetParent inherits from Vcl.Controls.TControl.SetParent. All content below this line refers to Vcl.Controls.TControl.SetParent. +Sets the parent of the control. +SetParent is the protected implementation of the Parent property. Override SetParent to execute additional code when the value of the Parent property changes. +The AParent parameter specifies the new parent of the control. +If the control already has a parent, SetParent removes the control from that parent's list of controls by calling the parent's RemoveControl method. If AParent is not nil (Delphi) or NULL (C++), SetParent calls its InsertControl method to add the control to its list of controls. +The TControl destructor calls SetParent(nil (Delphi) or NULL (C++)) to remove the control from its parent's control list before destroying the component. + + + + + + +Creates and initializes an instance of TTabSheet. +Call Create to instantiate a tab sheet at runtime. Tab sheets added to a page control at design time are created automatically. +Create calls the inherited Create method, then sets the initial values for the tab sheet component. +When creating tab sheets at runtime, use the PageControl property to insert them into a page control object. + + + + + +Destroys an instance of TTabSheet. +Do not call Destroy directly at runtime. Instead, call Free. Free verifies that the tab sheet is not nil and only then calls Destroy. Destroy removes the tab sheet from the page control and then calls the inherited Destroy method. + + +Indicates the page control object that contains the tab sheet. +Read PageControl to gain access to the page control object that uses the tab sheet. The properties and methods of the PageControl object can be used to locate the selected page, iterate through the other pages in the page control, or change the display properties of the tabs. +Set PageControl to remove the tab sheet from its current page control (if any) and insert it into a new page control. + +Code Examples +TTabSheetPageControl (Delphi) +TabSheetPageControl (Delphi) +TTabSheetPageControl (C++) +TabSheetPageControl (C++) + + + + + +Indicates the position of the tab sheet in the set of visible tabs in a TPageControl object. +Read TabIndex to determine where the user sees the tab sheet. A value of 0 indicates the first visible tab sheet, a value of 1 indicates the second visible tab sheet, and so on. TabIndex is always less than or equal to PageIndex. For example, a tab sheet that has a PageIndex of 3 will have a TabIndex of 2 if one of the previous tab sheets in the page control is not visible. +If a tab sheet's TabVisible property is false, the TabIndex property is -1. + + + + + + + + + +Indicates whether the tab sheet appears highlighted. +Use Highlighted to make a tab sheet stand out visually. When Highlighted is true, the tab sheet is drawn using a highlight color so that it stands out visually from other tab sheets. + +Note: Highlighted is not linked to the active page of the host page control. A page control can have only one active page, but can have multiple highlighted pages. + +Specifies an image for the tab. +Use ImageIndex to get or set the index of an image to be drawn in the tab. This index identifies an image from the Images property of the page control that contains the tab sheet. Specify -1 to prevent an image from being drawn. + + +Displays the name of linked items from the Image Collection. + + + + + + +Indicates the index of the tab sheet in the list of tab sheets maintained by the page control. +Use PageIndex to determine where the tab sheet sits in its page control. Each tab sheet in a page control is automatically assigned a PageIndex when it is inserted in the page control. The first tab sheet receives a value of 0, the second has a value of 1, and so on. PageIndex values are reassigned if tab sheets are deleted or moved. +To access a particular tab sheet given its index value, use the indexed Pages property of the TPageControl object. + + + + + + + +Specifies whether the tab of the TTabSheet object appears in its TPageControl. +Use TabVisible to temporarily remove a tab sheet from a page control. When TabVisible is false, the tab does not appear in the page control and its TabIndex property is -1. Setting TabVisible to true allows the user to see the tab of the tab sheet again. + + + + + + + + + + + + + +Occurs when the TabVisible property changes to false. +Write an OnHide event handler to take specific action when the tab sheet is temporarily removed from its page control. + + + + + + + + + +Occurs when the TabVisible property changes to true. +Write an OnShow event handler to take specific action when the tab sheet appears in its page control after being temporarily hidden. + + + + +TTabSheet is an individual page in a TPageControl object. +Use TTabSheet to represent a single page in a tabbed page control. Tab sheets are typically referred to as pages. TPageControl maintains an indexed array of its tab sheets in its Pages property. Users can click on a tab to activate the tab sheet. +You can use the Caption property of the TTabSheet control to define an accelerator key to a page of the TPageControl. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Indicates whether a tab sheet in the page control can be selected. +Call CanShowTab to determine whether a tab can be selected or accessed. +TabIndex is the index of the tab in the list of tab sheets maintained by the Pages property. +CanShowTab returns true if the specified Tab sheet is enabled (its Enabled property is true ). + + + +Responds to changes in the page control. +Change is called automatically when Windows notifies the page control of a change. TPageControl responds to this notification by updating its display to show the new current page. + + + + + + + +Provides necessary adjustments when a new client is docked in the page control. +DoAddDockClient is called when a new client is docked to the page control. It sets the page control's tab sheet as the new client's parent. +Client is the client being docked. + + + + + + + + + + +Indicates whether an object that is dragged over the page control can be docked. +DockOver is called automatically when the user drags a dockable window over the page control. +The Source parameter describes the object that is being dragged. +The X and Y parameters give the current position of the dragged control. +The State parameter indicates how the mouse is moving. +DockOver initializes the Source parameter to reflect the dockable region of the page control and generates an OnDockOver event. An OnDockOver event handler can change the Accept parameter to false if the Source control should not be docked. + +Note: DockOver is only called if the DockSite property is true. + + + + + +Provides necessary adjustments when a control is undocked from the page control. +DoRemoveDockClient is called when a client is undocked from the page control. It selects the next page in the tab sheet. +Client is the client being undocked. + + + + + + + +Specifies the image to display for a particular page. +Override GetImageIndex in a derived class to specify the index of the image to display for a particular page. +TabIndex is the page's index that is about to be displayed. +The Return Value is an integer that is the image's index (in the Images property) that will be displayed in the tab. +By default, if there is no OnGetImageIndex event handler, GetImageIndex returns the ImageIndex property for the page with the specified index; otherwise, GetImageIndex calls the inherited GetImageIndex method, returning the result. + + + + + + + +Returns the tab sheet on which a client is docked. +Call GetPageFromDockClient to get the tab sheet on which Client is docked. +Returns nil (Delphi) or NULL (C++) if Client is not docked. + + + + + + + + + + + +Returns the page control's docking information. +Call GetSiteInfo to determine the docking region of the page control and whether a dragged window can be docked. +Client is a potential docking client. +InfluenceRect returns the area in which the client can be docked. +MousePos is the current mouse position. +CanDock indicates whether the client can be docked in the page control. +GetSiteInfo initializes CanDock to true if Client is not already docked in the page control. It then inflates the influence rectangle by 10 pixels and generates an OnOnGetSiteInfo event. + + + +Initializes the page control after all its parts have been loaded from a stream. +Loaded is called automatically when the form containing the page control is first loaded into memory. TPageControl overrides the Loaded method to ensure that all tab sheets with a Highlighted property of true appear highlighted. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Assigns indexes to the pages that reflect the order in which pages are loaded from a stream. +SetChildOrder is called automatically when the children of the page control are loaded from a stream. It assigns each page an index that reflects the order in which pages are loaded and saved. +The Child parameter is a page of the page control. The Order parameter indicates when the page is loaded or saved. The first page loaded or saved is called with Order set to 0, the second with Order set to 1, and so on. +SetChildOrder assigns the PageIndex property of the individual pages to the value of Order. + + + + + + +Sets the TabIndex property. +Vcl.ComCtrls.TPageControl.SetTabIndex inherits from Vcl.ComCtrls.TCustomTabControl.SetTabIndex. All content below this line refers to Vcl.ComCtrls.TCustomTabControl.SetTabIndex. +Sets the TabIndex property. +SetTabIndex is called to change the value of the TabIndex property. Descendant classes should override SetTabIndex to provide special implementations of this property. + + + + + + +Displays a specified page. +ShowControl is called automatically when a particular page of the page control should be visible. The AControl parameter specifies the page that should be displayed on screen. +ShowControl makes the specified page active it is not already active, and sets its own Visible property to true. It then calls the ShowControl method of its parent object to ensure that the page control is showing (and therefore able to display the active page). + + + +Updates the ActivePage property when changes are made to the Pages property. +This protected method is used internally when the pages listed in the Pages property change. It ensures that the page control is internally consistent and that the active page is displayed. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates an instance of PageControl. +Call Create to instantiate a page control at runtime. Page controls added to forms at design time are created automatically. +AOwner is the form in which the page control should appear. It becomes the value of the Owner property. +When creating a page control at runtime, the pages must be added programmatically. To add a page to a page control at runtime, create the TTabSheet object for the page and set its PageControl property. + + + + + +Destroys an instance of TPageControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TPageControl reference is not nil, and only then calls Destroy. Destroy frees the TList object that holds the pages of the control, and then calls the inherited destructor. + + + + + + + + + False + + + + + +Returns the next page in the page control before or after a specified page. +Call FindNextPage to locate a page in the page control by its position relative to the page specified by the CurPage parameter. If the GoForward parameter is true, FindNextPage returns the next page in the page control after CurPage. If GoForward is false, FindNextPage returns the previous page. If CurPage is not a page in the page control, FindNextPage returns the first page when GoForward is true or the last page when GoForward is false. If GoForward is true and CurPage is the last page in the page control, FindNextPage returns the first page. If GoForward is false and CurPage is the first page in the page control, FindNextPage returns the last page. +When CheckTabVisible is true, FindNextPage returns the next page with a TabVisible property set to true, if CheckTabVisible is false, FindNextPage returns the next page, including pages with TabVisible set to false. + + + + + + + +Calls a specified procedure for every page in the page control. +Call GetChildren to execute a callback for every page in the page control. The Proc parameter is the callback. The Root parameter is ignored by TPageControl. +GetChildren is intended primarily for the streaming system that loads and saves components. + + + + + + + True + + + + +Changes the ActivePage to the first visible page that is before or after the currently active page. +Use SelectNextPage to select the page next to the currently active page. +If the GoForward parameter is true, SelectNextPage selects the first page after ActivePage; if GoForward is false, SelectNextPage selects the first page previous to ActivePage. +If CheckTabVisible is true, SelectNextPage only considers pages with their TabVisible property set to true. + +Note: To select a page at design-time, right-click the TPageControl and choose Previous Page or Next Page. + +Specifies the page currently displayed by the page control. +Use ActivePageIndex to get or set the active page by index rather than by object. The value of ActivePageIndex identifies a page in the Pages property array. Changing the value of ActivePageIndex changes the ActivePage property, and vice versa. +If there is no active page, reading ActivePageIndex gives a value of -1. +Setting ActivePageIndex to a value that is out of bounds (less than 0 or greater than PageCount - 1) results in the page control having no active page. + + +Indicates the number of pages in the TPageControl object. +Use PageCount to determine the number of pages listed by the Pages property. If the MultiLine property is false, not all pages may have tabs visible to the user. + + + +Specifies the page currently displayed by the page control. +Read ActivePage to determine which page is selected by the user. The user selects a page by clicking the mouse on its tab. Set ActivePage to bring a page to the foreground. Only one page can be active at a time. +To change the ActivePage to the page that precedes or follows the active page, use the SelectNextPage method. To iterate through all the pages to locate a specific page, use the FindNextPage method. +Two events occur when one attempts to change the current page. They are OnChange and OnChanging. OnChanging occurs immediately before you attempt to change the current page, while OnChange occurs immediately after the page has been changed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TPageControl is a set of pages used to make a multiple page dialog box. +Use TPageControl to create a multiple page dialog or tabbed notebook. TPageControl displays multiple overlapping pages that are TTabSheet objects. The user selects a page by clicking the page's tab that appears at the top of the control. To add a new page to a TPageControl object at design time, right-click the TPageControl object and choose New Page. +You can define an accelerator key to a page of the TPageControl. To define the accelerator key use the Caption property of the TTabSheet control. +To create a tabbed control that uses only a single body portion (page), use TTabControl instead. + +Note: When using one of the page controls, if you want to restrict a user from switching to a tab, you cannot set TTabSheet.Enabled to false to accomplish that restriction. Instead, use the OnChanging event to prevent the user from selecting a tab. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Repositions and resizes the status bar by a specified ratio. +ChangeScale is called automatically when the form that contains the status bar is rescaled. ChangeScale modifies the position as well as the size of a control. Thus, ChangeScale modifies the control's Top, Left, Width, and Height properties. +The M and D parameters define a fraction by which to scale the control. The M parameter is the multiplier and the D parameter is the divisor. For example, to make a control 75% of its original size, specify the value of M as 75, and the value of D as 100 (75/100). Alternately, the same results are achieved by specifying the value of M as 3, and the value of D as 4 (3/4). Both fractions are equal and result in the control being scaled by the same amount, 75%. +TCustomStatusBar overrides the inherited method to ensure that the new size of the status bar matches the system font if the UseSystemFont property is true. + + + + + + +Creates a new panel that can be added to the Panels property. +The TStatusPanels object that implements the Panels property calls CreatePanel when it needs to add a new panel. CreatePanel generates an OnCreatePanelClass event to determine the class of the new TStatusPanel object, and then creates an instance of that class. CreatePanel returns the new status panel instance. + + + + + + +Creates the TStatusPanels object that implements the Panels property. +TCustomStatusBar calls CreatePanels internally generate the implementation object for the Panels property. +Override this method to substitute a TStatusPanels descendant as the implementation of the Panels property or to provide special initializations to the TStatusPanels instance. + + + + + + +Initializes the window-creation parameter record when the status bar window is created. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomStatusBar overrides CreateParams to customize the parameters to specify a status bar control that reflects the properties of TCustomStatusBar. +The fields of the Params parameter become the parameters to a call to the CreateWindowEx API function. + + + +Creates the Windows control that represents the status bar. +The CreateHandle method calls CreateWnd to handle the particulars of creating the status bar window. TCustomStatusBar overrides the inherited method to ensure that the newly-created window and the TCustomStatusBar properties correctly reflect each other. +The Windows control for the status bar can be temporarily destroyed and recreated in order to set properties that require changing the window creation parameters. Thus, CreateWnd may be called more than once during the lifetime of the TCustomStatusBar instance. + + + + + + +Generates an OnHint event. +DoHint is called automatically when the value of AutoHint is true and the status bar receives notification that it should display a hint. +If there is an OnHint event handler, DoHint calls the event handler and returns true. If no OnHint event handler is assigned, DoHint returns false. + + + + + + + +Draws an owner-drawn panel. +DrawPanel is called automatically for each status panel that has a Style of psOwnerDraw. If there is an event handler for the OnDrawPanel event, DrawPanel calls the OnDrawPanel event handler. Otherwise, it fills the panel background using the color specified by the Color property. +Panel is the owner drawn status panel that needs to be drawn. +Rect indicates the dimensions of that panel on the status bar's canvas. + + + + + + +Returns the class to use for implementing the panels of the status bar. +The CreatePanel method calls GetPanelClass to determine the default class to use when creating new panels for the status bar. This class can then be changed by an OnCreatePanelClass event handler. +TCustomStatusBar returns TStatusPanel as the default class for status bar panels. Descendants that use a TStatusPanel descendant by default can override this method to indicate a different default class. + + + + + + +Indicates whether the value of the Font property should be saved in the form file. +TCustomStatusBar uses IsFontStored internally to determine whether the value of the Font property should be stored in a form file with the other properties of the status bar object. IsFontStored checks the UseSystemFont, ParentFont, and DesktopFont properties. If any of these is true, the status bar gets its font from an external source, and the value of the Font property does not need to be saved. + + + + + + +Sets the value of the Parent property. +SetParent is the protected write implementation of the Parent property. +AParent is the new parent of the status bar. + + + + + + +Creates and initializes a TCustomStatusBar component. +The Create method creates a status bar along with its canvas and status panels. +AOwner is a component, typically the form, that becomes the value of the Owner property. + + + + + +Destroys TCustomStatusBar and frees its memory. +Do not call Destroy directly. Instead, use the Free method, which checks for a nil object before calling Destroy. +The Destroy method destroys the status bar along with its canvas and status panels. + + + + + + + +Processes actions for the status bar. +When an action executes, the application makes a series of calls to respond to that action. If, in the course of that processing, the application identifies the status bar as a potential target of the action, it calls the status bar's ExecuteAction method. +If the action in a hint action (THintAction), ExecuteAction checks the AutoHint property, and if it is true, displays the hint and returns true. Otherwise, it allows the inherited method to respond to any other actions. +The Action parameter specifies the action that was invoked. +ExecuteAction returns true if the action was successfully dispatched, and false if the component could not handle the action. + + + + + + +Reverses the positions of the status bar's panels. +FlipChildren iterates through the panels of the status bar, reversing their order but otherwise leaving their properties intact. +AllLevels specifies whether FlipChildren should be called recursively on the control's children. TCustomStatusBar ignores this parameter when reversing the panels. + + + + + + + + + +Sets the Left, Top, Width, and Height properties all at once. +TCustomStatusBar overrides SetBounds in order to update the size grip. +ALeft, ATop, AWidth, and AHeight specify the new values for the Left, Top, Width, and Height properties, respectively. + + +Provides runtime access to the status bar's drawing surface. +The read-only Canvas property provides access to the status bar's drawing surface that you can use when implementing a handler for the OnDrawPanel event. + + +Specifies whether the status bar's text is set automatically to the current hint. +Use AutoHint to specify whether the status bar's text is set automatically to the current hint. When AutoHint is True, the status bar automatically responds to hint actions by displaying the long version of the hint's text in the first panel. + + +Lists the panels (TStatusPanel objects) in the status bar. +The Panels property holds a TStatusPanels, that is, a collection of TStatusPanel objects. At design time, you can add, remove, or modify panels with the Panels editor. To open the Panels editor, select the Panels property in the Object Inspector, then double-click in the Value column to the right or click the ellipsis (...) button. +At design time, you can add, remove, or modify panels with the Panels editor: + +To open the Panels editor from the the Object Inspector, select the Panels property and either double-click in the Value column to the right or click the ellipsis (...) button. +To open the Panels editor from the Form Designer, right-click TStatusBar and select Panels editor from the context menu. + +Determines whether the status bar displays a single panel or multiple panels. +If SimplePanel is set to True, the status bar consists of a single panel displaying the text in SimpleText. If SimplePanel is set to False, the status bar displays a separate panel for each item in its Panels property. + +Note: When SimplePanel is False, you cannot use the SimpleText property to display text in the status bar. Instead, you must set the Text property on one of the panel objects. + +Contains a text string to be displayed in the status panel when SimplePanel is True. + +Note: Microsoft Windows XP and earlier versions limited the size of the string to 127 chars. Under Microsoft Windows Vista, Windows 7, or later Windows operating systems, SimpleText has no such limit. + +Determines whether the status bar is resizable at run time. +If SizeGrip is set to True, the status bar has a triangular grip on the lower right corner. The user can resize the status bar by dragging the grip with the mouse. +A size grip will not be drawn unless the Parent property refers to the child of a TCustomForm descendant with a BorderStyle of bsSizeable or bsSizeToolWin. + +Note: If Align is set to alBottom, alRight, or alClient, the sizing grip will not work. If the Alignment property of the last panel in the status bar is set to taRightJustify, the sizing grip will truncate the panel's text. + +Specifies whether the status bar uses the system font. +UseSystemFont specifies whether the status bar uses the system font. To change fonts, use the Font property. + + +Occurs when a status panel needs to be created. +Write an OnCreatePanelClass event handler to specify a custom TStatusPanel descendant that the status bar should use to implement its panels. +OnCreatePanelClass is an event handler of type Vcl.ComCtrls.TSBCreatePanelClassEvent. + + +Occurs when the AutoHint property is True and the status bar receives a hint action. +Write an OnHint event handler to customize the way the status bar displays hints when the AutoHint property is True. When AutoHint is True and the status bar needs to display a hint, it generates an OnHint event. If the status bar has an OnHint event handler, then the status bar assumes that the event handler displays the hint and does not set the panel text to the value of the application's current hint. If there is no OnHint event handler (and AutoHint is True), the status bar displays the text of the hint in the first panel. +OnHint does not occur if the AutoHint property is False. + + + + +Occurs when a status panel needs to be redrawn. +The OnDrawPanel event occurs when a status panel needs to be redisplayed for example, when the user resizes the status bar. OnDrawPanel occurs only if the status panel's Style property is set to psOwnerDraw. +OnDrawPanel is an event handler of type Vcl.ComCtrls.TCustomDrawPanelEvent. + + + +TCustomStatusBar is the base class for objects that represent status bars. +TCustomStatusBar component is the base class for status bar controls. Status bars consist of a row of panels, usually aligned at the bottom of a form, that display information about an application as it runs. Each panel is represented by a TStatusPanel object listed in the Panels property. +TCustomStatusBar is intended only as a base class. To add a status bar to a form, use a TCustomStatusBar descendant such as TStatusBar. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs when a status panel needs to be redrawn. +The OnDrawPanel event occurs when a status panel needs to be redisplayed for example, when the user resizes the status bar. OnDrawPanel occurs only if the status panel's Style property is set to psOwnerDraw. +OnDrawPanel is an event handler of type Vcl.ComCtrls.TDrawPanelEvent. + + + + + + +TStatusBar represents a status bar. +The TStatusBar component is a row of panels, usually aligned at the bottom of a form, that display information about an application as it runs. Each panel is represented by a TStatusPanel object listed in the Panels property. The SimplePanel property can be used to toggle the status bar at runtime between a single- and multiple-panel display. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sets the stored directive for Touch properties. + + + + + + + + + Setter for the Encoding property. + + + + + + + + + + + + + + + + + + + + + Read-only property that contains the value of the encoding detected when the LoadFromStream or + LoadFromFile methods are called. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Initializes a window-creation parameter data structure. +Vcl.ComCtrls.TTrackBar.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + + + + + + +Resize and reposition children and self. +Vcl.ComCtrls.TTrackBar.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + +Creates the underlying window. +Vcl.ComCtrls.TTrackBar.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + +Destroys the control's window. +Vcl.ComCtrls.TTrackBar.DestroyWnd inherits from Vcl.Controls.TWinControl.DestroyWnd. All content below this line refers to Vcl.Controls.TWinControl.DestroyWnd. +Destroys the control's window. +DestroyWnd is called when the control needs to replace its window. For example, changing properties that are implemented by window parameter settings require the control to be destroyed and then recreated using the CreateWnd method. +Before the window is destroyed, DestroyWnd saves a copy of the control's text in memory, frees any device contexts, and finally calls DestroyWindowHandle. When the window is recreated, the stored copy of the control's text is assigned to the new window. + + + +Sends a CM_CHANGED message to the control. +Vcl.ComCtrls.TTrackBar.Changed inherits from Vcl.Controls.TControl.Changed. All content below this line refers to Vcl.Controls.TControl.Changed. +Sends a CM_CHANGED message to the control. +Call Changed after changing the properties of the control in a way that affects the properties of a parent object. Changed sends a CM_CHANGED message back to the control. If the control is a windowed control, this message is sent to the parent so that it can make any necessary adjustments. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates and initializes an instance of TTrackBar. +Call Create to instantiate a TTrackBar object at runtime. Track bars placed on forms at design time are created automatically. +Create allocates memory and initializes the following properties: +ControlStyle is set to [csCaptureMouse, csClickEvents, csSetCaption]. +Frequency is set to 1. +Height is set to 45 and Width to 150. +LineSize is set to 1 and PageSize to 2. +Max is set to 10 and Min to 0. +Orientation is set to trHorizontal. +TickMarks is set to tbBottomRight and TickStyle to tsAuto. +TabStop is set to true. + + + + + + +Adds a tick mark to the track bar at a specified location. +Use SetTick to place a tick mark on the bar at the position that corresponds to the Value parameter. Tick marks specified in this manner are only displayed when the TickStyle is set to tsManual. + + + + + + + + + + + + +Indicates the amount the value of Position changes when the user presses the arrow keys. +Use LineSize to specify the distance along the slider that represents a single unit. The current Position is marked by a slider. The right and down arrow keys increment the value of Position by LineSize, and the left and up arrow keys decrement the value of Position by LineSize. +Use the PageSize property to set the number of ticks moved using the Page Up and Page Down keys. + + +Specifies the maximum Position of a TTrackBar. +Use Max to set an upper limit to the value that can be represented using the track bar. A slider indicates the current Position in a range between Min and Max. + + +Specifies the minimum Position of a TTrackBar. +Use Min to set a lower limit to the value that can be represented using the track bar. A slider indicates the current Position in a range between Min and Max. + + +Specifies whether the track bar is horizontal or vertical. +Set Orientation to the desired orientation of the track bar. Orientation has these possible values: + + + + + +Value + +Meaning + + + +tbHorizontal + + + +The long edge of the track is parallel to the top of the form. The Min position is on the left and the Max position is on the right. + + + + +tbVertical + + + +The long edge of the track is parallel to the side of the form. The Min position is on the top and the Max position is on the bottom. + + + + + + + + + +Specifies the amount Position is changed when the PageUp or PageDown key is pressed, or when the bar is clicked. +Set PageSize to the distance along the track bar that corresponds to a single view. A slider marks the current Position. The Page Up key increments the value of Position by PageSize, and Page Down key decrements the value of Position by PageSize. +Use the LineSize property to set the number of ticks moved using the arrow keys. + + + +Specifies the increment between tick marks on the track bar. +Use Frequency to specify the spacing of the tick marks, using the logical units used by the Position property. For example, a Frequency of 5 sets a tick mark at every fifth possible increment. To provide visual feedback about the units used by the track bar, set Frequency to LineSize or PageSize. + +Note: If the value of the TickStyle property is not set to tsAuto, the value of Frequency is ignored. + +Contains the current position of the slider of a TTrackBar. +Read Position to determine the current value represented by the track bar. Position is a value in the range between Min and Max (inclusive). Set Position to programmatically move the slider of the track bar to a new value. + + +Determines the position of the (optional) Tool Tip displaying the position of the track bar. +You can set this property to one of the following values. + + + + + +Value + +Meaning + + + +ptNone + + + +No Tool Tip is shown. + + + + +ptTop + + + +The Tool Tip appears at the top side of the TrackBar. + + + + +ptBottom + + + +The Tool Tip appears at the bottom side of the TrackBar. + + + + +ptLeft + + + +The Tool Tip appears at the left side of the TrackBar. + + + + +ptRight + + + +The Tool Tip appears at the right side of the TrackBar. + + + + + +Note: Use ptLeft and ptRight for the vertical Track Bars. Use ptTop and ptBottom for the horizontal Track Bars. + +Specifies whether the track bar's slider is visible. +Use SliderVisible to get or set whether the track bar's slider is visible. + + + + +Specifies the position of the end point of the selection range. +Set SelEnd to determine the length of a selection that begins at SelStart. The track bar indicates a selection range on the bar by placing special tick marks at the positions specified by the SelStart and SelEnd properties and highlighting the selected portion of the bar. +SelEnd must be greater than or equal to Position. If SelEnd is set to a value less than Position, Position changes to SelEnd. SelEnd must be greater than or equal to SelStart. If SelEnd is the same as SelStart, there is no selection, and the value of Position is the same as SelStart and SelEnd. + + +Specifies the position of the starting point of the selection range. +Set SelStart to determine the beginning of a selection that runs to SelEnd. The track bar indicates a selection range on the bar by placing special tick marks at the positions specified by the SelStart and SelEnd properties and highlighting the selected portion of the bar. +SelStart must be less than or equal to Position. If SelStart is set to a value greater than Position, Position changes to SelStart. SelStart must be less than or equal to SelEnd. If SelStart is the same as SelEnd, there is no selection, and the value of Position is the same as SelStart and SelEnd. + + + +Specifies whether the track bar shows the selection range. +If set to True, the selection range on the track bar is displayed. If set to False, the selection range is not displayed. + + + + + + +Specifies the length of the track bar's slider. +Use ThumbLength to get or set the length of the track bar's slider. + + + + +Specifies the location of the tick marks. +Set TickMarks to specify where the tick marks should be drawn. TickMarks has these possible values: + + + + + +Value + +Meaning + + + +tmBottomRight + + + +Tick marks are on the bottom or right of the track bar, depending of the value of Orientation. + + + + +tmTopLeft + + + +Tick marks are on the top or left of the track bar, depending of the value of Orientation. + + + + +tmBoth + + + +Tick marks are on both sides of the track bar. + + + + +If the TickStyle property is tsNone, the value of TickMarks is ignored. + + +Specifies how tick marks are placed on the track bar. +Set TickStyle to specify whether the track bar should display tick marks, and if so, how those tick marks are set. TickStyle has these possible values: + + + + + +Value + +Meaning + + + +tsAuto + + + +Tick marks are automatically displayed at increments equal to the value of the Frequency property. + + + + +tsManual + + + +Tick marks are displayed at the Min and Max values. Additional tick marks can be set using the SetTick method. + + + + +tsNone + + + +No tick marks are displayed. + + + + + + + + + + + + + + + + + + + + + + + + + + +TTrackBar is a wrapper for a track bar control. +Use TTrackBar to put a track bar on a form. A track bar represents a position along a continuum using a slider and, optionally, tick marks. A track bar can also display a selected range marked by triangular ticks at the starting and ending positions of the selection. +During program execution, the slider can be moved to the desired position by dragging it with the mouse or by clicking the mouse on the bar. To use the keyboard to move the slider, press the arrow keys or the Page Up and Page Down keys. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + $0 + + + + + $FFFFFFFF + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFE + + + + + $FFFFFFFF + + + + + lgsNormal + + + + + lgsHidden + + + + + lgsCollapsed + + + + + lgsNoHeader + + + + + lgsCollapsible + + + + + lgsFocused + + + + + lgsSelected + + + + + lgsSubseted + + + + + lgsSubSetLinkFocused + + + + + drBounds + + + + + drIcon + + + + + drLabel + + + + + drSelectBounds + + + + + iaTop + + + + + iaLeft + + + + + arAlignBottom + + + + + arAlignLeft + + + + + arAlignRight + + + + + arAlignTop + + + + + arDefault + + + + + arSnapToGrid + + + + + vsIcon + + + + + vsSmallIcon + + + + + vsList + + + + + vsReport + + + + + isNone + + + + + isCut + + + + + isDropHilited + + + + + isFocused + + + + + isSelected + + + + + isActivating + + + + + ctText + + + + + ctImage + + + + + ctState + + + + + ifData + + + + + ifPartialString + + + + + ifExactString + + + + + ifNearest + + + + + sdLeft + + + + + sdRight + + + + + sdAbove + + + + + sdBelow + + + + + sdAll + + + + + htHandPoint + + + + + htUnderlineCold + + + + + htUnderlineHot + + + + + irText + + + + + irImage + + + + + irParam + + + + + irState + + + + + irIndent + + + + + aviNone + + + + + aviFindFolder + + + + + aviFindFile + + + + + aviFindComputer + + + + + aviCopyFiles + + + + + aviCopyFile + + + + + aviRecycleFile + + + + + aviEmptyRecycle + + + + + aviDeleteFile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1400 + + + + + tbsButton + + + + + tbsCheck + + + + + tbsDropDown + + + + + tbsSeparator + + + + + tbsDivider + + + + + tbsTextButton + + + + + tbsChecked + + + + + tbsPressed + + + + + tbsEnabled + + + + + tbsHidden + + + + + tbsIndeterminate + + + + + tbsWrap + + + + + tbsEllipses + + + + + tbsMarked + + + + + tbNoEdges + + + + + tbHiliteHotTrack + + + + + tbNoOffset + + + + + tbNoMark + + + + + tbNoEtchedEffect + + + + + gdoHotTrack + + + + + gdoGradient + + + + + dsNormal + + + + + dsGradient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Aligns any child controls of the toolbar within a specified area of the control. +The protected AlignControls method is called automatically to align all controls within an area of container control (in this case the tool bar). In TToolBar, AlignControls takes into account the special needs of a tool bar in arranging its buttons. +Control is a child control that should have precedence when laying out the child controls. If Control is nil (Delphi) or NULL (C++), none of the child controls has precedence. +Rect is the area in which to align the child controls. + + + + + + + + +Indicates whether the toolbar can resize itself automatically to accommodate its contents. +CanAutoSize is called automatically when the AutoSize property is true and an attempt is made to resize the control. It allows the toolbar to implement the AutoSize property before the resize sequence that ends with the OnResize event. +When CanAutoSize is called, the NewWidth and NewHeight parameters indicate the proposed new dimensions of the toolbar. CanAutoSize adjusts these values so that the toolbar's size adjusts to its buttons. If the adjustment results in values of NewWidth and NewHeight that differ from the control's current width and height, CanAutoSize returns true, indicating that the resize sequence should proceed. If, after adjustment, NewWidth and NewHeight equal Width and Height, CanAutoSize returns false, and the resize sequence is aborted. + + + +Called when the menu associated with a toolbar button is canceled. +Override CancelMenu in a derived class to handle the canceling of a menu on one of the tool buttons. +By default, CancelMenu clears the highlighting and hot item in the menu. + + + + + + + + +Repositions and resizes the toolbar by a specified ratio. +Use ChangeScale to change the scale of the toolbar. +ChangeScale modifies the position and size of a toolbar as well as rescaling the buttons. Thus, ChangeScale modifies the Top, Left, Width, and Height properties. +The M and D parameters define a fraction by which to scale the control. The M parameter is the multiplier and the D parameter is the divisor. For example, to make a control 75% of its original size, specify the value of M as 75, and the value of D as 100 (75/100). Alternately, the same results are achieved by specifying the value of M as 3, and the value of D as 4 (3/4). Both fractions are equal and result in the control being scaled by the same amount, 75%. + + + + + + + +Displays a toolbar button's drop-down menu. +CheckMenuDropdown is called automatically when the drop-down arrow portion of a toolbutton is clicked or if a toolbutton has an assigned MenuItem property. +Button is the drop-down toolbar button that was clicked. +CheckMenuDropdown has no effect unless the button's Style property contains tbsDropDown. + + + + + + +Simulates the clicking of a toolbar button. +Call ClickButton to simulate the clicking of a toolbar button. +Button is the toolbar button to click. + + + + + + + + +Initializes a window-creation parameter record passed in the Params parameter. +CreateParams is called automatically to initialize the window-creation parameters whenever the window for the toolbar needs to be created. CreateParams overrides the inherited method to implement those properties that require a specialize window style. + + + +Creates the window that implements the toolbar. +The Windows control for the toolbar can be temporarily destroyed and recreated in order to set properties that require changing the window creation parameters. TToolBar calls CreateWnd to create this Windows control when necessary. + + + + + + + +Use this method for drawing the toolbar when gdoGradient and dsGradient are both set. +This method is used for drawing the toolbar when gdoGradient and dsGradient are both set + + + + + + + + + + + +Use this method for drawing toolbuttons when gdoGradient and dsGradient are both set. +This method is used for drawing toolbuttons when gdoGradient and dsGradient are both set. + + + + + + + + + + +Generates OnCustomDraw and OnAdvancedCustomDraw events. +CustomDraw is called automatically at discrete stages during the drawing process to generate the OnCustomDraw and OnAdvancedCustomDraw events. +ARect specifies the boundaries of the toolbar on the toolbar's Canvas. +Stage indicates the current stage of the paint process. When Stage is cdPrePaint, CustomDraw generates an OnCustomDraw event followed by an OnAdvancedCustomDraw event. At all other stages, CustomDraw generates only the OnAdvancedCustomDraw event. +CustomDraw returns true if the toolbar should continue with its default painting sequence, false if the painting sequence should end after the call. + + + + + + + + + + +Generates OnCustomDrawButton and OnAdvancedCustomDrawButton events. +CustomDrawButton is called automatically at discrete stages during the drawing process to generate the OnCustomDrawButton and OnAdvancedCustomDrawButton events. +Button specifies the tool button that needs to be drawn. +State describes the state of the button, so that the event handler can reflect that state in the button's image. +Stage indicates the current stage of the paint process. When Stage is cdPrePaint, CustomDrawButton generates an OnCustomDrawButton event followed by an OnAdvancedCustomDrawButton event. At all other stages, CustomDrawButton generates only the OnAdvancedCustomDrawButton event. +Flags is used only when Stage is cdPrePaint. It influences how the button is subsequently rendered by the default drawing process. CustomDrawButton returns the set of flags that indicates how the toolbar should proceed with rendering the button. + + + + + + + +Generates an OnCustomizeCanInsert event. +DoQueryInsert is called automatically when the user tries to add a button to a customizable tool bar. It generates an OnCustomizeCanInsert event, allowing the application to block the insertion. +Index is the index (in the Buttons property) where the user is trying to insert a new button. + + + + + + + +Generates an OnCustomizeCanDelete event. +DoQueryDelete is called automatically when the user tries to delete a button from a customizable tool bar. It generates an OnCustomizeCanDelete event, allowing the application to block the deletion. +Index is the index (in the Buttons property) of the button that the user is trying to delete. + + + + + + + +Returns the toolbar button with the specified accelerator. +Use FindButtonFromAccel to determine which toolbar button has the specified accelerator. +If the accelerator is not found, FindButtonFromAccel returns nil (Delphi) or NULL (C++). + + + + + + +Called when the menu associated with a drop-down toolbar button is about to be displayed. +InitMenu initializes the highlighting and hot-tracking for the drop-down menu associated with the tool button that Button specifies. +Override InitMenu in a derived class to perform other initializations to the toolbar button's menu. + + + + + + + + +Indicates whether an event handler exists to respond at a particular stage in the paint process. +TToolBar uses IsCustomDrawn internally to determine whether it needs generate the various custom draw events. +Target indicates what object is currently being painted. If Target is dtControl, it is the background of the toolbar, and IsCustomDrawn checks whether there is an OnCustomDraw or OnAdvancedCustomDraw event handler. If Target is dtItem, it is one of the tool buttons, and IsCustomDrawn checks for an OnCustomDrawButton or OnAdvancedCustomDrawButton event handler. TToolBar does not use dtSubItem as a target. +Stage indicates the current stage of the paint process. If stage is not cdPrePaint, then the tool bar only generates an event if it has one of the advanced custom draw event handlers. +IsCustomDrawn returns true if the toolbar should generate an event (there is an event handler to respond.) IsCustomDrawn returns false if there is no need to generate a custom draw event. + + + +Initializes the component after the form file has been read into memory. +TToolBar overrides Loaded in order to managed the ButtonWidth property. + + + + + + + +Responds to a notification that a component has been added or is about to be deleted. +Notification is called automatically when a component has just been added to the form or is about to be deleted. +AComponent is the component that was just added or that is about to be deleted. +Operation indicates whether AComponent was added or is about to be deleted. +As implemented in TToolBar, Notification checks whether the image list that is the value of the Images, HotImages, or DisabledImages property is about to be deleted. If so, it resets the property to nil (Delphi) or NULL (C++). + + + + + + +Updates the position of a specified button in the toolbar. +TToolBar uses RepositionButton internally when laying out the buttons in the toolbar. RepositionButton calculates where to place the button with the specified index, given the positions of all previous buttons in the toolbar. It then changes the position and size of the specified tool button. + + + + + + +Updates the positions of all buttons in the toolbar from a specified button on. +TToolBar uses RepositionButtons internally when laying out the buttons in the toolbar. RepositionButtons calculates where to place all the buttons with the specified index or greater, and updates their positions and sizes. + + + + + + +Provides specific message responses for the toolbar. +WndProc overrides the WndProc for TWinControl to handle mouse messages, and sends all others to the inherited WndProc. +Derived classes that override WndProc to provide specialized responses to messages should call the inherited WndProc at the end to dispatch any other messages. + + + + + + + + +Rearranges the toolbar's buttons so they fit in the toolbar. +Call WrapButtons to rearrange the toolbar's buttons. +NewWidth is the width in which the buttons must fit. +NewHeight is the height in which the buttons must fit. +WrapButtons returns true if the buttons fit; otherwise, WrapButtons returns false. + + + + + +Respond to control resize. +Vcl.ComCtrls.TToolBar.Resize inherits from Vcl.Controls.TControl.Resize. All content below this line refers to Vcl.Controls.TControl.Resize. +Respond to control resize. +Resize is called automatically immediately after the control's dimensions change. As implemented in TControl, Resize calls the control's OnResize event handler if it is assigned. + + + + + + +Sets the value of the AutoSize property. +Vcl.ComCtrls.TToolBar.SetAutoSize inherits from Vcl.Controls.TControl.SetAutoSize. All content below this line refers to Vcl.Controls.TControl.SetAutoSize. +Sets the value of the AutoSize property. +SetAutoSize is a protected method in the TControl class and is used to set the value of the AutoSize property. + + + + + +Called when the StyleElements property changes. +Vcl.ComCtrls.TToolBar.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + + + + +Creates and initializes a TToolBar instance. +Call Create to create a toolbar at runtime. Toolbars added to forms at design time are created automatically. +AOwner is the component, typically the form, that is responsible for freeing the toolbar instance. It becomes the value of the Owner property. + + + + + +Destroys the TToolBar instance and frees its memory. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TToolBar reference is not nil, and only then calls Destroy. + + + + + + +Prevents the toolbar buttons from reversing position when the parent control is flipped. +FlipChildren overrides the inherited method in order to prevent the flipping of the toolbar's children. + + + + + + +Returns a TComponent enumerator. +Vcl.ComCtrls.TToolBar.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + + +Allows the streaming system to load and save child controls in the order they appear in the toolbar. +GetChildren is introduced in TComponent for the streaming system that loads and saves VCL components. It executes the callback specified by Proc for all the button in the toolbar, as well as any other controls that have the toolbar as a parent and the component specified by Root as an Owner. +Proc is a callback that the streaming system uses to load or save persistent objects on a form. +Root is the the top-level component (such as a form or data module) that is currently being loaded or saved. + + + + + + + +Called when the accelerator for a toolbar button is pressed. +TrackMenu is called automatically in response to the accelerator on a toolbar button. It initializes the menu of a drop-down menu button, and forwards a click to the underlying Windows control. +Button is the toolbar button for which an accelerator was pressed. +Override TrackMenu in a derived class to perform additional actions when the accelerator for a toolbar button is pressed. + + +Gives the number of buttons in the toolbar. +ButtonCount gives the number of buttons in the Buttons array. + + + +Specifies the drawing surface for the toolbar. +Use Canvas to draw or paint on the surface of the toolbar in an OnCustomDraw or OnCustomDrawButton event handler. The TCanvas object provides the properties and methods needed for drawing and painting. + + +Specifies the registry key where the tool bar saves its current button configuration before the user changes it using the toolbar customize dialog. +Use CustomizeKeyName to specify where the toolbar saves its button configuration when the user first displays the toolbar customize dialog. This is a subkey of HKEY_CURRENT_USER. +When the user double-clicks the tool bar to display the toolbar customize dialog, the tool bar receives an OnCustomizing event and then automatically saves its current configuration to this key using the name specified by the CustomizeValueName property. If the user instructs the dialog to restore this configuration, the toolbar fetches the saved configuration from this registry key. + + +Specifies the registry value under which the tool bar saves its current button configuration before the user changes it using the toolbar customize dialog. +Use CustomizeValueName to specify the name that the toolbar uses to save its button configuration when the user first displays the toolbar customize dialog. This is a value under the registry key specified by the CustomizeKeyName property. +When the user double-clicks the tool bar to display the toolbar customize dialog, the tool bar receives an OnCustomizing event and then automatically saves its current configuration to the Registry using this value. If the user instructs the dialog to restore this configuration, the toolbar fetches this saved configuration. + + +Indicates the number of rows in the toolbar. +Reading RowCount returns the number of rows in which the tool buttons are arranged. + + + + + + +Specifies the height of the controls in the toolbar. +ButtonHeight represents the height, in pixels, of the controls in the toolbar. + + +Specifies the width of the tool buttons (TToolButton) in the toolbar. +ButtonWidth represents the width, in pixels, of the TToolButton components on the toolbar. It has no effect on tool buttons whose Style property is set to tbsSeparator or tbsDivider. + + + + + + +Specifies whether the user can customize the toolbar at runtime. +Set Customizable to true to allow the user to add, delete, and move toolbar buttons at runtime. There are two ways the user can change a customizable toolbar: +By holding the shift key, the user can drag a button to a new position on the tool bar, or drag it off the toolbar entirely to delete the button. +By double-clicking on the toolbar, the user can display the toolbar customize dialog. The toolbar customize dialog shows all the possible buttons in two list boxes, one that contains buttons not on the tool bar, and one that contains buttons currently on the tool bar. The user can use this dialog to add or remove buttons and to change their order. + +Note: When Customizable is true, a number of events inform the tool bar component when the user makes changes. + +Lists the images that can appear on disabled tool buttons. +DisabledImages contains a list of images that can appear on tool buttons when they are disabled. Each tool button's ImageIndex property determines the specific image displayed on it. If DisabledImages is unassigned, disabled tool buttons display grayed versions of their regular images (specified by the Images property). + + + + + + + +Stores the style type. +This property stores either the dsNormal or dsGradient style choice. + + + + + + + + +Makes the toolbar transparent and eliminates tool-button borders. +If Flat is set to true, the toolbar and its tool buttons are transparent; background colors and graphics show through them. In addition, when Flat is true, tool buttons (TToolButton) on the toolbar have pop-up borders that appear only when the mouse is passed over the button. + + + +Color used as end color for the gradient. +This property stores the color that is used to paint the gradient when the drawing ends. (The end color blends with the start color). + + + + +Color used as start color for the gradient. +The property stores the value that represents the drawing color when the gradient starts painting. + + + + + +Specifies handling of buttons obscured by adjacent toolbar. +If HideClippedButtons is set to true, any button partially obscured by a neighboring band is hidden. + + + + +Lists the images that can appear on tool buttons when the mouse points to them. +HotImages contains a list of images that can appear on tool buttons when the mouse passes over them at runtime. Each tool button's ImageIndex property determines the specific image displayed when the mouse points to it. If HotImages is unassigned, tool buttons retain their regular images (specified by the Images property) when pointed to. Use a TImageList control to hold the images that will be shown for hot images. Typically, then, the application will have two TImageList controls, one for the Images property and one for the HotImages property. +To use HotImages set the Flat property to True. + + +Color used as hot tracking color when in gradient style. +This is the color used as the hot tracking color when the toolbar's DrawingStyle property is set to dsGradient. The hot tracking color is the color the button turns when the mouse moves over it. + + + + +Lists the images that can appear on tool buttons. +Images contains a list of images that can appear on the toolbar's tool buttons. Each tool button's ImageIndex property determines the specific image displayed on it. If Images is unassigned, no images are displayed on the tool buttons. +Images in the list should be 16x16. + + +Specifies the margin on the left side of the toolbar. +Indent specifies, in pixels, the margin that separates the left edge of the toolbar from the controls within it. + + + + +Aligns captions on the right and images on the left in tool buttons. +When List is false, tool buttons (TToolButton) appear in the toolbar with their images (if any) centered and their captions (if visible) underneath. Setting List to true aligns captions to the right and images to the left. + + +Causes the toolbar to populate itself with buttons that correspond to items in a menu. +Use the menu property to populate the tool bar to match a menu component. Setting Menu causes the toolbar to delete all of its current buttons and replace them with tool buttons that match the items in the specified menu component. +In applications that use Menu to populate the toolbar, do not change the Buttons property by adding, deleting, or editing toolbar buttons. + +Note: The toolbar does not dynamically track any changes to the menu specified by Menu. That is, it sets the tool buttons to reflect the set of items in the menu at the point when the application sets this property, and ignores any subsequent changes. + +Specifies whether the direction of the gradient is horizontal or vertical. +This property stores the value for the gradient direction. + + + + +Stores the drawing option chosen. +This property contains either the gdoHotTrack or gdoGradient option, depending on which one was chosen. + + + + + + + + + +Determines whether text captions are displayed on tool buttons. +If ShowCaptions is set to true, tool buttons appear in the toolbar with their captions displayed. Setting ShowCaptions to true may increase the size of the tool buttons. + + +Determines whether tool buttons that consist only of text can be placed on the Toolbar. +When set to true, the tbsTextButton style is available for the TToolButton control, allowing you to create tool buttons on the Toolbar that consist only of text. When set to false, the tbsTextButton style is not available for the TToolButton control. + + + + + + +Specifies whether the toolbar is transparent. +Use Transparent to get or set whether the toolbar is transparent. Note the Transparent property applies only to the toolbar itself not its buttons. + +Tip: To avoid painting problems, set the Transparent property before the toolbar becomes visible. + + + + + + +Enables automatic line-wrap for components in the toolbar. +If Wrapable is true, components automatically wrap around and form new rows when they do not fit horizontally in the toolbar. + + +Occurs at discrete stages during the painting of the toolbar's background. +Write an OnAdvancedCustomDraw event handler to enhance or replace the automatic painting of the toolbar. Use the toolbar's Canvas property to render the toolbar's image. OnAdvancedCustomDraw is for painting the background of the toolbar. The painting of individual buttons on the toolbar should be handled in an OnCustomDrawButton or OnAdvancedCustomDrawButton event handler. + +Note: OnAdvancedCustomDraw occurs at several points during the painting of the toolbar's background. If you only need to respond immediately prior to the default painting of the toolbar, use OnCustomDraw instead. +OnAdvancedCustomDraw is an event handler of type Vcl.ComCtrls.TTBAdvancedCustomDrawEvent. + + +Occurs at discrete stages during the painting of the toolbar's buttons. +Write an OnAdvancedCustomDrawButton event handler to enhance or replace the automatic painting of the toolbar's buttons. Use the toolbar's Canvas property to render the button's image. OnAdvancedCustomDrawButton occurs during the erasure and painting of individual buttons on the toolbar. The painting of the toolbar itself should be handled in an OnCustomDraw or OnAdvancedCustomDraw event handler. + +Note: OnAdvancedCustomDrawButton occurs at several points during the painting of the toolbar's buttons. If you only need to respond immediately prior to the default painting of each button and are not using the Flags parameter, use OnCustomDrawButton instead. +OnAdvancedCustomDrawButton is an event handler of type Vcl.ComCtrls.TTBAdvancedCustomDrawBtnEvent. + + + + +Occurs when the toolbar must be painted. +Write an OnCustomDraw event handler to enhance or replace the automatic painting of the toolbar. Use the toolbar's Canvas property to render the toolbar's image. OnCustomDraw is for painting the background of the toolbar. The painting of individual buttons on the toolbar should be handled in an OnCustomDrawButton or OnAdvancedCustomDrawButton event handler. + +Note: OnCustomDraw only occurs prior to painting the toolbar's background. To respond at other points in the paint process (when the background is erased, or after the default painting of the toolbar's background), use OnAdvancedCustomDraw instead. +OnCustomDraw is an event handler of type Vcl.ComCtrls.TTBCustomDrawEvent. + + +Occurs when one of the buttons in the toolbar must be painted. +Write an OnCustomDrawButton event handler to enhance or replace the automatic painting of the toolbar's buttons. Use the toolbar's Canvas property to render the button's image. OnCustomDrawButton is for painting individual buttons on the toolbar. The painting of the toolbar itself should be handled in an OnCustomDraw or OnAdvancedCustomDraw event handler. + +Note: OnCustomDrawButton only occurs prior to painting the button. To respond at other points in the process of painting a button (when the background is erased, or after the default painting of the button), use OnAdvancedCustomDrawButton instead. +OnCustomDrawButton is an event handler of type Vcl.ComCtrls.TTBCustomDrawBtnEvent. + + +Occurs when the user adds a button to the toolbar. +Write an OnCustomizeAdded handler to respond when the user adds a new button to the toolbar using the toolbar customize dialog. +This event occurs after the new button is already added to the toolbar. To respond before the button is added, possibly even preventing the user from adding the button, use the OnCustomizeCanInsert event instead. +OnCustomizeAdded is an event handler of type Vcl.ComCtrls.TTBButtonEvent. + + +Occurs when user tries to add a button to the toolbar. +When the Customizable property is true, the user can add buttons to the toolbar using the toolbar customize dialog. OnCustomizeCanInsert occurs when the user tries to add a button, and allows the application to reject the insertion. If the OnCustomizeCanInsert event handler sets its Allow parameter to false, the toolbar customize dialog rejects the insertion. +OnCustomizeCanInsert is an event handler of type Vcl.ComCtrls.TTBCustomizeQueryEvent. + + +Occurs when user tries to delete one of the buttons on the toolbar. +When the Customizable property is true, the user can remove buttons from the toolbar by dragging them off the toolbar when the Shift key is pressed or using the toolbar customize dialog. OnCustomizeCanDelete occurs when the user tries to delete a button in one of these ways, and allows the application to reject the deletion. If the OnCustomizeCanDelete event handler sets its Allow parameter to false, the tool button returns to the position it occupied before the user tried to delete it. +OnCustomizeCanDelete is an event handler of type Vcl.ComCtrls.TTBCustomizeQueryEvent. + + +Occurs when the user finishes making changes to the toolbar. +Write an OnCustomized event handler to take action after the user has finished making changes to the toolbar. This event occurs when the user finishes a drag operation (with the Shift key down) that moves or deletes a tool button, and when the user exits the toolbar customize dialog. + + +Occurs when the user deletes a button from the toolbar. +Write an OnCustomizeDelete event handler to respond when the user deletes a tool button by dragging it off the toolbar when the SHIFT key is pressed or by using the toolbar customize dialog. +This event occurs after the button has been removed from the toolbar. To respond before the button is being deleted, possibly preventing the user from deleting the button, use the OnCustomizeCanDelete event instead. +OnCustomizeDelete is an event handler of type Vcl.ComCtrls.TTBButtonEvent. + + +Occurs when the user displays the toolbar customize dialog in order to make changes to the toolbar. +Write an OnCustomizing event handler to take action when the user first displays the toolbar customize dialog. + + +Occurs when the user tries to add a new button to the tool bar. +Write an OnCustomizeNewButton event handler to supply your own TToolButton objects to represent the tool buttons that a user adds in the toolbar customize dialog. +OnCustomizeNewButton is an event handler of type Vcl.ComCtrls.TTBNewButtonEvent. + + +Occurs when the user cancels a customization to the toolbar. +Write an OnCustomizeReset event handler to respond when the user cancels changes made in the toolbar customize dialog. + + + + + + + + + + + + + + + + + + + + + + + + +TToolBar manages tool buttons and other controls, arranging them in rows and automatically adjusting their sizes and positions. +TToolBar is a container for tool buttons (TToolButton). It provides an easy way to arrange and manage visual controls. +All tool buttons on a toolbar maintain a uniform width and height. +Other controls can sit on a toolbar. These controls (which are held in place by invisible tool buttons) maintain a uniform height. +Controls can automatically wrap around and start a new row when they do not fit horizontally on the toolbar. +The Flat property allows the background to show through the toolbar and gives pop-up borders to the tool buttons. +Spaces and dividers (which are in fact specially configured tool buttons) can group controls on the toolbar both visually and functionally. +Typically, the tool buttons correspond to items in an application's menu and give the user more direct access to the application's commands. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $1400 + + + + + bmNone + + + + + bmClick + + + + + bmDblClick + + + + + dtkDate + + + + + dtkTime + + + + + dtkDateTime + + + + + dmComboBox + + + + + dmUpDown + + + + + dfShort + + + + + dfLong + + + + + dtaLeft + + + + + dtaRight + + + + + soHorizontal + + + + + soVertical + + + + + sbFirst + + + + + sbLast + + + + + bsNormal + + + + + bsInvisible + + + + + bsGrayed + + + + + bsDepressed + + + + + bsHot + + + + + csExDropDown + + + + + csExSimple + + + + + csExDropDownList + + + + + csExCaseSensitive + + + + + csExNoEditImage + + + + + csExNoEditImageIndent + + + + + csExNoSizeLimit + + + + + csExPathWordBreak + + + + + acoAutoSuggest + + + + + acoAutoAppend + + + + + acoSearch + + + + + acoFilterPrefixes + + + + + acoUseTab + + + + + acoUpDownKeyDropsList + + + + + acoRtlReading + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + Override background painting for custom style + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Clears the check box associated with the calendar. +Vcl.ComCtrls.TDateTimePicker.CheckEmptyDate inherits from Vcl.ComCtrls.TCommonCalendar.CheckEmptyDate. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.CheckEmptyDate. +Clears the check box associated with the calendar. +CheckEmptyDate is called automatically when DateTime is assigned a value that represents a time and not a date value (or Date is assigned a value of 0). As implemented in TCommonCalendar, CheckEmptyDate does nothing. +TDateTimePicker overrides CheckEmptyDate to clear the check box associated with the calendar, or raise an EDateTimeError if the ShowCheckbox property is false. This allows TDateTimePicker to represent time values that do not include a date portion. (When a TDateTime value represents a time and not a date, the date portion is 0). + + + + + + +Initializes a window-creation parameter data structure. +Vcl.ComCtrls.TDateTimePicker.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + +Creates the windows control for the calendar. +Vcl.ComCtrls.TDateTimePicker.CreateWnd inherits from Vcl.ComCtrls.TCommonCalendar.CreateWnd. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.CreateWnd. +Creates the windows control for the calendar. +CreateWnd is called automatically when the windowed control is first created or when the window must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the window when it is first created. +CreateWnd calls the TWinControl CreateWnd method to generate the window, and then sends messages to initialize the control so that it reflects the current property settings. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the calendar control's window handle. +Vcl.ComCtrls.TDateTimePicker.GetCalendarHandle inherits from Vcl.ComCtrls.TCommonCalendar.GetCalendarHandle. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.GetCalendarHandle. +Returns the calendar control's window handle. +GetCalendarHandle is the protected read implementation of the CalendarHandle property. For TCommonCalendar, this is an abstract method. It must be implemented in descendant classes. + + + + + + + + +Sets the calendar's colors. +Vcl.ComCtrls.TDateTimePicker.MsgSetCalColors inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetCalColors. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetCalColors. +Sets the calendar's colors. +MsgSetCalColors implements the CalColors property by sending a message to the calendar window handle. MsgSetCalColors is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The ColorIndex parameter indicates which of the TMonthCalColors properties is being set. It is one of the following values: + + + + + +Value + +Property + + + +0 + + + +BackColor + + + + +1 + + + +TextColor + + + + +2 + + + +TitleBackColor + + + + +3 + + + +TitleTextColor + + + + +4 + + + +MonthBackColor + + + + +5 + + + +TrailingTextColor + + + + +The ColorValue parameter is the value that should be set. +MsgSetCalColors returns true if the color is set by the method. + + + + + + + +Sets the calendar's date/time. +Vcl.ComCtrls.TDateTimePicker.MsgSetDateTime inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetDateTime. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetDateTime. +Sets the calendar's date/time. +MsgSetDateTime implements the DateTime property by sending a message to the calendar window handle. MsgSetDateTime is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The Value parameter indicates the value of DateTime as a TSystemTime value. This can be obtained from the DateTime property value by calling DateTimeToSystemTime. +MsgSetDateTime returns true if the date/time value is set by the method. + + + + + + + + +Implements the MinDate and MaxDate properties. +Vcl.ComCtrls.TDateTimePicker.MsgSetRange inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetRange. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetRange. +Implements the MinDate and MaxDate properties. +MsgSetRange implements the MinDate and MaxDate properties by sending a message to the calendar window handle. MsgSetRange is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The Flags parameter indicates what type of information is included in the SysTime array. It includes the GDTR_MIN flag if a minimum date is supplied and GDTR_MAX if a maximum date is supplied. +The SysTime parameter is a two-element array containing the minimum date as the first element and the maximum date as the second element. These values can be obtained from the MinDate and MaxDate properties by calling DateTimeToSystemTime. +MsgSetRange returns true if the range is set by the method. + + + + + + + + $0 + + + + + +Implements the MinDate and MaxDate properties. +Vcl.ComCtrls.TDateTimePicker.MsgSetRange inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetRange. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetRange. +Implements the MinDate and MaxDate properties. +MsgSetRange implements the MinDate and MaxDate properties by sending a message to the calendar window handle. MsgSetRange is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The Flags parameter indicates what type of information is included in the SysTime array. It includes the GDTR_MIN flag if a minimum date is supplied and GDTR_MAX if a maximum date is supplied. +The SysTime parameter is a two-element array containing the minimum date as the first element and the maximum date as the second element. These values can be obtained from the MinDate and MaxDate properties by calling DateTimeToSystemTime. +MsgSetRange returns true if the range is set by the method. + + + + + + +Creates and initializes a TDateTimePicker instance. +Create calls the inherited constructor method and initializes the Date and Time properties to the current date and time. It also sets the following ControlStyle flags: csCaptureMouse, csOpaque, csClickEvents, csDoubleClicks, and csFixedHeight. + + + +Specifies whether the date time picker control is dropped down. +DroppedDown specifies whether the date time picker control is dropped down. + + + + + + + + + + + + +Determines the alignment of the drop-down calendar. +Set CalAlignment to dtaLeft or dtaRight to align the drop-down calendar on the left or right side of the component. This property is applicable only if the Kind property is dtkDate and the DateMode property is dmComboBox. + + + + + +Specify format for date-time string. +Format specifies custom format string for the date-time display, overriding the control panel strings. A custom format can include both date and time fields, but time fields are not editable unless the Kind property is dtkTime. The following format characters are understood. + + + + + +Element + +Description + + + +d + + + +The one- or two-digit day. + + + + +dd + + + +The two-digit day. Single-digit day values are preceded by a zero. + + + + +ddd + + + +The three-character weekday abbreviation. + + + + +dddd + + + +The full weekday name. + + + + +h + + + +The one- or two-digit hour in 12-hour format. + + + + +hh + + + +The two-digit hour in 12-hour format. Single-digit values are preceded by a zero. + + + + +H + + + +The one- or two-digit hour in 24-hour format. + + + + +HH + + + +The two-digit hour in 24-hour format. Single-digit values are preceded by a zero. + + + + +m + + + +The one- or two-digit minute. + + + + +mm + + + +The two-digit minute. Single-digit values are preceded by a zero. + + + + +M + + + +The one- or two-digit month number. + + + + +MM + + + +The two-digit month number. Single-digit values are preceded by a zero. + + + + +MMM + + + +The three-character month abbreviation. + + + + +MMMM + + + +The full month name. + + + + +t + + + +The one-letter AM/PM abbreviation (that is, AM is displayed as "A"). + + + + +tt + + + +The two-letter AM/PM abbreviation (that is, AM is displayed as "AM"). + + + + +yy + + + +The last two digits of the year (that is, 2001 would be displayed as "01"). + + + + +yyyy + + + +The full year (that is, 2001 would be displayed as "2001"). + + + + +To include literal strings in the format, enclose them in single quotes. Failing to quote literal strings can have unpredictable results, even if they do not include formatting codes. Use two single quotes to represent one single quote character in a literal string. For example, +Today's date: MMM dd, yyyy +entered in the property editor, produces the following results for April 1, 2001: +"Today's date: Apr 01, 2001" + +Note: When setting Format programmatically in Delphi code, double each single quote again: + + + +DateTimePicker1.Format := '''Today''''s date:'' MMM dd, yyyy'; + + + + + +Indicates the time entered by the user. +Time represents the time entered by the user. Set Time in program code or in the Object Inspector to determine which time is selected by default. (Applies only when Kind = dtkTime.) + + +Displays a check box next to the date or time. +Set ShowCheckbox to true to display a check box in the TDateTimePicker component. + + +Indicates whether the check box next to the date or time is selected. +Checked is true if the check box in the TDateTimePicker component is selected. Setting Checked to true at design time makes the check box appear selected by default. + + + +Specifies format in which the date is presented. +If DateFormat is set to dfShort, the date is formatted using the short date format specified in the Windows control panel. By default, it appears like this: 3/21/97. +If DateFormat is set to dfLong, the date is formatted using the long date format specified in the Windows control panel. By default, it appears like this: Friday, March 21, 1997. (Applies only when Kind is dtkDate.) +For custom date formats, set the Format property. + + +Determines the method of date selection used by the component. +If DateMode is dmComboBox, the component has a drop-down calendar illustration from which the user can select a date. If DateMode is dmUpDown, the component has Up/Down arrows with which the user can adjust the date. (Applies only when Kind is dtkDate.) + + + + + + + + + + +Determines whether the component is a date selector or a time selector. +If the Kind property is dtkDate, the control is configured to support date editing. The default format gives only the date portion of the control value, and a drop-down calendar is available if the DateMode property is dmComboxBox. +If the Kind property is dtkTime, the control is configured to support time editing. The default format give only the time portion of the control value, but the date portion can also be edited if the Format property includes date field codes.. + + + + +Enables the OnUserInput event. +If ParseInput is True, the OnUserInput event occurs whenever the user types into the component's edit box. + + + + + + + + + + + + + + + + +Occurs when the drop-down calendar closes. +Write an OnCloseUp event handler to implement special processing that needs to occur only when the drop-down calendar closes. + + +Occurs when a date or time is entered. +Write an OnChange event handler to take specific action whenever the date or time entered in the component changes. + + + +Occurs when the user opens the drop-down calendar by clicking the arrow at the right of the control. +Write an OnDropDown event handler to implement special processing that needs to occur only when the drop-down calendar is opened. + + + + + + + + + + + + + + + + +Occurs when the user types directly into the component's edit box. +This event occurs only if ParseInput is set to True. Write an OnUserInput event handler implementing special processing that needs to occur when the user types directly into the TDateTimePicker (rather than selecting with the drop-down calendar or scroll arrows). +OnUserInput is an event handler of type Vcl.ComCtrls.TDTParseInputEvent. + + + +TDateTimePicker displays a list box for entering dates or times. +TDateTimePicker is a visual component designed specifically for entering dates or times. In dmComboBox date mode, it resembles a list box or combo box, except that the drop-down list is replaced with a calendar illustration; users can select a date from the calendar. Dates or times can also be selected by scrolling with Up and Down arrows and by typing. +Date-time picker ignores the BiDiMode setting for right-to-left reading, displaying dates according to the system locale. +TDateTimePicker formats date and time values according to the date and time settings in the Regional Settings of the Control panel on the user's system. Because TDateTimePicker is a wrapper for a Windows control, these formats can't be changed by changing the formatting variables in the SysUtils unit. However, you can use the Windows API call DateTime_SetFormat to programmatically specify these settings. + +Note: The underlying Windows control is known to behave unpredictably when used to set dates in 1752, the year English-speaking countries changed to the Gregorian calendar. Similar problems may appear for different dates when a non-English locale is used. If an application might be used to specify dates on or before the changeover in the current locale (for example, 1918 or before in Russian locales), be sure to test the application using the dates affected. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Custom handler for WM_GETTEXTLENGTH message. + + + + + + + + Custom handler for WM_GETTEXT message. + + + + + + + + Custom handler for WM_SETTEXT message. + + + + + + + + Custom handler for CB_GETEDITSEL message. + + + + + + + + Custom handler for CB_SETEDITSEL message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $40046 + + + + + $40047 + + + + + $40048 + + + + + $50050 + + + + + $50051 + + + + + $60000 + + + + + $6000A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Override background painting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Controls.xml b/Modules/DelphiVCL/doc/Vcl.Controls.xml new file mode 100644 index 00000000..b8eff03f --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Controls.xml @@ -0,0 +1,25198 @@ + + + + $B000 + + + + + $0 + + + + + $B000 + + + + + $B001 + + + + + $B002 + + + + + $B003 + + + + + $B004 + + + + + $B005 + + + + + $B006 + + + + + $B007 + + + + + $B008 + + + + + $B009 + + + + + $B00A + + + + + $B00B + + + + + $B00C + + + + + $B00D + + + + + $B00E + + + + + $B00F + + + + + $B010 + + + + + $B011 + + + + + $B012 + + + + + $B013 + + + + + $B014 + + + + + $B015 + + + + + $B016 + + + + + $B017 + + + + + $B018 + + + + + $B019 + + + + + $B01A + + + + + $B01B + + + + + $B01C + + + + + $B01D + + + + + $B01E + + + + + $B01F + + + + + $B020 + + + + + $B021 + + + + + $B022 + + + + + $B023 + + + + + $B024 + + + + + $B025 + + + + + $B026 + + + + + $B027 + + + + + $B028 + + + + + $B029 + + + + + $B02A + + + + + $B02B + + + + + $B02C + + + + + $B02D + + + + + $B02E + + + + + $B02F + + + + + $B030 + + + + + $B031 + + + + + $B032 + + + + + $B033 + + + + + $B034 + + + + + $B035 + + + + + $B036 + + + + + $B037 + + + + + $B038 + + + + + $B039 + + + + + $B03A + + + + + $B03B + + + + + $B03C + + + + + $B03D + + + + + $B03E + + + + + $B03F + + + + + $B040 + + + + + $B041 + + + + + $B042 + + + + + $B043 + + + + + $B044 + + + + + $B045 + + + + + $B046 + + + + + $B047 + + + + + $B048 + + + + + $B049 + + + + + $B04A + + + + + $B04B + + + + + $B04C + + + + + $B04D + + + + + $B04E + + + + + $B04F + + + + + $B050 + + + + + $B051 + + + + + $B051 + + + + + $B052 + + + + + $B053 + + + + + $B054 + + + + + $B055 + + + + + $B056 + + + + + $B057 + + + + + $B058 + + + + + $B059 + + + + + $B05A + + + + + $B05B + + + + + $B05C + + + + + $B05D + + + + + $BC00 + + + + + $BC2F + + + + + $BD11 + + + + + $BC39 + + + + + $BD35 + + + + + $BD36 + + + + + $BD33 + + + + + $BD34 + + + + + $BD32 + + + + + $BD37 + + + + + $BD38 + + + + + $BC2D + + + + + $BC2B + + + + + $BD14 + + + + + $BC2C + + + + + $BE10 + + + + + $BC2E + + + + + $BD15 + + + + + $BD00 + + + + + $BD01 + + + + + $BD02 + + + + + $BD04 + + + + + $BD06 + + + + + $BC4E + + + + + akLeft + + + + + akTop + + + + + akRight + + + + + akBottom + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $C + + + + + $D + + + + + $E + + + + + $8 + + + + + + + $0 + + + + + $FFFFFFFF + + + + + $FFFFFFFE + + + + + $FFFFFFFD + + + + + $FFFFFFFC + + + + + $FFFFFFEA + + + + + $FFFFFFFA + + + + + $FFFFFFF9 + + + + + $FFFFFFF8 + + + + + $FFFFFFF7 + + + + + $FFFFFFF6 + + + + + $FFFFFFF5 + + + + + $FFFFFFF4 + + + + + $FFFFFFF3 + + + + + $FFFFFFF2 + + + + + $FFFFFFF1 + + + + + $FFFFFFF0 + + + + + $FFFFFFEF + + + + + $FFFFFFEE + + + + + $FFFFFFED + + + + + $FFFFFFEC + + + + + $FFFFFFEB + + + + + $FFFFFFEA + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + $5 + + + + + $6 + + + + + $7 + + + + + $8 + + + + + $9 + + + + + $A + + + + + $B + + + + + $C + + + + + $D + + + + + $E + + + + + $F + + + + + $10 + + + + + $11 + + + + + $12 + + + + + $13 + + + + + $14 + + + + + $15 + + + + + $16 + + + + + $17 + + + + + $18 + + + + + $19 + + + + + $1A + + + + + $1B + + + + + $1C + + + + + $1D + + + + + $1E + + + + + $1F + + + + + $20 + + + + + $21 + + + + + $22 + + + + + $1 + + + + + $22 + + + + + $FFFFFE00 + + + + + $FFFFFFFF + + + + + $FFFFFC00 + + + + + $FFFFFDFF + + + + + $100 + + + + + $1FF + + + + + $101 + + + + + $102 + + + + + $103 + + + + + $104 + + + + + $105 + + + + + $106 + + + + + $107 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + dmAutomatic + + + + + dmManual + + + + + dsDragEnter + + + + + dsDragLeave + + + + + dsDragMove + + + + + dkDrag + + + + + dkDock + + + + + maDefault + + + + + maActivate + + + + + maActivateAndEat + + + + + maNoActivate + + + + + maNoActivateAndEat + + + + + mbLeft + + + + + mbRight + + + + + mbMiddle + + + + + gfBegin + + + + + gfInertia + + + + + gfEnd + + + + + igZoom + + + + + igPan + + + + + igRotate + + + + + igTwoFingerTap + + + + + igPressAndTap + + + + + igoPanSingleFingerHorizontal + + + + + igoPanSingleFingerVertical + + + + + igoPanInertia + + + + + igoPanGutter + + + + + igoParentPassthrough + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dmDragEnter + + + + + dmDragLeave + + + + + dmDragMove + + + + + dmDragDrop + + + + + dmDragCancel + + + + + dmFindTarget + + + + + alNone + + + + + alTop + + + + + alBottom + + + + + alLeft + + + + + alRight + + + + + alClient + + + + + alCustom + + + + + csLButtonDown + + + + + csClicked + + + + + csPalette + + + + + csReadingState + + + + + csAlignmentNeeded + + + + + csFocusing + + + + + csCreating + + + + + csPaintCopy + + + + + csCustomPaint + + + + + csDestroyingHandle + + + + + csDocking + + + + + csDesignerHide + + + + + csPanning + + + + + csRecreating + + + + + csAligning + + + + + csGlassPaint + + + + + csPrintClient + + + + + csAcceptsControls + + + + + csCaptureMouse + + + + + csDesignInteractive + + + + + csClickEvents + + + + + csFramed + + + + + csSetCaption + + + + + csOpaque + + + + + csDoubleClicks + + + + + csFixedWidth + + + + + csFixedHeight + + + + + csNoDesignVisible + + + + + csReplicatable + + + + + csNoStdEvents + + + + + csDisplayDragImage + + + + + csReflector + + + + + csActionClient + + + + + csMenuEvents + + + + + csNeedsBorderPaint + + + + + csParentBackground + + + + + csPannable + + + + + csAlignWithMargins + + + + + csGestures + + + + + csPaintBlackOpaqueOnGlass + + + + + csOverrideStylePaint + + + + + csNeedsDesignDisabledState + + + + + sfLeft + + + + + sfTop + + + + + sfWidth + + + + + sfHeight + + + + + sfFont + + + + + sfDesignSize + + + + + sgLeft + + + + + sgRight + + + + + sgUp + + + + + sgDown + + + + + sgUpLeft + + + + + sgUpRight + + + + + sgDownLeft + + + + + sgDownRight + + + + + sgLeftUp + + + + + sgLeftDown + + + + + sgRightUp + + + + + sgRightDown + + + + + sgUpDown + + + + + sgDownUp + + + + + sgLeftRight + + + + + sgRightLeft + + + + + sgUpLeftLong + + + + + sgUpRightLong + + + + + sgDownLeftLong + + + + + sgDownRightLong + + + + + sgScratchout + + + + + sgTriangle + + + + + sgSquare + + + + + sgCheck + + + + + sgCurlicue + + + + + sgDoubleCurlicue + + + + + sgCircle + + + + + sgDoubleCircle + + + + + sgSemiCircleLeft + + + + + sgSemiCircleRight + + + + + sgChevronUp + + + + + sgChevronDown + + + + + sgChevronLeft + + + + + sgChevronRight + + + + + toPressAndHold + + + + + toPenTapFeedback + + + + + toPenBarrelFeedback + + + + + toTouchUIForceOn + + + + + toTouchUIForceOff + + + + + toTouchSwitch + + + + + toFlicks + + + + + toSmoothScrolling + + + + + toFlickFallbackKeys + + + + + gtStandard + + + + + gtRecorded + + + + + gtRegistered + + + + + gtNone + + + + + goUniDirectional + + + + + goSkew + + + + + goEndpoint + + + + + goRotate + + + + + tpInteractiveGestures + + + + + tpInteractiveGestureOptions + + + + + tpParentTabletOptions + + + + + tpTabletOptions + + + + + seFont + + + + + seClient + + + + + seBorder + + + + + doNoOrient + + + + + doHorizontal + + + + + doVertical + + + + + ctWinApi + + + + + ctNative + + + + + imDisable + + + + + imClose + + + + + imOpen + + + + + imDontCare + + + + + imSAlpha + + + + + imAlpha + + + + + imHira + + + + + imSKata + + + + + imKata + + + + + imChinese + + + + + imSHanguel + + + + + imHanguel + + + + + tipClose + + + + + tipOpen + + + + + tipDontCare + + + + + bvNone + + + + + bvLowered + + + + + bvRaised + + + + + bvSpace + + + + + beLeft + + + + + beTop + + + + + beRight + + + + + beBottom + + + + + bkNone + + + + + bkTile + + + + + bkSoft + + + + + bkFlat + + + + + + Mouse wheel input is delivered to the app with focus. + This value is means the Windows Mouse setting + "Scroll inactive windows when I hover over them" is On + + + + wrFocusedWindow + + + + + + Mouse wheel input is delivered to the app with focus (desktop apps) + or the app under the mouse cursor (Windows Store apps) + + + + wrHybrid + + + + + + Mouse wheel input is delivered to the app under the mouse cursor. + This value is means the Windows Mouse setting + "Scroll inactive windows when I hover over them" is On + + + + wrMousePos + + + + + bhInfo + + + + + bhWarning + + + + + bhError + + + + + bhsNormal + + + + + bhsLarge + + + + + bhsSmall + + + + + bhsStandard + + + + + bhsBalloon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Indicates current PPI value for the control + + + + + + + + + + + + + + + + Indicates current scale factor for the control + + + + +Obtains the design Dpi for the form where the control was designed. + + + + + + + + + +Obtains the current Dpi for parent control, or the current control Dpi if there is no parent. + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Schedules asynch method calls. +Vcl.Controls.TControl.AsyncSchedule inherits from System.Classes.TComponent.AsyncSchedule. All content below this line refers to System.Classes.TComponent.AsyncSchedule. +Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + See Also +System.Classes.TComponent.BeginInvoke +System.Classes.TBaseAsyncResult +System.Classes.TBaseAsyncResult.Schedule + + + + + + + + +Responds when the action associated with the control changes. +ActionChange is called automatically when the action object specified by the Action property, or any of its properties, changes. By default, the control action link's OnChange event handler calls ActionChange. +ActionChange updates the control properties that correspond to properties of the associated action. These properties include the Caption, Enabled, Hint, and Visible properties and the OnClick event handler. +The Sender parameter is the action object that changed. +The CheckDefaults parameter indicates whether the control's properties should all be updated or only those that have not been explicitly changed from their default values. When CheckDefaults is true, only those properties and event handlers that have not been changed from the default values are updated. + + + +Sets the size of the control as determined by the AutoSize property. +If the AutoSize property is true, AdjustSize is called automatically when the control needs to automatically resize itself to its contents. As implemented in TControl, AdjustSize calls SetBounds with the values of its Left, Top, Width, and Height properties. This call can result in a change of size if these values are altered in the control's OnCanResize or OnConstrainedResize event handlers, or if the control's OnResize event handler makes any final adjustments. +Descendent classes override AdjustSize to change the size of the control to adjust to its contents. +Other controls can call AdjustSize after changing the control's contents. Do not call AdjustSize in application code. + + + + + + +Overrides the inherited AssignTo function to enable assignments to TAction objects. +Do not call the protected AssignTo method in application code. The Assign method of a persistent object calls AssignTo if it is passed the control as a Source and the persistent object does not know how to copy the properties of the control. The Dest parameter is the persistent object that should have its properties copied from the control. +As implemented in TControl, AssignTo checks whether the Dest parameter is a TCustomAction object, and if so, assigns values to its Enabled, Hint, Caption, and Visible properties and its OnExecute event. This allows arbitrary controls to assign these to an associated action object. + + + +Begins automatic drag. +BeginAutoDrag is called automatically when a user drags a control whose DragMode is dmAutomatic. Do not call BeginAutoDrag in application code. +As implemented in TControl, BeginAutoDrag calls BeginDrag, passing in the global Mouse variable's DragImmediate and DragThreshold properties. + + + + + + + + +OnCanResize event dispatcher. +CanResize is called automatically when an attempt is made to resize the control, after any autosizing has occurred. The NewWidth and NewHeight arguments specify the attempted new values for the control's height and width. CanResize optionally adjusts the values of NewWidth and NewHeight, and returns true if the control can be resized to the returned values. CanResize returns false if the control cannot be resized. +CanResize generates an OnCanResize event. An OnCanResize event handler may change the values of NewHeight and NewWidth. + + + + + + + + +Indicates whether the control can resize itself automatically to accommodate its contents. +CanAutoSize is called automatically when the AutoSize property is true and an attempt is made to resize the control. It allows controls to implement the AutoSize property before the resize sequence that begins with the OnCanResize and OnConstrainedResize events and ends with the OnResize event. +When CanAutoSize is called, the NewWidth and NewHeight parameters indicate the proposed new dimensions of the control. CanAutoSize adjusts these values so that the control's size adjusts to its contents. If the adjustment results in values of NewWidth and NewHeight that differ from the control's current width and height, CanAutoSize returns true, indicating that the resize sequence should proceed. If, after adjustment, NewWidth and NewHeight equal Width and Height, CanAutoSize returns false, and the resize sequence is aborted. +As implemented in TControl, CanAutoSize always returns true without changing NewWidth or NewHeight. Override CanAutoSize to implement the AutoSize property for a particular control class's contents. + + + +Sends a CM_CHANGED message to the control. +Call Changed after changing the properties of the control in a way that affects the properties of a parent object. Changed sends a CM_CHANGED message back to the control. If the control is a windowed control, this message is sent to the parent so that it can make any necessary adjustments. + + + + + + + +Rescaling event dispatcher. +ChangeScale is called automatically when an event requires that the control resize itself. Most often, this event is a call to the ScaleBy method of the control itself or the control's parent. This allows the control to adjust its own special properties, such as font sizes and display regions. +ChangeScale parameters have the same meaning as for ScaleBy. + +Note: Because control sizes and coordinates are integers, scaling can result in round-off error. Repeated calls to ChangeScale can make the control gradually get smaller or slowly disappear from the form. Consider destroying and reloading the form after several rescalings. + + + + + + + +Rescaling event dispatcher. +ChangeScale is called automatically when an event requires that the control resize itself. Most often, this event is a call to the ScaleBy method of the control itself or the control's parent. This allows the control to adjust its own special properties, such as font sizes and display regions. +ChangeScale parameters have the same meaning as for ScaleBy. + +Note: Because control sizes and coordinates are integers, scaling can result in round-off error. Repeated calls to ChangeScale can make the control gradually get smaller or slowly disappear from the form. Consider destroying and reloading the form after several rescalings. + + +Respond to user click. +Click is called automatically when the user left-clicks the control. Component or application code can call Click to simulate a user mouse click. This is often done in menu actions and hotkey handlers. +As implemented in TControl, Click queries whether the OnClick event handler exists and is different from the OnExecute handler for the control's Action. If this is true, the OnClick event handler is called. If this is false, and the Action OnExecute event handler exists, the Action's Execute method is called. Override Click to provide additional behavior. + + + + + + + + + +Notify control of resize with constraints. +ConstrainedResize is called automatically when a control is resized and has nonzero Constraints. This allows the control to modify the constraints before they are applied. +As implemented in TControl, ConstrainedResize simply calls the OnConstrainedResize event handler. + + + + + + +Gives the coordinates of the cursor, with respect to the origin of the control. +Use CalcCursorPos to obtain the current coordinates of the mouse cursor, with respect to the origin of the control. + + + +Instantiates a touch manager. +CreateTouchManager is called automatically in the constructor of the TControl class. By default, it instantiates a TTouchManager class. +CreateTouchManager can be overridden in descendent classes of TControl to use another touch manager, usually a user-defined one. + + + +OnDblClick event dispatcher. +DblClick calls any event handler attached to the OnDblClick event. Override DblClick to provide other responses in addition to the inherited event-handler call when the user double-clicks the control. +The DblClick method is triggered by left mouse-button double-click message (WM_LBUTTONDBLCLK) from Windows. + + + + + + + +Handles the painting and erasing of a dock image. +The DrawDragDockImage and EraseDragDockImage methods call DefaultDockImage to paint or erase the drag image of a control while the user drags it in a drag-and-dock operation. +DragDockObject contains the drag-and-dock information for the control. +Erase specifies whether to draw or erase the image. + + + + + + +Provides methods to read and write the IsControl property to a stream such as a form file. +DefineProperties is called automatically by the streaming system that loads and saves VCL components. It allows persistent objects to read and write properties that are not published. Published properties are loaded and stored automatically. +DefineProperties uses the methods of the filer passed as the Filer parameter to assign methods that can load and save the IsControl property. +Override DefineProperties to persist unpublished properties. Call the DefineBinaryProperty or DefineProperty method of the Filer parameter to assign methods that load or save property values. + +Note: When overriding this method, call the parent class's DefineProperties method first. + + + + + + + +Handles dragging of the control over an invalid docking target. +DockTrackNoTarget is called automatically when the control is dragged over an invalid docking target. It updates the docking rectangle of the TDragDockObject specified by Source to reflect the current mouse coordinates, as given by X and Y. + + + + + + + +Is an OnContextPopup event dispatcher. +OnContextPopup calls any event handler attached to the OnContextPopup event. When creating a component that descends from TControl override OnContextPopup to provide other responses in addition to the inherited event-handler call when the user invokes the control's context menu. +MousePos indicates the position where the user right-clicked the control. If the user invoked the context menu using the keyboard, MousePos is (-1,-1). +Handled returns a Boolean value indicating whether the control should continue with its default response to the user action. + + + + + + + + +Is an OnEndDock event dispatcher. +OnEndDock calls any event handler attached to the OnEndDock event. When creating a component that descends from TControl, override OnEndDock to provide other responses in addition to the inherited event-handler call when the user finishes a drag-and-dock operation. + + + + + + + +Docking event dispatcher. +DoDock is called automatically as part of the docking process. It updates the control's dimensions and causes it to repaint. +NewDockSite is the control's new dock site. This value can be nil (Delphi) or NULL (C++) or NullDockSite (a constant that indicates no dock site). +ARect specifies the control's new dimensions once it is docked to NewDockSite. + + + + + + +Is an OnStartDockevent dispatcher. +DoStartDock calls any event handler attached to the OnStartDock event. When creating a component that descends from TControl, override DoStartDock to provide other responses in addition to the inherited event-handler call when the user starts a drag-and-dock operation. + + + + + + + + + +Processes mouse wheel motion. +DoMouseWheel is called automatically when the user rotates the mouse wheel. +The Shift parameter indicates the current state of the SHIFT, ALT, and CTRL keys. +The WheelDelta parameter indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +The MousePos parameter indicates the current position of the mouse pointer. +DoMouseWheel returns true if an event handler was found and indicated that it handled the event. +As implemented in TControl, DoMouseWheel first attempts to call the OnMouseWheel event handler. If this routine exists and succesfully handles the event, DoMouseWheel returns true. Otherwise, DoMouseWheel repeatedly calls DoMouseWheelDown or DoMouseWheelUp, depending on the direction the user turned the mouse wheel. These routines, in turn, call the OnMouseWheelUp or OnMouseWheelDown event handler. +Before the first call to DoMouseWheelDown or DoMouseWheelUp, DoMouseWheel adds WheelDelta to the WheelAccumulator property. After each call, DoMouseWheel adjusts WheelAccumulator towards zero; each adjustment is by an internal constant that defines the minimum meaningful wheel motion. When the absolute value of of WheelAccumulator drops below the value of this constant, DoMouseWheel exits, returning the value returned by the final call to DoMouseWheelDown or DoMouseWheelUp. + + + + + + + + +Is an OnMouseWheelDown event dispatcher. +The DoMouseWheel method calls DoMouseWheelDown to generate an OnMouseWheelDown event. +The Shift parameter indicates the state of the SHIFT, ALT, and CTRL keys. +The MousePos parameter indicates the position of the mouse pointer. +DoMouseWheelDown returns true if an event handler indicates that it handled the message, and false otherwise. +Override DoMouseWheelDown to perform class-specific tasks in addition to calling the event handler when the mouse wheel is rotated downward. + + + + + + + + +Is an OnMouseWheelUp event dispatcher. +The DoMouseWheel method calls DoMouseWheelUp to generate an OnMouseWheelUp event. +The Shift parameter indicates the state of the SHIFT, ALT, and CTRL keys. +The MousePos parameter indicates the position of the mouse pointer. +DoMouseWheelUp returns true if an event handler indicates that it handled the message, and false otherwise. +Override DoMouseWheelUp to perform class-specific tasks in addition to calling the event handler when the mouse wheel is rotated upward. + + + +Provides the interface for a method that responds to the cancellation of a drag. +DragCanceled is called automatically when a drag operation is canceled. As implemented in TControl, DragCanceled does nothing. When creating a component that descends from TControl, override DragCanceled to provide code that executes when a drag-and-drop or drag-and-dock operation is canceled. + + + + + + + + + + +Is an OnDragOver event dispatcher. +Override DragOver to add additional code that executes before the OnDragOver event handler is called. +DragOver sets the Accept parameter to true to indicate that the user can drop the dragged object on the control. It sets Accept to false to indicate that the user cannot drop the dragged object on the control. +The Source parameter is the object being dragged. +The State parameter indicates how the dragged object is moving in relation to the control. X and Y indicate the current position of the mouse. + + + + + + + + +Is an OnEndDrag event dispatcher. +DoEndDrag calls any event handler attached to the OnEndDrag event. When creating a component that descends from TControl, override DoEndDrag to provide other responses in addition to the inherited event-handler call when the user drops an object or cancels a drag-and-drop operation. + + + + + + +Is an OnStartDrag event dispatcher. +DoStartDrag calls any event handler attached to the OnStartDrag event. When creating a component that descends from TControl, override DoStartDrag to provide other responses in addition to the inherited event-handler call when the user starts a drag-and-drop operation. + + + + + + + +Processes the unhandled gesturing events. +DoGesture is run automatically for all gesturing events that were not handled by the user. DoGesture is run only if OnGesture is not set or if it did not handle the gesture event. +Override DoGesture in descending classes to support default behavior for gesture events that were not handled by the user. In TControl, the DoGesture method simply returns and does no special processing. + + + + + + + +Returns the interactive gestures and their options. +DoGetGestureOptions is used internally to access the interactive gestures and their options associated with a TControl. + + + + + + +Draws the dock image for the control. +DrawDragDockImage is called automatically to draw the control (or, more typically, the drag rectangle) when the control is manipulated in drag-and-dock operations. +DrawDragDockImage calls DefaultDockImage to render the image. + + + + + + +Erases the dock image for the control. +DrawDragDockImage is called automatically to erase the control (or, more typically, the drag rectangle) when the control is manipulated in drag-and-dock operations. + + + + + + +Returns the value of the Action property. +GetAction is a protected method in the TControl class and is used to obtain the current value of the Action property. + + + + + + +Returns the appropriate action link class that is associated with the control class. +GetActionLinkClass returns the appropriate class type for the action link used with a control. This class is used internally to create an action link object for the control when it has an associated action. The action link links the action to the control client. Each Action link class is designed to link specific properties and event handlers of the action to its client, based on the types of properties the client supports. +As implemented in TControl, GetActionLinkClass returns the TControlActionLink class type, which associates the ShowHint, Caption, Enabled, and Visible properties with the OnClick event handler. Descendants of TControl override this method to specify a descendant of TControlActionLink that handles their configuration of properties and events. + + + + + + +Returns the screen coordinates of the upper-left corner of the control's client area. +Override GetClientOrigin to change how the ClientOrigin is calculated. +The GetClientOrigin method is the protected method for reading the ClientOrigin property. GetClientOrigin calculates the ClientOrigin by adding the control's Left and Top values to the ClientOrigin coordinates of its parent. + + + + + + +Returns a rectangle defining the client area of the control. +Override GetClientRect to change how the client area is calculated. +The GetClientRect method is the protected method for reading the ClientRect property. GetClientRect returns a rectangle with the rectangle's Top and Left fields set to zero, and its Bottom and Right fields set to the control's ClientHeight and ClientWidth, respectively. + + + + + + + +Returns a device context for the control. +Call GetDeviceContext to obtain a device context and window handle. Override GetDeviceContext to change how the device context is obtained. +The window handle used by the control is returned in the WindowHandle parameter. GetDeviceContext returns the device context of this, the parent control's window. + + + + + + + +Returns the edge on which another control should be docked when it is dragged over the control. +Use GetDockEdge to get the edge on which another control should be docked when it is dragged over the control. +MousePos is the position of the mouse. +GetDockEdge is called automatically during drag-and-dock operations involving the control. + + + + + + +Returns the value of the Enabled property. +GetEnabled is the read implementation of the Enabled property. +Override GetEnabled and SetEnabled to change the implementation of the Enabled property. For example, a descendant of TControl might change the way the Enabled property interacts with an associated action. + + + + + + +Returns the value of the Floating property. +GetFloating is the implementation of the read-only Floating property. GetFloating returns true if the HostDockSite property is either nil (Delphi) or NULL (C++), or of type FloatingDockSiteClass. +Override this method to change the way a control determines if it is floating. + + + + + + +Returns the class used for the control when it is floating. +GetFloatingDockSiteClass is the read implementation of the FloatingDockSiteClass property. Override this method to change the implementation of FloatingDockSiteClass. + + + + + + +Returns the handle to a palette for use by the control. +As implemented in TControl, GetPalette returns a null handle, indicating that the control does not have a palette. Override GetPalette to implement derived objects that use a palette. Create a palette handle for the control by a call to the Windows API function CreatePalette. GetPalette should return the palette handle for the control. +Specifying the palette for a control tells the application that the control's palette needs to be realized and designates the palette to use for realization. +GetPalette is called only if the run-time video mode requires color palette support, for example, in 256-color mode. + + + + + + +Returns the pop-up menu associated with the control. +Call GetPopupMenu to find the pop-up menu associated with the control. Override GetPopupMenu to change which pop-up menu is associated with the control or to specify different pop-up menus depending on the state of the control. +GetPopupMenu returns the value of the Popup property. + + + + + + +Returns the value of the DragMode property. +GetDragMode is a protected method in the TControl class and is used to obtain the current value of the DragMode property. + + + + + + + +Checks whether the associated touch manager stored any of the given options. +IsTouchPropertyStored is used internally by the VCL framework to check whether the associated touch manager component has stored the given options. Do not call IsTouchPropertyStored directly. IsTouchPropertyStored is used primarily to ensure that controls that do not require gesturing are not storing useless data in the DFMs or executables. + + + +Initializes the control after it is loaded from a stream. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. +Loaded overrides the inherited method in order to initialize the control from its associated Action. To change the properties the control copies from its action, override the ActionChange method. + + + + + + + + + + + +Triggers a TMouseActivateEvent event. +Use MouseActivate to trigger a TMouseActivateEvent event with the given parameters. +The following table explains the meaning of each parameter: + + + + + +Parameter + +Meaning + + + +Button + + + +The mouse button that is pressed. + + + + +Shift + + + +The shift state while the mouse button is pressed. + + + + +X | Y + + + +The current mouse coordinates. + + + + +HitTest + + + +The hit test value obtained from the WM_NCHITTEST message. + + + + + + + + + + + + + +OnMouseDown event dispatcher. +Override the protected MouseDown method to provide other responses in addition to calling the OnMouseDown event handler when the user presses the mouse button down while the cursor's hotspot is over the control. +The Button parameter determines which mouse button the user pressed. Shift indicates which shift keys (Shift, Ctrl, or Alt) were down when the user pressed the mouse button. X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +A control calls MouseDown in response to any of the Windows mouse-down messages (WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was pressed down: left, right, or middle. + + + + + + + + +Responds to mouse moving over control area. +Override the protected MouseMove method to provide other responses in addition to calling the OnMouseMove event handler when the user moves the mouse. +A control calls MouseMove in response to any of the Windows mouse-move messages (WM_MOUSEMOVE), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called, it is with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation. + + + + + + + + + +Is an OnMouseUp event dispatcher. +Override the protected MouseUp method to provide other responses in addition to calling the OnMouseUp event handler when the user releases a previously pressed mouse button while the cursor's hot spot is over the control. +A control calls MouseUp in response to any of the Windows mouse-up messages (WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was released: left, right, or middle. + + + + + + + +Responds to notifications indicating that components are being created or destroyed. +Notification allows TControl to update its internal state if an associated component is removed. The internal state is updated if: + +The associated pop-up menu is destroyed. +The control docking site is destroyed. +The custom hint associated with the control is destroyed. +The associated gesture manager is destroyed. +Override the Notification method to respond to notifications indicating that other components are about to be destroyed or have just been created. Use the Notification method to update controls that rely on other objects. Data-aware objects override the Notification method to update themselves when their data source is removed. Some objects respond to notifications indicating that other objects of a specific type are being created. For example, the session component sets the Session property of new data-aware controls to itself when the AutoSessionName property is True. +By default, components pass along the notification to their owned components, if any. + + + + + + +Positions the docking rectangle according to the current drag-and-dock state. +Use PositionDockRect to adjust the docking rectangle of the drag-and-dock object specified by DragDockObject. DragDockObject's DockRect property is updated to reflect the current drag-and-dock state. This updating process makes use of the UndockWidth, UndockHeight, LRDockWidth, or TBDockHeight property, as appropriate. + + + + + + + +Responds to changes in the system's palette by realizing the control's palette. +Override PaletteChanged to change how the control responds to Windows notifications that the system palette is changing. TControl responds to these notifications by trying to realize the control's palette, if any, into the current device context. If the change in the system palette causes the actual value of the control's palette to change, PaletteChanged invalidates the control so that it can repaint with the new palette. +Windows paints the active window with a foreground palette, while other windows are forced to use background palettes. Background palettes are approximate matches to the colors specified by the control's logical palette, given the limitations imposed by implementing the foreground palette. Windows only allows a single foreground palette. +PaletteChanged allows the control to obtain a new realization of its palette when the system palette changes. When Foreground is true, the form has been activated and the control is specifying the new foreground palette. When Foreground is false, another application or form has changed the foreground palette, and controls that are sensitive to the available palette should realize new background palettes to best match their logical palettes. +If the control does not have a logical palette to be realized into the current device context, GetPalette returns a handle of 0, and PaletteChanged returns false, indicating that no palette was realized. If GetPalette returns the handle to a logical palette, PaletteChanged realizes this palette into the current device context, and returns true. + +Note: PaletteChanged is called only when the run-time video mode requires palette support, such as for 256 color mode, but not 16 million color mode. + + + + + +Prepares the control for having its properties assigned values read from a stream. +ReadState is part of a sequence of calls used by the streaming system that loads and saves component state. It reads the values of all the control's published properties, stored data, and owned components from the reader object passed in Reader. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Remember to include a call to the inherited class's method when overriding ReadState. +As implemented in TControl, ReadState assigns the Reader parameter's Parent property to the control's own Parent property before calling the inherited ReadState method of TComponent. Finally, ReadState synchronizes the Font, Color, and ShowHint properties with the parent control, as indicated by the ParentFont, ParentColor, and ParentShowHint properties, respectively. + + + +Instructs the parent of a control to reposition the control, enforcing its Align property. +Controls call RequestAlign internally when changes are made to the size or position of the control, so that they remain properly aligned within the parent control. Do not call RequestAlign in application code. + + + +Respond to control resize. +Resize is called automatically immediately after the control's dimensions change. As implemented in TControl, Resize calls the control's OnResize event handler if it is assigned. + + + + + + + +Scales the values of the Constraints property to the given ratio. +Use ScaleConstraints to scale the values of the Constraints property to the given M/D ratio. + + + + + + + +Scales the values of the Margins property to the given ratio. +Use ScaleMargins to scale the values of the Margins property to the given M/D ratio. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Cancels the modal state of the control. +Call SendCancelMode to cancel the modal state of the control. Various controls implemented in the VCL support a model state where the user must respond to the control before interacting with any other object on the form. An example is the dropped-down state of a combo box when the drop-down list is showing. For these controls, specific user actions send a Windows message to the control to end the model state, such as a mouse click that closes up the drop-down list. +SendCancelMode allows an application to end the modal state of the control in the absence of a user action, or when implementing a new user interface response. + + + + + + + + +Sends a Windows message to the control's host dock site. +Use SendDockNotification to send a Windows message to the control's host dock site. +SendDockNotification is called automatically when the control's text or visibility changes. + + + + + + +Sets the value of the AutoSize property. +SetAutoSize is a protected method in the TControl class and is used to set the value of the AutoSize property. + + + + + + +Sets the drag mode for the control. +SetDragMode is the protected write implementation for the DragMode property. Override SetDragMode to execute additional code when the value of the DragMode property changes. + + + + + + +Sets the value of the Enabled property. +SetEnabled is the protected write implementation of the Enabled property. After changing the internal representation of the Enabled property, SetEnabled sends a Windows message back to the control so that it can respond to the change. When TControl receives this message, it invalidates the control so that its appearance reflects the change (for example, so that it appears grayed). Some descendants respond to this message in other ways (for example, windowed controls ensure that a disabled control does not have focus). +Override GetEnabled and SetEnabled to change the implementation of the Enabled property. For example, a descendant of TControl might change the way the Enabled property interacts with an associated action. When overriding SetEnabled, be sure to call the inherited method. + + + + + + +Sets the name of the control. +SetName is the protected write implementation of the Name property. TControl updates the Text or Caption property, if appropriate, after changing the value of Name. +Override SetName to execute additional code when the value of the Name property changes. + + + + + + +Sets the parent of the control. +SetParent is the protected implementation of the Parent property. Override SetParent to execute additional code when the value of the Parent property changes. +The AParent parameter specifies the new parent of the control. +If the control already has a parent, SetParent removes the control from that parent's list of controls by calling the parent's RemoveControl method. If AParent is not nil (Delphi) or NULL (C++), SetParent calls its InsertControl method to add the control to its list of controls. +The TControl destructor calls SetParent(nil (Delphi) or NULL (C++)) to remove the control from its parent's control list before destroying the component. + + + + + + +Specifies whether the control uses its parent's BiDiMode. +SetParentBiDiMode is the protected write implementation of the ParentBiDiMode property. + + + + + + +Sets the control's bidirectional mode. +SetBiDiMode is the write implementation of the control's BiDiMode property. Override this method to change the implementation of BiDiMode. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Repositions the control in its parent's control list, thereby changing position onscreen. +Call SetZOrder to change the z-order of the control. To make the control the topmost control, specify the TopMost value as true. To make the control the bottommost, set TopMost to false. +After changing the order, SetZOrder invalidates the control to ensure repainting to reflect the new order. +The stacking order of windowed and non-windowed controls cannot be mingled. For example, if you put a memo, a windowed control on a form, and then put a label, a non-windowed control on top of it, the label disappears behind the memo. Windowed controls always stack on top of non-windowed controls. In this example, calling the SetZOrder method of the label or the memo has no effect; the label always remains behind the memo. + + + + + + +Sets the value of the CustomHint property. +SetCustomHint is a protected method in the TControl class and is used to set the value of the CustomHint property. + + + +Attempts to update the values of the control's explicit bounds to those of its current bounds. +Use UpdateExplicitBounds to update the values of the control's explicit bounds to those of its current bounds. +The update process succeeds as long as the options csAligning in ControlState and csReading in ComponentState are disabled. + + + + + + +Changes the Top, Left, Width, and Height properties of the control, but does not update its screen image and bypasses all resize events. +UpdateBoundsRect is used internally by controls to stay synchronized with changes made by the underlying Windows screen object. UpdateBoundsRect updates the properties to match those passed in the rectangle as the R parameter. + + + +Provides the interface for a method that responds to changes in the control's visibility. +VisibleChanging is called before the value of a control's Visible property changes. As implemented in TControl, it does nothing. Override VisibleChanging to respond to changes in the control's visibility. For example, if a control should not change its visibility, override VisibleChanging to raise an exception when an attempt is made to alter the control's visibility. + + + + + + +Provides specific message responses for the control. +Override WndProc to change the initial Windows message handler for the control. The WindowProc property is initialized to WndProc. +WndProc implements the mouse behavior specified by the ControlStyle and DragMode properties, and updates the ControlState property. It passes any unhandled messages on to the Dispatch method. +When overriding WndProc to provide specialized responses to messages, be sure to call the inherited WndProc at the end to dispatch any unhandled messages. + + + +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + + + + + +Processes the given message and returns some Boolean information based on the message's content. +DesignWndProc returns true if the csDesignInteractive option in ControlStyle is enabled and if either the right mouse button is pressed or the right mouse button is released. The true value is returned also when ControlStyle is enabled and when either the mouse has moved or the right mouse button is double-clicked. + + + + + + +Returns the control's image list containing the image to be displayed while dragging. +Override GetDragImages to provide a custom image list for the control. As implemented in TControl, GetDragImages returns nil (Delphi) or NULL (C++). + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Contains the action link object associated with the control. +ActionLink handles the association between the control and the action specified by the Action property. The action link specifies which properties and events of the action object determine the values of the control's corresponding properties and events. +Most applications do not use the ActionLink property. Component writers can change this property in TControl descendants to be a custom descendant of TControl ActionLink that handles a desired configuration of properties and events. + + +Specifies whether the control sizes itself automatically to accommodate its contents. +Use AutoSize to specify whether the control sizes itself automatically. When AutoSize is True, the control resizes automatically when its contents change. +By default, AutoSize is False. + + +Specifies a text string that identifies the control to the user. +Use Caption to specify the text string that labels the control. +To underline a character in a Caption that labels a component, include an ampersand (&) before the character. This type of character is called an accelerator character. The user can then select the component by pressing ALT while typing the underlined character. To display an ampersand character in the caption, use two ampersands (&&). + +Notes: +Controls that display text use either the Caption property or the Text property to specify the text value. The property that is used depends on the type of control. In general, Caption is used for text that appears as a window title or label, while Text is used for text that appears as the content of a control. +For some controls, such as TButton, it is not possible to change the color of the Caption. If you want to change the color of a button caption, you should use an alternate button type such as TSpeedButton or TBitBtn instead of TButton. With either TSpeedButton or TBitBtn, you can change the color of the Caption property by using the Font property. +For TLinkLabel, an HTML tag is declared inside the Caption property either at run time or at design time. + + +Specifies whether the control uses the Windows icon font when writing text. +Set DesktopFont to true to specify that the control should use the Windows icon font for its Font property. The Windows icon font is the value of the IconFont property of the global Screen variable. +When DesktopFont is true, the control's Font property updates every time the Windows icon font changes. This font can be changed by setting the IconFont property of the global Screen variable, or by the actions of other programs. Setting the Font property from the IconFont property of the Screen object does not allow controls to dynamically respond in this manner when the Windows icon font changes. + + +Specifies whether the control is being dragged normally or for docking. +Use DragKind to get or set whether the control participates in drag-and-drop operations or drag-and-dock operations. + + +Specifies the image used to represent the mouse pointer when the control is being dragged. +Use the DragCursor property to change the cursor image presented when the control is being dragged. + +Note: To make a custom cursor available for the DragCursor property, see the Cursor property. + +Specifies how the control initiates drag-and-drop or drag-and-dock operations. +Use DragMode to control when the user can drag the control. Disable the drag-and-drop or drag-and-dock capability at run time by setting the DragMode property value to dmManual. Enable automatic dragging by setting DragMode to dmAutomatic. For more information about dmManual and dmAutomatic, see TDragMode. + + +Specifies whether a form stores its form-specific properties to a stream. +Use IsControl to use a form as a complex control, rather than as a desktop form. IsControl affects the way the form gets saved. When IsControl is true, form-specific properties do not get saved with the form. When IsControl is false, the form-specific properties get saved along with the other properties. +IsControl permits you to use the forms designer to create complex controls by creating those controls as forms, placing and naming their contained controls, and attaching code to events. After saving the form, edit the form as text, and in the text version set IsControl to true. The next time the form is loaded and saved, only those form properties appropriate to use as a control are stored, not the properties specific to TForm. Next, edit the form file as text, changing the type of the component from TForm to the desired control type, such as TPanel. + + +Specifies whether the control has "captured" mouse events. +Use MouseCapture to determine whether a control has captured the mouse. When a control captures the mouse, all subsequent mouse events go to that control until the user releases the mouse button. +A control captures the mouse when the user drags an item from it. In addition, if the control has the csCaptureMouse flag set in its ControlStyle property, it captures the mouse when the user presses the left mouse button over it, until the user releases the mouse button. + + +Specifies whether the control uses its parent's BiDiMode. +Use ParentBiDiMode to get or set whether the control uses its parent's BiDiMode. When ParentBiDiMode is true, the control's BiDiMode property is always equal to that of its parent. If ParentBiDiMode is false, the control uses its own BiDiMode property. +Set ParentBiDiMode to true for all controls in a form to ensure that the entire user interface adjusts to Middle Eastern locales in a uniform manner. +When the value of the control's BiDiMode property changes, ParentBiDiMode becomes false automatically. + + +Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + +Specifies where a control looks for its font information. +To have a control use the same font as its parent control, set ParentFont to true. If ParentFont is false, the control uses its own Font property. Many controls default ParentFont to true so that all the controls in a form or other container present a uniform appearance. When the value of a control's Font property changes, ParentFont becomes false automatically. +When ParentFont is true for a form, the form uses the default font. Currently, the default font is Tahoma 8 pt. + + +Specifies where a control looks to find out if its Help Hint should be shown. +Use ParentShowHint to ensure that all the controls on a form either uniformly show their Help Hints or uniformly do not show them. +If ParentShowHint is True, the control uses the ShowHint property value of its parent. If ParentShowHint is False, the control uses the value of its own ShowHint property. +To provide Help Hints only for selected controls on a form, set the ShowHint property for those controls that should have Help Hints to True, and ParentShowHint becomes False automatically. + +Note: Enable or disable all Help Hints for the entire application using the ShowHint property of the application object. + +Specifies the pop-up menu associated with the control. +Assign a value to PopupMenu to make a pop-up menu appear when the user selects the control and clicks the right mouse button. If the TPopupMenu's AutoPopup property is True, the pop-up menu appears automatically. If the menu's AutoPopup property is False, display the menu with a call to its Popup method from the control's OnContextPopup event handler. + + +Reflects which attributes of the control have been scaled. +ScalingFlags is an internal set of flags used primarily in scaling inherited forms and their controls. Applications should not use this property without a serious need. +These are the flags and their meanings: + + + + + +Flag + +Meaning + + + +sfLeft + + + +Left side of control not yet scaled + + + + +sfTop + + + +Top of control not yet scaled + + + + +sfWidth + + + +Width of control not yet scaled + + + + +sfHeight + + + +Height of control not yet scaled + + + + +sfFont + + + +Font of control not yet scaled + + + + +sfDesignSize + + + +Design-time dimensions of control not yet scaled + + + + + + +Contains a text string associated with the control. +Use the Text property to read the Text of the control or to specify a new string for the Text value. By default, Text is the control name. For edit controls and memos, the Text appears within the control. For combo boxes, the Text is the content of the edit control portion of the combo box. + +Note: Controls that display text use either the Caption property or the Text property to specify the text value. Which property is used depends on the type of control. In general, Caption is used for text that appears as a window title or label, while Text is used for text that appears as the content of a control. + +Accumulates mouse wheel rotations. +WheelAccumulator contains a value indicating the progress of event handlers in response to mouse wheel motion. See DoMouseWheel for more information. + + +Specifies the background color of the control. +Use Color to read or change the background color of the control. +If a control's Vcl.Controls.TControl.ParentColor property is True, then changing the Color property of the control's parent automatically changes the Color property of the control. When the value of the Color property is changed, the control's ParentColor property is automatically set to False. +The Color of a TLabel is always the color of the background unless you set TLabel.Transparent to False. + + +Specifies the attributes of text written on or in the control. +To change to a new font, specify a new TFont object. To modify a font, change the value of the Charset, Color, Height, Name , Pitch, Size, or Style of the TFont object. + +Note: Changing the font color of the Caption is not supported for some controls (such as TButton). In most cases, there is an alternate control you can use whose Font property will change the color of the caption or text (such as TBitBtn or TSpeedButton). + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the text string of the control. +Use WindowText to specify the text associated with the control. When setting WindowText, the control frees the memory associated with the previous value of WindowText before assigning a new value. Any memory associated with WindowText is freed when the control is destroyed. By default, WindowText is the same string as the Text property. Descendants of TControl can override the Text property to implement a different value. +For an edit box, the WindowText is the content of the control. For a combo box, the text string is the content of the edit box part of the combo box. For a button, the string is the button name. For all other controls, the string is the window title. + + +Occurs when an attempt is made to resize the control. +Use OnCanResize to adjust the way a control is resized. If necessary, change the new width and height of the control in the OnCanResize event handler. The OnCanResize event handler also allows applications to indicate that the entire resize should be aborted. +If there is no OnCanResize event handler, or if the OnCanResize event handler indicates that the resize attempt can proceed, the OnCanResize event is followed immediately by an OnConstrainedResize event. +OnCanResize is an event handler of type Vcl.Controls.TCanResizeEvent. + + +Occurs when the user clicks the control. +Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action's OnExecute method responds to click events unless it is superseded by an OnClick event handler. +Usually, OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when: + +The user selects an item in a grid, outline, list, or combo box by pressing an arrow key. +The user presses the SPACEBAR while a button or check box has focus. +The user presses ENTER when the active form has a default button (specified by the Default property). +The user presses ESC when the active form has a cancel button (specified by the Cancel property). +The user presses the accelerator key for a button or check box. For example, if the value of the Caption property of a check box is '&Bold', the B is underlined at run time and the OnClick event of the check box is triggered when the user presses Alt+B. However, focus does not move to the control in these instances. +The Checked property of a radio button is set to True. +The value of the Checked property of a check box is changed. +Note: When you change the value of the Checked property programmatically, the OnClick event of the check box control occurs. Do not modify the value of the Checked property in the event handler of the OnClick event, because that leads into a deadlock situation. +The Click method of a menu item is called. +For a form, an OnClick event occurs when the user clicks a disabled component or in a blank area of the form. +OnClick is an event handler of type TNotifyEvent. + + +Adjusts the resize constraints. +Use OnConstrainedResize to adjust a control's constraints when an attempt is made to resize it. Upon entry to the OnConstrainedResize event handler, the parameters of the event handler are set to the corresponding properties of the control's Constraints object. The event handler can adjust those values before they are applied to the new height and width that are being applied to the control. (The CanAutoSize method or an OnCanResize event handler may already have adjusted this new height and width). +On exit from the OnConstrainedResize event handler, the constraints are applied to the attempted new height and width. Once the constraints are applied, the control's height and width are changed. After the control's height and width change, an OnResize event occurs to allow any final adjustments or responses. + +Note: The OnConstrainedResize handler is called immediately after the OnCanResize handler. +OnConstrainedResize is an event handler of type Vcl.Controls.TConstrainedResizeEvent. + + +Occurs when the user right-clicks the control or otherwise invokes the pop-up menu (such as using the keyboard). +The OnContextPopup event handler is called when the user utilizes the mouse or keyboard to request a pop-up menu. The OnContextPopup event is generated by a WM_CONTEXTMENU message, which is itself generated by the user clicking the right mouse button or by pressing SHIFT+F10 or the Applications key. +This event is especially useful when the control does not have an associated pop-up menu (the PopupMenu property is not set) or if the AutoPopup property of the control's associated pop-up menu is False. However, the OnContextPopup can also be used to override the automatic context menu that appears when the control has an associated pop-up menu with an AutoPopup property of True. In this last case, if the event handler displays its own menu, it should set the Handled parameter to True to suppress the default context menu. +The handler's MousePos parameter indicates the position of the mouse, in client coordinates. If the event was not generated by a mouse click, MousePos is (-1,-1). + +Note: Parent controls receive an OnContextPopup event before their child controls. In addition, for many child controls, the default window procedure causes the parent control to receive an OnContextPopup event after the child control. As a result, when parent controls do not set Handled to True in an OnContextPopup event handler, the event handler may be called multiple times for each context menu invocation. +OnContextPopup is an event handler of type Vcl.Controls.TContextPopupEvent. + + +Occurs when the user double-clicks the left mouse button when the mouse pointer is over the control. +Use the OnDblClick event to respond to mouse double-clicks. +OnDblClick is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the user drops an object being dragged. +Use the OnDragDrop event handler to specify what happens when the user drops an object. The Source parameter of the OnDragDrop event is the object being dropped, and the Sender is the control on which the object is being dropped. The X and Y parameters are the coordinates of the mouse positioned over the control. +OnDragDrop is an event handler of type TDragDropEvent. + + +Occurs when the user drags an object over a control. +Use an OnDragOver event to signal that the control can accept a dragged object so the user can drop or dock it. +Within the OnDragOver event handler, change the Accept parameter to False to reject the dragged object. Leave Accept as True to allow the user to drop or dock the dragged object on the control. +To change the shape of the cursor, indicating that the control can accept the dragged object, change the value of the DragCursor property for the control before the OnDragOver event occurs. +The Source is the object being dragged, the Sender is the potential drop or dock site, and X and Y are screen coordinates in pixels. The State parameter specifies how the dragged object is moving over the control. + +Note: Within the OnDragOver event handler, the Accept parameter defaults to True. However, if an OnDragOver event handler is not supplied, the control rejects the dragged object, as if the Accept parameter were changed to False. +OnDragOver is an event handler of type TDragOverEvent. + + +Occurs when the dragging of an object ends, either by docking the object or by canceling the dragging. +Use OnEndDock to specify actions or special processing that happen when a drag-and-dock operation stops. + + +Occurs when the dragging of an object ends, either by dropping the object or by canceling the dragging. +Use the OnEndDrag event handler to specify any special processing that occurs when dragging stops. +OnEndDrag is an event handler of type Vcl.Controls.TEndDragEvent. + + +Occurs when the user presses a mouse button with the mouse pointer over a control and the parent form is not active. +Use the OnMouseActivate event handler to implement any special processing that should occur as a result of pressing a mouse button on a control when the parent top-level form is not active. +The event type is: + +TMouseActivateEvent = procedure (Sender: TObject; Button: TMouseButton; ShiftState: TShiftState; +X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object; + +When you click a control and the parent top-level form is not active, this event fires on the control that the mouse cursor is over. MouseActivate is a protected virtual function in TControl. MouseActivate can be overridden in custom control descendants to provide special built-in processing of the OnMouseActivate events. If you leave the default value of MouseActivate as maDefault, the parent control fires the OnMouseActivate event and repeats the process all the way up to the top-level form. If no control in the chain sets the value of MouseActivate, the behavior is the same as if a control set TMouseActivate to maActivate. At any point, a control can set the value of TMouseActivate and the parent processing stops. +Some controls set focus to themselves when they get a button down message so, in some cases, setting maNoActivate appears to have no effect. For instance, a TButton control sets focus to itself in the WM_LBUTTONDOWN message regardless of whether or not TMouseActivate is set to maNoActivate. In this case, setting maNoActivateAndEat will work because the top-level form is not activated and the WM_LBUTTONDOWN message is suppressed. +The HitTest parameter is the hit test value obtained from the WM_NCHITTEST message. See Windows.pas for valid values and their meanings. In most cases this value will be HTCLIENT, which means that the user clicked in the client area of a control. However, in the case of a top-level form, this can take other values such as HTCAPTION or HTBOTTOM. This allows the code to decide which value to set for MouseActivate, based on the HitTest code. For example, the following code in the OnMouseActivate event handler for a TForm forces the user to click into a non-client area to activate the form: + +if HitTest = HTCLIENT then +MouseActivate := maNoActivateAndEat; + +Even though this event is tied to how Windows processes WM_MOUSEACTIVATE, the actual handling of the message is done at the TControl level, which is the point in the VCL hierarchy where the control has no window handle. The OnMouseActivate event is then simulated because all the TControl descendants also have OnMouseDown, OnMouseMove, and OnMouseUp events. This information is applicable to both VCL Win32 and VCL.NET. + + +Occurs when the user presses a mouse button with the mouse pointer over a control. +Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button. +The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseDown is an event handler of type Vcl.Controls.TMouseEvent. + + +Occurs when the user moves the mouse into a control. +Use the OnMouseEnter event handler to implement any special processing that should occur as a result of moving the mouse into a control when the parent top-level form is not active. +OnMouseEnter is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the user moves the mouse outside of a control. +Use the OnMouseLeave event handler to implement any special processing that should occur as a result of moving the mouse outside of a control when the parent top-level form is not active. +OnMouseLeave is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the user moves the mouse pointer while the mouse pointer is over a control. +Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse. +Use the Shift parameter of the OnMouseMove event handler to determine the state of the shift keys and mouse buttons. Shift keys are the SHIFT, CTRL, and ALT keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender. +OnMouseMove is an event handler of type Vcl.Controls.TMouseMoveEvent. + + +Occurs when the user releases a mouse button that was pressed with the mouse pointer over a component. +Use an OnMouseUp event handler to implement special processing when the user releases a mouse button. +The OnMouseUp event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseUp is an event handler of type Vcl.Controls.TMouseEvent. + + +Occurs when the mouse wheel is rotated. +Write code in the OnMouseWheel event handler to respond to mouse wheel messages. If there is no OnMouseWheel event handler, or if the mouse wheel message is not handled in the OnMouseWheel event handler, then an OnMouseWheelUp or OnMouseWheelDown event occurs, depending on the direction the mouse wheel was rotated. +OnMouseWheel is an event handler of type Vcl.Controls.TMouseWheelEvent. + + +Occurs when the mouse wheel is rotated downward. +Write code in the OnMouseWheelDown event handler to perform actions when the mouse wheel is rotated downward. OnMouseWheelDown occurs only if the message is not already handled in an OnMouseWheel event handler. +OnMouseWheelDown is an event handler of type Vcl.Controls.TMouseWheelUpDownEvent. + + +Occurs when the mouse wheel is rotated upward. +Write code in the OnMouseWheelUp event handler to perform actions when the mouse wheel is rotated upward. OnMouseWheelUp occurs only if the message is not already handled in an OnMouseWheel event handler. +OnMouseWheelUp is an event handler of type Vcl.Controls.TMouseWheelUpDownEvent. + + +Occurs immediately after the control is resized. +Use OnResize to make any final adjustments after a control is resized. +To modify the way a control responds when an attempt is made to resize it, use OnCanResize or OnConstrainedResize. + +Note: Some controls call this event handler when the control is first created. +OnResize is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the user begins to drag a control with a DragKind of dkDock. +Use the OnStartDock event handler to implement special processing when the user starts a drag-and-dock operation by dragging the control. +The OnStartDock event handler can create a TDragDockObjectEx object for the DragObject parameter to specify the appearance of the dragging rectangle and how the dragged control interacts with potential docking sites. If you return TDragDockObjectEx as the drag object, there is no need to call the Free method for the DragObject when dragging is over. If you use TDragDockObject, your application is responsible for freeing the drag object. +If the OnStartDock event handler sets the DragObject parameter to nil (Delphi) or NULL (C++), a TDragDockObject object is automatically created. + +Note: This information applies to Win32 applications only. +OnStartDock is an event handler of type TStartDockEvent. + + +Occurs when the user begins to drag the control or an object it contains by left-clicking the control and holding the mouse button down. +Use the OnStartDrag event handler to implement special processing when the user starts to drag the control or an object it contains. OnStartDrag only occurs if DragKind is dkDrag. +Sender is the control that is about to be dragged, or that contains the object about to be dragged. +The OnStartDrag event handler can create a TDragControlObjectEx instance for the DragObject parameter to specify the drag cursor, or, optionally, a drag image list. If you create a TDragControlObjectEx instance, there is no need to call the Free method for the DragObject when dragging is over. If you create, instead, a TDragControlObject instance, your application is responsible for freeing the drag object instance. +If the OnStartDrag event handler sets the DragObject parameter to nil (Delphi) or NULL (C++), a TDragControlObject object is automatically created and dragging begins on the control itself. + +Note: On some controls, such as TRichEdit, the underlying Windows control handles internal drag operations. For these controls, there are no OnStartDrag or OnEndDrag events for drag operations within the control. +OnStartDrag is an event handler of type TStartDragEvent. + + + + + + +Creates an instance of TControl. +Calling Create constructs and initializes an instance of TControl. However, you should never attempt to instantiate a TControl. This class is intended solely as a base class from which other control classes descend and you should only call Create to instantiate one of these descendants. +Create calls the parent constructor and initializes the control. +When overriding Create, always call the inherited Create method first, then proceed with the control's initialization. Remember to specify the override directive when overriding the Create method. + +Note: If a control's constructor allocates resources or memory, also override the destructor to free those resources. + + + + +Destroys an instance of TControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it: + +Frees the TFont object in its Font property. +Calls its inherited destructor. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + $FFFFFFFF + + + + +Starts the dragging of a control. +Call BeginDrag to start a drag operation. BeginDrag is called in application code only when the value of the control's DragMode is dmManual. If DragMode is dmAutomatic, BeginDrag is called automatically. +If the Immediate parameter is true, the mouse pointer changes to the value of the DragCursor property and dragging begins immediately. If Immediate is false, the mouse pointer does not change to the value of the DragCursor property and dragging does not begin until the user moves the mouse pointer the number of pixels specified by the Threshold parameter. If the caller passes a Threshold value less than 0 (such as the default value for this parameter), BeginDrag uses the DragThreshold property of the global Mouse variable. +Setting Immediate to false allows the control to accept mouse clicks without beginning a drag-and-drop or drag-and-dock operation. + + + +Puts the control in front of all other controls in its parent control. +Call BringToFront to ensure that a form is visible or to reorder overlapping controls within a form. +Note that controls that wrap Windows screen objects (control classes descended from TWinControl) always "stack" above lightweight controls (control classes descended from TGraphicControl). BringToFront can force a lightweight control, such as a Shape, to stack above other lightweight controls, but wrapped controls, such as an Edit, will still stack above the Shape. +Without BringToFront, controls are stacked in the order they were placed on the form. + + + + + + + +Translates a given point from client area coordinates to global screen coordinates. +Use ClientToScreen to convert a point whose coordinates are expressed locally to the control to the corresponding point in screen coordinates. In client area coordinates, (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates, (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + +P�:= TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + + + + + +Translates a given point from client area coordinates to global screen coordinates. +Use ClientToScreen to convert a point whose coordinates are expressed locally to the control to the corresponding point in screen coordinates. In client area coordinates, (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates, (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + +P�:= TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + + + + + nil + + + + + +Translates client coordinates to parent coordinates. +ClientToParent translates Point from the current control's coordinate system to AParent's coordinate system. AParent must be a control that can be found by iterating up the chain of Parent properties. If AParent is nil (Delphi) or NULL (C++), the control's immediate parent is used. +An EInvalidOperation exception is thrown if AParent is not an ancestor control or the Parent property is nil (Delphi) or NULL (C++). + + + + + + + +Used internally to dock the control. +Do not call Dock in applications. It is called automatically to implement many of the details of docking the control to a dock site. +To dock the control programmatically, use ManualDock instead. +The NewDockSite parameter specifies the docking site to which the control is being docked. The ARect parameter indicates the new dimensions of the control when it is docked to NewDockSite. + + + + + + +Indicates whether a control is being dragged. +Use Dragging to determine the drag state of the control. If Dragging returns true, the control is being dragged. If Dragging is false, the control is not being dragged. + + + + + + + + +Is an OnDragDrop event dispatcher. +When creating a component that descends from TControl, override DragDrop to add additional code that executes before the OnDragDrop event handler is called. +The Source parameter is the object that was dropped onto the control. The X and Y parameters are the mouse coordinates where the object was dropped. + + + + + + + +Returns the text flags that reflect the current setting of the BiDiMode property. +Call DrawTextBiDiModeFlags to obtain a value for the TextFlags property of a canvas when drawing the control's text or caption. The return value can also be used with the Windows API DrawText function. +Flags are the current text flags, unaltered by any bidirectional mode considerations. +DrawTextBiDiModeFlags adds or removes the DT_RIGHT or DT_RTLREADING flags based on the values returned from the UseRightToLeftAlignment and UseRightToLeftReading methods. + + + + + + +Returns the text flag to add that indicates whether the control's text should read from right to left. +Call DrawTextBiDiModeFlagsReadingOnly to determine whether the DT_RTLREADING flag should be added when calling the Windows API DrawText or when assigning the TextFlags property of a canvas. +DrawTextBiDiModeFlagsReadingOnly returns the DT_RTLREADING flag or 0, depending on the value returned from the UseRightToLeftReading method. +To obtain the text flags that indicate the bidirectional alignment as well as text direction for the control, use DrawTextBiDiModeFlags instead. + + +Controls whether the control responds to mouse, keyboard, and timer events. +Use Enabled to change the availability of the control to the user. To disable a control, set Enabled to False. Some disabled controls appear dimmed (for example: buttons, check boxes, labels), while others (container controls) simply lose their functionality without changing their appearance. If Enabled is set to False, the control ignores mouse, keyboard, and timer events. +To re-enable a control, set Enabled to True. + +Note: This property applies to all TControl descendants. + + + + + +Stops a control from being dragged any further. +Use EndDrag to stop a dragging operation that began with a call to the BeginDrag method. +If the Drop parameter is true, the control being dragged is dropped or docked. If the Drop parameter is false, the control is not dropped or docked and dragging is canceled. + + + + + + +Indicates how text is aligned within the control. +Use GetControlsAlignment to determine the alignment of the control. For controls that do not have an Alignment property, GetControlsAlignment returns taLeftJustify. + +Note: GetControlsAlignment returns the alignment of text before it is altered by the BiDiMode property. To check whether the alignment should be reversed to reflect the BiDiMode property, call UseRightToLeftAlignment. + + + + + +Returns the parent of the control. +GetParentComponent is called by the streaming system that loads and saves VCL components. The component returned by GetParentComponent is responsible for loading and saving the control when it is streamed in or out. As implemented in TControl, GetParentComponent returns the value of the Parent property. + + + + + + +Indicates whether the control has a parent. +HasParent indicates whether the Parent property has been assigned a value. This method is used by the streaming system to determine whether the control has a parent that is responsible for writing it to a stream. As implemented in TControl, HasParent returns true if the Parent property is not nil (Delphi) or NULL (C++), and false otherwise. + + + +Makes the control invisible. +Call Hide to hide a control. Hide sets the Visible property of the control to false. +Although a control that is hidden is not visible, its properties and methods are still available. + + + +Calls the action link's Update method if the control is associated with an action link. +When the application is idle, the library makes a series of calls to allow controls to update their associated actions so that they reflect the current properties of the controls. The first of these is to the InitiateAction method of the each form, followed by the InitiateAction methods of its visible menus and controls. +InitiateAction calls the action's update method indirectly (through its action link), which leads to a number of events, any of which may update the action and stop the update process: + +First, the action list that contains the action receives an OnUpdate event. +If the action list does not handle the OnUpdate event, then the Application object receives an OnActionUpdate event. +If the OnActionUpdate event handler does not update the action, the action itself receives an OnUpdate event. +If that does not update the action, the active control's UpdateAction method is called. +Finally, if the action is still not updated, the active form's UpdateAction method is called. + + +Completely repaints the control. +Use Invalidate when the entire control needs to be repainted. When more than one region within the control needs repainting, Invalidate will cause the entire window to be repainted in a single pass, avoiding flicker caused by redundant repaints. There is no performance penalty for calling Invalidate multiple times before the control is actually repainted. + + + + + + +Dispatches messages received from a mouse wheel. +The WndProc method calls MouseWheelHandler when it receives a mouse wheel message. MouseWheelHandler checks whether the windowed control is embedded in a form, and if so, calls the form's MouseWheelHandler method. This allows the form to respond to mouse wheel messages before they are handled by individual controls. If the windowed control is not in a form, MouseWheelHandler passes the mouse wheel message to the Perform method, which generates an OnMouseWheel event, followed (if necessary) by an OnMouseWheelUp or OnMouseWheelDown event. + + + + + + +Indicates whether the control should be reversed right to left. +Use IsRightToLeft to determine whether the control should be reversed in any way because it is running on a system with a Middle Eastern locale. IsRightToLeft is intended for component writers to ease the process of implementing the BiDiMode property. +IsRightToLeft returns true if the application is running on a Middle East-enabled version of Windows and the BiDiMode property indicates that the control should make any adjustments. + + + + + + + nil + + + + + alNone + + + + + +Docks the control. +Use ManualDock to dock the control programmatically. ManualDock undocks the control from its current dock site, then docks the control to its new dock site. +NewDockSite is the control's new dock site. +DropControl is the control in the new dock site, if any, on which to drop the control. For example, when docking to a page control, DropControl would be a tab sheet. +ControlSide specifies on which side of DropControl or NewDockSite (if DropControl is nil (Delphi) or NULL (C++)) the control should be docked. This value can be obtained by calling the dock site's GetDockEdge method. + + + + + + + +Undocks the control. +Use ManualFloat to undock the control programmatically. +ScreenPos is the rectangle in which the control is displayed when it starts floating. + + + + + + + + + +Responds as if the control received a specified Windows message. +Call Perform to bypass the Windows message queue and send a message directly to the control's window procedure. +Perform fills a message record (of type TMessage) with the message ID passed in the Msg parameter, the message parameters passed in WParam and LParam, and a result field of zero. Perform then passes the message record to the WindowProc method for processing. + + + +Repaints the control on the screen. +Call the Refresh method to repaint the control immediately. Refresh calls the Repaint method. Use the Refresh and Repaint methods interchangeably. + + + +Forces the control to repaint its image on the screen. +Call Repaint to force the control to repaint its image immediately. If the ControlStyle property includes csOpaque, the control paints itself directly. Otherwise, the Repaint method calls the Invalidate method and then the Update method so that any visible portions of controls beneath the control will be repainted as well. + + + + + + + + + + +Docks the control in the place where another control is already docked. +Call ReplaceDockedControl to replace a control that is already docked while moving that control to another dock site. +Control is the control whose place this control is taking. +NewDockSite is the new dock site for the control that is replaced. +DropControl is a control in the new dock site on which to drop the control that is replaced. For example, if NewDockSite were a page control, DropControl would be a tab sheet. +ControlSide specifies on which side of DropControl or NewDockSite (if DropControl is nil (Delphi) or NULL (C++)) the replaced control should be docked. This value can be obtained by calling the dock site's GetDockEdge method. +ReplaceDockedControl does the same thing as calling the ManualDock method of the control specified by the Control parameter (using the values of NewDockSite, DropControl, and ControlSide) in addition to calling ManualDock for the control whose method this is, docking it in the current position of the Control parameter. However, calling ReplaceDockedControl is more efficient, and prevents unnecessary flicker. + + + + + + + +Converts the screen coordinates of a specified point on the screen to client coordinates. +Use ScreenToClient to convert a point in screen coordinates to local, or client area, coordinates. In client area coordinates (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + + + +P := TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + + + + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + + + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + + + + + +Converts the screen coordinates of a specified point on the screen to client coordinates. +Use ScreenToClient to convert a point in screen coordinates to local, or client area, coordinates. In client area coordinates (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + + + +P := TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + + + + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + + + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + + + + + nil + + + + + +Translate parent coordinates to client coordinates. +ParentToClient translates Point from the AParent's coordinate system to the current control's coordinate system. AParent must be a control that can be found by iterating up the chain of Parent properties. If AParent is nil (Delphi) or NULL (C++), the control's immediate parent is used. +An EInvalidOperation exception is thrown if AParent is not an ancestor control or the Parent property is nil (Delphi) or NULL (C++). + + + +Puts a windowed control behind all other windowed controls, or puts a non-windowed control behind all other non-windowed controls. +Use SendToBack to change the order of overlapping controls or forms. +The order in which controls stack on top of each other (also called the Z order) depends on the order the controls are placed on the form. For example, if you put a label and an image on a form so that one is on top of the other, the one that was placed first on the form becomes the one on the bottom. Because both the label and the image are non-windowed controls, they "stack" as you would expect them to. Call the SendToBack method for the top object to move it below the other object. +The stacking order of two windowed controls is the same as the stacking of two non-windowed controls. For example, if you put a memo on a form, then put a check box on top of it, the check box remains on top. Calling SendToBack for the check box makes the memo appear on top. +The stacking order of windowed and non-windowed controls cannot be mingled. For example, if you put a memo, a windowed control on a form, and then put a label, a non-windowed control on top of it, the label disappears behind the memo. Windowed controls always stack on top of non-windowed controls. In this example, calling the SendToBack method of the memo does nothing, the label remains behind the memo. +If the control has the input focus when the SendToBack method executes, it loses the input focus. + + + + + + + + + +Sets the Left, Top, Width, and Height properties all at once. +Use SetBounds to change all of the component's boundary properties at one time. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately, but SetBounds changes all four properties at once ensuring that the control will not repaint between changes. +Specify the values for the Left, Top, Width, and Height properties as the value of the ALeft, ATop, AWidth, and AHeight parameters, respectively. +Calling SetBounds does not necessarily result in the Left, Top, Width, and Height properties changing to the specified values. Before the properties are changed, the AutoSize or Constraints property may limit the changes, and an OnCanResize (or OnConstrainedResize) event handler may change the new values. After the control's Left, Top, Width, and Height properties are changed, SetBounds generates an OnResize event. + +Note: Component writers can change the Left, Top, Width, and Height properties while bypassing all resize events and constraint or autosize logic by using the UpdateBoundsRect method instead. + + + + + +Makes a control visible at design time. +SetDesignVisible is used internally by Delphi during form design. + + + + + + +Sets the parent for the control. +Do not call the SetParentComponent method. It is used by the streaming system that loads and saves VCL components. SetParentComponent makes the component specified by the Value parameter the parent of the control. +SetParentComponent calls the SetParent method only if the component specified as the parent is a windowed control. + + + +Makes a control visible. +Use the Show method to make visible a control that was previously hidden. +The Show method sets the control's Visible property to true and ensures that the parent control is also visible. + + + +Processes any pending paint messages immediately. +Call Update to force the control to be repainted before any more, possibly time-consuming, processing takes place. Use Update to provide immediate feedback to the user that cannot wait for the Windows paint message to arrive. +Update does not invalidate the control, but simply forces a repaint of any regions that have already been invalidated. Call Repaint instead to invalidate the control as well. + + + + + + +Specifies whether the control's alignment should be reversed right-to-left. +Controls call UseRightToLeftAlignment when implementing the BiDiMode property. UseRightToLeftAlignment indicates whether the control's alignment should be reversed right-to-left. This information can be used when painting the control or when responding to mouse events. +UseRightToLeftAlignment returns True if the application is running on a system with a Middle Eastern locale and the BiDiMode property is bdRightToLeft. Otherwise, it returns False. Descendants override UseRightToLeftAlignment if alignment in Middle Eastern locales depends on other factors. + + + + + + +Specifies whether the control is using a right-to-left reading order. +Controls call UseRightToLeftReading when implementing the BiDiMode property. UseRightToLeftReading indicates whether the control's text should read from right to left. This information can be used to determine which style flags to set for the control when it is created and which flags to set for drawing text. +UseRightToLeftReading returns true if the application is running on a system with a Middle Eastern locale and the BiDiMode property is not bdLeftToRight. UseRightToLeftReading returns false otherwise. + + + + + + +Specifies whether the vertical scroll bar appears on the left side of the control. +Controls call UseRightToLeftScrollBar when implementing the BiDiMode property. UseRightToLeftScrollBar returns true when the vertical scroll bar appears on the left side of the control, and false when it appears on the right side. +UseRightToLeftScrollBar returns true if the application is running on a system with a Middle Eastern locale and the BiDiMode property is bdRightToLeft or bdRightToLeftNoAlign. + + + + + + +Provides message handling for all messages that do not have specific handlers. +Override DefaultHandler to extend the default handling of messages. DefaultHandler is the final opportunity for component writers to handle messages to controls. The method referenced by WindowProc provides the first opportunity. Individual message methods such as Click provide additional opportunities. +DefaultHandler handles the messages Windows sends to manage the control's text: WM_GETTEXT, WM_SETTEXT, and WM_GETTEXTLENGTH. + + + + + + + + +Retrieves the control's text, copies it into a buffer, and returns the number of characters copied. +Call GetTextBuf to retrieve the text of a control into a fixed size buffer. The text copied is the value of the Text property. GetTextBuf returns the number of characters that were actually copied, which is either the length of the Text property, or BufSize - 1, whichever is smaller. +To find out how many characters the buffer needs to hold the entire text, call the GetTextLen method before allocating a buffer for GetTextBuf. + +Note: GetTextBuf is available for compatibility with 16-bit code. Where backward compatibility is not an issue, use the Text property. +Note: To obtain the control's text as an AnsiString, use the Text property instead. + + + + + +Returns the length of the control's text. +Call GetTextLen to find the length of the control's text. This is the size needed for a text buffer to be used by the GetTextBuf method. + + + + + + + + + +Responds as if the control received a specified Windows message. +Call Perform to bypass the Windows message queue and send a message directly to the control's window procedure. +Perform fills a message record (of type TMessage) with the message ID passed in the Msg parameter, the message parameters passed in WParam and LParam, and a result field of zero. Perform then passes the message record to the WindowProc method for processing. + + + + + + + + + +Responds as if the control received a specified Windows message. +Call Perform to bypass the Windows message queue and send a message directly to the control's window procedure. +Perform fills a message record (of type TMessage) with the message ID passed in the Msg parameter, the message parameters passed in WParam and LParam, and a result field of zero. Perform then passes the message record to the WindowProc method for processing. + + + + + + +Sets the text of the control. +Call the SetTextBuf method to set the text of the control to the text in the specified buffer. +The text is set to the text in the buffer pointed to by the Buffer parameter. Buffer must point to a null-terminated string. The SetTextBuf method sends the WM_SETTEXT and CM_TEXTCHANGED messages. Doing this in the tight execution of a function can result in the change not being seen until messages from the Windows message queue are processed after the function finishes executing. To interrupt a function's execution and process messages, use the ProcessMessages method of the Application object. + +Note: The SetTextBuf method is provided for backwards compatibility only. To set the text of a control now, assign a string value to the Text property. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + + + + + + + +The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + + + + + + + +The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + + + + + + + +The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + + + + + + + +The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the action associated with the control. +Action is the action object that is associated with the control. Actions allow an application to centralize the response to user commands. When a control is associated with an action, the action determines the appropriate properties and events of the control (such as whether the control is enabled or how it responds to an OnClick event). +To create actions at design time, place an action list component on a form or data module. Double-click the action list to bring up the action list editor. Add actions in the editor using its context menu. Once the actions have been added using the Action List editor, they appear in the drop-down list for the Action property in the Object Inspector. + + +Determines how the control aligns within its container (parent control). +Use Align to align a control to the top, bottom, left, or right of a form or panel and have it remain there even if the size of the form, panel, or component that contains the control changes. When the parent is resized, an aligned control also resizes so that it continues to span the top, bottom, left, or right edge of the parent. +For example, to use a panel component with various controls on it as a tool palette, change the panel's Align value to alLeft. The value of alLeft for the Align property of the panel guarantees that the tool palette remains on the left side of the form and always equals the client height of the form. +The default value of Align is alNone, which means a control remains where it is positioned on a form or panel. + +Tip: If Align is set to alClient, the control fills the entire client area so that it is impossible to select the parent form by clicking it. In this case, select the parent by selecting the control on the form and pressing ESC, or by using the Object Inspector. +Any number of child components within a single parent can have the same Align value, in which case they stack up along the edge of the parent. The child controls stack up in z-order. To adjust the order in which the controls stack up, drag the controls into their desired positions. + +Note: To cause a control to maintain a specified relationship with an edge of its parent, but not necessarily lie along one edge of the parent, use the Anchors property instead. + +Specifies how the control is anchored to its parent. +Use Anchors to ensure that a control maintains its current position relative to an edge of its parent, even if the parent is resized. When its parent is resized, the control holds its position relative to the edges to which it is anchored. +If a control is anchored to opposite edges of its parent, the control stretches when its parent is resized. For example, if a control has its Anchors property set to [akLeft, akRight], the control stretches when the width of its parent changes. +Anchors is enforced only when the parent is resized. Thus, for example, if a control is anchored to opposite edges of a form at design time and the form is created in a maximized state, the control is not stretched because the form is not resized after the control is created. + +Note: If a control should maintain contact with three edges of its parent (hugging one side of the parent and stretching the length of that side), use the Align property instead. Unlike Anchors, Align allows controls to adjust to changes in the size of other aligned sibling controls as well as changes to the parent's size. + +Specifies the bidirectional mode for the control. +Use BiDiMode to enable the control to adjust its appearance and behavior automatically when the application runs in a locale that reads from right to left instead of left to right. The bidirectional mode controls the reading order for the text, the placement of the vertical scroll bar, and whether the alignment is changed. +Alignment does not change for controls that are known to contain number, date, time, or currency values. For example, with data-aware controls, the alignment does not change for the following field types: ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftAutoInc. + + +Specifies the bounding rectangle of the control, expressed in the coordinate system of the parent control. +Use BoundsRect as a quick way to obtain the pixel locations of all corners of the control all at once. +For example, the statement + + + +R := Control.BoundsRect; + + + + +R = Control->BoundsRect; + + + +corresponds to + + + +R.Left := Control.Left; +R.Top := Control.Top; +R.Right := Control.Left + Control.Width; +R.Bottom := Control.Top + Control.Height; + + + + +R.Left = Control->Left; +R.Top = Control->Top; +R.Right = Control->Left + Control->Width; +R.Bottom = Control->Top + Control->Height; + + + +The origin of the pixel coordinate system is in the upper-left corner of the parent window. + +Note: A point is considered within the control's bounds rectangle if it lies on the left or top side but not if it lies on the right or bottom side. That is, to be inside the bounds rectangle, the x-coordinate must be greater than or equal to BoundsRect.Left and less than BoundsRect.Right, and the y-coordinate must be greater than or equal to BoundsRect.Top and less than BoundsRect.Bottom. + +Specifies the height of the control's client area in pixels. +Use ClientHeight to read or change the height of the control's client area. +For TControl, ClientHeight is the same as Height. Derived classes may implement a ClientHeight property that differs from Height. For example, the ClientHeight of a form is the value of the Height property minus the height of the title bar, resize border, and scroll bars. + + +Specifies the screen coordinates (in pixels) of the upper-left corner of a control's client area. +Read ClientOrigin to locate the upper-left corner of the control's client area. ClientOrigin returns X and Y coordinates as a TPoint type, where X specifies the horizontal coordinate of the point and Y specifies the vertical coordinate. +The screen coordinates of a control that is descended from TControl and not TWinControl are the screen coordinates of the control's parent added to its Left and Top properties. If the control doesn't have a parent, an EInvalidOperation exception is raised when ClientOrigin is read. + + +Specifies the size of a control's client area in pixels. +Read ClientRect to find out the size of the client area of a control. ClientRect returns a rectangle with its Top and Left fields set to zero, and its Bottom and Right fields set to the control's Height and Width, respectively. ClientRect is equivalent to Rect(0, 0, ClientWidth, ClientHeight). +A point is considered within the control's client rectangle if it lies on the left or top side but not if it lies on the right or bottom side. That is, to be inside the client rectangle, the X-coordinate must be greater than or equal to ClientRect.Left and less than ClientRect.Right, and the Y-coordinate must be greater than or equal to ClientRect.Top and less than ClientRect.Bottom. + +Note: ClientRect is the size of the physical client area of the control, not its logical client area. If the control supports scrolling, the ClientRect is not the entire scrolling range, but only the region that is available at any given time. + +Specifies the horizontal size of the control's client area in pixels. +Use ClientWidth to read or change the width of the control's client area. ClientWidth is equivalent to ClientRect.Right. +For TControl, ClientWidth is the same as Width. Derived classes may implement a ClientWidth property that differs from Width. For example, the ClientWidth of a form is the value of the Width property minus the width of the resize border and scroll bars. + + +Specifies the size constraints for the control. +Use Constraints to specify the minimum and maximum width and height of the control. When Constraints contains maximum or minimum values, the control cannot be resized to violate those constraints. + +Note: Constraints apply to the height of the form. However, the height of the form depends on how large Windows makes the title bar. For example, Windows XP uses much larger title bars than other windowing systems. To work around this, note the ClientHeight when you design your form and set the constraints in the FormCreate event. In the following example, ClientHeight is represented by x: Constraints.MinHeight�:= x + Height - ClientHeight. +Warning: Do not set up constraints that conflict with the value of the Align or Anchors property. When these properties conflict, the response of the control to resize attempts is not well-defined. + +Specifies the current state of a control at run time. +Read ControlState to find out various conditions that affect the control such as whether it has been clicked or needs alignment. ControlState reflects transient conditions of an instance of the control, as opposed to attributes of the control class as a whole. ControlState consists of a set of flags drawn from the following values: + + + + + +Flag + +Meaning + + + +csLButtonDown + + + +The left mouse button was clicked and not yet released. This is set for all mouse-down events. + + + + +csClicked + + + +The same as csLButtonDown, but only set if ControlStyle contains csClickEvents, meaning that mouse-down events are interpreted as clicks. + + + + +csPalette + + + +The system palette has changed and the control or one of its descendants has not finished adjusting by realizing its palette. + + + + +csReadingState + + + +The control is reading its state from a stream. + + + + +csAlignmentNeeded + + + +The control needs to realign itself when alignment is re-enabled. + + + + +csFocusing + + + +The application is processing messages intended to give the control focus. This does not guarantee the control will receive focus, but prevents recursive calls. + + + + +csCreating + + + +The control and/or its owner and subcontrols are being created. This flag clears when all have finished creating. + + + + +csPaintCopy + + + +The control is being replicated, meaning a copy of the control is being painted. The ControlStyle flag csReplicatable must be set for this state to occur. + + + + +csCustomPaint + + + +The control is processing custom paint messages. + + + + +csDestroyingHandle + + + +The control's window is being destroyed. + + + + +csDocking + + + +The control is being docked. + + + + +The flags in ControlState are specific to controls, and augment the state flags in the ComponentState property. +ControlState is primarily used by component writers in the implementation of components derived from TControl. + + +Determines style characteristics of the control. +Use ControlStyle to determine various attributes of the control, such as whether the control can capture the mouse or has a fixed size. The ControlStyle property contains a set of style flags indicating these attributes. The following table lists the flags and their meanings: + + + + + +Flag + +Meaning + + + +csAcceptsControls + + + +The control becomes the parent of any controls dropped on it at design time. + + + + +csCaptureMouse + + + +The control captures mouse events when it is clicked. + + + + +csDesignInteractive + + + +The control maps right mouse button clicks at design time into left mouse button clicks to manipulate the control. + + + + +csClickEvents + + + +The control can receive and respond to mouse clicks. Some controls may not inherit this attribute, for example, TButton. + + + + +csFramed + + + +The control has a 3D frame. + + + + +csSetCaption + + + +The control's Caption should match the Name if it has not been explicitly set to something else. + + + + +csOpaque + + + +The control completely fills its client rectangle. + + + + +csDoubleClicks + + + +The control can receive and respond to double-click messages. Otherwise, map double-clicks into clicks. + + + + +csFixedWidth + + + +The width of the control does not vary or scale. + + + + +csFixedHeight + + + +The height of the control does not vary or scale. + + + + +csNoDesignVisible + + + +The control is not visible at design time. + + + + +csReplicatable + + + +The control can be copied using the PaintTo method to draw its image to an arbitrary canvas. + + + + +csNoStdEvents + + + +Standard events such as mouse, key, and click events are ignored. This flag allows an application to run faster when there is no need to respond to these events. + + + + +csDisplayDragImage + + + +If a control that has an associated drag image list is dragged across a control with this setting, then the image list is used to enhance the drag cursor while the cursor is over it. Otherwise, the drag cursor is used on its own. + + + + +csReflector + + + +The control responds to Windows dialog messages, focus messages, or size change messages. Use this setting if the control can be used as an ActiveX control, so that it receives notification of these events. + + + + +csActionClient + + + +The control is linked to an action object. This flag is set when the Action property is set, and cleared if the Action property is cleared. + + + + +csMenuEvents + + + +The control responds to system menu commands. + + + + +ControlStyle describes all controls instantiated from a given class. ControlStyle should not be modified at run time, except in the constructor. The ControlState property records transient conditions. +The TControl constructor initializes ControlStyle to the set of csCaptureMouse, csClickEvents, csSetCaption, and csDoubleClicks. +ControlStyle is primarily used by component writers when implementing components derived from TControl. + + +Embarcadero Technologies does not currently have any additional information. + + + + +DockOrientation specifies how the control is docked relative to other controls docked in the same parent. +Use DockOrientation to determine the position of the control relative to other controls docked to the same parent. Docking zones can be arranged from left to right or from top to bottom. + + + + +Specifies the explicit horizontal pixel coordinate of the left edge of a component relative to its parent. +ExplicitLeft is a read-only property used internally by Delphi. Use Left in applications to allow read and write access. + + +Specifies the explicit vertical pixel coordinate of the top edge of a component relative to its parent. +ExplicitTop is a read-only property used internally by Delphi. Use Top in applications to allow read and write access. + + +Specifies the explicit horizontal size of the control in pixels. +ExplicitWidth is a read-only property used internally by Delphi. Use Width in applications to allow read and write access. + + +Specifies the explicit vertical size of the control in pixels. +ExplicitHeight is a read-only property used internally by Delphi. Use Height in applications to allow read and write access. + + +Specifies whether the control is floating. +Read Floating to determine whether a dockable control appears in a floating window, rather than docked to a parent control. + +Note: Use Floating rather than the Parent property to determine whether a control is free-floating. Floating controls may have a non-nil (Delphi) or NULL (C++) parent if the FloatingDockSiteClass property specifies a floating window type. + +Specifies the class of the temporary control that hosts the control when it is floating. +Use FloatingDockSiteClass to specify the class that houses the control when it is floating. This class must be a descendant of TWinControl. By default, it is TCustomDockForm. When the control is undocked, a temporary control of this type is created and the control is docked to that control. When the control is docked to another control, the temporary floating dock site is freed. +If the control can float as a stand-alone window, FloatingDockSiteClass is nil (Delphi) or NULL (C++). + + +Specifies the control in which the control is docked. +Read HostDockSite to access the windowed control to which the control is docked. If the control is floating, HostDockSite is a temporary control of type FloatingDockSiteClass, or (if there is no floating dock site class) nil (Delphi) or NULL (C++). +Most applications should use the ManualDock method rather than setting HostDockSite. Setting HostDockSite automatically undocks the control from its previous host (if any) and docks it to the specified control, but does not adjust the control's position and alignment and bypasses the standard docking events. +For dock clients, the value of HostDockSite is the same as the value of Parent. For controls that are not docking clients, HostDockSite is nil (Delphi) or NULL (C++), while Parent specifies the containing control. + + +Specifies the width of the control when it is docked horizontally. +Read LRDockWidth to get the width of the control from the last time it was docked horizontally. Set LRDockWidth to indicate the width the control should have the next time it is docked horizontally. +LRDockWidth allows a control to "remember" its docked size even when its width changes because it is undocked or docked with a vertical orientation. + + +Embarcadero Technologies does not currently have any additional information. + + + + +ShowHint specifies whether to show the Help Hint when the mouse pointer moves over the control. +ShowHint determines whether the Help Hint appears for the control. The Help Hint is the value of the TControl.Hint property. The Help Hint appears in a box just beneath the control when the mouse pointer moves over the control. +To enable Help Hints for a particular control, two conditions must be satisfied: + +The application's ShowHint property must be True. +Either the control's own ShowHint property must be True, or the control's ParentShowHint property must be True and its parent's ShowHint property must be True. +For example, imagine a check box within a group box. If the ShowHint property of the group box is True and the ParentShowHint property of the check box is True, but the ShowHint property of the check box is False, the check box still displays its Help Hint. +Changing the ShowHint value automatically sets the ParentShowHint property to False. + + +Specifies the height of the control when it is docked vertically. +Read TBDockHeight to get the height of the control from the last time it was docked vertically. Set TBDockHeight to indicate the height the control should have the next time it is docked vertically. +TBDockHeight allows a control to "remember" its docked size even when its height changes because it is undocked or docked with a horizontal orientation. + + +Specifies the touch manager component associated with the control. +Use the Touch property to access gesturing options associated with a control. Touch specifies a class of type TTouchManager. +Touch is used to: + +Associate a TGestureManager. +(TGestureManager manages all the gestures that can be used by the control.) +Select the standard, interactive, or custom gestures to associate with the control. +(You can also connect each gesture to an action; see Assigning Actions to Gestures.) +Specify a set of options for interactive or tablet gestures. + +Specifies the height of the control when it is floating. +Read UndockHeight to get the height of the control from the last time it was floating. Set UndockHeight to indicate the height the control should have the next time it is undocked. +UndockHeight allows a control to "remember" its floating size even when its height changes because it is docked. + + +Specifies the width of the control when it is floating. +Read UndockWidth to get the width of the control from the last time it was floating. Set UndockWidth to indicate the width the control should have the next time it is undocked. +UndockWidth allows a control to "remember" its floating size even when its width changes because it is docked. + + +Specifies whether the component appears onscreen. +Use the Visible property to control the visibility of the control at run time. If Visible is True, the control appears. If Visible is False, the control is not visible. +Calling the Show method sets the control's Visible property to True. Calling the Hide method sets it to False. +For TCustomForm descendants, the Show and ShowModal methods set Visible to True and bring the form to the front of all open windows. +For TTabSheet descendants, Visible does not control the visibility of the control at run time. For more information, see the description of the TabVisible property. + + +Points to the window procedure that responds to messages sent to the control. +Use the WindowProc property to temporarily replace or subclass the window procedure of the control. Component writers that are customizing the window procedure for a descendent class should override the WndProc method instead. +Before assigning a new value to WindowProc, store the original value. WindowProc is initially set to the WndProc method, so if the value has not been changed since then, the original value need not be stored. Within the procedure that is used as the new value for WindowProc, pass any unhandled messages to the original procedure that was the value of WindowProc. After completing any specialized message handling, restore the value of WindowProc to the original procedure. + + +Specifies the parent of the control. +Use the Parent property to get or set the parent of the control. The parent of a control is the control that contains it. For example, if an application includes three radio buttons in a group box, the group box is the parent of the three radio buttons, and the radio buttons are the child controls of the group box. +To serve as a parent, a control must be an instance of a TWinControl descendant. +When creating a new control at run time, assign a Parent property value for the new control. Usually, this is a form, panel, group box, or a control that is designed to contain another. Changing the parent of a control moves the control onscreen so that it is displayed within the new parent. When the parent control moves, the child moves with the parent. +Some controls (such as ActiveX controls) are contained in native windows rather than in a parent VCL control. For these controls, the value of Parent is nil (Delphi) or NULL (C++) and the ParentWindow property specifies the window. + +Note: The Parent property declared in TControl is similar to the Owner property declared in TComponent, in that the Parent of a control frees the control just as the Owner of a component frees that component. However, the Parent of a control is always a windowed control that visually contains the control, and is responsible for writing the control to a stream when the form is saved. The Owner of a component is the component that was passed as a parameter in the constructor and, if assigned, initiates the process of saving all objects (including the control and its parent) when the form is saved. + +Specifies the style elements that are used by the control. +Use StyleElements to customize the style of the control. If a custom style is enabled, you can enable or disable style elements in the control. +StyleElements is a set of values that specify which elements of the current style are to be applied to this control. By default, all the elements of the style are enabled. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs when you perform a gesture associated with this control. +Write an event handler for OnGesture to perform custom processing for gesture events. OnGesture is fired on controls that subscribed for specific gestures using the TTouchManager class. If your code did process the gesture event, do not forget to set the Handled parameter to True so that the event is not propagated further. +If no event handler is associated with the control, the default DoGesture method is executed performing its own processing for the event. +OnGesture is an event handler of type Vcl.Controls.TGestureEvent. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether a control should be constrained by margins. +If AlignWithMargins is true, use the Margins property of the control to govern the spacing relative to other controls that are aligned with this one. The controls are not allowed to be any closer than the spacing specified in Margins. This spacing is maintained as controls are moved when the parent control resizes. +AlignWithMargins is true if the style csAlignWithMargins, a TControlStyle type, is in the control's ControlStyle property, and false otherwise. + + +Specifies the horizontal coordinate of the left edge of a component relative to its parent. +Use the Left property to determine where the left side of the control begins or to reposition the left side of the control. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Left property is relative to the screen in pixels. + + +Specifies the Y coordinate of the upper-left corner of a control, relative to its parent or containing control in pixels. +Use Top to locate the top of the control or reposition the control to a different Y coordinate. The Top property, like the Left property, is the position of the control relative to its container. Thus, if a control is contained in a TPanel, the Left and Top properties are relative to the panel. If the control is contained directly by the form, it is relative to the form. For forms, the value of the Top property is relative to the screen in pixels. + + +Specifies the horizontal size of the control or form in pixels. +Use the Width property to read or change the width of the control. + +Note: For tab sheet controls, changing this property at run time has no effect. + +Specifies the vertical size of the control in pixels. +Use the Height property to read or change the height of the control. + + +Specifies the image used to represent the mouse pointer when it passes into the region covered by the control. +Change the value of Cursor to provide feedback to the user when the mouse pointer enters the control. The value of Cursor is the index of the cursor in the list of cursors maintained by the global variable, Screen. In addition to the built-in cursors provided by TScreen, applications can add custom cursors to the list. + + +Hint contains the text string that appears when the user moves the mouse over the control. +Use the Hint property to provide a string of Help text either as a Help Hint or as Help text on a particular location, such as a status bar. +A Help Hint is a box containing Help text that appears for a control when the user moves the mouse pointer over the control and pauses momentarily. +To set up Help Hints + +Specify the Hint property of each control for which a Help Hint should appear. +Set the ShowHint property of each appropriate control to True, or set the ParentShowHint property of all controls to True and set the ShowHint property of the form to True. +At run time, set the value of the application's ShowHint property to True. +To show the Hint on a status bar or another location, use the OnHint event handler of the application. The application's OnHint event occurs when the mouse pointer moves over the control. +Specify a hint to be used for both a Help Hint box and by an OnHint event handler by specifying values separated by a | (pipe) character. +For example, + +Edit1.Hint := 'Name|Enter Name in the edit box|1'; + +Edit1->Hint = "Name|Enter Name in the edit box|1"; + +Here: + +The Name part is the short hint and appears at the top of the Help Hint box. +Enter full name in the edit box is the long hint and appears below the short hint. It can be extracted using the GetLongHint function for use in an OnHint event handler. +1 is an optional image index in an image list in the Images property of the control and specifies the index of the image to appear in the hint. +If Hint contains only one value, the entire string is used as a Help Hint and returned by the GetLongHint and GetShortHint functions. If a control has no Hint value specified, but its parent control does, the control uses the value of the parent control (as long as the control's ShowHint property is True). + +Note: If the application's ShowHint property is False, the Help Hint does not appear, but the OnHint event handler is still called. + +Specifies whether the control's context-sensitive Help topic is identified by a context ID or by keyword. +Set HelpType to specify whether the control identifies its context-sensitive Help topic by a context ID or by keyword: + +When HelpType is htContext, the HelpContext property value identifies the control's Help topic. +When HelpType is htKeyword, the HelpKeyword property value identifies the control's Help topic. +To use the Help, insert in the uses clause of your application the Vcl.HtmlHelpViewer or another unit that provides an interface to the external Help viewer to use. For C++, you need to include the HTMLHelpViewer.hpp header file. + + + + +The HelpKeyword property contains the keyword string that identifies the Help topic for the control. +To enable the keyword-based context-sensitive Help for a control, set Vcl.Controls.TControl.HelpType to htKeyword and set HelpKeyword to a keyword string. +No keyword (zero-length string, the default) means that no Help topic is provided for the control. +To use the Help, insert in the uses clause of your application the Vcl.HtmlHelpViewer or other unit that provides an interface to the external Help viewer to use. For C++, you need to include the HTMLHelpViewer.hpp header file. + + +The HelpContext property contains the numeric context ID that identifies the Help topic for the control. +In case of a .chm help file, you must map symbolic Context IDs of Help topics to numeric topic ID values in the [MAP] section of your project (.hhp) file. +To enable Context ID-based context-sensitive Help for a control, set Vcl.Controls.TControl.HelpType to htContext and set HelpContext to a numeric topic ID. +A topic ID of 0 (default) means that no Help topic is provided for the control. +To use the Help, insert in the uses clause of your application the Vcl.HtmlHelpViewer or another unit that provides an interface to the external Help viewer to use. For C++, you need to include the HTMLHelpViewer.hpp header file. + + +Specifies the margins of the control. +Use the Margins property to set the margins of the control. +If AlignWithMargins is true, then the Margins property of the control governs the spacing relative to other controls that are aligned with this one. The controls are not allowed to be closer than the spacing specified in Margins. + +Note: The Margins you set for the control have effect only when AlignWithMargins is set to true and Align is not set to alNone. + +CustomHint is a custom hint for the control. +CustomHint is a TCustomHint instance for a control to specify the appearance of the control's hint. + + +Specifies where a control looks for its custom hint. +To have a control use the same hint customization information as its parent control, set ParentCustomHint to true. +If ParentCustomHint is false, the control uses its own CustomHint property. +Set ParentCustomHint to true for all controls to ensure that all the controls on a form display their hint messages alike. +When the value of a control's CustomHint property changes, ParentCustomHint becomes false automatically. + + + +TControl is the base class for all components that are visible at run time. +Controls are visual components, meaning the user can see them and possibly interact with them at run time. All controls have properties, methods, and events that describe aspects of their appearance, such as the position of the control, the cursor or hint associated with the control, methods to paint or move the control, and events that respond to user actions. +TControl has many protected properties and methods that are used or published by its descendants. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal list of pending Asynchronous method calls for this Win control and child TControl instances. + + + + + +Processes pending asynchronous method calls listed in FAsyncList. +The Handle of the control calls InvokeAsyncCalls as a result of a specific message that the Handle retrieves. + +Note: InvokeAsyncCalls synchronizes the access to FAsyncList. It prohibits other threads from accessing it until the calling one calls Exit. + + + +Called when the StyleElements property changes. +Vcl.Controls.TWinControl.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + + + + + + +Schedules asynch method calls. +Vcl.Controls.TWinControl.AsyncSchedule inherits from System.Classes.TComponent.AsyncSchedule. All content below this line refers to System.Classes.TComponent.AsyncSchedule. +Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + See Also +System.Classes.TComponent.BeginInvoke +System.Classes.TBaseAsyncResult +System.Classes.TBaseAsyncResult.Schedule + + + + + + + + +Updates the control to reflect changes in its associated action. +ActionChange is called automatically when the associated action changes. It updates the control to reflect the action's current Caption, Enabled, Hint, Visible, and HelpContext properties and its OnClick event handler. +The Sender parameter is the associated action. The CheckDefaults parameter specifies whether properties and event handlers should be changed if they differ from the default values. When CheckDefaults is true, properties and event handlers are only changed when the current values are the default values (that is, when the values have not been previously changed). When CheckDefaults is false, properties and event handlers are changed, regardless of their current values. + + + + + + +Sets control's window style according to its bi-directional support. +The CreateParams method calls AddBiDiModeExStyle to update the control's style flags (passed as the ExStyle parameter) according the control's bi-directional support. AddBiDiModeExStyle uses the UseRightToLeftReading, UseRightToLeftScrollBar, UseRightToLeftAlignment, and GetControlsAlignment methods to determine the current bi-directional support. + + + + + + +Copies the properties of the windowed control to another object. +Do not call the protected AssignTo method. Instead, applications call the Assign method to copy the properties of another object. If the object's Assign method does not include the ability to copy from the source object, the Assign method calls the source object's protected AssignTo method, to copy the source objects properties to the object specified by the Dest parameter. This allows objects to expand the abilities of another object's Assign method to copy from additional sources. +The AssignTo method implemented in TWinControl copies the Caption, Enabled, Hint, Visible, and HelpContext properties and the OnClick event handler to a TCustomAction object. + + + + + + +Provides the interface that adjusts the ClientRect property for idiosyncrasies of the window. +AdjustClientRect is called internally when the control needs accurate information on where to place child controls within the client area. As implemented in TWinControl, AdjustClientRect does nothing. Override this method in descendants such as TTabControl where the ClientRect property is not the same as the region in which child objects can appear. + + + +Adjusts the control's size according to its contents and constraints. +If the AutoSize property is true, AdjustSize is called automatically when the control needs to automatically resize itself to its contents. As implemented in TWinControl, AdjustSize calls SetBounds with the values of its Left, Top, Width, and Height properties. This call can result in a change of size if these values are altered in the control's OnCanResize or OnConstrainedResize event handlers, or if the control's OnResize event handler makes any final adjustments. +Descendant classes override AdjustSize to change the size of the control to adjust to its contents. +Component writers may call AdjustSize when making changes to a control's contents. + + + + + + + +Aligns any controls for which the control is the parent within a specified area of the control. +Use AlignControls to align all controls within an area of a form, panel, group box, scroll box, or any container control. Specify the area in which to align the controls as the value of the Rect parameter. +AlignControls uses the Align property value for each child control to determine how to align it. The AControl parameter can be nil (Delphi) or NULL (C++). If you specify a control in AControl, that control takes precedence in alignment over other, similarly-aligned controls. + + + + + + + + + + + False + + + + +Aligns the given control with the specified alignment options. +ArrangeControl is a protected method used internally by AlignControls to align each control, with the specified alignment options. +To be more specific, ArrangeControl aligns the control given by AControl, with the alignment options specified through the parameters ParentSize, AAlign, AAlignInfo, Rect, and UpdateAnchorOrigin. The meaning of these parameters is summarized in the following table. + + + + + +Parameter + +Meaning + + + +ParentSize + + + +The size of the parent control within which AControl is aligned. + + + + +AAlign + + + +Determines how AControl aligns within its parent control. + + + + +AAlignInfo + + + +Describes the alignment details of AControl within its parent. + + + + +Rect + + + +The rectangular area inside the parent control in which to align AControl. + + + + +UpdateAnchorOrigin + + + +Specifies whether to update the anchor origin of AControl, following the alignment. + + + + + + + + + + + + +Indicates how the control can be resized. +CanAutoSize is called automatically when the AutoSize property is true and an attempt is made to resize the control. It allows controls to implement the AutoSize property before the resize sequence that begins with the OnCanResize and OnConstrainedResize events and ends with the OnResize event. +When CanAutoSize is called, the NewWidth and NewHeight parameters indicate the proposed new dimensions of the control. CanAutoSize adjusts these values so that the control's size adjusts to its contents. If the adjustment results in values of NewWidth and NewHeight that differ from the control's current width and height, CanAutoSize returns true, indicating that the resize sequence should proceed. If, after adjustment, NewWidth and NewHeight equal Width and Height, CanAutoSize returns false, and the resize sequence is aborted. +As implemented in TWinControl, CanAutoSize returns true, adjusting NewWidth and NewHeight so that all the control's children fit. + + + + + + + + +Indicates how the control can respond to a resize attempt. +CanResize is called automatically when an attempt is made to resize the control. The NewWidth and NewHeight parameters specify the attempted new values for the control's height and width. CanResize returns true if the control can be resized to the returned values of NewWidth and NewHeight. CanResize returns false if the control can't be resized. +CanResize generates an OnCanResize event. An OnCanResize event handler may change the values of NewHeight and NewWidth. + + + + + + + + +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + + + + + + + +Generates an OnConstrainedResize event. +ConstrainedResize is called automatically as part of a control's resize sequence. It generates an OnConstrainedResize event, passing in the MinWidth, MinHeight, MaxWidth, and MaxHeight parameters, which can be altered by the event handler before they are applied to the attempted resize. + + + +ControlsAligned automatically executes after a call to AlignControls. +Implement ControlsAligned in descendant classes to display a notification, after aligning the controls by a call to AlignControls. + +Note: As a member of the TWinControl class, ControlsAligned has no effect. + + + + + +Creates the dock manager for the control. +CreateDockManager is called automatically during drag-and-dock operations when the UseDockManager property is true. CreateDockManager creates the object that implements the DockManager property. +Override CreateDockManager to create a custom dock manager for the control. + + + +Creates underlying screen object. +CreateHandle creates the Microsoft Windows screen object that underlies the control. if it does not already exist. The new window handle becomes the value of the Handle property. +CreateHandle creates or locates the parent control's window before it creates a window for the control itself. + +Note: If the Parent property is nil (Delphi) or NULL (C++), CreateHandle raises an exception. + + + + + +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + + + + +Creates a Windows control to represent the control. +The CreateWnd method calls CreateWindowHandle to create the window for a control. CreateWindowHandle creates the window by calling the CreateWindowEx API function, passing parameters from the record passed in the Params parameter. Once the window is created, its handle is available as the Handle property. + + + +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + + + + + + +Returns placement order of custom-aligned child control. +CustomAlignInsertBefore determines the order in which custom-aligned child controls are placed. The control calls CustomAlignInsertBefore once for each pair of child controls with an Align property of alCustom. CustomAlignInsertBefore returns true if C2 should be presented before C1, and false otherwise. +Once the custom-aligned child controls are sorted, their specific positions are determined by calls to CustomAlignPosition. +CustomAlignInsertBefore triggers the OnAlignInsertBefore event. If this event is defined, CustomAlignInsertBefore returns the value returned by OnAlignInsertBefore. Defining this event allows users to define the order of control alignment without overriding CustomAlignInsertBefore. +As implemented in TWinControl, CustomAlignInsertBefore returns false if OnAlignInsertBefore is not implemented, so the controls are placed in the order they appear in the Controls property. + + + + + + + + + + + + +Returns aligned position of custom-aligned child control. +CustomAlignPosition determines the specific position of custom-aligned child controls. CustomAlignPosition is called once for each child control with an Align property of alCustom, in an order previously determined by calls to CustomAlignInsertBefore. +CustomAlignPosition triggers the OnAlignPosition event. If this event is defined, CustomAlignPosition uses the alignment parameters it obtains from OnAlignPosition. Defining this event allows users to set the alignment parameters without overriding CustomAlignPosition. +These are the parameters: + + + + + +Control + +The child control being placed. + + + +NewLeft | NewTop | NewWidth | NewHeight + + + +Location and size of child control, as determined by container's size and the Anchors TControl_Anchors constraints for the control. CustomAlignPosition can modify these values to reposition the control. + + + + +AlignRect + + + +The client area in which the control is aligned. CustomAlignPosition can modify this value. + + + + +AlignInfo + + + +Alignment information in a TAlignInfo. + + + + +As implemented in TWinControl, CustomAlignPosition does nothing. + + + + + + + + + + + + +Provides methods to read and write the IsControl property to a stream such as a form file. +Vcl.Controls.TWinControl.DefineProperties inherits from Vcl.Controls.TControl.DefineProperties. All content below this line refers to Vcl.Controls.TControl.DefineProperties. +Provides methods to read and write the IsControl property to a stream such as a form file. +DefineProperties is called automatically by the streaming system that loads and saves VCL components. It allows persistent objects to read and write properties that are not published. Published properties are loaded and stored automatically. +DefineProperties uses the methods of the filer passed as the Filer parameter to assign methods that can load and save the IsControl property. +Override DefineProperties to persist unpublished properties. Call the DefineBinaryProperty or DefineProperty method of the Filer parameter to assign methods that load or save property values. + +Note: When overriding this method, call the parent class's DefineProperties method first. + + +Destroys the control's window without destroying the control. +Call DestroyHandle to dispose of the window, but leave the control intact. The control can later recreate the window if needed. DestroyHandle is the converse operation to CreateHandle. Applications should call the high-level CreateHandle and DestroyHandle methods, rather than the lower-level methods of CreateWnd and DestroyWnd, whenever possible. +If the control has TWinControl objects as child controls, DestroyHandle calls each of their DestroyHandle methods before calling DestroyWnd to destroy its own handle. + + + +Destroys the window created in the CreateWindowHandle method. +Call DestroyWindowHandle to dispose of the window for the control. +TWinControl's Destroy method calls DestroyWindowHandle to destroy any window associated with a windowed control before destroying the object. The DestroyWnd method also calls DestroyWindowHandle. + + + +Destroys the control's window. +DestroyWnd is called when the control needs to replace its window. For example, changing properties that are implemented by window parameter settings require the control to be destroyed and then recreated using the CreateWnd method. +Before the window is destroyed, DestroyWnd saves a copy of the control's text in memory, frees any device contexts, and finally calls DestroyWindowHandle. When the window is recreated, the stored copy of the control's text is assigned to the new window. + + + + + + + +Performs actions when a control is docked to the windowed control. +DoAddDockClient is called automatically when a client control is docked to the windowed control. As implemented in TWinControl, DoAddDockClient sets the client's Parent property to the control. +Client is the control that has been docked. +ARect describes the boundaries of the region where Client has been docked. +Override DoAddDockClient to perform actions when a control is docked to the windowed control. + +Note: DoAddDockClient is called in response to a message sent by the DockDrop method, before the OnDockDrop event. + + + + + + + + + +Responds when a docking client is dragged over the windowed control. +DockOver is called automatically for dock sites when a dockable object is dragged over them. As implemented in TWinControl, DockOver positions the docking rectangle and then calls DoDockOver to generate an OnDockOver event. +Override DockOver to perform additional actions when another control is dragged over the control. +DockOver is called only if DockSite is true. + + + + + + + + + + + +Invalidates the first dock site in the list of child controls. +Currently, DockReplaceDockClient always returns False and has no effect as a member of the TWinControl class. +Implement DockReplaceDockClient in descendant classes in order to manually replace Client with ReplacementClient. Also, manually dock Client to NewDockSite on the control specified by DropControl and using the alignment options given in ControlSide. + + + + + + + + + + + + +Generates an OnDockOver event. +DoDockOver is called by the DockOver method to generate an OnDockOver event when the user drags a dockable control over the windowed control. Override this method to perform some other action or to suppress the event. + + + +Respond to receiving input focus. +DoEnter is called automatically when the control receives the input focus. As implemented in TWinControl, DoEnter calls the OnEnter event handler, if defined. +Descendant classes that override DoEnter should always call the inherited method. + + + +Responds to losing input focus. +DoExit is called automatically when the control loses the input focus. As implemented in TWinControl, DoExit calls the OnExit event handler, if defined. +Descendant classes that override DoExit should always call the inherited method. + + + +Flips the control's children. +The FlipChildren method calls DoFlipChildren to reverse the positions of child controls. DoFlipChildren moves the control's children to opposite positions on the control; that is, children on the left side of the control are moved to the right side of the control and vice versa. +Override FlipChildren to control how the control's children are flipped. + +Note: DoFlipChildren is a protected helper method for the public FlipChildren method. Unlike FlipChildren, DoFlipChildren does not adjust the alignment of controls that are aligned to one of the edges of the windowed control. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Performs some preprocessing before generating an OnKeyDown event. +The return value from DoKeyDown determines if the control should continue processing key-down messages passed in the Message parameter. A return value of true indicates that the key-down occurrence has been handled completely, and no further processing is needed. A return value of false indicates that the application should continue passing the key-down message through the inherited processing. +DoKeyDown checks whether the KeyPreview property of the parent form is true; if so, it allows the form to preemptively process key-down messages before they are handled by the windowed control. If the form does not handle the message, DoKeyDown translates the message parameters into the appropriate types and calls KeyDown, which in turn calls the OnKeyDown event handler, if any. + + + + + + + +Performs some preprocessing before generating an OnKeyPress event. +The return value from DoKeyPress determines whether the control should continue processing the key-press message passed in the Message parameter. A return value of true indicates that the key-press occurrence has been handled completely, and no further processing is needed. A return value of false indicates that the application should continue passing the key-press message through the inherited processing. +DoKeyPress checks whether the KeyPreview property of the parent form is true, and if so, allows the form to preemptively process key-press messages before they are handled by the windowed control. If the form does not handle the message, DoKeyPress translates the message parameters into the appropriate types and calls KeyPress, which in turn calls the OnKeyPress event handler, if any. + + + + + + + +Performs some preprocessing before generating an OnKeyUp event. +The return value from DoKeyUp determines whether the control should continue processing the key-up message passed in the Message parameter. A return value of true indicates that the key-up occurrence has been handled completely, and no further processing is needed. A return value of false indicates that the application should continue passing the key-up message through the inherited processing. +DoKeyUp checks whether the KeyPreview property of the parent form is true, and if so, allows the form to preemptively process key-up messages before they are handled by the windowed control. If the form does not handle the message, DoKeyUp translates the message parameters into the appropriate types and calls KeyUp, which in turn calls the OnKeyUp event handler, if any. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Responds when a control is undocked from the windowed control. +DoRemoveDockClient is called automatically when a client control is undocked from the windowed control. As implemented in TWinControl, DoRemoveDockClient does nothing. +Client is the control that has been undocked. +Override DoRemoveDockClient to perform any necessary adjustments when a control is undocked from the windowed control. + +Note: DoRemoveDockClient occurs at the end of the undocking process. To make changes when undocking starts, override the DoUnDock method instead. + + + + + + + +Undocks a control that is currently docked to the windowed control. +DoUnDock is called automatically when a control is undocked from the windowed control. It handles all necessary changes to the windowed control to accomplish the undocking. These are +1.Generates an OnUnDock event. +2.If there is no OnUnDock event handler, or if the event handler indicates that the client can be undocked, it removes the client from the DockClients property list. +The NewTarget parameter indicates the new host to which the undocked control is moving. +The Client parameter indicates the control to be undocked from the windowed control. +DoUnDock returns true if the client is successfully undocked, false if the undocking attempt was blocked by an OnUnDock event handler. +Override DoUnDock to change the way controls are undocked from the windowed control. + +Note: DoUnDock occurs at the start of the undocking process. To handle changes when undocking is complete, override the DoRemoveDockClient method instead. + + + + + + + + + +Returns the control's next child in the tab order after the specified control. +Call FindNextControl to find the next child control in the tab order after CurControl. If CurControl is not a child of the control, FindNextControl returns the first child control in the tab order. +The GoForward parameter controls the direction of the search. If GoForward is true, FindNextControl searches forward through the child controls in tab order. If Go Forward is false, FindNextControl searches backward through the controls. +The CheckTabStop and CheckParent parameters control whether FindNextControl performs certain checks on the controls it finds. If CheckTabStop is true, the returned control must have its TabStop property set to true. If CheckParent is true, the returned control's Parent property must indicate the parent control. +FindNextControl calls the GetTabOrderList method to build its list of possible "next" controls. + + + +Sorts the child controls by their tab order. +Applications should not call FixupTabList directly. The ReadState method calls FixupTabList to initialize the tab order list based on the TabOrder properties of the child controls being read from a stream. + + + + + + +Returns the associated action link class. +GetActionLinkClass returns the appropriate class type for the action link used with a control. This class is used internally to create an action link object for the control when it has an associated action. The action link links the action to the control client. Each Action link class is designed to link specific properties and event handlers of the action to its client, based on the types of properties the client supports. +As implemented in TWinControl, GetActionLinkClass returns the TWinControlActionLink class type, which associates the HelpContext, ShowHint, Caption, Enabled and Visible properties and the OnClick event handler. Descendants of TWinControl override this method to specify a descendant of TControlActionLink that handles their configuration of properties and events. + + + + + + +Returns the value of the ClientOrigin property. +GetClientOrigin is the protected implementation of the ClientOrigin property. +GetClientOrigin returns a point indicating the position of the top-left corner of the control in screen coordinates. + + + + + + +Returns the value of the ClientRect property. +GetClientRect is the protected implementation of the ClientRect property. GetClientRect returns a rectangle with the rectangle's Top and Left fields set to zero, and its Bottom and Right fields set to the control's ClientHeight and ClientWidth, respectively. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the smallest rectangle in which all the control's children fit. +Call GetControlExtents to determine the smallest rectangle in which all the control's children fit. Windowed controls call GetControlExtents when implementing the AutoSize property. + + + + + + + +Provides access to a device context for the control. +Call GetDeviceContext to obtain a handle to a device context for the control. +GetDeviceContext calls the Windows API function GetDC, passing the windowed control's Handle property. It returns the window's handle in the WindowHandle parameter and the HDC as the return value. If the call is unsuccessful, the EOutOfResources exception is raised. + + + + + + +Returns the window handle for the window of the control's parent. +Use the handle returned by GetParentHandle as a parameter to Windows API function calls that need the window handle for the parent window of the control. If the Parent property is not nil (Delphi) or NULL (C++), GetParentHandle returns the Handle property of the parent control. If the Parent property is nil (Delphi) or NULL (C++), GetParentHandle returns the value of ParentWindow. + + + + + + + + + +Generates an OnGetSiteInfo event. +GetSiteInfo is called automatically during drag-and-dock operations to initialize a TDragDockObject with information about where a dragged object can be docked, if at all. +Client is a potential docking client. +InfluenceRect returns the area in which the client would be docked. +MousePos is the current mouse position. +CanDock returns whether the client can dock to the windowed control. +As implemented in TWinControl, GetSiteInfo generates an influence rectangle equal to BoundsRect expanded by 10 pixels on every side, and then calls the OnGetSiteInfo event handler. + + + + + + +Returns the window handle of the first window not associated with a VCL control that contains the windowed control. +Use GetTopParentHandle to access the handle of the window that is hosting the windowed control. GetTopParentHandle walks up the containers of the windowed control until it finds a control whose Parent property is nil (Delphi) or NULL (C++). If that topmost parent is contained in a non-VCL window (its ParentWindow is nonzero), GetTopParentHandle returns the non-VCL window. If the windowed control is not contained in a non-VCL window, GetTopParentHandle returns the windowed control's own window handle. + + + + + + +Invalidates the first dock site that appears in the list of child controls. +Call InvalidateDockHostSite to invalidate the first dock site that appears in the list of child controls. + + + + + + + + + +Indicates whether a specified mouse message is directed to one of the windowed control's child controls. +Call IsControlMouseMsg to find out if a mouse message is directed to one of the control's child controls. Specify the mouse message as the value of the Message parameter. +Windows takes care of sending messages to windowed child controls, but for nonwindowed child controls, Windows sends the messages to the parent control, which must then determine which, if any, of its child controls should receive the message. +The WndProc method of a windowed control calls IsControlMouseMsg to process all mouse message sent to the windowed control. + + + + + + + nil + + + + + +Indicates whether a specified mouse activation message is directed to the given child control. +Call IsControlActivateMsg to find out whether a mouse activation message is directed to the child control given by the Control parameter. Specify the mouse activation message as the value of the Message parameter. +The WndProc method of a windowed control calls IsControlActivateMsg to process all mouse activation messages sent to the windowed control. + + + + + + + +Checks whether the control is docked inside another control or has at least two docked controls. +IsQualifyingSite is a protected method that returns true if either the given Client control is docked inside another control, or there are at least two controls docked inside Client. + + + + + + + +Responds to key press events. +When a windowed control receives a key-down message (WM_KEYDOWN) from Windows, its message handler calls the DoKeyDown method. If DoKeyDown determines that the control should, in fact, process the character, it calls KeyDown, passing the key code and shift-key state in the Key and Shift parameters, respectively. +KeyDown calls any event handler attached to the OnKeyDown event. Override KeyDown to provide other responses in addition to the event handler call. +The Key parameter is the key on the keyboard. For nonalphanumeric keys, you must use WinAPI virtual key codes to determine the key pressed. For more information see Representing Keys and Shortcuts. +The Shift parameter indicates whether the SHIFT, ALT, or CTRL keys are combined with the keystroke. +Either KeyDown or the OnKeyDown event handler it calls can suppress further processing of a key by setting the Key parameter to zero. + + + + + + + +Respond to released key. +When a windowed control receives a key-up message (WM_KEYUP) from Windows, its message handler calls the DoKeyUp method. If DoKeyUp determines that the control should, in fact, process the character, it calls KeyUp, passing the key code and shift-key state to KeyUp in the Key and Shift parameters, respectively. +KeyUp calls any event handler attached to the OnKeyUp event. Override KeyUp to provide other responses in addition to the event-handler call. +Either KeyUp or the OnKeyUp event handler it calls can suppress further processing of a key by setting the Key parameter to zero. +The Key parameter is the key on the keyboard. For non-alphanumeric keys, use WinAPI virtual key codes to determine the key pressed. For more information, see Representing Keys and Shortcuts. +The Shift parameter indicates whether the Shift, Alt, or Ctrl keys are combined with the keystroke. + + + + + + +Responds to keyboard input. +When a windowed control receives a key-press message (WM_CHAR) from Windows, its message handler calls the DoKeyPress method. If DoKeyPress determines that the control should, in fact, process the character, it calls KeyPress, passing the key code in the Key parameter. +KeyPress calls any event handler attached to the OnKeyPress event. Override KeyPress to provide other responses in addition to the event handler call. +Either KeyPress or the OnKeyPress event handler it calls can suppress further processing of a character by setting the Key parameter to zero. + +Note: The Key parameter is the character represented by the key that is pressed, not a Windows virtual key code. + + + + + +Receives Windows messages for the control. +MainWndProc is the window procedure for the control that is associated with the control's window when it is created. When Windows sends a message to the control's window, MainWndProc receives it. +MainWndProc does not process or dispatch the messages itself, but rather calls the method specified by WindowProc to do that. MainWndProc provides an exception-handling block around WindowProc, ensuring that if any unhandled exceptions occur during the processing of a message, the application's HandleException method will handle them. + + + + + + + +Responds to notifications indicating that components are being created or destroyed. +Vcl.Controls.TWinControl.Notification inherits from Vcl.Controls.TControl.Notification. All content below this line refers to Vcl.Controls.TControl.Notification. +Responds to notifications indicating that components are being created or destroyed. +Notification allows TControl to update its internal state if an associated component is removed. The internal state is updated if: + +The associated pop-up menu is destroyed. +The control docking site is destroyed. +The custom hint associated with the control is destroyed. +The associated gesture manager is destroyed. +Override the Notification method to respond to notifications indicating that other components are about to be destroyed or have just been created. Use the Notification method to update controls that rely on other objects. Data-aware objects override the Notification method to update themselves when their data source is removed. Some objects respond to notifications indicating that other objects of a specific type are being created. For example, the session component sets the Session property of new data-aware controls to itself when the AutoSessionName property is True. +By default, components pass along the notification to their owned components, if any. + + + + + + +Sends a message to all the child controls. +NotifyControls sends a message with the message ID passed in the Msg parameter to all the controls in the windowed control's Controls array property. NotifyControls is used to update all the controls in a form of such occurrences as changes in the parent color or font. +NotifyControls constructs a generic message record, filling its message ID field with the value of Msg and setting its parameter and result fields to zeros, then calls the Broadcast method to send the message to all the child controls. + + + + + + + +Paints each of the child controls in a windowed control using the specified device context. +Call PaintControls to paint all the child controls of this control. Pass the device context as the value of the DC parameter. The First parameter indicates the starting point in the windowed control's child-control list to paint. If First is nil (Delphi) or NULL (C++) or does not indicate one of the child controls, PaintControls paints all the child controls. +The Repaint method calls PaintControls for the control's parent, passing the control in First to repaint the control and any controls it might intersect. PaintHandler also calls PaintControls after calling PaintWindow. + + + + + + +Responds to WM_PAINT messages. +PaintHandler is called automatically when the control receives a WM_PAINT message. It calls the BeginPaint and EndPaint API functions, and between them paints the control's background by calling PaintWindow and any child controls by calling PaintControls. + + + + + + +Renders the image of a windowed control. +Call PaintWindow to repaint the control. PaintWindow sends a WM_PAINT message to the windowed control's DefaultHandler method, setting the message record's WParam field to the value passed in DC and the other parameter and result fields to zeros. + + + + + + + +Responds to changes in the system's palette by realizing the control's palette and the palette for each child control. +PaletteChanged is called automatically when the Windows system palette changes. TWinControl responds to these notifications by trying to realize the windowed control's palette, if any, into the current device context, and then passing on the PaletteChanged notification to each of the child controls in turn. If the change in the system palette causes the actual value of the control's palette to change, PaletteChanged will invalidate the control so that it can repaint with the new palette. +Windows paints the active window with a foreground palette, while other windows are forced to use background palettes. Background palettes are approximate matches to the colors specified by the control's logical palette, given the limitations imposed by implementing the foreground palette. Windows only allows a single foreground palette. +PaletteChanged allows the control to obtain a new realization of its palette when the system palette changes. When Foreground is true, the form has been activated and the control is specifying the new foreground palette. When Foreground is false, another application or form has changed the foreground palette, and controls that are sensitive to the available palette should realize new background palettes to best match their logical palettes. +If the control does not have a logical palette to be realized into the current device context, GetPalette will return a handle of 0, and PaletteChanged will not try to realize a palette for the windowed control. Instead, it simply passes the notification on to the child controls. If the windowed control or any of its child controls realize a palette into the current device context in response to PaletteChanged, this method returns true. +Override PaletteChanged to change the way in which controls are given an opportunity to realize a new palette when the Windows system palette changes. For example, override PaletteChanged to change the order in which child controls realize their palettes, giving a particular control the foreground palette when the form is activated, or to pass palette change notification to custom controls implemented outside of the VCL, such as in DLLs. +Override GetPalette instead to affect whether the windowed control actually has a palette to realize, or to change the value of the control's logical palette. + +Note: PaletteChanged is called only when the run-time video mode requires palette support, such as for 256 color mode, but not 16 million color mode. + + + + + +Prepares the control for having its properties assigned values from a stream. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Be sure to include a call to the inherited method when overriding ReadState. +As implemented in TWinControl, ReadState disables control alignment until all the child controls have been read from the stream, calls the inherited ReadState method, and re-enables the alignment of all the controls. The method then builds the tab order list of controls and synchronizes its visibility with that of its parent control. + + + +Recreate underlying Windows screen object. +Call RecreateWnd to recreate the control from scratch. RecreateWnd destroys the underlying Windows screen object. The next time the Handle property is referenced (when the object is repainted, for example), a new Windows screen object is created. Some changes in control properties are not implemented until this re-creation occurs. + + + + + + + +Reloads a docked control. +Use ReloadDockedControl to obtain a reference to control given its name. The AControlName parameter is the name of the child control. The corresponding control is returned as the AControl parameter. ReloadDockedControl can only locate a control if it has the same Owner as the windowed control. +The dock manager calls ReloadDockedControl to obtain a control reference that it then docks to the windowed control. + + + +Restores the input method editor (IME) that was active when the application started. +For controls that specify the ImeName property, call ResetIme to revert to the IME that was active when the application started. If the IME was deactivated by setting the ImeMode property to imDisable, ResetIme restarts the default IME. +Applications cannot call ResetIme. ResetIme is called automatically when the control loses input focus. It is exposed as a protected method so descendant objects can restore the default IME at other times. + + + + + + +Restores the input method editor (IME) that was active when the application started. +For controls that specify the ImeName property, call ResetIme to revert to the IME that was active when the application started. If the IME was deactivated by setting the ImeMode property to imDisable, ResetIme restarts the default IME. +Applications cannot call ResetIme. ResetIme is called automatically when the control loses input focus. It is exposed as a protected method so descendant objects can restore the default IME at other times. + + + + + + + +Directs the composition window of the input method editor (IME) to perform a specific action. +Call ResetImeComposition to direct what the composition window does with the input typed by the user. The composition window is the window displayed by the IME that provides feedback to the user about what keystrokes have been typed, and how they are converted into asian characters. +The Action parameter indicates what the composition window should do with its current contents. Action can have one of the following values: + + + + + +Value + +Meaning + + + +CPS_CANCEL + + + +Clear the composition string and set the status to no composition string. + + + + +CPS_COMPLETE + + + +Set the composition string as the result string. + + + + +CPS_CONVERT + + + +Convert the composition string. + + + + +CPS_REVERT + + + +Cancel the current composition string and revert to the unconverted string. + + + + +ResetImeComposition returns true if the composition window performs the requested action. + + + +Instructs the parent of a control to reposition the control, enforcing its Align property. +Vcl.Controls.TWinControl.RequestAlign inherits from Vcl.Controls.TControl.RequestAlign. All content below this line refers to Vcl.Controls.TControl.RequestAlign. +Instructs the parent of a control to reposition the control, enforcing its Align property. +Controls call RequestAlign internally when changes are made to the size or position of the control, so that they remain properly aligned within the parent control. Do not call RequestAlign in application code. + + + +Scales all the contained controls to the NewPPI value. + + + + + + + + + + + + nil + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Rescale child controls only. +Call ScaleControls to rescale only the children of the control, while leaving the control itself the same size. The parameters have the same meaning as in the ScaleBy method. + + + + + + + +Scales the control padding to the given ratio. +Call ScalePadding to scale the padding coordinates of the control to the given M/D ratio. + + + +Locates first selectable child control. +Call SelectFirst to find the first child that can be selected within the control's tab order. SelectFirst calls the FindNextControl method, passing nil (Delphi) or NULL (C++) as the current control. Once the first selectable control is found, SelectFirst makes the control the active control on the form. + + + + + + + + +Moves the input focus from the current child control to the next one in the tab order. +Call SelectNext to move the child control focus. SelectNext selects the first child that follows or precedes CurControl in the tab order and that meets the criteria specified in the other parameters. +The GoForward parameter controls the direction of the search. If GoForward is true, FindNextControl searches forward through the child controls in tab order. If GoForward is false, SelectNext searches backward through the controls. The search wraps past the end of the collection back to CurControl. +The CheckTabStop parameter controls whether the control SelectNext finds must be a tab stop. If CheckTabStop is true, the returned control must have its TabStop property set to true, or the search for the next control continues. +If a child control matches the search criteria, that control obtains the focus. If no such child control is found, the focus remains unchanged. + + + + + + + +Changes the order in which the child component appears in the list of child components returned by the GetChildren method. +Use SetChildOrder when you want to change the order in which child objects are streamed in. Specify the child component whose order you want to change as the value of the Child parameter. Indicate the position you want the component to be in as the value of the Order parameter. +When SetChildOrder is called, items previously below the child's old position move up, and those below the new position move down. + + + +Activates an input method editor (IME) using the values specified by the ImeMode and ImeName properties. +Applications cannot call SetIme. SetIme is called automatically when the control receives input focus. It is exposed as a protected method so that descendant objects can cause the ImeMode and ImeName properties to take effect at other times. + + + + + + +Activates an input method editor (IME) using the values specified by the ImeMode and ImeName properties. +Applications cannot call SetIme. SetIme is called automatically when the control receives input focus. It is exposed as a protected method so that descendant objects can cause the ImeMode and ImeName properties to take effect at other times. + + + + + + + + + +Sets the position and font of the composition window. +Call SetImeComposition to change the position or font of the composition window. The composition window is the window displayed by the input method editor (IME) that provides feedback to the user about what keystrokes have been typed, and how they are converted into asian characters. +The Font parameter describes the font that the composition window should use. Setting the Font parameter to nil (Delphi) or NULL (C++) repositions the composition window without changing the font. XPos and YPos specify the desired global coordinates for the composition window. +SetImeCompositionWindow returns true if the font and position are successfully assigned. + + + + + + +Sets the parent of the control. +Vcl.Controls.TWinControl.SetParent inherits from Vcl.Controls.TControl.SetParent. All content below this line refers to Vcl.Controls.TControl.SetParent. +Sets the parent of the control. +SetParent is the protected implementation of the Parent property. Override SetParent to execute additional code when the value of the Parent property changes. +The AParent parameter specifies the new parent of the control. +If the control already has a parent, SetParent removes the control from that parent's list of controls by calling the parent's RemoveControl method. If AParent is not nil (Delphi) or NULL (C++), SetParent calls its InsertControl method to add the control to its list of controls. +The TControl destructor calls SetParent(nil (Delphi) or NULL (C++)) to remove the control from its parent's control list before destroying the component. + + + + + + +Sets the ParentBackground property. +SetParentBackground is a protected method that sets the value of ParentBackground. + + + + + + +Sets the ParentBackground property. +SetParentDoubleBuffered is a protected method that sets the value of ParentDoubleBuffered. + + + + + + +Moves the control to the top or bottom of the parent control's (or screen's) list of TWinControl controls. +Use SetZOrder to rearrange overlapping controls within a parent control or (if the control has no parent) overlapping windows on the screen. If the TopMost parameter is true, the control becomes the top control; otherwise, it becomes the bottom control. +TWinControl controls always stack on top of other controls, regardless of the Z order. +After changing the order, SetZOrder invalidates the control to ensure repainting to reflect the new order. + + + + + + +Ensures that a specified child control is visible. +Call ShowControl to display a child control. Specify the control you want to ensure will be visible as the value of the AControl parameter. +As implemented in TWinControl, ShowControl simply calls the ShowControl method of the control's parent. Derived objects override ShowControl to perform whatever actions are necessary to allow the indicated child object to be visible. Possible actions include scrolling the particular child object into view, or changing to the appropriate notebook page. + + + +Updates the bounds of the control. +UpdateBounds is a protected method that updates the bounds of the control. + + + + + + + + + +Updates the original size of the parent control. +UpdateControlOriginalParentSize is a protected method that updates the original size of the parent control. It is used internally to update the anchor rules of the control. + + + + + + + + +Toggles the csRecreating flag in the ControlState property. +Switches on or off the csRecreating flag in the ControlState property, if the Recreating parameter is True or False, correspondingly. +If the control has any children, then the UpdateRecreatingFlag method is applied to all the children, using the same Recreating parameter. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Updates form User Interface State as needed +UpdateUIState is called in component code to ensure that the User Interface State is consistently updated. User Interface State determinates whether keyboard accelerators and focus indicators are hidden or shown. A control should call UpdateUIState whenever it receives a keyboard event that might invalidate the User Interface State. CharCode is the virtual key code of the keyboard event. + + + + + + + + +Provides specific message responses for the control. +Override WndProc to change the initial Windows message handler for the control. The WindowProc property is initialized to point to the WndProc method. +WndProc for TWinControl overrides the inherited method to define responses for focus, mouse, and keyboard messages. It sends all others to its inherited WndProc. +When overriding WndProc to provide specialized responses to messages, call the inherited WndProc at the end to dispatch any unhandled messages. + + + + + + + +Creates a windowed control derived from an existing Windows window class. +Call CreateSubClass in the CreateParams method of a subclassed control, after calling the inherited CreateParams. Specify the parameter record as the value of the Params parameter. CreateSubClass allows VCL controls to create registered Windows controls. + + + +Removes the ControlAtom and WindowAtom properties of the control. +Call RemoveWindowProps to remove the ControlAtom and WindowAtom properties of the control. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies which edges of the control are beveled. +Use BevelEdges to get or set which edges of the control are beveled. The BevelInner, BevelOuter, and BevelKind properties determine the appearance of the specified edges. + + +Specifies the cut of the inner bevel. +Use BevelInner to specify whether the inner bevel has a raised, lowered, or flat look. +The inner bevel appears immediately inside the outer bevel. If there is no outer bevel (BevelOuter is bvNone), the inner bevel appears immediately inside the border. + + +Specifies the cut of the outer bevel. +Use BevelOuter to specify whether the outer bevel has a raised, lowered, or flat look. +The outer bevel appears immediately inside the border and outside the inner bevel. + + +Specifies the control's bevel style. +Use BevelKind to modify the appearance of a bevel. BevelKind influences how sharply the bevel stands out. +BevelKind, in combination with BevelWidth and the cut of the bevel specified by BevelInner or BevelOuter, can create a variety of effects. Experiment with various combinations to get the look you want. + + +Specifies the width of the inner and outer bevels. +Use BevelWidth to specify the width, in pixels, of the inner and outer bevels. + + +Specifies the width of the control's border. +Use BorderWidth to get or set the width of the control's border. Graphics or text drawn by the control is clipped to the area within the border. + + +Determines whether a control has a three-dimensional (3-D) or two-dimensional look. +Ctl3D is provided for backward compatibility. It is not used by 32-bit versions of Windows or NT4.0 and later, with the exception of Windows XP Home, where it is used on occasion. +On earlier platforms, Ctl3D controlled whether the control had a flat or beveled appearance. + + +Note RAD Studio no longer supports Windows Vista or earlier. + + + +Determines the behavior of the input method editor (IME). +Set ImeMode to configure the way an IME processes user keystrokes. An IME is a front-end input processor for Asian language characters. The IME hooks all keyboard input, converts it to Asian characters in a conversion window, and sends the converted characters or strings on to the application. +ImeMode allows a control to influence the type of conversion performed by the IME so that it is appropriate for the input expected by the control. For example, a control that only accepts numeric input might specify an ImeMode of imClose, as no conversion is necessary for numeric input. + +Note: The value of ImeMode only takes effect when the control receives focus. To change the value of ImeMode when the control already has input focus, call the SetIme method. + +Specifies the input method editor (IME) to use for converting keyboard input to Asian language characters. +Set ImeName to specify which IME to use for converting keystrokes. An IME is a front-end input processor for Asian language characters. The IME hooks all keyboard input, converts it to Asian characters in a conversion window, and sends the converted characters or strings on to the application. +ImeName must specify one of the IMEs that has been installed through the Windows control panel. The property inspector provides a drop-down list of all currently installed IMEs on the system. At runtime, applications can obtain a list of currently installed IMEs from the global Screen variable. +If ImeName specifies an unavailable IME, the IME that was active when the application started is used instead. No exception is generated. + +Note: The value of ImeName only takes effect when the control receives focus. To change the value of ImeName after the control has input focus, call the SetIme method. + +Determines whether the control uses its parent's theme background. +If ParentBackground is True, the control uses the parent's theme background to draw its own background. +If ParentBackground is False, the control uses its own properties, such as Color, to draw its background. +ParentBackground has no effect unless XP themes are enabled. + + + + +Determines where a component looks to determine whether it should have a three-dimensional look. +ParentCtl3D is provided for backwards compatibility. It has no effect on 32-bit versions of Windows or NT 4.0 and later. +ParentCtl3D determines whether the control uses its parent's Ctl3D property. + + +TipMode indicates whether TabTip (onscreen keyboard equivalent) opens or closes when the control receives focus or if it receives a gesture. +For example, in controls derived from TButtonControl the default mode is tipClose, so TabTip is instructed to disappear when the control receives focus or a gesture. The default for controls derived from TCustomEdit is tipOpen. + +Note: The above applies only to devices that have touch screen support + + + +Specifies the default window procedure for the windowed control. +Windowed controls use the Windows API function CallWindowProc with DefWndProc to invoke the standard Windows message handling for a window message. Using DefWndProc instead of the WndProc method bypasses any message processing introduced by the WndProc method. +DefWndProc fills the role for windowed controls that DefaultHandler fills for all objects. The DefaultHandler for TWinControl uses DefWndProc to pass messages to Windows for processing. +For windowed controls, DefWndProc is initially set to the window procedure of the window class specified in the Params parameter in the CreateParams method. Change DefWndProc to subclass the window class of a windowed control. + + +Provides access to a window handle for the control. +The WindowHandle property provides access to the same window handle as the Handle property, but WindowHandle is protected, and therefore only accessible to code inside the control. +The advantage to using WindowHandle is that it can be written to, while the Handle property is read-only. Use WindowHandle when implementing methods that need to change the value of the control's window handle. Unlike the Handle property, reading the value of WindowHandle doesn't automatically create a valid handle. Reading WindowHandle can return a zero value. + + +Occurs when an object with custom alignment is aligned. +OnAlignInsertBefore occurs for each pair of child controls with an Align property of alCustom. +It can determine the order in which custom-aligned child controls are placed. OnAlignInsertBefore returns true if C2 should be presented before C1, and false otherwise. It holds a TAlignInsertBeforeEvent type. +CustomAlignInsertBefore triggers the OnAlignInsertBefore event. If this event is defined, CustomAlignInsertBefore returns the value returned by OnAlignInsertBefore. Defining this event allows users to define the order of control alignment without overriding CustomAlignInsertBefore. + + +Occurs when an object with custom alignment is aligned. +OnAlignPosition occurs when child controls with an Align property of alCustom are aligned. +CustomAlignPosition triggers the OnAlignPosition event. If this event is defined, CustomAlignPosition uses the alignment parameters it obtains from OnAlignPosition. Defining this event allows users to set the alignment parameters without overriding CustomAlignPosition. It holds a TAlignPositionEvent type. +These are the parameters: + + + + + +Parameter + +Meaning + + + +NewLeft | NewTop | NewWidth | NewHeight + + + +Location and size of child control, as determined by container's size and the Anchors TControl_Anchors constraints for the control. OnAlignPosition can modify these values to reposition the control. + + + + +AlignRect + + + +The client area in which the control is aligned. OnAlignPosition can modify this value. + + + + +AlignInfo + + + +Alignment information in a TAlignInfo. + + + + +As implemented in TWinControl, OnAlignPosition does nothing. + + + + + + + + +Occurs when another control is docked to the control. +Write code in the OnDockDrop event to perform actions when another control is docked on the control. +OnDockDrop can only occur if DockSite is true. +OnDockDrop is an event handler of type Vcl.Controls.TDockDropEvent. + + +Occurs when another control is dragged over the control. +Write code in the OnDockOver event to indicate whether a dockable control that is dragged over the windowed control can be accepted as a dock client. OnDockOver occurs after the TDragDockObject has been initialized by an OnGetSiteInfo event. +OnDockOver occurs only if DockSite is true. + + +Occurs when a control receives the input focus. +Use the OnEnter event handler to cause any special processing to occur when a control becomes active. +The OnEnter event does not occur when switching between forms or between another application and the application that includes the control. +When switching between controls in separate container controls such as the TPanel and the TGroupBox controls, an OnEnter event occurs for the container before the OnEnter event of the contained control. +Similarly, an OnExit event of the container occurs after the OnExit event of the control in a container when focus moves to another control outside the container. +For example, consider a form with an OK button and a group box that contains three radio buttons, where focus is currently on the OK button. When the user clicks one of the radio buttons, an OnExit event of the button occurs, followed by an OnEnter event on the group box, and finally an OnEnter event on the radio button that was clicked. If the user then clicks on the OK button, an OnExit event for the radio button occurs followed by an OnExit event for the group box, and then the button's OnEnter event occurs. +OnEnter is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the input focus shifts away from one control to another. +Use the OnExit event handler to provide special processing when the control ceases to be active. +The OnExit event does not occur when switching between forms or between another application and your application. +When switching between controls in separate container controls such as the TPanel and the TGroupBox controls, an OnExit event occurs for the control inside the container before the OnExit event of the container. +Similarly, an OnEnter event of the container occurs before the OnEnter event of the control in a container when the focus moves to a control inside a container. +For example, consider a form with an OK button and a group box that contains three radio buttons, where the focus is currently on the OK button. When the user clicks one of the radio buttons, an OnExit event on the button occurs, followed by an OnEnter event on the group box, and finally an OnEnter event on the radio button that was clicked. If the user then clicks the OK button, an OnExit event for the radio button occurs followed by an OnExit event for the group box, and then the button's OnEnter event occurs. + +Note: In some control classes, the ActiveControl property updates before the OnExit event occurs. +OnExit is an event handler of type TNotifyEvent. + + +Returns the control's docking information. +Write code in the OnGetSiteInfo event handler to initialize a TDragDockObject with information about where a dragged object can be docked, if at all. OnGetSiteInfo occurs before the OnDockOver event. +OnGetSiteInfo occurs only if DockSite is true. +OnGetSiteInfo is an event handler of type Vcl.Controls.TGetSiteInfoEvent. See TGetSiteInfoEvent for a description of the parameters. + + +Occurs when a user presses any key while the control has focus. +Use the OnKeyDown event handler to specify special processing to occur when a key is pressed. The OnKeyDown handler can respond to keyboard keys, including function keys and keys combined with the SHIFT, ALT, and CTRL keys, and pressed mouse buttons. + +Note: TCheckBox does not fire OnKeyDown events for arrow keys. +OnKeyDown is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTRL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. + + +Occurs when a key is pressed. +Use the OnKeyPress event handler to make something happen as a result of a single character key press. +The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that do not correspond to an ASCII Char value (SHIFT or F1, for example) do not generate an OnKeyPress event. Key combinations (such as SHIFT+A) generate only one OnKeyPress event (for this example, SHIFT+A results in a Key value of "A" if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the OnKeyDown or OnKeyUp event handler. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTROL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. +OnKeyPress is an event handler of type Vcl.Controls.TKeyPressEvent. + + +Occurs when the user releases a key that was pressed. +Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, keys that represent characters, function keys, and keys combined with the SHIFT, ALT, and CTRL keys. +If Key is set to #0, any further processing of the OnKeyUp event will be prevented. +OnKeyUp is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. + + +Occurs when the application tries to undock a control that is docked to the windowed control. +Write an OnUnDock event handler to adjust the windowed control when a dock client is undocked. The OnUnDock event handler can make any necessary adjustments, or it can block the undock attempt by setting the Allow parameter to false. +OnUnDock is an event handler of type Vcl.Controls.TUnDockEvent. + + + + + + +Creates an instance of TWinControl. +Call Create to construct and initialize a new control and insert the newly-constructed control into its owner, as specified by the AOwner parameter. Create inserts the control in the owner by calling the owner's InsertComponent method. +Most controls override Create to initialize their unique properties. Objects that override the Create method must always call the inherited Create method first, and then proceed with the component-specific initialization. Specify the override directive when overriding the Create method. +If a component's Create method allocates resources or memory, override the Destroy method to free those resources. + + + + + + + + + + + + +Creates and initializes a control as the child of a specified non-VCL window. +Call CreateParentedControl to embed a new control in a non-VCL parent. +CreateParentedControl allocates memory for a new instance of the same class as the control (Delphi) or is the class specified by the vmt parameter (C++), sets its ParentWindow property to ParentWindow, and calls the constructor, passing in nil (Delphi) or NULL (C++) for the Owner parameter. CreateParentedControl returns the newly created control. +CreateParentedControl has the same purpose as CreateParented, but is a simple class function instead of a constructor. Unlike CreateParented, CreateParentedControl can be called from C++ code. + + + + + +Destroys an instance of TWinControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TWinControl reference is not nil, and only then calls Destroy. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Sends a message to each of the child controls. +Use Broadcast when you want to send the same message to each of the child controls contained within the windowed control. Specify the message to be passed as the value of the Message parameter. + + + + + + +Indicates whether a control can receive focus. +Call CanFocus to find out if the control can receive input from the user. +CanFocus returns true if both the control and its parent(s) have their Visible and Enabled properties set to true. If any of the Visible and Enabled properties of the control or the controls in which it is contained are not true, then CanFocus returns false. + + + + + + + +Indicates whether a specified control exists within the control. +Use ContainsControl to find out if a particular control exists within this control. ContainsControl returns true if the specified value of the Control parameter is a child control of this control. The Control parameter need not be an immediate child (in the Controls property), but may be contained in a child of the control, or in a child of a child of the control, for indefinitely many levels deep. +If the method returns false, the specified control is not within the control. + + + + + + + + False + + + + + False + + + + + +Returns the child control located at a specified position within the control. +Use ControlAtPos to determine which child control is at the specified location within the control. ControlAtPos returns an immediate child of the control; that is, one of the entries of the Controls property, that has this control for its Parent property. +Specify the position in client coordinates as the value of the Pos parameter. Pos can be anywhere within the boundaries of the child control, not just the upper left corner. +The AllowDisabled parameter determines whether the search for controls includes disabled controls. +The AllowWinControls parameter determines whether descendants of TWinControl are considered when looking for the child control. +If there is no control that matches the AllowDisabled and AllowWinControls parameters at the specified position, ControlAtPos returns nil (Delphi) or NULL (C++). + + + + + + +Provides message handling for all messages that the control does not fully process by itself. +Override DefaultHandler to change the default message handling for the control. The Message parameter can be cast to a TMessage type, to obtain the WParam, LParam, and Result of the message. If the Result of the message is non-zero, the message has already been handled. Set the Result field to a non-zero value to prevent further processing of the message by the inherited method. + +Note: In Delphi code, calling inherited in a message-handling method results in a call to the ancestor's DefaultHandler method unless that ancestor specifies an explicit handler for the message. +TWinControl overrides the TControl DefaultHandler method to handle messages for all its descendant types. DefaultHandler passes any otherwise-unhandled messages to the control's window procedure using the CallWindowProc API function. + + + +Disables the realignment of child controls. +Call DisableAlign to temporarily prevent child controls from realigning. For example, while performing multiple manipulations of controls, such as reading from a form file or scaling, performance improves if child controls are not realigned until all manipulations are complete. The EnableAlign method restores normal child realignment. +Every call to DisableAlign must be followed by a matching call to EnableAlign. If an exception could be raised after the call to DisableAlign, use an exception block to ensure that EnableAlign will always be called. +DisableAlign/EnableAlign call sequences can be nested. An internal counter records the level of nesting. As long as the counter is positive, realignment is disabled and the AlignDisabled property returns true. Once the counter returns to zero, realignment is enabled and AlignDisabled returns false. + + +Specifies the number of controls that are docked on the windowed control. +Use DockClientCount to get the number of controls that are docked to the windowed control. This value can be used as an upper bound when iterating through the DockClients property. + +Note: The DockClients property can contain controls that are not visible. To get the number of docked clients that are visible, use the VisibleDockClientCount property instead. + + + + + + + + +Generates an OnDockDrop event. +DockDrop is called automatically when a control is docked to the windowed control. It instructs the control that is being dropped to prepare for the dock operation and then generates an OnDockDrop event. +Although you can override DockDrop to perform actions in addition to the generated OnDockDrop event, typically descendant classes override the DoAddDockClient method instead. This is because DoAddDockClient is called by the client after it has performed its own preparations, but before the OnDockDrop event. +DockDrop is called only if DockSite is True. + + +Specifies whether the control can be the target of drag-and-dock operations. +Set DockSite to true to allow other controls to be docked to this windowed control. + +Code Examples +Docking (Delphi) +Docking (C++) + + + + + +Specifies the control's docking manager interface. +Use DockManager to specify the control's docking manager. The docking manager handles the layout of docking zones (where controls are docked) and any painting associated with docking zones. +If you set DockSite and UseDockManager to true, but do not assign a value to DockManager, the windowed control generates a default docking manager, using the global DefaultDockTreeClass variable. + + +Determines whether the control's image is rendered directly to the window or painted to an in-memory bitmap first. +When DoubleBuffered is false, the windowed control paints itself directly to the window. When DoubleBuffered is true, the windowed control paints itself to an in-memory bitmap that is then used to paint the window. Double buffering reduces the amount of flicker when the control repaints, but is more memory intensive. +When a windowed control is a dock site and has an associated dock manager, it must be double-buffered. + +Note: Some controls, such as TRichEdit, can't paint themselves into a bitmap. For such controls, DoubleBuffered must be set to false. + + +Decrements the reference count incremented by the DisableAlign method, eventually realigning the child controls. +Call EnableAlign to allow child controls within the control to realign again after they were prevented from realigning by a call to DisableAlign. +Each time the DisableAlign method is called, it increments a reference count. Each time EnableAlign is called, it decrements the same reference count. When the reference count reaches zero, EnableAlign calls the Realign method to perform any pending realignments. +Be sure to pair each call to DisableAlign with a call to EnableAlign. If an exception could be raised after the call to DisableAlign, use an exception block to ensure that the corresponding call to EnableAlign is executed. + + + + + + + +Returns a child control given its name. +Call FindChildControl to locate a specified child control. FindChildControl searches the control's children and returns the control with the specified name. If no child controls match the specified name, FindChildControl returns nil (Delphi) or NULL (C++). + +Note: FindChildControl only locates immediate children of the control. It can't find a control that is a child of one of the control's children. + + + + + +Reverses the positions of child controls. +Call FlipChildren to flip the control's children; that is, to move children on the left side of the control to the right side and vice versa. FlipChildren reverses the position of all child controls and adjusts their Align properties, if necessary, to enforce the new position. +AllLevels specifies whether FlipChildren should be called recursively on the control's children. +FlipChildren can be used to reverse the layout of an application when it is running in Middle Eastern locales where users read from right to left instead of left to right: Call UseRightToLeftAlignment to determine whether the BiDiMode property dictates a reversal of alignment based on the system locale. + +Note: FlipChildren does the same thing as the Flip Children command on the control's context menu in the IDE. + + + + + +Determines whether the control has input focus. +Use the Focused method to see if the control is the active control. When Focused returns true, the control has the input focus. If Focused returns false, the user cannot interact with the control. + + + + + + + +Calls a specified method for each child of the control. +GetChildren is called by the streaming system that loads and saves components. Applications seldom need to call this routine. +GetChildren executes the callback specified by the Proc parameter for every child control listed by the Controls property that lists the Root parameter as its Owner. +Override GetChildren to limit or augment which child controls are saved with the control. When overriding GetChildren, call the procedure passed as the Proc parameter for every child control that should be saved. The Root parameter indicates the component (usually a form) that owns the control. + + + + + + +Builds a list of owned controls. +Call GetTabControlList to construct a list of child controls. +GetTabControlList iterates through the control's internal tab order list, adding each of the child controls to List. The result is a list of all the owned controls in TabOrder. + + + + + + +Builds a list of controls in tab order. +Call GetTabOrderList to construct a list of child controls in tab order. +GetTabOrderList iterates through the control's internal tab order list, adding each of the child controls to List, including any controls contained in those controls. The result is a list of all the controls and their owned controls, in tab order. +The FindNextControl method calls GetTabOrderList to build a complete list of the controls that FindNextControl uses to locate the next control in the tab order. + + + + + + +Reports whether a screen object handle exists for the control. +Query HandleAllocated to find out if the control's underlying screen object has been generated. +If the screen object exists, HandleAllocated returns true. If the screen object does not exist, HandleAllocated returns false. Testing the Handle property of a control directly causes the window to be created if it does not already exist. Call the HandleAllocated method to determine whether a window exists without creating one as a side effect. + + + +Creates a screen object for the control if it doesn't already exist. +Call HandleNeeded to create a screen object for the control. +If the screen object does not exist, HandleNeeded calls the CreateHandle method for the parent of the control before it creates a screen object for this control. + + + + + + +Inserts a control into the Controls array property. +Applications should not need to call InsertControl directly. Child controls are automatically inserted and removed when added or deleted at design time. At run time, use the Parent property of the child control to insert it in the Controls array. If the child control is already the child of another control, setting the Parent property ensures that the child is removed from the Controls of the original parent. +InsertControl makes the inserted control a child, and the containing control the parent. The AControl parameter is the child control that is inserted into the Controls array. + + + +Schedules a control repaint. +Invalidate informs a control that its entire surface needs to be repainted. Calling Invalidate can prevent flicker caused by a series of partial repaints. There is no performance penalty for calling Invalidate multiple times before the control is actually repainted. +The actual repaint does not occur until the control is updated. To force an immediate repaint, call Repaint instead. + + + + + + + + +Draws the windowed control to a device context. +Call PaintTo to draw the control on a device context. Specify the device context as the value of the DC parameter and specify the X and Y coordinates on the device context where the top-left corner of the windowed control is to be drawn. PaintTo first erases the background of the device context and then paints the control. +PaintTo is useful for drawing an image of the control into a bitmap DC. + +Warning: When using PaintTo to draw on a canvas, you must lock the canvas first (and unlock it after the call to PaintTo. If you do not lock the canvas, Windows calls that occur while the control is painting can cause the canvas to lose its handle. + + + + + + + +Draws the windowed control to a device context. +Call PaintTo to draw the control on a device context. Specify the device context as the value of the DC parameter and specify the X and Y coordinates on the device context where the top-left corner of the windowed control is to be drawn. PaintTo first erases the background of the device context and then paints the control. +PaintTo is useful for drawing an image of the control into a bitmap DC. + +Warning: When using PaintTo to draw on a canvas, you must lock the canvas first (and unlock it after the call to PaintTo. If you do not lock the canvas, Windows calls that occur while the control is painting can cause the canvas to lose its handle. + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Returns False, no matter the value of Msg. +As a member of the TWinControl class, PreProcessMessage always returns False, no matter the value of Msg. + +Note: When overriding PreProcessMessage in descendant classes, we recommend to implement it such that it returns True if Msg is a preprocess message, and False otherwise. + + + + + +Removes a specified control from the Controls array. +RemoveControl removes a child control from the Controls property. After calling RemoveControl, the control is no longer the parent of the child specified by the AControl parameter. +Applications should not call RemoveControl directly. Child controls are automatically inserted and removed when added or deleted at design time. At runtime, use the Parent property of the child control to remove it from the Controls array. + + + +Forces the control to realign children. +The EnableAlign method calls Realign when the reference count reaches zero. It adjusts the size and position of any child controls according to their Align properties. +If all of the child controls have their Align properties set to alNone, Realign has no effect. + + + +Repaints the entire control. +Call Repaint to repaint the control. +As implemented in TWinControl, Repaint calls the Invalidate method and then the Update method to repaint the control. + + + + + + + +Rescale control and its children. +ScaleBy resizes a control without moving its upper left corner. This is similar to changing the Height and Width properties, but the control also attempts to rescale and rearrange any child controls to maintain their relative size and placement. +The M and D parameters define a multiplier and divisor by which to scale the control. For example, to make a control 75% of its original size, specify the value of M as 75, and the value of D as 100. Any pair of values that has the same ratio has the same effect. Thus M = 3 and D = 4 also makes the control 75% of its previous size. +To rescale the control's children without rescaling the control itself, use ScaleControls. + + + + + + + +Scroll control contents. +Call ScrollBy to scroll the contents within the control. While ScrollBy can be used for any TWinControl, it makes the most sense to use it for descendants of TScrollingWinControl. +Applications seldom need to call the ScrollBy method unless they implement their own scrolling interface rather than relying on a scroll bar. +The DeltaX parameter is the change in pixels along the X axis. A positive DeltaX value scrolls the contents to the right; a negative value scrolls the contents to the left. The DeltaY parameter is the change in pixels along the Y axis. A positive DeltaY value scrolls the contents down; a negative value scrolls the contents up. + + + + + + + + + +Sets the windowed control's boundary properties all at once. +Use SetBounds to change all of the control's boundary properties at once. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately. By setting all four properties at once, SetBounds ensures that the control will not repaint between changes +Specify the values for the Left, Top, Width, and Height properties as the value of the ALeft, ATop, AWidth, and AHeight parameters, respectively. + + + + + + +Makes a control visible at design time. +Vcl.Controls.TWinControl.SetDesignVisible inherits from Vcl.Controls.TControl.SetDesignVisible. All content below this line refers to Vcl.Controls.TControl.SetDesignVisible. +Makes a control visible at design time. +SetDesignVisible is used internally by Delphi during form design. + + + +Gives the input focus to the control. +Use SetFocus to change input focus to the control. When a control has focus, it receives keyboard events. + + + +Forces the control to update. +Update repaints any part of the control surface that is out of date. Normally, updates occur automatically, but an Update call may be necessary before lengthy processing that might interfere with automatic updates. Calling Update unnecessarily can increase overhead and cause screen flicker. +Update only repaints areas of the control the have been determined to be out of date. To force immediate repainting of the entire control, call the Repaint method. To notify a control that it is out of date (without forcing an immediate repaint), call the Invalidate method. + + + +Respond to state change. +UpdateControlState is called automatically when any display change occurs that might affect the internal state of the control. +As implemented in TWinControl, UpdateControlState climbs the chain of parent controls to verify that each control in the chain has Showing equal to true. If this is the case, UpdateControlState makes sure that the Showing property is accurate for this control and for all its descendants. Descendant classes can extend this behavior. + + + +Call LockDrawing method to prevent changes in that control from being redrawn. To resume redrawing call UnlockDrawing method. If to recreate a window handle after a LockDrawing call, the control will remain locked until the corresponding UnlockDrawing call. +LockDrawing / UnlockDrawing calls may be nested. + + + +Call UnlockDrawing method to allow changes in that control to be redrawn. +LockDrawing / UnlockDrawing calls may be nested. + + +Indicates child control realignment disabled. +AlignDisabled returns true if child control realignment has been temporarily disabled by a call to DisableAlign. + + +Indicates whether the mouse pointer is currently in the client area of the control. +Use MouseInClient to check whether the mouse pointer is currently located in the client area of the control. MouseInClient is also used internally to fire the OnMouseEnter and OnMouseLeave events. + + +Specifies the number of visible controls that are docked on the windowed control. +Use VisibleDockClientCount to determine the number of controls in the DockClients list that have a Visible property value of true. This value is less than or equal to the value of DockClientCount. + + +Determines the color and pattern used for painting the background of the control. +The Brush property accesses the TBrush object that determines pattern and color for the control background. Brush is a read-only property, but an application can manipulate the TBrush object by setting its properties or by using its Assign method. + + + +Returns the number of child controls. +Read ControlCount when iterating over all the children of this control. The children of the control are listed in the Controls property array. +ControlCount is a read-only property. + +Note: The value of ControlCount is always 1 greater than the highest Controls index, because the first Controls index is 0. + +Provides access to the underlying Windows screen object for the control. +The Handle property returns the window handle for the underlying Microsoft Windows screen object. Use the Handle property to bypass the VCL API and directly access the underlying window. +Do not refer to the Handle property during component creation or streaming. The underlying window does not exist until the first time the Handle property is referenced. When this occurs, the HandleNeeded method is called automatically. +Handle is a read-only property. + +Note: On Win64, the size of HANDLE types has changed to 64-bits --except for OLE_HANDLE, which is now a 32bit Long even in Win64. This means that you need to change any code that assumed OLE_HANDLE and other HANDLE types are interchangeable. See also http://stackoverflow.com/questions/401812/what-is-the-proper-way-to-cast-from-an-ole-handle-to-an-hicon. + +Specifies the padding of a control. +Use Padding to specify the padding of a control. This value is an instance of the class TPadding. + + +ParentDoubleBuffered defers the DoubleBuffered property of this component to the value of the parent's DoubleBuffered property. +ParentDoubleBuffered is a boolean indicating that the DoubleBuffered property of this component is overridden by the value of the parent's DoubleBuffered property. + + + + +Reference to parent's underlying control. +ParentWindow refers to the window handle that underlies the parent control. To designate a non-VCL control as a parent, assign that control's handle to ParentWindow. This assignment causes the control to be moved into the parent's screen area. Setting ParentWindow has no effect if Parent is not nil (Delphi) or NULL (C++). +TActiveXControl objects use ParentWindow to insert a control in an ActiveX container window. ParentWindow is set automatically when a control is constructed with a call to CreateParented (Delphi) or the appropriate overloaded constructor (C++). +Use ParentWindow with windowed controls that are packaged in a DLL. This allows references to the control by applications based on other applications. + + +Indicates whether the control is showing on the screen. +Showing is used internally to optimize the allocation of Windows resources. Use Showing to determine when you must allocate resources that are required when the control is visible. When Showing is false, the control is not visible and you can delay the allocation of resources. +If the Visible properties of a component and all the parents in its parent hierarchy are true, Showing is guaranteed to be true. If one of the parents containing the control has a Visible property value of false, Showing may be either true or false. +Showing is a read-only property. + + +IsDrawingLocked property returns True when redrawing for this control is locked. It is True when the number of LockDrawing calls is less than UnlockDrawing calls for this control. + + +RedrawDisabled property returns True when redrawing for this control is locked. It is similar to IsDrawingLocked, but uses Win32 API to determine when a Win32 window redrawing is disabled. +For example, when a parent control redrawing is locked using LockDrawing, then IsDrawingLocked returns True for parent control and False for child control. RedrawDisabled returns True for both parent and child controls. + + +Indicates the position of the control in its parent's tab order. +TabOrder is the order in which child windows are visited when the user presses the Tab key. The control with the TabOrder value of 0 is the control that has the focus when the form first appears. +Initially, the tab order is always the order in which the controls were added to the form. The first control added to the form has a TabOrder value of 0, the second is 1, the third is 2, and so on. Change this by changing the TabOrder property. +Each control has a unique tab-order value within its parent. If you change the TabOrder property value of one control to be the same as the value of a second control, the TabOrder value for all the other controls changes. For example, suppose a control is sixth in the tab order. If you change the control's TabOrder property value to 3 (making the control fourth in the tab order), the control that was originally fourth in the tab order now becomes fifth, and the control that was fifth becomes sixth. +Assigning TabOrder a value greater than the number of controls contained in the parent control moves the control to the end of the tab order. The control does not take on the assigned value of TabOrder, but instead is given the number that assures the control is the last in the tab order. + +Note: TabOrder is meaningful only if the TabStop property is True and if the control has a parent. (The TabOrder property of a form is not used unless the form is the child of another form.) A control with a TabOrder of -1 has no parent, and therefore cannot be reached by pressing the Tab key. To remove a parented control from the Tab order, set its TabStop property to False. + +Determines whether the user can tab to a control. +Use the TabStop to allow or disallow access to the control using the Tab key. +If TabStop is True, the control is in the tab order. If TabStop is False, the control is not in the tab order and the user cannot press the TAB key to move to the control. + +Note: TabStop is not meaningful for a form unless the form assigns another form to be its parent. + +Specifies whether the docking manager is used in drag-and-dock operations. +Use UseDockManager to get or set whether a docking manager is used in drag-and-dock operations. +The docking manager handles the positioning of docked controls and any painting of docking zones around those controls. If you do not use a docking manager, docked controls are aligned to the windowed control based on the closest edge to where they are released. When you do not use a docking manager, there is no region for a user to grab to automatically undock a docked control. + + + +TWinControl is the base class for all controls that are wrappers for Microsoft Windows screen objects. +TWinControl provides the common functionality for all controls that act as wrappers for Microsoft Windows screen objects ("windows"). Controls that are wrap underlying windows have the following features: + +The control can incorporate the functionality of an underlying window. For example, if the underlying screen object is a text editor, the control can incorporate the editor ability to manage and display a text buffer. +The control can receive user input focus. The focused control can handle keyboard input events. Some controls change their appearance when they have the focus. For example, button controls typically indicate the focus by drawing a rectangle around the caption. +The control can serve as a container for other controls, referred to as child controls. This relationship is signified by the child's Parent property. Container controls provide important services to their children, including display services for controls that do not implement their own canvases. Examples of container controls include forms, panels, and toolbars. +Controls based on TWinControl can display standard screen objects provided by Microsoft Windows, or customized screen objects developed by the VCL programmer. +Descendants of TWinControl include abstract base classes that support most kinds of user interface objects. The most significant descendant is TCustomControl, which provides code to implement a canvas and handle paint messages. Other important abstract descendants include TScrollingWinControl, TButtonControl, TCustomComboBox, TCustomEdit, and TCustomListBox. When defining new control classes, consider these descendants before deriving directly from TWinControl. +Every TWinControl object has a Handle property which provides the window handle for the underlying Microsoft Windows screen object. Use the Handle property to bypass the VCL API and directly access the underlying window. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + + + +Renders the image of the control on a specified device context. +PaintWindow is called automatically when a custom control receives a WM_PAINT message. PaintWindow assigns the device context specified by the DC parameter to the custom control's canvas, calls the Paint method, and finally removes the device context. Override PaintWindow to provide additional responses to the WM_PAINT message. To draw the image of the control, override the Paint method instead. + + +Specifies the TCanvas object that presents a drawing surface for the control. +Use the properties of the TCanvas object to draw or paint on the surface of the control. Canvas encapsulates a Windows device context, providing all the tools and methods needed for drawing and painting. +Canvas is a protected property that is usually redeclared as public in descendants of TCustomControl. + + + + + + +Creates an instance of TCustomControl. +Calling Create constructs and initializes an instance of TCustomControl. However, you should never attempt to instantiate a TCustomControl. This class is intended solely as a base class from which other control classes descend and you should only call Create to instantiate one of these descendants. Controls placed on forms at design time are created automatically. +After calling the inherited constructor, Create initializes the control and also a TCanvas object for its Canvas property. +When overriding Create, always call the inherited Create method first, then proceed with the control's initialization. Remember to specify the override directive when overriding the Create method. + +Note: If a component's constructor allocates resources or memory, also override the destructor to free those resources. + + + + +Destroys an instance of TCustomControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it destroys the TCanvas object in its Canvas property. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + +Base class for controls that wrap Windows screen objects but perform their own rendering. +In most descendants of TWinControl, the job of drawing the control's surface belongs to the underlying Windows screen object. If a control has visible features that cannot be rendered by a Windows screen object, it requires access to a canvas object so it can do its own drawing. +TCustomControl is one of two base classes for controls that draw their own surfaces. Because TCustomControl is descended from TWinControl, instances of its descendants can receive focus and serve as containers. +Classes of controls that perform their own screen rendering and do not need the features of TWinControl should be descendants of TGraphicControl instead of TCustomControl. TGraphicControl objects can render themselves with less overhead, because they do not have underlying Windows screen objects. +TCustomControl objects have a Paint method, which is called whenever the control needs to render its image. Custom controls paint themselves using the Canvas property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TDockZone encapsulates a region into which other zones are contained. + A TDockZone can be a parent to other zones (when FChildZones <> nil) or + can contain only a control (when FChildControl <> nil). A TDockZone also + stores pointers to previous and next siblings and its parent. Parents + store a pointer to only the first child in a doubly-linked list of child + zones, though each child maintains a pointer to its parent. Thus, the + data structure of relating TDockZones works out to a kind of a + doubly-linked list tree. The FZoneLimit field of TDockZone represents + the coordinate of either the left or bottom of the zone, depending on + whether its parent zone's orientation is doVertical or doHorizontal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TDockZone encapsulates a region into which other zones are contained. + A TDockZone can be a parent to other zones (when FChildZones <> nil) or + can contain only a control (when FChildControl <> nil). A TDockZone also + stores pointers to previous and next siblings and its parent. Parents + store a pointer to only the first child in a doubly-linked list of child + zones, though each child maintains a pointer to its parent. Thus, the + data structure of relating TDockZones works out to a kind of a + doubly-linked list tree. The FZoneLimit field of TDockZone represents + the coordinate of either the left or bottom of the zone, depending on + whether its parent zone's orientation is doVertical or doHorizontal. + + + + + + + + + TDockZone encapsulates a region into which other zones are contained. + A TDockZone can be a parent to other zones (when FChildZones <> nil) or + can contain only a control (when FChildControl <> nil). A TDockZone also + stores pointers to previous and next siblings and its parent. Parents + store a pointer to only the first child in a doubly-linked list of child + zones, though each child maintains a pointer to its parent. Thus, the + data structure of relating TDockZones works out to a kind of a + doubly-linked list tree. The FZoneLimit field of TDockZone represents + the coordinate of either the left or bottom of the zone, depending on + whether its parent zone's orientation is doVertical or doHorizontal. + + + + + + + + + TDockZone encapsulates a region into which other zones are contained. + A TDockZone can be a parent to other zones (when FChildZones <> nil) or + can contain only a control (when FChildControl <> nil). A TDockZone also + stores pointers to previous and next siblings and its parent. Parents + store a pointer to only the first child in a doubly-linked list of child + zones, though each child maintains a pointer to its parent. Thus, the + data structure of relating TDockZones works out to a kind of a + doubly-linked list tree. The FZoneLimit field of TDockZone represents + the coordinate of either the left or bottom of the zone, depending on + whether its parent zone's orientation is doVertical or doHorizontal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TDockTree serves as a manager for a tree of TDockZones. It is responsible + for inserting and removing controls (and thus zones) from the tree and + associated housekeeping, such as orientation, zone limits, parent zone + creation, and painting of controls into zone bounds. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TDockZone encapsulates a region into which other zones are contained. + A TDockZone can be a parent to other zones (when FChildZones <> nil) or + can contain only a control (when FChildControl <> nil). A TDockZone also + stores pointers to previous and next siblings and its parent. Parents + store a pointer to only the first child in a doubly-linked list of child + zones, though each child maintains a pointer to its parent. Thus, the + data structure of relating TDockZones works out to a kind of a + doubly-linked list tree. The FZoneLimit field of TDockZone represents + the coordinate of either the left or bottom of the zone, depending on + whether its parent zone's orientation is doVertical or doHorizontal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TDockZone encapsulates a region into which other zones are contained. + A TDockZone can be a parent to other zones (when FChildZones <> nil) or + can contain only a control (when FChildControl <> nil). A TDockZone also + stores pointers to previous and next siblings and its parent. Parents + store a pointer to only the first child in a doubly-linked list of child + zones, though each child maintains a pointer to its parent. Thus, the + data structure of relating TDockZones works out to a kind of a + doubly-linked list tree. The FZoneLimit field of TDockZone represents + the coordinate of either the left or bottom of the zone, depending on + whether its parent zone's orientation is doVertical or doHorizontal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An enumerated type defining values for TMouse.WheelRouting + + + + + Mouse wheel input is delivered to the app with focus. + This value is means the Windows Mouse setting + "Scroll inactive windows when I hover over them" is On + + + + + + + Mouse wheel input is delivered to the app with focus (desktop apps) + or the app under the mouse cursor (Windows Store apps) + + + + + + + Mouse wheel input is delivered to the app under the mouse cursor. + This value is means the Windows Mouse setting + "Scroll inactive windows when I hover over them" is On + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WheelRouting gives the value used to indicate how Windows will treat mouse wheel messages, + whether they go to the focused application, the application under the mouse cursor etc. + This can be changed in the Windows UI in the Mouse settings applet using the + "Scroll inactive windows when I hover over them" setting. + + + + + + + + $4 + + + + + $4 + + + + + $4 + + + + + $A + + + + + $4 + + + + + + + + + + $FFFF + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Dialogs.xml b/Modules/DelphiVCL/doc/Vcl.Dialogs.xml new file mode 100644 index 00000000..0ad47b30 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Dialogs.xml @@ -0,0 +1,10704 @@ + + + + $10 + + + + + ofReadOnly + + + + + ofOverwritePrompt + + + + + ofHideReadOnly + + + + + ofNoChangeDir + + + + + ofShowHelp + + + + + ofNoValidate + + + + + ofAllowMultiSelect + + + + + ofExtensionDifferent + + + + + ofPathMustExist + + + + + ofFileMustExist + + + + + ofCreatePrompt + + + + + ofShareAware + + + + + ofNoReadOnlyReturn + + + + + ofNoTestFileCreate + + + + + ofNoNetworkButton + + + + + ofNoLongNames + + + + + ofOldStyleDialog + + + + + ofNoDereferenceLinks + + + + + ofEnableIncludeNotify + + + + + ofEnableSizing + + + + + ofDontAddToRecent + + + + + ofForceShowHidden + + + + + ofExNoPlacesBar + + + + + prAllPages + + + + + prSelection + + + + + prPageNums + + + + + poPrintToFile + + + + + poPageNums + + + + + poSelection + + + + + poWarning + + + + + poHelp + + + + + poDisablePrintToFile + + + + + psoDefaultMinMargins + + + + + psoDisableMargins + + + + + psoDisableOrientation + + + + + psoDisablePagePainting + + + + + psoDisablePaper + + + + + psoDisablePrinter + + + + + psoMargins + + + + + psoMinMargins + + + + + psoShowHelp + + + + + psoWarning + + + + + psoNoNetworkButton + + + + + pkDotMatrix + + + + + pkHPPCL + + + + + ptEnvelope + + + + + ptPaper + + + + + pmDefault + + + + + pmMillimeters + + + + + pmInches + + + + + mtWarning + + + + + mtError + + + + + mtInformation + + + + + mtConfirmation + + + + + mtCustom + + + + + mbYes + + + + + mbNo + + + + + mbOK + + + + + mbCancel + + + + + mbAbort + + + + + mbRetry + + + + + mbIgnore + + + + + mbAll + + + + + mbNoToAll + + + + + mbYesToAll + + + + + mbHelp + + + + + mbClose + + + + + fsEdit + + + + + fsComboBox + + + + + cdFullOpen + + + + + cdPreventFullOpen + + + + + cdShowHelp + + + + + cdSolidColor + + + + + cdAnyColor + + + + + fdAnsiOnly + + + + + fdTrueTypeOnly + + + + + fdEffects + + + + + fdFixedPitchOnly + + + + + fdForceFontExist + + + + + fdNoFaceSel + + + + + fdNoOEMFonts + + + + + fdNoSimulations + + + + + fdNoSizeSel + + + + + fdNoStyleSel + + + + + fdNoVectorFonts + + + + + fdShowHelp + + + + + fdWysiwyg + + + + + fdLimitSize + + + + + fdScalableOnly + + + + + fdApplyButton + + + + + fdScreen + + + + + fdPrinter + + + + + fdBoth + + + + + frDown + + + + + frFindNext + + + + + frHideMatchCase + + + + + frHideWholeWord + + + + + frHideUpDown + + + + + frMatchCase + + + + + frDisableMatchCase + + + + + frDisableUpDown + + + + + frDisableWholeWord + + + + + frReplace + + + + + frReplaceAll + + + + + frWholeWord + + + + + frShowHelp + + + + + fdoOverWritePrompt + + + + + fdoStrictFileTypes + + + + + fdoNoChangeDir + + + + + fdoPickFolders + + + + + fdoForceFileSystem + + + + + fdoAllNonStorageItems + + + + + fdoNoValidate + + + + + fdoAllowMultiSelect + + + + + fdoPathMustExist + + + + + fdoFileMustExist + + + + + fdoCreatePrompt + + + + + fdoShareAware + + + + + fdoNoReadOnlyReturn + + + + + fdoNoTestFileCreate + + + + + fdoHideMRUPlaces + + + + + fdoHidePinnedPlaces + + + + + fdoNoDereferenceLinks + + + + + fdoDontAddToRecent + + + + + fdoForceShowHidden + + + + + fdoDefaultNoMiniMode + + + + + fdoForcePreviewPaneOn + + + + + forDefault + + + + + forAccept + + + + + forRefuse + + + + + fsrDefault + + + + + fsrAccept + + + + + fsrRefuse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +Vcl.Dialogs.TOpenDialog.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the value for the inherited Handle property. +The GetHandle protected function gets the value for the Handle property. + + + + + + +Returns the coordinates of the reserved area of the dialog box. +GetStaticRect is provided for components that descend from TOpenDialog and require the placement of new controls alongside the standard ones inherited from the parent class. For Explorer-style dialogs, GetStaticRect returns the size and location of the standard controls within the dialog. For older versions of Windows, or if ofOldStyleDialog is enabled in Options, GetStaticRect returns the client dimensions of the entire dialog box. + + + + + + +Responds to Windows messages sent to the dialog. +Vcl.Dialogs.TOpenDialog.WndProc inherits from Vcl.Dialogs.TCommonDialog.WndProc. All content below this line refers to Vcl.Dialogs.TCommonDialog.WndProc. +Responds to Windows messages sent to the dialog. +WndProc is the main window procedure for the dialog. As implemented in TCommonDialog, it simply calls the Dispatch method, where any message handlers respond to messages before the DefaultHandler method sends them on to the Windows message handler. +Override WndProc to subclass the dialog's window procedure. To add additional message processing without interfering with the existing message handling of the dialog, override MessageHook instead. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates and initializes a TOpenDialog instance. +Create generates a TOpenDialog instance, but the new dialog does not appear on the form at runtime until the Execute method is called. +AOwner is the component that is responsible for freeing the TOpenDialog instance. It becomes the value of the Owner property. + + + + + +Destroys the TOpenDialog and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the TOpenDialog reference is not nil before calling Destroy. + + + + + + + +Displays the file-selection dialog. +Execute opens the file-selection dialog, returning true when the user selects a file and clicks Open. If the user clicks Cancel, Execute returns false. +The code signatures of Execute that appear above are actually overrides of the Execute overloads in the base class Vcl.Dialogs.TCommonDialog.Execute. There is one more overload of Execute for Delphi that appears in the inherited members from TCommonDialog, and this overload takes no input parameters. +The ParentWnd parameter is a window handle of type HWND MSDN. If none is provided, the current form handle is used, accessed from Vcl.Forms.TApplication.ActiveFormHandle in the global variable Vcl.Forms.Application. + + // Delphi: + if OpenDialog1.Execute then + Memo1.Lines.LoadFromFile(OpenDialog1.FileName) + else + Memo1.Lines.Clear; + + // C++: + if (OpenDialog1->Execute()) + Memo1->Lines->LoadFromFile(OpenDialog1->FileName); + else + Memo1->Lines->Clear(); + + +Determines the style of the file-selection dialog. (Obsolete.) +FileEditStyle is maintained for compatibility with older versions of the VCL. It has no effect. + + + + +List of selected file names. +Files is a string list that contains each selected file name with its full directory path. (To let users select multiple file names, set the ofAllowMultiSelect flag in Options.) Use properties and methods for string lists to traverse this list of files and read individual items. +The example below assigns the list of files in Files to the Items property of a TListBox component. + + + +ListBox1.Items.Assign(OpenDialog1.Files); + + + + +ListBox1->Items->Assign(OpenDialog1->Files); + + + + + +Maintains a list of previously selected files. (Obsolete.) +HistoryList is maintained for compatibility with older versions of TOpenDialog. It is not used. + + + + +Specifies a default file extension. +DefaultExt specifies a file extension that is appended automatically to the selected file name, unless the selected file name already includes a registered extension. If the user selects a file name with an extension that is unregistered, DefaultExt is appended to the unregistered extension. +Extensions longer than three characters are not supported. Do not include the period (.) that divides the file name and its extension. + +Code Examples +SavePictureDialog (Delphi) +TApplicationIcon (Delphi) +SavePictureDialog (C++) +TApplicationIcon (C++) + + + + + +Indicates the name and directory path of the last file selected. +The FileName property returns the name and complete directory path of the most recently selected file. The value of FileName is the same as the first item in the Files property. +To make a file name appear by default in the dialog's edit box, assign a value to FileName in the Object Inspector or in program code. Programmatic changes to FileName have no effect while the dialog is active. + +if OpenDialog1.Execute then + Memo1.Lines.LoadFromFile(OpenDialog1.FileName) +else + Memo1.Lines.Clear; + +if (OpenDialog1->Execute()) + Memo1->Lines->LoadFromFile(OpenDialog1->FileName); +else + Memo1->Clear(); + + +Determines the file masks (filters) available in the dialog. +The file-selection dialog includes a drop-down list of file types under the edit box. When the user picks a file type from the list, only files of the selected type are displayed in the dialog. +To configure file masks at design time, click on the ellipsis marks (...) to the right of the Filter property in the Object Inspector. This opens the Filter editor. In the left column of the Filter editor, under Filter Name, type a brief description of each file type that will be available at runtime. In the right column, under Filter, type the file mask corresponding to each description. For example, the description "Text files" might appear to the left of the mask "*.txt", and the description "Pascal source files" might appear to the left of the mask "*.pas". Since the description appears in the drop-down list at runtime, it is often helpful to show the mask explicitly in the description (for example, "Text files (*.txt)"). +To create file masks in program code, assign a value to the Filter property that consists of a description and a mask separated by a vertical bar (pipe) character. Do not include spaces around the vertical bar. For example, + + + +OpenDialog1.Filter := 'Text files (*.txt)|*.TXT'; + + + + +OpenDialog1->Filter = "Text files (*.txt)|*.TXT"; + + + +Multiple filters should be separated by vertical bars. For example, + + + +OpenDialog1.Filter := 'Text files (*.txt)|*.TXT|Pascal files (*.pas)|*.PAS'; + + + + +OpenDialog1->Filter = "Text files (*.txt)|*.TXT|Pascal files (*.pas)|*.PAS"; + + + +To include multiple masks in a single filter, separate the masks with semicolons. This works both in the Object Inspector and in program code. For example, + + + +OpenDialog1.Filter := 'Pascal files|*.PAS;*.DPK;*.DPR'; + + + + +OpenDialog1->Filter = "Pascal files|*.PAS;*.DPK;*.DPR"; + + + +If no value is assigned to Filter, the dialog displays all file types. + + +Determines which filter is selected by default when the dialog opens. +FilterIndex determines which of the file types in Filter is selected by default when the dialog opens. Set FilterIndex to 1 to choose the first file type in the list as the default, or set FilterIndex to 2 to choose the second file type as the default, and so forth. If the value of FilterIndex is out or range, the first file type listed in Filter is the default. + + +Determines the current directory when the dialog opens. +InitialDir determines the default directory displayed in the file-selection dialog when it opens. For example, to point the dialog at the WINDOWS\SYSTEM directory, set the value of InitialDir to C:\WINDOWS\SYSTEM. +If no value is assigned to InitialDir, or if the specified directory does not exist, the initial directory is controlled by the global ForceCurrentDirectory variable. If ForceCurrentDirectory is true, the dialog opens with the current working directory displayed. Otherwise, the dialog opens with either the current working directory or the My Documents directory, depending on the version of Windows. + + +Determines the appearance and behavior of the file-selection dialog. +Use the Options property to customize the appearance and functionality of the dialog. + + +Augments the Options property with additional flags that determine the appearance and behavior of the file-selection dialog. +Use the OptionsEx property to further customize the file open dialog beyond the options covered by the Options property. + + +Specifies the text in the dialog's title bar. +Use Title to specify the text that appears in the file-selection dialog's title bar. If no value is assigned to Title, the dialog has the title "Open". + +Code Examples +TOpenDialogTitle (Delphi) +TOpenDialogTitle (C++) + + + + + +Occurs when the user tries to close the dialog without canceling. +Write an OnCanClose event handler to provide custom validation of the value of FileName. File selection dialogs provide a number of built-in validations, such as checking for invalid characters, prompting for confirmation before overwriting, checking whether a file or path exists, and so on. These validations can be specified using the Options property. However, applications can provide additional validation of file names in an OnCanClose event handler. +Set the CanClose parameter to false to prevent the dialog from closing. The OnCanClose event handler is responsible for telling the user why the dialog doesn't close. + +Note: OnCanClose does not occur under Windows NT 3.51 unless the new shell is installed. + +Occurs when a directory is opened or closed from the dialog. +The OnFolderChange event occurs when the user changes the directory whose contents are displayed in the dialog. This can happen when the user double-clicks a directory, clicks the Up arrow, or uses the list box at the top of the dialog to navigate through the directory structure. +To obtain the path of the currently selected directory, use the ExtractFilePath routine on the FileName property of the Sender. + + +Occurs when file names displayed in the dialog are changed. +The OnSelectionChange event occurs when the user does something to change the list displayed in the dialog. This can include opening the file-selection dialog box, highlighting a file or directory, selecting a new filter, selecting a new directory, or creating a new folder. +The newly selected files can be obtained by reading the value of the FileName or Files properties. The latter property should be consulted if the ofMultiSelect option is included in the dialog's Options. + + +Occurs when the file types displayed in the dialog are changed. +The OnTypeChange event occurs when the user selects a new filter from the Files of Type list box at the bottom of the dialog. + + +Occurs before the dialog adds a file to the file list box. +Write an OnIncludeItem event handler to programmatically filter the items that appear in the shell folder's item list. +This event does not occur unless the Options property includes ofEnableIncludeNotify. + + + +TOpenDialog displays a file-selection dialog. +TOpenDialog displays a modal Windows dialog box for selecting and opening files. The dialog does not appear at runtime until it is activated by a call to the Execute method. When the user clicks Open, the dialog closes and the selected file or files are stored in the Files property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Displays the Save As dialog box. +Execute opens the Save As dialog, returning true when the user selects a file name and clicks Save. If the user cancels the save operation, Execute returns a false value. +The code signatures of Execute that appear above are actually overrides of the Execute overloads in the base class Vcl.Dialogs.TCommonDialog.Execute. There is one more overload of Execute for Delphi that appears in the inherited members from TCommonDialog, and this overload takes no input parameters. +The ParentWnd parameter is a window handle of type HWND MSDN. If none is provided, the current form handle is used, accessed from +Vcl.Forms.TApplication.ActiveFormHandle in the global variable Vcl.Forms.Application. + + // Delphi: + if SaveDialog1.Execute then + Memo1.Lines.SaveToFile(SaveDialog1.FileName); + + // C++: + if (SaveDialog1->Execute()) + Memo1->Lines->SaveToFile(SaveDialog1->FileName); + + + +TSaveDialog displays a "Save As" dialog for saving files. +TSaveDialog displays a modal Windows dialog box for selecting file names and saving files. The dialog does not appear at runtime until it is activated by a call to the Execute method. When the user clicks Save, the dialog closes and the selected file name is stored in the FileName property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Class for Vista and newer Windows operating systems style file open dialogs. +This class extends TCustomFileOpenDialog. It allows creating Microsoft Windows Vista (or newer Windows operating systems) style file open dialogs CLSID_FileOpenDialog and implements the IFileOpenDialog interface. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $1 + + + + + $2 + + + + + $3 + + + + + $4 + + + + + tfEnableHyperlinks + + + + + tfUseHiconMain + + + + + tfUseHiconFooter + + + + + tfAllowDialogCancellation + + + + + tfUseCommandLinks + + + + + tfUseCommandLinksNoIcon + + + + + tfExpandFooterArea + + + + + tfExpandedByDefault + + + + + tfVerificationFlagChecked + + + + + tfShowProgressBar + + + + + tfShowMarqueeProgressBar + + + + + tfCallbackTimer + + + + + tfPositionRelativeToWindow + + + + + tfRtlLayout + + + + + tfNoDefaultRadioButton + + + + + tfCanBeMinimized + + + + + tfSizeToContent + + + + + tcbOk + + + + + tcbYes + + + + + tcbNo + + + + + tcbCancel + + + + + tcbRetry + + + + + tcbClose + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [mbYes..mbNo] + + + + + [mbYes..mbNo,mbCancel] + + + + + [mbYes..mbNo,mbCancel,mbNoToAll..mbYesToAll] + + + + + [mbOK..mbCancel] + + + + + [mbAbort..mbIgnore] + + + + + [mbAbort,mbIgnore] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.ExtCtrls.xml b/Modules/DelphiVCL/doc/Vcl.ExtCtrls.xml new file mode 100644 index 00000000..1360706c --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.ExtCtrls.xml @@ -0,0 +1,42683 @@ + + + + stRectangle + + + + + stSquare + + + + + stRoundRect + + + + + stRoundSquare + + + + + stEllipse + + + + + stCircle + + + + + bsLowered + + + + + bsRaised + + + + + bsBox + + + + + bsFrame + + + + + bsTopLine + + + + + bsBottomLine + + + + + bsLeftLine + + + + + bsRightLine + + + + + bsSpacer + + + + + fsLeftRightTopBottom + + + + + fsRightLeftTopBottom + + + + + fsLeftRightBottomTop + + + + + fsRightLeftBottomTop + + + + + fsTopBottomLeftRight + + + + + fsBottomTopLeftRight + + + + + fsTopBottomRightLeft + + + + + fsBottomTopRightLeft + + + + + ssAbsolute + + + + + ssPercent + + + + + ssAuto + + + + + emAddRows + + + + + emAddColumns + + + + + emFixedSize + + + + + rsNone + + + + + rsLine + + + + + rsUpdate + + + + + rsPattern + + + + + bpoGrabber + + + + + bpoFrame + + + + + bpoGradient + + + + + bpoRoundRect + + + + + dsNormal + + + + + dsGradient + + + + + ceNone + + + + + ceSmall + + + + + ceMedium + + + + + ceLarge + + + + + lpAbove + + + + + lpBelow + + + + + lpLeft + + + + + lpRight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Instantiates a timer object. +Call Create to instantiate a timer at runtime. Timers added to forms or data modules at design time are created automatically. +AOwner specifies the component, typically a form or data module, that is responsible for freeing the timer. + + + + + +Disposes of a timer object. +Do not call Destroy directly in an application. Instead, an application should call Free. Free verifies that the timer is not nil before it calls Destroy. +Destroy deactivates the timer by setting Enabled to False before freeing the resources required by the timer. + + +Controls whether the timer generates OnTimer events periodically. +Use Enabled to enable or disable the timer. If Enabled is true, the timer responds normally. If Enabled is false, the timer does not generate OnTimer events. The default is true. + + +Determines the amount of time, in milliseconds, that passes before the timer component initiates another OnTimer event. +Interval determines how frequently the OnTimer event occurs. Each time the specified interval passes, the OnTimer event occurs. +Use Interval to specify any cardinal value as the interval between OnTimer events. The default value is 1000 (one second). + +Note: A 0 value is valid, however the timer will not call an OnTimer event for a value of 0. + +Occurs when a specified amount of time, determined by the Interval property, has passed. +Write an OnTimer event handler to execute an action at regular intervals. +The Interval property of a timer determines how frequently the OnTimer event occurs. Each time the specified interval passes, the OnTimer event occurs. + + + +TTimer encapsulates the Windows API timer functions. +TTimer is used to simplify calling the Windows API timer functions SetTimer and KillTimer, and to simplify processing the WM_TIMER messages. Use one timer component for each timer in the application. +The execution of the timer occurs through its OnTimer event. TTimer has an Interval property that determines how often the timer's OnTimer event occurs. The interval corresponds to the parameter for the Windows API SetTimer function. + +Warning: Limitations on the total number of timers system-wide are system-dependent. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FFFFFFFF + + + + + $FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Prepares the control for having its properties assigned values from a stream. +Vcl.ExtCtrls.TPage.ReadState inherits from Vcl.Controls.TWinControl.ReadState. All content below this line refers to Vcl.Controls.TWinControl.ReadState. +Prepares the control for having its properties assigned values from a stream. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Be sure to include a call to the inherited method when overriding ReadState. +As implemented in TWinControl, ReadState disables control alignment until all the child controls have been read from the stream, calls the inherited ReadState method, and re-enables the alignment of all the controls. The method then builds the tab order list of controls and synchronizes its visibility with that of its parent control. + + + +Renders the image of a custom control. +Vcl.ExtCtrls.TPage.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + + + +Creates an instance of TCustomControl. +Vcl.ExtCtrls.TPage.Create inherits from Vcl.Controls.TCustomControl.Create. All content below this line refers to Vcl.Controls.TCustomControl.Create. +Creates an instance of TCustomControl. +Calling Create constructs and initializes an instance of TCustomControl. However, you should never attempt to instantiate a TCustomControl. This class is intended solely as a base class from which other control classes descend and you should only call Create to instantiate one of these descendants. Controls placed on forms at design time are created automatically. +After calling the inherited constructor, Create initializes the control and also a TCanvas object for its Canvas property. +When overriding Create, always call the inherited Create method first, then proceed with the control's initialization. Remember to specify the override directive when overriding the Create method. + +Note: If a component's constructor allocates resources or memory, also override the destructor to free those resources. + + + + + + + + + + + +Specifies a page in a TNotebook control. +The TPage class implements a page in a TNotebook control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Initializes a window-creation parameter data structure. +Vcl.ExtCtrls.TNotebook.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + + + + +Returns the owner of a child component being read from a stream. +Vcl.ExtCtrls.TNotebook.GetChildOwner inherits from System.Classes.TComponent.GetChildOwner. All content below this line refers to System.Classes.TComponent.GetChildOwner. +Returns the owner of a child component being read from a stream. +GetChildOwner is used internally by the component streaming system. It is rarely necessary to call it directly. +In TComponent, GetChildOwner always returns nil (Delphi) or NULL (C++), indicating that the owner is the root component currently being read (usually a form or data module). The Owner of a component is responsible for destroying it. + + + + + + +Prepares the control for having its properties assigned values from a stream. +Vcl.ExtCtrls.TNotebook.ReadState inherits from Vcl.Controls.TWinControl.ReadState. All content below this line refers to Vcl.Controls.TWinControl.ReadState. +Prepares the control for having its properties assigned values from a stream. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Be sure to include a call to the inherited method when overriding ReadState. +As implemented in TWinControl, ReadState disables control alignment until all the child controls have been read from the stream, calls the inherited ReadState method, and re-enables the alignment of all the controls. The method then builds the tab order list of controls and synchronizes its visibility with that of its parent control. + + + + + + +Ensures that a specified child control is visible. +Vcl.ExtCtrls.TNotebook.ShowControl inherits from Vcl.Controls.TWinControl.ShowControl. All content below this line refers to Vcl.Controls.TWinControl.ShowControl. +Ensures that a specified child control is visible. +Call ShowControl to display a child control. Specify the control you want to ensure will be visible as the value of the AControl parameter. +As implemented in TWinControl, ShowControl simply calls the ShowControl method of the control's parent. Derived objects override ShowControl to perform whatever actions are necessary to allow the indicated child object to be visible. Possible actions include scrolling the particular child object into view, or changing to the appropriate notebook page. + + + + + + +Constructs a TNotebook component. +Call Create to instantiate a notebook at runtime. Notebook components placed in forms at design time are created automatically. +The AOwner parameter specifies the component (usually the form) that is responsible for freeing the notebook. + + + + + + + +Destroys the TNotebook component. +Do not call Destroy directly in an application. Instead, use Free, which checks that the TNotebook reference is not nil before calling Destroy. + + + + + + + +Calls a specified method for each child of the control. +Vcl.ExtCtrls.TNotebook.GetChildren inherits from Vcl.Controls.TWinControl.GetChildren. All content below this line refers to Vcl.Controls.TWinControl.GetChildren. +Calls a specified method for each child of the control. +GetChildren is called by the streaming system that loads and saves components. Applications seldom need to call this routine. +GetChildren executes the callback specified by the Proc parameter for every child control listed by the Controls property that lists the Root parameter as its Owner. +Override GetChildren to limit or augment which child controls are saved with the control. When overriding GetChildren, call the procedure passed as the Proc parameter for every child control that should be saved. The Root parameter indicates the component (usually a form) that owns the control. + + +Determines which page displays in the notebook. +ActivePage determines which page displays in the notebook. The value of ActivePage must be one of the strings contained in the Pages property. +To get or set the active page by index rather than string, use the PageIndex property instead. + + + + + + + + + + + + + +Determines which page displays in the notebook control. +The value of PageIndex determines which page displays in the notebook. Changing the PageIndex value changes the page in the control. +Each string in the Pages property is automatically assigned a PageIndex value when the page is created. The first page receives a value of 0, the second has a value of 1, and so on. If you delete a string from the Pages property, the PageIndex values are reassigned so that the values always begin with 0 and continue to increase without any gaps between values. +To get or set the current page using its string rather than its index, use the ActivePage property instead. + + +Contains the strings that identify the individual pages of the notebook control. +The Pages property contains the strings that identify the individual pages of the notebook control. Both these controls create a separate page for each string in the Pages property. For example, if Pages contains three strings, First, Second, and Third, the control has three separate pages. +You can access the various pages in a notebook or tabbed notebook control with either the ActivePage or PageIndex property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs when the user selects a new page in the notebook. +Use the OnPageChanged event when you want special processing to occur when the active page changes. + + + + + + + +TNotebook displays multiple pages, each with its own set of controls. +Notebook components are frequently used with tab set controls (TTabSet) to let the user select pages in the notebook by clicking a tab. TNotebook is provided for backward compatibility. New applications should use TPageControl instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Resize and reposition children and self. +Vcl.ExtCtrls.THeader.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + +Renders the image of a custom control. +Vcl.ExtCtrls.THeader.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + + + +Initializes a window-creation parameter data structure. +Vcl.ExtCtrls.THeader.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + + + + + + + +OnMouseDown event dispatcher. +Vcl.ExtCtrls.THeader.MouseDown inherits from Vcl.Controls.TControl.MouseDown. All content below this line refers to Vcl.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +Override the protected MouseDown method to provide other responses in addition to calling the OnMouseDown event handler when the user presses the mouse button down while the cursor's hotspot is over the control. +The Button parameter determines which mouse button the user pressed. Shift indicates which shift keys (Shift, Ctrl, or Alt) were down when the user pressed the mouse button. X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +A control calls MouseDown in response to any of the Windows mouse-down messages (WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was pressed down: left, right, or middle. + + + + + + + + +Responds to mouse moving over control area. +Vcl.ExtCtrls.THeader.MouseMove inherits from Vcl.Controls.TControl.MouseMove. All content below this line refers to Vcl.Controls.TControl.MouseMove. +Responds to mouse moving over control area. +Override the protected MouseMove method to provide other responses in addition to calling the OnMouseMove event handler when the user moves the mouse. +A control calls MouseMove in response to any of the Windows mouse-move messages (WM_MOUSEMOVE), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called, it is with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation. + + + + + + + + + +Is an OnMouseUp event dispatcher. +Vcl.ExtCtrls.THeader.MouseUp inherits from Vcl.Controls.TControl.MouseUp. All content below this line refers to Vcl.Controls.TControl.MouseUp. +Is an OnMouseUp event dispatcher. +Override the protected MouseUp method to provide other responses in addition to calling the OnMouseUp event handler when the user releases a previously pressed mouse button while the cursor's hot spot is over the control. +A control calls MouseUp in response to any of the Windows mouse-up messages (WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was released: left, right, or middle. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates a new THeader object. +Call Create to instantiate a header at runtime. Headers added to forms at design time are created automatically. +The AOwner parameter initializes the Owner property of the header. + + + + + +Frees the memory associated with the THeader object. +Do not call Destroy directly. Instead, use the Free method, which checks whether the THeader reference is nil before calling Destroy. + + + + +Determines if the user can modify the size of the header at runtime with the mouse. +If AllowResize is false, the sections within a header can't be resized. If AllowResize is true, clicking a border of a header section and dragging it left or right changes the width of the section. The default value is true. + + + + + +Determines whether the header control has a border. +These are the possible values: + + + + + +Value + +Meaning + + + +bsNone + + + +No visible border + + + + +bsSingle + + + +Single-line border + + + + + + + + + + + + + +Lists the strings that contain the text for the sections of a header. +The number of lines of the string list determines the number of sections of the header. If the string list is empty, the header has one blank section. If this string list contains one or more lines, the text of each line is in its own section. The first line is in the leftmost section, the second line is in the next section to the right, and so on. + + + + + + + + + + + +Occurs before the header is resized. +Write an OnSizing event handler to perform special processing immediately before the header is resized. In this event, AWidth is the width that the section will have after it is resized. Use the SectionWidth property to determine the current size of the section. + + +Occurs after the header has been resized. +Write an OnSized event handler to perform special processing after the header has been resized. In this event, the AWidth parameter is the width of the section before it was resized. Use the SectionWidth property to determine the new size of the section. +OnSized is an event handler of type Vcl.ExtCtrls.TSectionEvent. + + + +THeader is a sectioned visual control that displays text and allows each section to be resized with the mouse. +THeader is provided for backward compatibility. New applications should use THeaderControl instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TRadioGroup represents a group of radio buttons that function together. +A TRadioGroup object is a special group box that contains only radio buttons. Radio buttons that are placed directly in the same control component are said to be "grouped." When the user checks a radio button, all other radio buttons in its group become unchecked. Hence, two radio buttons on a form can be checked at the same time only if they are placed in separate containers, such as group boxes. +To add radio buttons to a TRadioGroup, edit the Items property in the Object Inspector. Each string in Items makes a radio button appear in the group box with the string as its caption. The value of the ItemIndex property determines which radio button is currently selected. +Display the radio buttons in a single column or in multiple columns by setting the Columns property. + +Note: Setting the radio group's BiDiMode to bdRightToLeft automatically flips its radio buttons. The FlipChildren method has no effect. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TControlBar manages the layout of toolbar components. +Use TControlBar as a docking site for toolbar components. Control bars contain child controls (usually TToolBar objects) that can be moved and resized independently. As with a cool bar, each child control resides on its own individual band that the user positions by dragging its sizing grip. + +Tip: When docking TToolBar objects to a control bar, you may find it useful to use TToolDockObject. +Note: If you want to use TActionToolBar on a TControlBar component, you should set the AutoSize property to False. When the AutoSize property is set to True (default), the TActionToolBar control wraps its controls and expands itself in size, accordingly. This does not allow the TActionToolBar component to display properly on a TControlBar component. When the AutoSize property is set to False, the TActionToolBar hides items on the end of the bar and displays a dropdown button that provides access to those items. The control displays in the proper size. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Resizes the label when the text changes. +Vcl.ExtCtrls.TBoundLabel.AdjustBounds inherits from Vcl.StdCtrls.TCustomLabel.AdjustBounds. All content below this line refers to Vcl.StdCtrls.TCustomLabel.AdjustBounds. +Resizes the label when the text changes. +When the text in the label or the font changes, AdjustBounds is implicitly called. It redraws the text in the client area, and then resizes the label if the AutoSize property is true. +When WordWrap is true, the width of the label is fixed. If AutoSize is also true, changes to the text cause the label to change in height. When AutoSize is true and WordWrap is false, the height of the label is determined by the font, and changes to the text cause the label to change in width. +Override AdjustBounds to make additional adjustments when the text changes. + + + + + + +Creates a new TBoundLabel object. +Do not create instances of TBoundLabel. Bound labels are instantiated by the labeled edit controls to which they belong. +AOwner specifies the labeled edit control that acts as the bound label's Owner. + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TBoundLabel is the type of a labeled edit control's label. +TBoundLabel implements the label of a labeled edit control. Unlike other label controls such as TLabel, TBoundLabel "belongs" to the labeled edit control (it is a subcomponent of the edit control). This means that the bound label's Owner is the edit control rather than the form, and the edit control is responsible for loading and saving the bound label. +Use the properties of TBoundLabel to specify how you want the labeled edit control's label to appear. For example, you can use the Caption property to specify the text that appears in the label. You can use the Alignment and Layout properties to specify the placement of that caption within the label. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TLabeledEdit is an edit control that has an associated label. +Use TLabeledEdit to add an edit control with a label to a form. TLabeledEdit works with an associated label control, which is the value of its EditLabel property. The position of that label relative to the edit control is determined by the LabelPosition and LabelSpacing properties. +Use the Text property to work with the text in the control, and the label's Caption property to work with the text in the label. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $FF000000 + + + + + cbStandardColors + + + + + cbExtendedColors + + + + + cbSystemColors + + + + + cbIncludeNone + + + + + cbIncludeDefault + + + + + cbCustomColor + + + + + cbPrettyNames + + + + + cbCustomColors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TColorBox represents a combo box that lets users select a color. +Use TColorBox to provide the user with a drop-down combo box from which to select a color. Use the Style property to specify which colors the color box should list. Each color is displayed next to a small square that is drawn in the corresponding color. +Use the Selected property to access the color that the user selects. The Colors property provides access to the entire list of colors, while the ColorNames property lists their names. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $401 + + + + + bfNone + + + + + bfInfo + + + + + bfWarning + + + + + bfError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $C8 + + + + + sltURL + + + + + sltID + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Override background painting and font color + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Forms.xml b/Modules/DelphiVCL/doc/Vcl.Forms.xml new file mode 100644 index 00000000..b9d8c70a --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Forms.xml @@ -0,0 +1,18052 @@ + + + + caNone + + + + + caHide + + + + + caFree + + + + + caMinimize + + + + + wsNormal + + + + + wsMinimized + + + + + wsMaximized + + + + + biSystemMenu + + + + + biMinimize + + + + + biMaximize + + + + + biHelp + + + + + sbHorizontal + + + + + sbVertical + + + + + ssRegular + + + + + ssFlat + + + + + ssHotTrack + + + + + bsNone + + + + + bsSingle + + + + + bsSizeable + + + + + bsDialog + + + + + bsToolWindow + + + + + bsSizeToolWin + + + + + + hdmUnknown This is for internal use only. Do not use this value. + + + + hdmUnknown + + + + + + hdmAutoScale The VCL designer is scaled to match the current PPI of the screen where the designer window is located. + This is recommended when working on HighDPI-enabled applications. + + + + hdmAutoScale + + + + + + hdmLowDPI The VCL designer uses the traditional low DPI, or non-HighDPI, scaling value of 96 PPI. + + + + hdmLowDPI + + + + + + hdmUserEditable This allows you to specify a custom PPI value, + scaling the form to that custom PPI when designing. + This is useful to design a form at a specific PPI, such as if you want + all forms across the software to be designed at the same PPI, not at a PPI changing based + on each developer's local computer settings. + This PPI value is preserved when moving the designer to another monitor with a different PPI. + + + + hdmUserEditable + + + + + fsNormal + + + + + fsMDIChild + + + + + fsMDIForm + + + + + fsStayOnTop + + + + + poDesigned + + + + + poDefault + + + + + poDefaultPosOnly + + + + + poDefaultSizeOnly + + + + + poScreenCenter + + + + + poDesktopCenter + + + + + poMainFormCenter + + + + + poOwnerFormCenter + + + + + dmDesktop + + + + + dmPrimary + + + + + dmMainForm + + + + + dmActiveForm + + + + + poNone + + + + + poProportional + + + + + poPrintToFit + + + + + saIgnore + + + + + saRestore + + + + + saMinimize + + + + + saMaximize + + + + + tbHorizontal + + + + + tbVertical + + + + + fsCreating + + + + + fsVisible + + + + + fsShowing + + + + + fsModal + + + + + fsCreatedMDIChild + + + + + fsActivated + + + + + pmNone + + + + + pmAuto + + + + + pmExplicit + + + + + afbNone + + + + + afbSingle + + + + + afbSunken + + + + + afbRaised + + + + + mdNearest + + + + + mdNull + + + + + mdPrimary + + + + + tmShow + + + + + tmHide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VCL designer HighDPI modes + + + + + + hdmUnknown This is for internal use only. Do not use this value. + + + + + + + hdmAutoScale The VCL designer is scaled to match the current PPI of the screen where the designer window is located. + This is recommended when working on HighDPI-enabled applications. + + + + + + + hdmLowDPI The VCL designer uses the traditional low DPI, or non-HighDPI, scaling value of 96 PPI. + + + + + + + hdmUserEditable This allows you to specify a custom PPI value, + scaling the form to that custom PPI when designing. + This is useful to design a form at a specific PPI, such as if you want + all forms across the software to be designed at the same PPI, not at a PPI changing based + on each developer's local computer settings. + This PPI value is preserved when moving the designer to another monitor with a different PPI. + + + + + + + + IDesignerHook allows component writers to interact with the + + + + + + + + + + + + + + + + + + + + + + + + + + Determines when the designer should handle a Windows message. + + + + + + + + + + + + Paints the alignment grid on the form's canvas. + + + + + + + Paints the alignment menu on the form's canvas. + + + + + + + Allow show/hide the caption for the designed form. + + + + + + + + + + + Restricts the names that can be given to components on the form that is being designed. + + + + + + + + + + + + Refresh the form designer. + + + + + + + Generates a unique name from a specified base string. + + + + + + + + + + + Returns the current entity being edited by the form designer. + + + + + + + + + + Returns the designer PPI value that should be used for a control in design-time. + + + + + + + + + + + Returns the designer PPI value that should be used for a control in design-time. + + + + + + + VCL designer HighDPI modes + + + + + + + + + Specifies whether the form is in its form state or its control state. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TTitleBar encapsulates the properties and methods used to draw a custom titlebar. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DrawTitleBarIcon is used to draw the icon of the owner form. + + + + + + + + + DrawTitleBarCaption is used to draw the text of the owner form. + + + + + + + + + + + DrawCustomTitleBar is used to draw a custom title bar, supports basic customization like show/hide icon and set caption and foreground colors. + + + + + + + + + + + InitTitleBarColors use this method to reset the colors used in the titlebar. + + + + + + + + + + + + + + + IconRect retrieves the bounds of the icon in the owner form. + + + + + ClientRect retrieves the bounds of the window returned by AdjustWindowRectEx. + + + + + ClientRect retrieves the bounds of the titlebar. + + + + + CaptionButtonsRect retrieves the bounds of the caption button area in the owner form. + + + + + + + + + CaptionAlignment used to set the alignment for the caption. + + + + + Control is used to assign a TCustomTitleBarPanel descendent to handle the titlebar drawing. + + + + + Enabled allows enable/disable the customization of the titlebar area. + + + + + Height retrieves the height of the titlebar and allows set a custom height for titlebar if the SystemHeight property is False . + + + + + SystemHeight used to specify if titlebar should use the system default height. Set to False allows set a custom height for the titlebar. + + + + + ShowCaption used to show/hide the caption on the title-bar + + + + + ShowIcon used to show/hide the icon on the title-bar. + + + + + SystemColors used to specify if titlebar should use the system default colors. Set to False allows set customs colors for the titlebar. + + + + + SystemButtons used to specify if titlebar should use the system caption buttons. Set to False allows set customs colors for the titlebar buttons. Windows 10 Only. + + + + + BackgroundColor gets or sets the color of the title bar background. + + + + + ForegroundColor gets or sets the color of the title bar foreground. + + + + + InactiveBackgroundColor gets or sets the color of the title bar background when the owner form is inactive. + + + + + InactiveForegroundColor gets or sets the color of the title bar foreground when the owner form is inactive. + + + + + ButtonForegroundColor gets or sets the foreground color of the title bar buttons. + + + + + ButtonBackgroundColor gets or sets the background color of the title bar buttons. + + + + + ButtonHoverForegroundColor gets or sets the foreground color of the title bar buttons when are hovered. + + + + + ButtonHoverBackgroundColor gets or sets the background color of the title bar buttons when are hovered. + + + + + ButtonPressedForegroundColor gets or sets the foreground color of the title bar buttons when are pressed. + + + + + ButtonPressedBackgroundColor gets or sets the background color of the title bar buttons when are pressed. + + + + + ButtonInactiveForegroundColor gets or sets the color of the title bar buttons foreground when the owner form is inactive. + + + + + ButtonInactiveBackgroundColor gets or sets the color of the title bar buttons background when the owner form is inactive. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Activation event dispatcher. +Activation is the event dispatcher for form activations. +The form component calls Activate in response to the CM_ACTIVATE message, sent when a form gets the focus either because of a change in active windows within an application or because of the application becoming active. As defined in TCustomForm, Activate simply calls the OnActivate event handler. + + + +Active state event dispatcher. +ActiveChanged is the event dispatcher for changes in the form's active status. As implemented in TCustomForm, ActiveChanged does nothing. Override this method in a descendant class to implement event handling or other response to a change in the active form. + + + + + + +Adjusts the ClientRect property to exclude the scroll bars. +Vcl.Forms.TCustomForm.AdjustClientRect inherits from Vcl.Forms.TScrollingWinControl.AdjustClientRect. All content below this line refers to Vcl.Forms.TScrollingWinControl.AdjustClientRect. +Adjusts the ClientRect property to exclude the scroll bars. +AdjustClientRect is called internally when the control needs accurate information on where to place child controls within the client area. It indents Rect to exclude the area taken by the scroll bars, then calls the inherited AdjustClientRect method. + + + + + + + +Aligns all child controls of the form that fall within a specified rectangle. +Use AlignControls to align all controls within an area of the form. Specify the area in which to align the controls as the value of the Rect parameter. +AlignControls uses the Align property value for each child control to determine how to align it. The AControl parameter can be nil (Delphi) or NULL (C++). If you specify a control in AControl, that control takes precedence in alignment over other, similarly aligned controls. + + + +Responds when the user starts dragging the form if DragMode is dmAutomatic. +BeginAutoDrag suppresses the default behavior of the BeginAutoDrag method. This is because forms do not change the mouse cursor when dragged. + + + + + + + + +Repositions and resizes the form by the ratio M/D, adjusting its client area and font size as needed. +TCustomForm overrides ChangeScale to rescale any scroll bars and child controls. + + + + + + +Provides specific message responses for a MDI form from the client. +The ClientWndForm method receives message for a MDI form from a client. ClientWndForm is called when a form is created. ClientWndForm handles messages that deal with background erase, repaint, and determining which part of the window corresponds to a particular screen coordinate. Override ClientWndForm to change how the form responds to Windows client messages. + + + +CloseModal prepares a modal form for closing. +Do not call CloseModal in your application. CloseModal is used by the VCL when a modal form needs to be closed. CloseModal does not close the form by itself; it simply calls the registered close events and updates the ModalResult property. + + + + + + +Initializes the window-creation parameter record when the form window is created. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomForm overrides CreateParams to customize the way the form creates its Windows representation after calling the inherited method. You should never need to override this method in the context of a form class. +The fields of the Params parameter become the parameters to a call to the CreateWindowEx OS function. + + + + + + +Creates a form window given a set of window-creation parameters. +The CreateWnd method calls CreateWindowHandle to create the form window once it has been specified in the window-creation parameters. CreateWindowHandle creates the window by calling the CreateWindowEx API function, passing parameters from the record passed in the Params parameter. CreateWindowHandle removes the CS_HREDRAW and CS_VREDRAW class styles from the window class. +Params holds information needed when telling Windows to create a window handle. + + + +Creates the form window. +CreateWnd is called when the form is created, and whenever a change to the form requires the window to be recreated. CreateWnd calls (indirectly) the CreateParams method to obtain the window creation parameters, and then calls CreateWindowHandle to direct Windows to create the underlying window for the form. It then initializes the newly-created window to reflect the property settings of the form. + + + +Generates an OnDeactivate event. +The form component calls Deactivate in response to the CM_DEACTIVATE message, sent when a form gets the focus either because of a change in active windows within an application or because of the application becoming active. +The default Deactivate method calls any event handler attached by the user to the OnDeactivate event. Override this method to block the OnDeactivate event or provide additional responses to the loss of activation. + + + + + + +Designates methods for storing a form's unpublished data on a stream such as a form file. +DefineProperties calls the inherited method and calls the filer object's DefineProperty method for the PixelsPerInch,and TextHeight properties. TForm descendants can also specify methods that read and write data other than properties by overriding the DefineProperties method. + + + +Destroys the control's window without destroying the control. +Vcl.Forms.TCustomForm.DestroyHandle inherits from Vcl.Controls.TWinControl.DestroyHandle. All content below this line refers to Vcl.Controls.TWinControl.DestroyHandle. +Destroys the control's window without destroying the control. +Call DestroyHandle to dispose of the window, but leave the control intact. The control can later recreate the window if needed. DestroyHandle is the converse operation to CreateHandle. Applications should call the high-level CreateHandle and DestroyHandle methods, rather than the lower-level methods of CreateWnd and DestroyWnd, whenever possible. +If the control has TWinControl objects as child controls, DestroyHandle calls each of their DestroyHandle methods before calling DestroyWnd to destroy its own handle. + + + +Destroys the window created in the CreateWindowHandle method. +DestroyWindowHandle is called automatically to destroy the window associated with a form before destroying the form. + + + + + + +Form closing event dispatcher. +DoClose is called automatically when the form is about to close. DoClose can alter closing behavior by changing the Action parameter. For more information, refer to the OnClose event handler. +As implemented in TCustomForm, DoClose simply calls the OnClose event handler. + + + +Form creation event dispatcher. +DoCreate is called automatically after form construction is complete. The precise way DoCreate is called can be modified by setting the OldCreateOrder property. +As implemented in TCustomForm, DoCreate simply calls the OnCreate event handler. + + + +Form destruction event dispatcher. +DoDestroy is called automatically when the TCustomForm object is about to be deallocated. The precise way DoDestroy is called can be modified by setting the OldCreateOrder property. +As implemented in TCustomForm, DoDestroy simply calls the OnDestroy event handler. + + + +Form hide event dispatcher. +DoHide is called automatically when the form is hidden. +As implemented in TCustomForm, DoHide calls the OnHide event handler. + + + +Form show event dispatcher. +DoShow is called automatically when the application is about to show the form. As implemented in TCustomForm, DoShow simply calls the OnShow event handler. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the value of the ClientRect property. +GetClientRect is the protected access function for the ClientRect property. It returns the dimensions of the form window, indented by any scroll bars and menus. +Override this method to change the way the client area of the form is defined. + + + + + + +Returns the value of the Floating property. +GetFloating is the protected access function for the Floating property. Override this method in descendants that implement floating windows in some class-specific way. + + + + + + +Returns the FTextHeight integer value of TCustomForm. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Handles exceptions that are raised by the OnCreate event handler. +The form calls HandleCreateException internally if the OnCreate event handler raises an exception. HandleCreateException forwards the exception on to the application object, which generates an OnException event. If there is no OnException event handler, the application displays an exception message box. +HandleCreateException returns true if it handles the exception, false otherwise. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Performs fix-ups when the form is first loaded into memory. +Loaded overrides the inherited method to give focus to the ActiveControl if it is assigned. Before assigning focus, Loaded calls the inherited method to perform any lower-level initialization. + + + + + + + +Responds to notifications that objects are about to be inserted or removed. +Notification is called when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, forms pass along the notification to their owned components, if any. In addition, Notification makes internal adjustments if the main menu is added or deleted. +A form can, if needed, override Notification to make other adjustments when components are inserted or removed. In particular, if a form has object fields or properties that contains references to other components, it might check the notifications of component removals and invalidate those references as needed. + + + +Generates an OnPaint event. +The form component calls Paint in response to the WM_PAINT message (sent when the window needs to be painted) before rendering all controls on the form. +The default Paint method calls any event handler attached by the user to the OnPaint event. Override Paint to block the OnPaint event or to draw additional features before or after the OnPaint event. + + + + + + +Renders the image of the form. +Applications can't call this protected method. It is called when the form needs to be painted. +PaintWindow locks the canvas to prevent threading issues, assigns the DC parameter as the Handle of the form's canvas, and then calls the Paint method to render the image of the form. + + + + + + + +Responds to changes in the system's palette by realizing the control's palette as returned from GetPalette. +PaletteChanged is called automatically when the system palette changes. The Foreground parameter indicates whether the palette realization should treat this control's palette as being in the foreground or the background. The return value from PaletteChanged indicates whether the form actually realized its palette, returning true only if the form has an associated palette. +Most applications should not need to alter the default behavior of PaletteChanged. + + + + + + +Obtains the design Dpi for the form where the control was designed. +Vcl.Forms.TCustomForm.GetDesignDpi inherits from Vcl.Controls.TControl.GetDesignDpi. All content below this line refers to Vcl.Controls.TControl.GetDesignDpi. +Obtains the design Dpi for the form where the control was designed. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Reads the form's published properties, stored data, and owned components from a reader object. +ReadState is part of a sequence of calls used by the VCL streaming system that loads and saves VCL components. It reads the values of all the component's published properties, stored data, and owned components from the reader object passed in Reader. Do not call ReadState directly. +Any descendant classes overriding ReadState should end with a call to the inherited ReadState method. + + + +Instructs the form's parent (if any) to reposition the form, enforcing its Align property. +RequestAlign is called internally when changes are made to the size or position of the form, so that it remains properly aligned within a dock site or properly positioned on the screen. + + + + + + + +Changes the order in which Child appears when GetChildren is called. +Use SetChildOrder to change the order in which child components are loaded and saved. The Child moves as if it were an item in a list object: items previously below the child's old position move up, and those below the new position move down. + + + + + + +Sets the ParentBiDiMode property. +SetParentBiDiMode is the protected implementation of the ParentBiDiMode property. It overrides the inherited method to obtain the BiDiMode property of the application if the form does not have a parent. + + + + + + + +Docking event dispatcher. +DoDock supplements the inherited DoDock method by updating form borders. + + + + + + +Sets the Parent property. +SetParent is the protected implementation of the Parent property. It overrides the inherited method to regenerate the form's window when the Parent property is changed to nil (Delphi) or NULL (C++). + + + +Updates all actions associated with the form. +UpdateActions is called automatically when the application is idle to allow all components in the form an opportunity to update any actions for which the component is a target. This allows actions to be checked, grayed, and so on to reflect the current state of their targets. +UpdateActions updates all actions associated with the form, its menus, and the components contained in the form. + + + +Updates the WindowState property to reflect the current state of the form. +UpdateWindowState ensures that the WindowState property reflects the current state of the form. + + + + + +Called when the StyleElements property changes. +Vcl.Forms.TCustomForm.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + + + + + + +Determines if a form can rename one of its owned components. +The ValidateRename method checks to see if a form can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the form's list, ValidateRename raises an EComponentError exception. + + + +Responds just before the form changes the value of its Visible property. +This protected method raises an exception if, for some reason, the form should not change its visible state. + + + + + + +Provides specific message responses for the form. +WndProc is the first method that receives messages for a form. After calling the inherited method, WndProc performs some window activation, focus, and position message handling necessary to keep in sync with Windows. Override WndProc to change how the form responds to Windows messages. + + + + + + +Makes any required adjustments when the form changes size. +This protected method is called automatically when the form is resized, including when it is maximized, minimized, or restored to normal size. Resizing adjusts the size and position of any child controls that are aligned to the form. +The State parameter indicates the state of the form after the resize. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Returns a reference to a specified interface if that interface is supported by the form. +For forms that support interfaces, QueryInterface calls the QueryInterface method of the interface supported by the form. QueryInterface returns a reference to the interface specified by the IID parameter, as the Obj parameter. If the form does not support the interface, the Obj parameter is nil (Delphi) or NULL (C++). +QueryInterface returns S_OK if the Obj parameter is successfully assigned. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the MDI child that has focus. +Use ActiveMDIChild to get the MDI child that has focus. +If the form is not an MDI parent (that is, if the FormStyle property of the form is not fsMDIForm), ActiveMDIChild returns nil (Delphi) or NULL (C++). + + +Specifies whether the form is translucent. +Set AlphaBlend to specify that the form represents a layered window that allows a translucent color. The AlphaBlendValue property specifies the degree of translucency. + +Note: AlphaBlend does not work on all systems. The application must be running under Windows 2000 or better, and the machine must be a P90 or better. + +Specifies the degree of translucency on a translucent form. +Set AlphaBlendValue to a value between 0 and 255 to indicate the degree of translucency when the AlphaBlend property is true. A value of 0 indicates a completely transparent window. A value of 255 indicates complete opacity. + +Note: AlphaBlendValue only has an effect when the AlphaBlend property is true. + +Specifies which icons appear on the title bar of the form. +Use BorderIcons to get or set the icons that appear on the title bar of the form. BorderIcons can include any of the following TBorderIcons values: + + + + + +Value + +Meaning + + + +biSystemMenu + + + +The form has a Control menu (also known as a System menu). + + + + +biMinimize + + + +The form has a Minimize button + + + + +biMaximize + + + +The form has a Maximize button + + + + +biHelp + + + +If BorderStyle is bsDialog or biMinimize and biMaximize are excluded, a question mark appears in the form's title bar and when clicked, the cursor changes to crHelp; otherwise,no question mark appears. + + + + + +Note: Certain combinations of the BorderIcons and BorderStyle properties are mutually exclusive. For example, BorderIcons biMax, biMin with BorderStyle of bsDialog are mutually exclusive. + +Indicates whether scroll bars appear automatically on the scrolling windowed control if it is not large enough to display all of its controls. +If AutoScroll is true, the scroll bars appear automatically when necessary. For example, if the user resizes the control so that some of its controls are partially obscured, scroll bars appear. +If AutoScroll is false, scroll bars don't appear automatically. In this case, use the HorzScrollBar and VertScrollBar properties to make scroll bars appear. + + +Specifies the height of the control's client area in pixels. +Use ClientHeight to read or change the height of the control's client area. +For TControl, ClientHeight is the same as Height. Derived classes may implement a ClientHeight property that differs from Height. For example, the ClientHeight of a form is the value of the Height property minus the height of the title bar, resize border, and scroll bars. + + +Specifies the horizontal size of the control's client area in pixels. +Use ClientWidth to read or change the width of the control's client area. ClientWidth is equivalent to ClientRect.Right. +For TControl, ClientWidth is the same as Width. Derived classes may implement a ClientWidth property that differs from Width. For example, the ClientWidth of a form is the value of the Width property minus the width of the resize border and scroll bars. + + +Specifies whether a color on the form appears transparent. +Use TransparentColor to indicate that one of the colors on the form should be treated as transparent, allowing windows behind the form to completely show through. The TransparentColorValue property indicates the color that appears completely transparent. + +Note: To make the entire form transparent, or to make it translucent rather than transparent, use the AlphaBlend and AlphaBlendValue properties. +Note: TransparentColor does not work on all systems. The application must be running under Windows 2000 or better, with adequate hardware. + +Indicates the color on the form that appears transparent when TransparentColor is true. +Use TransparentColorValue to indicate the color that appears transparent when the TransparentColor property is true. + +Note: If the application uses a 16-bit color palette, TransparentColorValue must be a basic color. + +Determines whether a control has a three-dimensional (3-D) or two-dimensional look. +Ctl3D is provided for backward compatibility. It is not used by 32-bit versions of Windows or NT4.0 and later, with the exception of Windows XP Home, where it is used on occasion. +On earlier platforms, Ctl3D controlled whether the control had a flat or beveled appearance. + + +Note RAD Studio no longer supports Windows Vista or earlier. + + + +Specifies the monitor on which the form appears. +Use DefaultMonitor to associate a form with a particular monitor in a multi-monitor application. The following table lists the possible values: + + + + + +Value + +Meaning + + + +dmDesktop + + + +No attempt is made to position the form on a specific monitor. + + + + +dmPrimary + + + +The form is positioned on the first monitor listed in the global screen object's Monitors property. + + + + +dmMainForm + + + +The form appears on the same monitor as the application's main form. + + + + +dmActiveForm + + + +The form appears on the same monitor as the currently active form. + + + + + +Note: DefaultMonitor has no effect if the application does not have a main form. + +Represents the horizontal scroll bar for the scrolling windowed control. +Use HorzScrollBar to hide, show, or manipulate the horizontal scroll bar for the scrolling windowed control. + + +Specifies the icon that appears when the form is minimized. +Set the Icon property to provide an icon for the form. If Icon is not set, the system provides a default icon when the form is minimized. + + +Specifies the number of open MDI child forms. +Use MDIChildCount to get the number of open MDI child forms. +MDIChildCount is meaningful only if the form is an MDI parent (that is, if the form's FormStyle property is set to fsMDIForm). + + + +Represents an OLE object menu item that reacts to selections of OLE objects. +Use ObjectMenuItem to get or set a menu item that becomes enabled or disabled when an OLE object on the form is selected or unselected respectively. +The OLE object menu item can be used for standard OLE commands, such as Activate or Convert. (The implementations of these commands are provided by the OLE server.) + + +Specifies where a control looks for its font information. +To have a control use the same font as its parent control, set ParentFont to true. If ParentFont is false, the control uses its own Font property. Many controls default ParentFont to true so that all the controls in a form or other container present a uniform appearance. When the value of a control's Font property changes, ParentFont becomes false automatically. +When ParentFont is true for a form, the form uses the default font. Currently, the default font is Tahoma 8 pt. + + +Specifies the pop-up menu associated with the control. +Assign a value to PopupMenu to make a pop-up menu appear when the user selects the control and clicks the right mouse button. If the TPopupMenu's AutoPopup property is True, the pop-up menu appears automatically. If the menu's AutoPopup property is False, display the menu with a call to its Popup method from the control's OnContextPopup event handler. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Represents the size and placement of the form. +Use Position to get or set the size and placement of the form. Position can have one of the following TPosition values: + + + + + +Value + +Meaning + + + +poDesigned + + + +The form appears positioned on the screen and with the same height and width as it had at design time. + + + + +poDefault + + + +The form appears in a position on the screen and with a height and width determined by the operating system. Each time you run the application, the form moves slightly down and to the right. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of bsDialog or bsNone, for example), the window is positioned in the upper-left corner of the screen. + + + + +poDefaultPosOnly + + + +The form displays with the size you created it at design time, but the operating system chooses its position on the screen. Each time you run the application, the form moves slightly down and to the right. When the form can no longer move down and to the right and keep the same size while remaining entirely visible on the screen, the form displays at the upper-left corner of the screen. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of bsDialog or bsNone, for example), the window is positioned in the upper-left corner of the screen. + + + + +poDefaultSizeOnly + + + +The form appears in the position you left it at design time, but the operating system chooses its size. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. + + + + +poScreenCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. In multi-monitor applications, the form may be moved from this center position so that it falls entirely on one monitor, as specified by the DefaultMonitor property. + + + + +poDesktopCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. No adjustments are made for multi-monitor applications. + + + + +poMainFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the application's main form. No adjustments are made for multi-monitor applications. This position should only be used with secondary forms. If set for a main form, it acts like poScreenCenter. + + + + +poOwnerFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the form specified by the Owner property. If the Owner property does not specify a form, this position acts like poMainFormCenter. + + + + +Note that if Position is set to poDefault, poDefaultPosOnly or poDefaultSizeOnly, and BorderStyle is set to bsDialog or bsNone, the form will be positioned at (0,0). + + +Represents the proportions of a printed form. +Use PrintScale to get or set the proportions of the printed form. PrintScale can have one of the following TPrintScale values: + + + + + +Value + +Meaning + + + +poNone + + + +No special scaling occurs; therefore, the printed form and how the form appears onscreen may appear squished or stretched. + + + + +poProportional + + + +The form is printed so that the printed image is approximately the same visible size as on the screen (WYSIWYG). The form image is scaled so that the printed image is approximately the same visible size as on the screen. + + + + +poPrintToFit + + + +The form is printed using the same screen proportions, but in a size that just fits the printed page. + + + + + + +Represents how MDI child forms are arranged when the Tile method is called. +TileMode can have one of the following TTileMode values: + + + + + +Value + +Meaning + + + +tbHorizontal + + + +Each form stretches across the width of the parent form + + + + +tbVertical + + + +Each form stretches along the height of the parent form + + + + +TileMode is meaningful only if the form is an MDI child (that is, if the form's FormStyle property is set to fsMDIChild). + + +Represents the vertical scroll bar for the scrolling windowed control. +Use VertScrollBar to hide, show, or manipulate the vertical scroll bar for the scrolling windowed control. + + +Specifies whether the component appears onscreen. +Use the Visible property to control the visibility of the control at run time. If Visible is True, the control appears. If Visible is False, the control is not visible. +Calling the Show method sets the control's Visible property to True. Calling the Hide method sets it to False. +For TCustomForm descendants, the Show and ShowModal methods set Visible to True and bring the form to the front of all open windows. +For TTabSheet descendants, Visible does not control the visibility of the control at run time. For more information, see the description of the TabVisible property. + + +Specifies the Window menu for an MDI parent form. +Use WindowMenu to get or set the Window menu for an MDI parent form. The Window menu is a standard menu in MDI applications. It contains commands that let the user manage the windows in the application. Menu items usually include Cascade, Arrange Icons, Tile, and so on. +The Window menu also lists (at the bottom) the child windows that are currently open in the application. When the user selects one of these windows from the menu, the window becomes the active window in the application. +Although this menu is commonly called the Window menu, it can have any name that corresponds to an existing menu item on the menu bar. The names of open child forms are merged onto the menu automatically at run-time. +WindowMenu is meaningful only if the form is an MDI parent (that is, if the form's FormStyle property is set to fsMDIForm). + + +Provides access to the handle of the form's internal MDI client window. +Use ClientHandle to get the handle for the form's internal MDI client window. +ClientHandle is meaningful only if the form is an MDI parent (that is, if the form's FormStyle property is set to fsMDIForm). + +Note: Use the Handle property instead to get the handle to the form window itself. + +Determines the form's style. +Use FormStyle to get or set the form's style. FormStyle is one of the following values: + + + + + +Value + +Meaning + + + +fsNormal + + + +The form is neither an MDI parent window nor an MDI child window. + + + + +fsMDIChild + + + +The form is an MDI child window. + + + + +fsMDIForm + + + +The form is an MDI parent window. + + + + +fsStayOnTop + + + +This form remains on top of the desktop and of other forms in the project, except any others that also have FormStyle set to fsStayOnTop. If one fsStayOnTop form launches another, neither form will consistently remain on top. + + + + +If the form is the main form of an MDI application, its FormStyle property must be set to fsMDIForm. + +Note: It is not advisable to change FormStyle at runtime. +Warning: TGraphicControl descendants placed in the client area of a form with FormStyle set to fsMDIForm will not paint. + +Specifies the vertical size of the control in pixels. +Use the Height property to read or change the height of the control. + + +Specifies the horizontal size of the control or form in pixels. +Use the Width property to read or change the width of the control. + +Note: For tab sheet controls, changing this property at run time has no effect. + +Occurs when the form becomes active. +Use OnActivate to perform special processing when the form receives focus. A form becomes active when focus is transferred to it (when the user clicks on the form, for example). + +Note: The OnActivate event of the application (TApplication), not the form, occurs when Windows switches control from another application. + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs when an attempt is made to resize the control. +Use OnCanResize to adjust the way a control is resized. If necessary, change the new width and height of the control in the OnCanResize event handler. The OnCanResize event handler also allows applications to indicate that the entire resize should be aborted. +If there is no OnCanResize event handler, or if the OnCanResize event handler indicates that the resize attempt can proceed, the OnCanResize event is followed immediately by an OnConstrainedResize event. +OnCanResize is an event handler of type Vcl.Controls.TCanResizeEvent. + + +Occurs when the user clicks the control. +Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action's OnExecute method responds to click events unless it is superseded by an OnClick event handler. +Usually, OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when: + +The user selects an item in a grid, outline, list, or combo box by pressing an arrow key. +The user presses the SPACEBAR while a button or check box has focus. +The user presses ENTER when the active form has a default button (specified by the Default property). +The user presses ESC when the active form has a cancel button (specified by the Cancel property). +The user presses the accelerator key for a button or check box. For example, if the value of the Caption property of a check box is '&Bold', the B is underlined at run time and the OnClick event of the check box is triggered when the user presses Alt+B. However, focus does not move to the control in these instances. +The Checked property of a radio button is set to True. +The value of the Checked property of a check box is changed. +Note: When you change the value of the Checked property programmatically, the OnClick event of the check box control occurs. Do not modify the value of the Checked property in the event handler of the OnClick event, because that leads into a deadlock situation. +The Click method of a menu item is called. +For a form, an OnClick event occurs when the user clicks a disabled component or in a blank area of the form. +OnClick is an event handler of type TNotifyEvent. + + +Occurs when the form closes. +Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close. The handler specified by OnClose might, for example, test to make sure all fields in a data-entry form have valid contents before allowing the form to close. +A form is closed by the Close method or when the user chooses Close from the form's system menu. +The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines if the form actually closes. These are the possible values of Action: + + + + + +Value + +Meaning + + + +caNone + + + +The form is not allowed to close, so nothing happens. + + + + +caHide + + + +The form is not closed, but just hidden. Your application can still access a hidden form. + + + + +caFree + + + +The form is closed and all allocated memory for the form is freed. + + + + +caMinimize + + + +The form is minimized, rather than closed. This is the default action for MDI child forms. + + + + +If a form is an MDI child form, and its BorderIcons property is biMinimize, then the default Action is caMinimize. If a MDI child form does not have these settings, the default Action is caNone, meaning that nothing happens when the user attempts to close the form. +If a form is an SDI child form, Action defaults to caHide. +To close the form and free it in an OnClose event, set Action to caFree. + +Note: When the application shuts down, the main form receives an OnClose event, but any child forms do not receive the OnClose event. + +Occurs when close is attempted. +Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler returns a Boolean CanClose value that determines whether a form is allowed to close. Its default value is true. +You can use an OnCloseQuery event handler to ask users if they are sure they really want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form. +The TCloseQueryEvent type points to the method that determines whether a form can be closed. The value of the CanClose parameter determines if the form can close or not. + + +Occurs when the form is created. +Use OnCreate to perform special processing when the form is created and is invoked by TCustomForm's constructor. Either implement this event or override the constructor of the form; do not do both. Any objects created in the OnCreate event should be freed by the OnDestroy event. +When a form is being created and its Visible property is true, the following events occur in the order listed: + +OnCreate +OnShow +OnActivate +OnPaint +Note: Use of the OnCreate event is discouraged in C++ code because it can interact badly with the form's constructor (see OldCreateOrder). It is recommended that you override the form constructor instead. + +Occurs when the user double-clicks the left mouse button when the mouse pointer is over the control. +Use the OnDblClick event to respond to mouse double-clicks. +OnDblClick is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the form is destroyed. +Use OnDestroy to perform special processing when the form is destroyed. Either implement this event or override the destructor of the class, but not both. This event should destroy any objects created in the OnCreate event. + + +Occurs when the form loses focus. +Use OnDeactivate to perform special processing when the active form becomes inactive and another form in the same application becomes the active one. If activation goes to another application, this event is not triggered. To determine whether another application has become active, use the TApplication object's OnDeactivate event. + +Note: OnDeactivate is called differently than described, when the form's parent is set to another component (for example, a panel). + +Occurs when the user drops an object being dragged. +Use the OnDragDrop event handler to specify what happens when the user drops an object. The Source parameter of the OnDragDrop event is the object being dropped, and the Sender is the control on which the object is being dropped. The X and Y parameters are the coordinates of the mouse positioned over the control. +OnDragDrop is an event handler of type TDragDropEvent. + + +Occurs when the user drags an object over a control. +Use an OnDragOver event to signal that the control can accept a dragged object so the user can drop or dock it. +Within the OnDragOver event handler, change the Accept parameter to False to reject the dragged object. Leave Accept as True to allow the user to drop or dock the dragged object on the control. +To change the shape of the cursor, indicating that the control can accept the dragged object, change the value of the DragCursor property for the control before the OnDragOver event occurs. +The Source is the object being dragged, the Sender is the potential drop or dock site, and X and Y are screen coordinates in pixels. The State parameter specifies how the dragged object is moving over the control. + +Note: Within the OnDragOver event handler, the Accept parameter defaults to True. However, if an OnDragOver event handler is not supplied, the control rejects the dragged object, as if the Accept parameter were changed to False. +OnDragOver is an event handler of type TDragOverEvent. + + +Occurs when the form receives a request for Help. +Write an OnHelp event handler to perform special processing when the user requests Help. The HelpContext and HelpJump methods automatically trigger the OnHelp event. +The THelpEvent type has the following parameters: CallHelp, Command, and Data. +Set CallHelp to true if the application should still invoke the Help system after the event. Set CallHelp to false to prevent the default response given by the Help system. All application Help methods go through OnHelp. The application calls the Help system only if OnHelp's CallHelp parameter is true or if no OnHelp event handler is assigned. +The event handler returns True if it succeeds, False if it fails. +The possible values for the Data parameter depend upon the value of the Command parameter. To find the possible values of the Command and Data parameters, see the appropriate HTMLHelp topics in the MSDN Library. +In order for the OnHelp event handler to work properly, insert in the uses clause of your application the Vcl.HtmlHelpViewer or another unit that provides an interface to the external Help viewer to use. The Vcl.HtmlHelpViewer unit provides a Delphi interface to the HTMLHelp Windows native Help handling function. For C++, you need to include the HTMLHelpViewer.hpp header file. + + +Occurs when the form is hidden (that is, when its Visible property is set to false). +Use OnHide to perform special processing when the form is hidden (that is, when the form's Visible property is set to false). + + +Occurs when a user presses any key while the control has focus. +Use the OnKeyDown event handler to specify special processing to occur when a key is pressed. The OnKeyDown handler can respond to keyboard keys, including function keys and keys combined with the SHIFT, ALT, and CTRL keys, and pressed mouse buttons. + +Note: TCheckBox does not fire OnKeyDown events for arrow keys. +OnKeyDown is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTRL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. + + +Occurs when a key is pressed. +Use the OnKeyPress event handler to make something happen as a result of a single character key press. +The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that do not correspond to an ASCII Char value (SHIFT or F1, for example) do not generate an OnKeyPress event. Key combinations (such as SHIFT+A) generate only one OnKeyPress event (for this example, SHIFT+A results in a Key value of "A" if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the OnKeyDown or OnKeyUp event handler. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTROL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. +OnKeyPress is an event handler of type Vcl.Controls.TKeyPressEvent. + + +Occurs when the user releases a key that was pressed. +Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, keys that represent characters, function keys, and keys combined with the SHIFT, ALT, and CTRL keys. +If Key is set to #0, any further processing of the OnKeyUp event will be prevented. +OnKeyUp is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. + + +Occurs when the user presses a mouse button with the mouse pointer over a control and the parent form is not active. +Use the OnMouseActivate event handler to implement any special processing that should occur as a result of pressing a mouse button on a control when the parent top-level form is not active. +The event type is: + +TMouseActivateEvent = procedure (Sender: TObject; Button: TMouseButton; ShiftState: TShiftState; +X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object; + +When you click a control and the parent top-level form is not active, this event fires on the control that the mouse cursor is over. MouseActivate is a protected virtual function in TControl. MouseActivate can be overridden in custom control descendants to provide special built-in processing of the OnMouseActivate events. If you leave the default value of MouseActivate as maDefault, the parent control fires the OnMouseActivate event and repeats the process all the way up to the top-level form. If no control in the chain sets the value of MouseActivate, the behavior is the same as if a control set TMouseActivate to maActivate. At any point, a control can set the value of TMouseActivate and the parent processing stops. +Some controls set focus to themselves when they get a button down message so, in some cases, setting maNoActivate appears to have no effect. For instance, a TButton control sets focus to itself in the WM_LBUTTONDOWN message regardless of whether or not TMouseActivate is set to maNoActivate. In this case, setting maNoActivateAndEat will work because the top-level form is not activated and the WM_LBUTTONDOWN message is suppressed. +The HitTest parameter is the hit test value obtained from the WM_NCHITTEST message. See Windows.pas for valid values and their meanings. In most cases this value will be HTCLIENT, which means that the user clicked in the client area of a control. However, in the case of a top-level form, this can take other values such as HTCAPTION or HTBOTTOM. This allows the code to decide which value to set for MouseActivate, based on the HitTest code. For example, the following code in the OnMouseActivate event handler for a TForm forces the user to click into a non-client area to activate the form: + +if HitTest = HTCLIENT then +MouseActivate�:= maNoActivateAndEat; + +Even though this event is tied to how Windows processes WM_MOUSEACTIVATE, the actual handling of the message is done at the TControl level, which is the point in the VCL hierarchy where the control has no window handle. The OnMouseActivate event is then simulated because all the TControl descendants also have OnMouseDown, OnMouseMove, and OnMouseUp events. This information is applicable to both VCL Win32 and VCL.NET. + + +Occurs when the user presses a mouse button with the mouse pointer over a control. +Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button. +The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseDown is an event handler of type Vcl.Controls.TMouseEvent. + + +Occurs when the user moves the mouse pointer while the mouse pointer is over a control. +Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse. +Use the Shift parameter of the OnMouseMove event handler to determine the state of the shift keys and mouse buttons. Shift keys are the SHIFT, CTRL, and ALT keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender. +OnMouseMove is an event handler of type Vcl.Controls.TMouseMoveEvent. + + +Occurs when the user releases a mouse button that was pressed with the mouse pointer over a component. +Use an OnMouseUp event handler to implement special processing when the user releases a mouse button. +The OnMouseUp event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseUp is an event handler of type Vcl.Controls.TMouseEvent. + + +Occurs when the form is redrawn. +Use OnPaint to perform special processing when the form is redrawn. Any special painting on the form should be done in this event. OnPaint occurs before any controls on the form are painted. +To determine which portions of the form's canvas need to be repainted, use the ClipRect property of the canvas. +If you use the form's Canvas property outside the OnPaint event, it will be erased and drawn-over by the next OnPaint event. + + +Occurs immediately after the control is resized. +Use OnResize to make any final adjustments after a control is resized. +To modify the way a control responds when an attempt is made to resize it, use OnCanResize or OnConstrainedResize. + +Note: Some controls call this event handler when the control is first created. +OnResize is an event handler of type System.Classes.TNotifyEvent. + + +Occurs when the user presses a key (before the OnKeyDown event). +Use OnShortCut to dispatch shortcut keystrokes before the form handles them. When the user presses a key, the form can dispatch it as a shortcut key instead of allowing the standard keystroke processing (OnKeyDown, OnKeyPress, and OnKeyUp). Built-in shortcut processing is provided for menu shortcuts and actions associated with the form. OnShortCut allows the form to implement additional shortcuts. +If the OnShortCut implements a response to the keystroke, set the Handled parameter of the event handler to true. This prevents the keystroke from being passed on to menus or actions associated with the form. It also prevents the standard keystroke processing in the same way that a menu or action shortcut does. + + +Occurs when the form is shown (that is, when its Visible property is set to true). +Use OnShow to perform special processing when the form is shown (that is, when the form's Visible property is set to true). + + + + + + +Creates and initializes a new TForm object. +Use Create to instantiate a TForm object or descendant of TForm at runtime. AOwner is the owner of the TCustomForm object. +For descendants of TCustomForm that are not TForm objects, use CreateNew instead. Calling Create for a TCustomForm descendant that is not a TForm will raise an exception. + + + + + + + $0 + + + + + + + + +Removes the form from memory. +Do not call Destroy. Instead, call Release, which indirectly produces a call to the Free method, which in turn calls Destroy. + + + +Checks if there is a change in Dpi and performs the necessary changes to scale all the controls for the new Dpi. + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Closes the form. +Call Close to close a form. +Attempts to close a form can be aborted by the CloseQuery event dispatcher or the OnCloseQuery event handler. + +Note: When the main form of the application closes, the application terminates. + + + + + +Close attempt event dispatcher. +CloseQuery is called automatically when an attempt is made to close the form. CloseQuery can allow the form to close by returning true, or prevent the form from closing by returning false. +As implemented in TCustomForm, CloseQuery polls any MDI children by calling their CloseQuery methods. If no child form aborts the close, CloseQuery then calls the OnCloseQuery event handler, if it exists, to determine if the close should be allowed. If no such event handler exists, CloseQuery returns true. + + + + + + +Provides message handling for all messages that the form does not fully process. +Override DefaultHandler to change the default message handling for the form. This is seldom necessary because messages can be handled by creating message methods. +DefaultHandler passes any otherwise-unhandled messages to the form's window procedure by calling the CallWindowProc OS function. + +Note: In Delphi code, calling inherited in a message-handling method results in a call to the ancestor's DefaultHandler method unless that ancestor specifies a handler for the message. + + + + + + +Removes focus from a control on the form. +Use DefocusControl to remove focus from a control on the form. This method is used internally by the VCL. +Control is the control from which to remove focus. If Control is the form's active control, DefocusControl sets the form's ActiveControl property to nil (Delphi) or NULL (C++). +Removing specifies whether to set focus to the control's parent. + + + + + + + +Handles automatic docking of the form into other windows. +Do not call Dock in application code. It is called automatically when the form is released on a docking site that will accept it. To dock a form programmatically, use the ManualDock method instead. + + + + + + +Sets focus to a control on the form. +Use FocusControl to set focus to a control on the form. +Control is a TWinControl object encapsulating the control on which to set focus. FocusControl sets the ActiveControl property. + + + + + + + +Returns the "child" components of the form; that is, those components that return the form from their GetParentComponent method. +The component streaming system calls GetChildren to request that the form execute a callback for every child component in the form. The callback must execute in creation order (the order the child components appear in the form file). A child component is defined as any component that returns this form from its GetParentComponent method. +Proc is the callback to execute for every child component. +Root specifies the top-level component (such as a form or data module) that is currently being loaded or saved. +In TCustomForm, GetChildren first calls the inherited method, which executes Proc for every control that lists the form as its Parent. Then, if the Root parameter identifies this form, GetChildren executes Proc for every child component that does not have a Parent. + + + + + + +Returns a bitmap of the form. +Use the GetFormImage method to obtain a bitmap of the form. + + + +Hides the form. +Hide sets the Visible property to false. + + + + + + + +Processes shortcut keys when the form has focus. +IsShortCut is called automatically when the user presses a key while the form has focus. It allows the form to dispatch shortcut keys and bypass the standard keystroke processing (OnKeyDown, OnKeyPress, and OnKeyUp events). +The Message parameter encapsulates the Windows message describing the keypress. If a shortcut for the key exists, IsShortCut executes the appropriate command and returns true. Otherwise IsShortCut returns false. +IsShortCut generates an OnShortCut event to allow the developer to insert shortcuts for the form. If the keystroke is not handled in an OnShortCut event handler, IsShortCut checks for any shortcuts associated with the form's menus and actions. + + + + + + nil + + + + +Ensures that the form is fully visible on a specified monitor. +Call MakeFullyVisible to ensure that the form does not appear split over more than one monitor in a multi-monitor application. +AMonitor is the monitor on which the form should appear. If AMonitor is nil (Delphi) or NULL (C++), MakeFullyVisible uses the Monitor property. +MakeFullyVisible checks whether the form fits entirely on the specified monitor. If not, it repositions the form so that it fits, if possible. + + + + + + +Directs mouse wheel messages to the appropriate control. +MouseWheelHandler is called automatically when the form or any windowed control contained in the form receives a message from a mouse wheel. The Message parameter encapsulates the message. +As implemented in TCustomForm, MouseWheelHandler performs no special processing, but simply redirects the message to the active control by calling its Perform method. By default, the Perform method generates the appropriate mouse wheel events. + + + +Prints the form. +Call Print to print the form. Print uses the GetFormImage method to obtain a bitmap of the form and draws that to the printer's HDC. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Destroys the form and frees its associated memory. +Use Release to destroy the form and free its associated memory. +Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form's event queue are processed before the form is released. Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error. + +Note: Release returns immediately to the caller. It does not wait for the form to be freed before returning. + + + + + +Cancels modes on the form. +Use SendCancelMode to release the mouse capture and cancel scroll bar input and menu processing on the form. + + + +Sets focus to the form. +Use SetFocus to give the form input focus. SetFocus calls the SetFocus method of the active control, if one exists. To determine whether the form has focus, use the Active property. + + + + + + + +Sets focus to a control on the form. +Use SetFocusedControl to give a control on the form input focus. SetFocusedControl returns false if the Control specified by the Control parameter was already in the process of receiving focus, true otherwise. + +Note: A return value of true does not indicate the control has successfully received input focus. If the Control can't have focus (for example, if it is not visible), SetFocusedControl will still return true, indicating that an attempt was made. + + +Shows the form. +Use Show to set the form's Visible property to true and to bring the form to the front of other forms on the screen. + + + + + + +Shows a form as a modal dialog. +Use ShowModal to show a form as a modal form. A modal form is one where the application can't continue to run until the form is closed. Thus, ShowModal does not return until the form closes. When the form closes, it returns the value of the ModalResult property. +To close a modal form, set its ModalResult property to a nonzero value. + +Note: If the form contains buttons with a ModalResult property set to a value other than mrNone, the form automatically closes when the user clicks one of those buttons and returns the ModalResult value as the return value of ShowModal. +You can check the return value against common return values using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions. + + + + + + + + +Indicates whether the form processes keyboard input for a control it owns. +WantChildKey is called by any control that the form owns when the control receives keyboard input. If WantChildKey returns true, the control performs no further processing in response to the keyboard input, instead deferring to its parent form to respond to the keystroke. In its default implementation, WantChildKey always returns false; it is overridden in TActiveForm to implement certain ActiveX functionality. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Construction event dispatcher. +AfterConstruction is the dispatcher for the event that occurs immediately after the form object's construction. As implemented in TCustomForm, AfterConstruction calls the OnCreate event handler, provided the OldCreateOrder property is false. + + + +Destruction event dispatcher. +BeforeDestruction is the dispatcher for the event that occurs immediately before the form object's destruction. As implemented in TCustomForm, BeforeDestruction calls the OnDestroy event handler, provided the OldCreateOrder property is false. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether the form has focus. +Use Active to determine whether the form has focus. The Active Form receives all keyboard input. If it has a title bar, it is drawn using the active colors specified in the Control panel. +If Active is true , the form has focus; if Active is false, the form does not have focus. + + +Specifies the control that has focus on the form. +Use ActiveControl to get or set the control that has focus on the form. Only one control can have focus at a given time in an application. +If the form does not have focus, ActiveControl is the control on the form that will receive focus when the form receives focus. + +Note: When focus shifts to another control, ActiveControl is updated before the OnExit event occurs. + + +Specifies the OLE control on the form that reacts to changes in focus. +Use ActiveOleControl to get or set an OLE control on the form that reacts to changes in focus. +If ActiveOleControl is not nil (Delphi) or NULL (C++), the user interface for the specified OLE control is deactivated when it is not focused. Also, when the form receives or loses focus, the document window for the specified OLE control is activated or deactivated respectively. + + +Specifies the appearance and behavior of the form border. +Use BorderStyle to get or set the appearance and behavior of the form border. BorderStyle can be any of the following TForm BorderStyle values: + + + + + +Value + +Meaning + + + +bsDialog + + + +Not resizable; no minimize/maximize menu + + + + +bsSingle + + + +Not resizable; minimize/maximize menu + + + + +bsNone + + + +Not resizable; no visible border line + + + + +bsSizeable + + + +Standard resizable border + + + + +bsToolWindow + + + +like bsSingle but with a smaller caption + + + + +bsSizeToolWin + + + +like bsSizeable with a smaller caption + + + + + +Note: Changing the border style of an MDI child form to bsDialog or bsNone has no effect. + +Provides access to the drawing area of the form. +Use TCanvas to draw on the client area of the form. Canvas is often used in the OnPaint event handler. + + + + +Specifies the designer interface for the form. +The Designer property is used internally at design time. Never assign a value to this property. This is done automatically by the form designer. Only use this property when designing classes for use in the form designer, such as property editors and component editors. + + +Specifies whether the form is the target of a drag-and-drop operation. +Use DropTarget to determine whether the form is currently the target of a drag-and-drop operation. + + + +Indicates transitional state information about the form. +Read FormState to determine the state of the form. FormState indicates when the form is in various transitional states or when certain Windows operations have occurred. The following table lists the values that can be included in a form's state: + + + + + +Value + +Meaning + + + +fsCreating + + + +The form's constructor is currently executing. + + + + +fsVisible + + + +The form's window is visible. This state is used to update the Visible property. + + + + +fsShowing + + + +The form's WindowState property is changing. This state is used to prevent WindowState changes from interfering with a transition that is in progress. + + + + +fsModal + + + +The form was created as a modal window. + + + + +fsCreatedMDIChild + + + +The form is an MDI parent window. This state is only set once the MDI client window has been created. + + + + +fsActivated + + + +The form has received a CM_ACTIVATE message (because it received focus or the application became active) but has not yet called the Activate method to generate an OnActivate event. + + + + + + +Accesses the Glass Frame under Windows Vista, Windows 7, or later Windows operating systems. +Use GlassFrame to make your forms Windows Vista or Windows 7 Aero-compatible, displaying a glass effect. +GlassFrame is a property of a TGlassFrame object created automatically for any form. + +Note: The property is only available for Windows Vista or Windows 7 with Aero. Otherwise, the Glass Frame is ignored. + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the name of the Help file the form uses to display the Help from. +If your form should have a Help file different from the default Help file of the application specified using the TApplication.HelpFile property of the global TApplication type object, then use the HelpFile property of the form to specify the name of the Help file the form will use to display the Help from. +The Help system specified by TApplication.HelpSystem displays Help topics from the Help file specified by the HelpFile property of the form when the form has the focus. + + +Specifies whether the form should receive keyboard events before the active control. +If KeyPreview is true, keyboard events occur on the form before they occur on the active control. (The active control is specified by the ActiveControl property.) +If KeyPreview is false, keyboard events occur only on the active control. +Navigation keys (Tab, BackTab, the arrow keys, and so on) are unaffected by KeyPreview because they do not generate keyboard events. Similarly, when a button has focus or when its Default property is true, the Enter key is unaffected by KeyPreview because it does not generate a keyboard events. +KeyPreview is false by default. + + +Specifies the form's main menu. +Use Menu to get or set the form's main menu. At design time, Menu is set to the first TMainMenu component added to the form. + + +Represents the return value of a form that is used as a modal dialog. +Use ModalResult to close the form when it is displayed modally. +By default, ModalResult is mrNone. Set ModalResult to any nonzero value to close the form. The value assigned to ModalResult becomes the return value of the ShowModal function call used to display the form. + +Note: This property is modified automatically by some components such as the TButton control. +Tip: If you call the Close method from a modal form, then ModalResult is automatically set to mrCancel. + +Provides access to the monitor on which the form appears. +Use Monitor to access information about the monitor on which the form appears if the application runs on a multi-monitor system. The monitor is determined by the DefaultMonitor property. + + +Specifies the IOleForm interface for an in-place OLE object contained in the form. +OleFormObject is used to communicate resize and destroy notifications when a form is used as a frame for an in-place OLE object. + + +Controls how the top-level form behaves with respect to Window's WS_POPUP style. +The PopupMode property controls how the top-level form behaves with respect to Window's WS_POPUP style. A window that has the WS_POPUP style is always above its "owner" in Z-order. You can use the PopupMode property in conjunction with the PopupParent property to avoid the appearance of a hung application caused by a modal dialog showing up behind another form on the screen. + +Note: Using the PopupMode property is similar to specifying fsStayOnTop for the FormStyle property, but allows better control over the layering. +The PopupMode property is automatically set to pmAuto when the ShowModal method is called. However, this causes the window handle to be recreated, which is not usually desirable. To avoid the re-creation of window handles, you can explicitly set the PopupMode property to pmAuto prior to calling the ShowModal method (such as at design time). +Set the PopupMode property to pmExplicit for non-modal design windows such as tool palettes and other floating tool windows. This causes the windows to always remain on top of the main form. In the case of a snapped together design (in which the window is docked to the main form), the design window remains on top of the designer. + +Note: For undocked windows, the design window remains above the main form, allowing other top-level forms to obscure the design window. +Set the PopupMode property to pmNone if you want the pop-up window to have the pre-Delphi 8 behavior (except for the ShowModal item mentioned above). +You can force the Z-Ordering of your forms and create a "stacked" appearance that the user cannot change by setting the PopupParent property to an explicit TCustomForm. If the PopupMode property is pmExplicit and PopupParent is nil, then the Application.MainForm is implicitly used as the PopupParent. If no Application.MainForm is assigned, then Application.Handle is used as the PopupParent. If the PopupMode property is set to pmAuto, Screen.ActiveForm is used as the PopupParent. + + + + +Specifies whether the form is sized according to the value of the PixelsPerInch property. +Scaled determines whether the form adjusts itself to differences between the font used at design time and the current system font used by a system at runtime. If Scaled is true, the form resizes itself and all its child controls to maintain the relationship between the size of controls and the height of text displayed in the default font. If Scaled is false, no such resizing occurs. +By setting Scaled to true, the form can adjust to fonts that are not scalable (that is, fonts that only supply discrete point sizes) or to differences such as forms designed using small fonts at design time that are run on systems that use large fonts. +The degree of resizing is determined by the PixelsPerInch property, which measures the proportion of the font on the system used when designing the form. + + +Specifies whether form snaps to edge of screen. +ScreenSnap determines whether the edges of the form snap to the edge of the screen when the user moves the form. To control the snap distance, set the SnapBuffer property. + + +Specifies distance for screen snap. +If ScreenSnap is true, SnapBuffer determines the maximum number of pixels that be between the form edge and the screen edge before the form snaps to the screen edge. + + +Represents how the form appears on the screen. +Set WindowState to minimize, maximize, or restore the form window. Read WindowState to determine whether the form is minimized, maximized, or in a normal state. + + +Sets an order for stacked forms that users cannot change. +If the PopupMode property is set to pmExplicit and PopupParent is nil, then the Application.MainForm is implicitly used as the PopupParent. If no Application.MainForm is assigned, then Application.Handle is used as the PopupParent. +If the PopupMode property is set to pmAuto, Screen.ActiveForm is used as the PopupParent property. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the horizontal coordinate of the left edge of a component relative to its parent. +Vcl.Forms.TCustomForm.Left inherits from Vcl.Controls.TControl.Left. All content below this line refers to Vcl.Controls.TControl.Left. +Specifies the horizontal coordinate of the left edge of a component relative to its parent. +Use the Left property to determine where the left side of the control begins or to reposition the left side of the control. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Left property is relative to the screen in pixels. + + +Specifies the Y coordinate of the upper-left corner of a control, relative to its parent or containing control in pixels. +Vcl.Forms.TCustomForm.Top inherits from Vcl.Controls.TControl.Top. All content below this line refers to Vcl.Controls.TControl.Top. +Specifies the Y coordinate of the upper-left corner of a control, relative to its parent or containing control in pixels. +Use Top to locate the top of the control or reposition the control to a different Y coordinate. The Top property, like the Left property, is the position of the control relative to its container. Thus, if a control is contained in a TPanel, the Left and Top properties are relative to the panel. If the control is contained directly by the form, it is relative to the form. For forms, the value of the Top property is relative to the screen in pixels. + + + +TCustomForm is the base class from which to derive a window such as a form or dialog. +Derive from TCustomForm to create a custom window. The TCustomForm descendant can contain other objects, such as TButton, TCheckBox, and TComboBox objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Arranges the icons of minimized MDI child forms. +Use ArrangeIcons to arrange the icons of minimized MDI child forms so they are evenly spaced and don't overlap. +ArrangeIcons works only if the form is an MDI parent form (that is, if the form's FormStyle property is fsMDIForm). + + + +Arranges MDI child forms so they overlap. +Use Cascade to arrange MDI child forms so they overlap. +Cascade works only if the form is an MDI parent form (that is, if the form's FormStyle property is fsMDIForm). + + + +Activates the next child form in the form sequence. +Use Next to change the active child form of an MDI parent. For example, if you have three child forms within a parent form and Form2 is the active form, the Next method makes Form3 the active form. Calling Next again makes Form4 active. The next time your application calls Next, the sequence starts over again and Form2 becomes the active form once again. +The Next method applies only to forms that are MDI parent forms (have a FormStyle property value of fsMDIForm). + + + +Activates the previous MDI child form in the form sequence. +Use Previous to change the active child form of an MDI parent. For example, if you have three child forms within a parent form and Form4 is the active form, the Previous method makes Form3 the active form. Calling Previous again makes Form2 active. The next time your application calls Previous, the sequence starts over again and Form4 becomes the active form once again. +The Previous method applies only to forms that are MDI parent forms (have a FormStyle property value of fsMDIForm). + + + +Arranges MDI child forms so that they are all the same size. +Use Tile to arrange MDI child forms so that they are all the same size. Tiled forms completely fill up the client area of the parent form. How the forms arrange themselves depends upon the values of their TileMode properties. +Tile works only if the form is an MDI parent form (that is, if the form's FormStyle property is fsMDIForm). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Occurs when an attempt is made to resize the control. +Use OnCanResize to adjust the way a control is resized. If necessary, change the new width and height of the control in the OnCanResize event handler. The OnCanResize event handler also allows applications to indicate that the entire resize should be aborted. +If there is no OnCanResize event handler, or if the OnCanResize event handler indicates that the resize attempt can proceed, the OnCanResize event is followed immediately by an OnConstrainedResize event. +OnCanResize is an event handler of type Vcl.Controls.TCanResizeEvent. + + +Occurs when the user clicks the control. +Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action's OnExecute method responds to click events unless it is superseded by an OnClick event handler. +Usually, OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when: + +The user selects an item in a grid, outline, list, or combo box by pressing an arrow key. +The user presses the SPACEBAR while a button or check box has focus. +The user presses ENTER when the active form has a default button (specified by the Default property). +The user presses ESC when the active form has a cancel button (specified by the Cancel property). +The user presses the accelerator key for a button or check box. For example, if the value of the Caption property of a check box is '&Bold', the B is underlined at run time and the OnClick event of the check box is triggered when the user presses Alt+B. However, focus does not move to the control in these instances. +The Checked property of a radio button is set to True. +The value of the Checked property of a check box is changed. +Note: When you change the value of the Checked property programmatically, the OnClick event of the check box control occurs. Do not modify the value of the Checked property in the event handler of the OnClick event, because that leads into a deadlock situation. +The Click method of a menu item is called. +For a form, an OnClick event occurs when the user clicks a disabled component or in a blank area of the form. +OnClick is an event handler of type TNotifyEvent. + + + + + + + +Occurs when the user double-clicks the left mouse button when the mouse pointer is over the control. +Use the OnDblClick event to respond to mouse double-clicks. +OnDblClick is an event handler of type System.Classes.TNotifyEvent. + + + + + + +Occurs when the user drops an object being dragged. +Use the OnDragDrop event handler to specify what happens when the user drops an object. The Source parameter of the OnDragDrop event is the object being dropped, and the Sender is the control on which the object is being dropped. The X and Y parameters are the coordinates of the mouse positioned over the control. +OnDragDrop is an event handler of type TDragDropEvent. + + +Occurs when the user drags an object over a control. +Use an OnDragOver event to signal that the control can accept a dragged object so the user can drop or dock it. +Within the OnDragOver event handler, change the Accept parameter to False to reject the dragged object. Leave Accept as True to allow the user to drop or dock the dragged object on the control. +To change the shape of the cursor, indicating that the control can accept the dragged object, change the value of the DragCursor property for the control before the OnDragOver event occurs. +The Source is the object being dragged, the Sender is the potential drop or dock site, and X and Y are screen coordinates in pixels. The State parameter specifies how the dragged object is moving over the control. + +Note: Within the OnDragOver event handler, the Accept parameter defaults to True. However, if an OnDragOver event handler is not supplied, the control rejects the dragged object, as if the Accept parameter were changed to False. +OnDragOver is an event handler of type TDragOverEvent. + + + + + + + +Occurs when a user presses any key while the control has focus. +Use the OnKeyDown event handler to specify special processing to occur when a key is pressed. The OnKeyDown handler can respond to keyboard keys, including function keys and keys combined with the SHIFT, ALT, and CTRL keys, and pressed mouse buttons. + +Note: TCheckBox does not fire OnKeyDown events for arrow keys. +OnKeyDown is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTRL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. + + +Occurs when a key is pressed. +Use the OnKeyPress event handler to make something happen as a result of a single character key press. +The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that do not correspond to an ASCII Char value (SHIFT or F1, for example) do not generate an OnKeyPress event. Key combinations (such as SHIFT+A) generate only one OnKeyPress event (for this example, SHIFT+A results in a Key value of "A" if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the OnKeyDown or OnKeyUp event handler. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTROL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. +OnKeyPress is an event handler of type Vcl.Controls.TKeyPressEvent. + + +Occurs when the user releases a key that was pressed. +Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, keys that represent characters, function keys, and keys combined with the SHIFT, ALT, and CTRL keys. +If Key is set to #0, any further processing of the OnKeyUp event will be prevented. +OnKeyUp is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. + + +Occurs when the user presses a mouse button with the mouse pointer over a control and the parent form is not active. +Use the OnMouseActivate event handler to implement any special processing that should occur as a result of pressing a mouse button on a control when the parent top-level form is not active. +The event type is: + +TMouseActivateEvent = procedure (Sender: TObject; Button: TMouseButton; ShiftState: TShiftState; +X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object; + +When you click a control and the parent top-level form is not active, this event fires on the control that the mouse cursor is over. MouseActivate is a protected virtual function in TControl. MouseActivate can be overridden in custom control descendants to provide special built-in processing of the OnMouseActivate events. If you leave the default value of MouseActivate as maDefault, the parent control fires the OnMouseActivate event and repeats the process all the way up to the top-level form. If no control in the chain sets the value of MouseActivate, the behavior is the same as if a control set TMouseActivate to maActivate. At any point, a control can set the value of TMouseActivate and the parent processing stops. +Some controls set focus to themselves when they get a button down message so, in some cases, setting maNoActivate appears to have no effect. For instance, a TButton control sets focus to itself in the WM_LBUTTONDOWN message regardless of whether or not TMouseActivate is set to maNoActivate. In this case, setting maNoActivateAndEat will work because the top-level form is not activated and the WM_LBUTTONDOWN message is suppressed. +The HitTest parameter is the hit test value obtained from the WM_NCHITTEST message. See Windows.pas for valid values and their meanings. In most cases this value will be HTCLIENT, which means that the user clicked in the client area of a control. However, in the case of a top-level form, this can take other values such as HTCAPTION or HTBOTTOM. This allows the code to decide which value to set for MouseActivate, based on the HitTest code. For example, the following code in the OnMouseActivate event handler for a TForm forces the user to click into a non-client area to activate the form: + +if HitTest = HTCLIENT then +MouseActivate�:= maNoActivateAndEat; + +Even though this event is tied to how Windows processes WM_MOUSEACTIVATE, the actual handling of the message is done at the TControl level, which is the point in the VCL hierarchy where the control has no window handle. The OnMouseActivate event is then simulated because all the TControl descendants also have OnMouseDown, OnMouseMove, and OnMouseUp events. This information is applicable to both VCL Win32 and VCL.NET. + + +Occurs when the user presses a mouse button with the mouse pointer over a control. +Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button. +The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseDown is an event handler of type Vcl.Controls.TMouseEvent. + + + + +Occurs when the user moves the mouse pointer while the mouse pointer is over a control. +Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse. +Use the Shift parameter of the OnMouseMove event handler to determine the state of the shift keys and mouse buttons. Shift keys are the SHIFT, CTRL, and ALT keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender. +OnMouseMove is an event handler of type Vcl.Controls.TMouseMoveEvent. + + +Occurs when the user releases a mouse button that was pressed with the mouse pointer over a component. +Use an OnMouseUp event handler to implement special processing when the user releases a mouse button. +The OnMouseUp event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseUp is an event handler of type Vcl.Controls.TMouseEvent. + + + + + + +Occurs immediately after the control is resized. +Use OnResize to make any final adjustments after a control is resized. +To modify the way a control responds when an attempt is made to resize it, use OnCanResize or OnConstrainedResize. + +Note: Some controls call this event handler when the control is first created. +OnResize is an event handler of type System.Classes.TNotifyEvent. + + + + + + + +TForm represents a standard application window (form). +When you create forms in the Form designer at design time, they are implemented as descendants of TForm. Forms can represent the application's main window, or dialog boxes, or MDI children. A form can contain other objects, such as TButton, TCheckBox, and TComboBox objects. +Examples of forms include TLoginDialog and TPasswordDialog objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Indicates the Windows handle for the monitor. +Read Monitor to obtain a Windows handle for the monitor represented by this TMonitor component. Use this handle for Windows API calls such as GetMonitorInfo. + + +Specifies the index of the monitor in the global screen object's Monitors list. +The global screen variable maintains a list of all monitors in a multi-monitor application. MonitorNum is the index of this monitor in the list object that is the screen's Monitors property. +Use MonitorNum to identify a specific monitor when working with multiple monitors. + + +Indicates the logical position of the left edge of the monitor. +In multi-monitor applications, the available screen space can span multiple monitors from left to right. Read Left to determine where, in the entire available screen space, this monitor appears. The value of Left is in pixels relative to the left edge of the primary monitor. + + +Indicates the vertical size of the monitor in pixels. +Read Height to learn the size of the monitor in pixels. Use this value along with the Top property to calculate how to position objects vertically in multi-monitor applications. + +Note: The Height property does not take into account any task bars or tool bars docked on the monitor. To determine the area on the monitor that is free of such docked windows, use the WorkareaRect property. + +Indicates the logical position of the top edge of the monitor. +In multi-monitor applications, the available screen space can span multiple monitors from top to bottom. Read Top to determine where, in the entire available screen space, this monitor appears. The value of Top is in pixels relative to the top edge of the primary monitor. + + +Indicates the horizontal size of the monitor in pixels. +Read Width to learn the size of the monitor in pixels. Use this value along with the Left property to calculate vertical positions for objects in multi-monitor applications. + +Note: The Width property does not take into account any task bars or tool bars docked on the monitor. To determine the area on the monitor that is free of such docked windows, use the WorkareaRect property. + +Indicates the dimensions of the monitor in pixels. +Read BoundsRect to learn the dimensions of the monitor. BoundsRect gives the dimensions of the monitor in pixels, where (0,0) represents the top-left corner of the primary monitor. +The top of BoundsRect is given by the Top property, the left edge by the Left property, and the height and width by the Height and Width properties respectively. + +Note: The BoundsRect property does not take into account any task bars or tool bars docked on the monitor. To determine the area on the monitor that is free of such docked windows, use the WorkareaRect property. + +Gives the application useable area of the monitor. +WorkareaRect returns a TRect value furnished with the coordinates and dimensions of the work area of the Monitor. On Windows, for example, the application tabs at the screen mean that the Workarea is smaller than the monitor size. + +Note: The TRect Right and Bottom values are one pixel beyond Workarea boundary. They are given these values to allow for easy calculation of Workarea width and height as (Right-Left) and (Bottom-Top) respectively. + +Indicates whether this is the primary monitor. +Read Primary to determine whether a monitor is the primary monitor in a multi-monitor application. When Primary is true, the monitor is the primary monitor. The coordinates of other monitors are given in terms of the primary monitor. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +TMonitor represents a monitor on which an application runs. +TMonitor represents a monitor that displays the user interface of an application. It introduces properties to describe the dimensions of a single monitor. In addition, the Primary property distinguishes the primary property from other monitors on the system. +When writing multi-monitor applications, use TMonitor to help lay out forms and dialogs so that they are not split over several monitors. +Applications do not create instances of TMonitor. Instead, monitor components for all available monitors are listed by the Monitors property of the global Screen variable. The global Screen variable also provides global information about the monitors on which the application runs, such as screen resolution, available fonts, and so on. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PUREPASCAL + PUREPASCAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mdNearest + + + + + + + + + + + mdNearest + + + + + + + + + + + mdNearest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + $0 + + + + + + + + + + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Return number of scanlines between the scanline containing cursor hotspot + and the last scanline included in the cursor mask for the current cursor. + + + + + + + + + + + + + + + + + + + + + + If True the TScrollBox will attempt to perform automatic vertical scroll + via the mouse wheel in preference to triggering OnMouseWheel. It defaults to False. + Note: if the Mouse.WheelRouting property does not have the value of + TWheelRouting.wrMousePos then this property has no effect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $E + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $AE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + True + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Graphics.xml b/Modules/DelphiVCL/doc/Vcl.Graphics.xml new file mode 100644 index 00000000..fa488022 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Graphics.xml @@ -0,0 +1,8666 @@ + + + + + + $FF000000 + + + + + $FF000000 + + + + + $FF000001 + + + + + $FF000002 + + + + + $FF000003 + + + + + $FF000004 + + + + + $FF000005 + + + + + $FF000006 + + + + + $FF000007 + + + + + $FF000008 + + + + + $FF000009 + + + + + $FF00000A + + + + + $FF00000B + + + + + $FF00000C + + + + + $FF00000D + + + + + $FF00000E + + + + + $FF00000F + + + + + $FF000010 + + + + + $FF000011 + + + + + $FF000012 + + + + + $FF000013 + + + + + $FF000014 + + + + + $FF000015 + + + + + $FF000016 + + + + + $FF000017 + + + + + $FF000018 + + + + + $FF00001A + + + + + $FF00001B + + + + + $FF00001C + + + + + $FF00001D + + + + + $FF00001E + + + + + $0 + + + + + $80 + + + + + $8000 + + + + + $8080 + + + + + $800000 + + + + + $800080 + + + + + $808000 + + + + + $808080 + + + + + $C0C0C0 + + + + + $FF + + + + + $FF00 + + + + + $FFFF + + + + + $FF0000 + + + + + $FF00FF + + + + + $FFFF00 + + + + + $C0C0C0 + + + + + $808080 + + + + + $FFFFFF + + + + + $10 + + + + + $C0DCC0 + + + + + $F0CAA6 + + + + + $F0FBFF + + + + + $A4A0A0 + + + + + $4 + + + + + $1FFFFFFF + + + + + $20000000 + + + + + $FAFAFF + + + + + $F0FAFF + + + + + $F5F0FF + + + + + $E6F5FD + + + + + $F0FFFF + + + + + $DCF8FF + + + + + $DCF5F5 + + + + + $D7EBFA + + + + + $B3DEF5 + + + + + $FFF8F0 + + + + + $FFF8F8 + + + + + $FAE6E6 + + + + + $EEF5FF + + + + + $E0FFFF + + + + + $D5EFFF + + + + + $ADDEFF + + + + + $B5E4FF + + + + + $87B8DE + + + + + $FFFFF0 + + + + + $FAFFF5 + + + + + $F0FFF0 + + + + + $E6F0FA + + + + + $CDFAFF + + + + + $CDEBFF + + + + + $C4E4FF + + + + + $B9DAFF + + + + + $8CB4D2 + + + + + $FFFF + + + + + $8CFF + + + + + $FF + + + + + $8B + + + + + $80 + + + + + $5C5CCD + + + + + $7280FA + + + + + $507FFF + + + + + $D7FF + + + + + $4763FF + + + + + $3C14DC + + + + + $2A2AA5 + + + + + $1E69D2 + + + + + $60A4F4 + + + + + $7AA0FF + + + + + $8080F0 + + + + + $A5FF + + + + + $45FF + + + + + $2222B2 + + + + + $13458B + + + + + $2D52A0 + + + + + $3F85CD + + + + + $7A96E9 + + + + + $8F8FBC + + + + + $AAE8EE + + + + + $D2FAFA + + + + + $8080 + + + + + $228B22 + + + + + $2FFFAD + + + + + $FF7F + + + + + $90EE90 + + + + + $D4FF7F + + + + + $578B2E + + + + + $20A5DA + + + + + $8CE6F0 + + + + + $238E6B + + + + + $8000 + + + + + $32CD9A + + + + + $FC7C + + + + + $98FB98 + + + + + $AACD66 + + + + + $71B33C + + + + + $B86B8 + + + + + $6BB7BD + + + + + $2F6B55 + + + + + $6400 + + + + + $32CD32 + + + + + $FF00 + + + + + $7FFF00 + + + + + $9AFA00 + + + + + $8FBC8F + + + + + $AAB220 + + + + + $EEEEAF + + + + + $FFFFE0 + + + + + $E6D8AD + + + + + $FACE87 + + + + + $ED9564 + + + + + $8B0000 + + + + + $82004B + + + + + $CCD148 + + + + + $D0E040 + + + + + $FFFF00 + + + + + $FFFF00 + + + + + $E6E0B0 + + + + + $EBCE87 + + + + + $E16941 + + + + + $CD0000 + + + + + $701919 + + + + + $D1CE00 + + + + + $A09E5F + + + + + $8B8B00 + + + + + $808000 + + + + + $FFBF00 + + + + + $FF901E + + + + + $FF0000 + + + + + $800000 + + + + + $D30094 + + + + + $CC3299 + + + + + $FF00FF + + + + + $FF00FF + + + + + $8B008B + + + + + $8515C7 + + + + + $9370DB + + + + + $E22B8A + + + + + $D355BA + + + + + $DB7093 + + + + + $800080 + + + + + $9314FF + + + + + $C1B6FF + + + + + $EE82EE + + + + + $D670DA + + + + + $DDA0DD + + + + + $D8BFD8 + + + + + $B469FF + + + + + $CBC0FF + + + + + $DEC4B0 + + + + + $EE687B + + + + + $998877 + + + + + $FFFFFF + + + + + $D3D3D3 + + + + + $808080 + + + + + $B48246 + + + + + $CD5A6A + + + + + $908070 + + + + + $F5F5F5 + + + + + $C0C0C0 + + + + + $696969 + + + + + $E1E4FF + + + + + $8B3D48 + + + + + $4F4F2F + + + + + $DCDCDC + + + + + $A9A9A9 + + + + + $0 + + + + + $8C + + + + + $42 + + + + + $550009 + + + + + $C000CA + + + + + $BB0226 + + + + + $330008 + + + + + $1100A6 + + + + + $F00021 + + + + + $5A0049 + + + + + $FB0A09 + + + + + $8800C6 + + + + + $CC0020 + + + + + $440328 + + + + + $660046 + + + + + $EE0086 + + + + + $FF0062 + + + + + $0 + + + + + $1 + + + + + $2 + + + + + fsBold + + + + + fsItalic + + + + + fsUnderline + + + + + fsStrikeOut + + + + + fpDefault + + + + + fpVariable + + + + + fpFixed + + + + + fqDefault + + + + + fqDraft + + + + + fqProof + + + + + fqNonAntialiased + + + + + fqAntialiased + + + + + fqClearType + + + + + fqClearTypeNatural + + + + + $800000 + + + + + psSolid + + + + + psDash + + + + + psDot + + + + + psDashDot + + + + + psDashDotDot + + + + + psClear + + + + + psInsideFrame + + + + + psUserStyle + + + + + psAlternate + + + + + pmBlack + + + + + pmWhite + + + + + pmNop + + + + + pmNot + + + + + pmCopy + + + + + pmNotCopy + + + + + pmMergePenNot + + + + + pmMaskPenNot + + + + + pmMergeNotPen + + + + + pmMaskNotPen + + + + + pmMerge + + + + + pmNotMerge + + + + + pmMask + + + + + pmNotMask + + + + + pmXor + + + + + pmNotXor + + + + + bsSolid + + + + + bsClear + + + + + bsHorizontal + + + + + bsVertical + + + + + bsFDiagonal + + + + + bsBDiagonal + + + + + bsCross + + + + + bsDiagCross + + + + + fsSurface + + + + + fsBorder + + + + + fmAlternate + + + + + fmWinding + + + + + csHandleValid + + + + + csFontValid + + + + + csPenValid + + + + + csBrushValid + + + + + coLeftToRight + + + + + coRightToLeft + + + + + tfBottom + + + + + tfCalcRect + + + + + tfCenter + + + + + tfEditControl + + + + + tfEndEllipsis + + + + + tfPathEllipsis + + + + + tfExpandTabs + + + + + tfExternalLeading + + + + + tfLeft + + + + + tfModifyString + + + + + tfNoClip + + + + + tfNoPrefix + + + + + tfRight + + + + + tfRtlReading + + + + + tfSingleLine + + + + + tfTop + + + + + tfVerticalCenter + + + + + tfWordBreak + + + + + tfHidePrefix + + + + + tfNoFullWidthCharBreak + + + + + tfPrefixOnly + + + + + tfTabStop + + + + + tfWordEllipsis + + + + + tfComposited + + + + + psStarting + + + + + psRunning + + + + + psEnding + + + + + gsStream + + + + + gsFileName + + + + + gsClipboard + + + + + bmDIB + + + + + bmDDB + + + + + pfDevice + + + + + pf1bit + + + + + pf4bit + + + + + pf8bit + + + + + pf15bit + + + + + pf16bit + + + + + pf24bit + + + + + pf32bit + + + + + pfCustom + + + + + afIgnored + + + + + afDefined + + + + + afPremultiplied + + + + + tmAuto + + + + + tmFixed + + + + + wifBmp + + + + + wifPng + + + + + wifJpeg + + + + + wifGif + + + + + wifTiff + + + + + wifWMPhoto + + + + + wifOther + + + + + wipmNone + + + + + wipmHighQualityCubic + + + + + wipmFant + + + + + wipmCubic + + + + + wipmLinear + + + + + wipmNearestNeighbor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Represents the getter method for the CanvasOrientation property. +GetCanvasOrientation is called each time the value of the CanvasOrientation is read. + + + + + + +Represents the getter method for the ClipRect property. +GetClipRect is called each time the value of ClipRect is read. + + + + + + +Represents the getter method for the PenPos property. +GetPenPos is called each time the value of PenPos is read. + + + + + + + + +Represents the getter method for the Pixels property. +GetPixel is called each time the color of a pixel in the Pixels property is read. + + + + + + +Represents the getter method for the Handle property. +GetHandle is called each time the value of the Handle property is read. GetHandle uses the RequiredState method to make sure that the canvas has a valid handle allocated. + + + + + + +Represents the setter method for the Brush property. +SetBrush is called each time the value of the Brush property is changed. + + + + + + +Represents the setter method for the Font property. +SetFont is called each time the value of the Font property is changed. + + + + + + +Represents the setter method for the Handle property. +SetHandle is called each time the value of the Handle property is changed. SetHandle makes sure to deallocate all associated graphical objects before changing the handle. + + + + + + +Represents the setter method for the Pen property. +SetPen is called each time the value of the Pen property is changed. + + + + + + +Represents the setter method for the PenPos property. +SetPenPos is called each time the value of the PenPos property is changed. + + + + + + + + +Represents the setter method for the Pixels property. +SetPixel is called each time the color of a pixel in the Pixels property is changed. + + + +Allocates a new handle for the canvas. +CreateHandle is called automatically by the canvas when a handle is required. In TCanvas, CreateHandle simply returns without allocating a handle. CreateHandle is supposed to be overridden in descending classes, which, in certain conditions, allocate handles. +For example, TControlCanvas returns the HDC (Windows Device Context handle) for the control the canvas is associated to. + + + + + + +Changes the current state of the canvas to meet the given requirements. +RequiredState ensures that a canvas meets a set of given requirements. If the requirements are not met, the canvas initializes its internal structures so that the requirements are met after the call to RequiredState is completed. +RequiredState verifies that the Pen, Brush and Font objects are created and initialized. RequiredState also makes sure that the canvas has a handle allocated. + + + + + +Creates an instance of TCanvas. +Call Create to instantiate a TCanvas object at runtime. Create allocates memory for the instance of TCanvas and creates the TFont, TBrush and TPen objects for the Font, Brush, and Pen properties. Create also initializes the CopyMode to cmSrcCopy. + + + + + +Destroys an instance of TCanvas. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TCanvas object is not nil and only then calls Destroy. + + + + + + + + + + + + + +Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle. +Use Arc to draw an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4). + +Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. +On NT or Windows 2000, the drawing direction can be changed to clockwise using the Windows API call SetArcDirection. + + + + + + + + + + + + + +Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle. +Vcl.Graphics.TCanvas.ArcTo inherits from Vcl.Graphics.TCustomCanvas.ArcTo. All content below this line refers to Vcl.Graphics.TCustomCanvas.ArcTo. +Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle. +Override the ArcTo method (or just use Arcto from descendant classes) to implement drawing of an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4). +This procedure draws lines by using the current pen and updates the value of PenPos to the value of the last endpoint. + + + + + + + + + + +Draws an arc on the image along the perimeter of the circle defined by the parameters. +The AngleArc method draws a line from the current position to the starting point of the arc and then a counterclockwise circular arc to the arc endpoint. The arc traverses the perimeter of a circle whose center lies at (X,Y) and whose radius is Radius. The arc is drawn following the perimeter of the circle, counterclockwise, from the StartAngle with a sweep angle of SweepAngle. +If the sweep angle is greater than 360 degrees, the entire circle is drawn and part of the arc is drawn multiple times. +The current position is updated to the arc endpoint. + + + + + + + + + +Copies a portion of a bitmap onto a rectangle on the canvas, replacing one of the colors of the bitmap with the brush of the canvas. +Use BrushCopy to achieve special effects such as making the copied image partially transparent. BrushCopy is provided mainly for backward compatibility. Use a TImageList instead of BrushCopy. +Dest specifies the rectangular portion of the canvas that will receive the copy of the bitmap. Bitmap specifies the graphic to copy from. Source specifies the rectangular area of Bitmap to copy. Color specifies the color in Bitmap to replace with the Brush of the canvas. +To use BrushCopy to make the copied image partially transparent, specify the color of the surface of the canvas (clBackground for example) as the Color of the Brush property, then call BrushCopy. + + + + + + + + + + + + + +Draws a closed figure represented by the intersection of a line and an ellipse. +Use Chord to create a shape that is defined by an arc and a line that joins the endpoints of the arc. The chord consists of a portion of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The ellipse is bisected by a line that runs between the points (X3,Y3) and (X4,Y4). +The perimeter of the chord runs counter clockwise from (X3, Y3), counterclockwise along the ellipse to (X4,Y4), and straight back to (X3,Y3). If (X3,Y3) and (X4,Y4) are not on the surface of the ellipse, the corresponding corners on the chord are the closest points on the perimeter that intersect the line. The outline of the chord is drawn using the value of Pen, and the shape is filled using the value of Brush. + +Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. +On NT, the drawing direction can be changed to clockwise using the Windows API call SetArcDirection. + + + + + + + + +Copies part of an image from another canvas into the canvas. +Use CopyRect to transfer part of the image on another canvas to the image of the TCanvas object. Dest specifies the rectangle on the canvas where the source image will be copied. The Canvas parameter specifies the canvas with the source image. Source specifies a rectangle bounding the portion of the source canvas that will be copied. +The portion of the source canvas is copied using the mode specified by CopyMode. + + + + + + + + +Renders the graphic specified by the Graphic parameter on the canvas at the location given by the coordinates (X, Y). +Call Draw to draw a graphic on the canvas. Draw calls the Draw method of the graphic. The image is rendered into a rectangle determined by the size of the graphic, with the upper left corner at the point (X, Y). +Graphics can be bitmaps, icons, or metafiles. If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. + + + + + + + + + +Renders the graphic specified by the Graphic parameter on the canvas at the location given by the coordinates (X, Y). +Call Draw to draw a graphic on the canvas. Draw calls the Draw method of the graphic. The image is rendered into a rectangle determined by the size of the graphic, with the upper left corner at the point (X, Y). +Graphics can be bitmaps, icons, or metafiles. If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. + + + + + + +Draws a rectangle in the style used to indicate that the object inside the rectangle has focus. +Call DrawFocusRect for the perimeter of the image of a control when the control gets or loses input focus. Because DrawFocusRect uses an XOR function, calling it a second time while specifying the same rectangle removes the rectangle from the screen. +The rectangle this function draws cannot be scrolled. To scroll an area containing a rectangle drawn by DrawFocusRect, call DrawFocusRect to remove the rectangle from the screen, scroll the area, and then call DrawFocusRect to draw the rectangle in the new position. + + + + + + + + + +Draws the ellipse defined by a bounding rectangle on the canvas. +Call Ellipse to draw a circle or ellipse on the canvas. Specify the bounding rectangle either by giving: + +The top left point at pixel coordinates (X1, Y1) and the bottom right point at (X2, Y2). +A TRect value.If the bounding rectangle is a square, a circle is drawn.The ellipse is outlined using the value of Pen, and filled using the value of Brush.Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. + + + + + +Fills the specified rectangle on the canvas using the current brush. +Use FillRect to fill a rectangular region using the current brush. The region is filled including the top and left sides of the rectangle, but excluding the bottom and right edges. + + + + + + + + + +Fills an area of the canvas using the current brush. +Use FloodFill to fill a possibly non-rectangular region of the image with the value of Brush. The boundaries of the region to be filled are determined by moving outward from the point (X,Y) until a color boundary involving the Color parameter is encountered. +X and X are the coordinates on the canvas where filling starts. +Color is the color that defines the boundary of the region to fill. Its interpretation depends on the value of FillStyle. +FillStyle specifies whether the region is defined by all pixels with the same value as Color, or all points with a different value. + +Tip: Use the Pixels property to get the exact value of the color at the point (X,Y) when using a FillStyle of fsSurface. Similarly, when FillStyle is fsBorder, use Pixels to get the exact value of the boundary color if a point on the boundary is known. + + + + + +Draws a rectangle using the Brush of the canvas to draw the border. +Use FrameRect to draw a 1 pixel wide border around a rectangular region. FrameRect does not fill the interior of the rectangle with the Brush pattern. +To draw a boundary using the Pen instead, use the Polygon method. + + + + + + +Indicates whether the TCanvas object has acquired a handle to a device context. +Use HandleAllocated to determine whether the Handle property is set to an HDC value. HandleAllocated indicates whether the canvas has acquired a device context. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, TCanvas automatically allocates a new device context and returns its handle if the property had not been previously set. + + + + + + + +Draws a line on the canvas from PenPos to the point specified by X and Y, and sets the pen position to (X, Y). +Use LineTo to draw a line from PenPos up to, but not including the point (X,Y). LineTo changes the value of PenPos to (X,Y). +The line is drawn using Pen. + +Note: If the current Pen does not have a style of psSolid, the line is drawn with a background specified by the current brush. + + + + + + +Changes the current drawing position to the point (X,Y). +Use MoveTo to set the value of PenPos before calling LineTo. Calling MoveTo is equivalent to setting the PenPos property. + + + + + + + + + + + + + +Draws a pie-shaped section of the ellipse bounded by the rectangle (X1, Y1) and (X2, Y2) on the canvas. +Use Pie to draw a pie-shaped wedge on the image. The wedge is defined by the ellipse bounded by the rectangle determined by the points (X1, Y1) and (X2, Y2). The section drawn is determined by two lines radiating from the center of the ellipse through the points (X3, Y3) and (X4, Y4). +The wedge is outlined using Pen, and filled using Brush. + +Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. + + + + + + + + + +Draws a series of lines on the canvas connecting the points passed in and closing the shape by drawing a line from the last point to the first point. +Use Polygon to draw a closed, many-sided shape on the canvas, using the value of Pen. After drawing the complete shape, Polygon fills the shape using the value of Brush. +The Points parameter is an array of points that give the vertices of the polygon. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +The first point is always connected to the last point. + +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the Polygon method. For example, to form a polygon using the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.Polygon(Slice(PointArray, 10)); + +To draw a polygon on the canvas, without filling it, use the Polyline method, specifying the first point a second time at the end. + + + + + + + + + + +Draws a series of lines on the canvas with the current pen, connecting each of the points passed to it in Points. +Use Polyline to connect a set of points on the canvas. If you specify only two points, Polyline draws a single line. +The Points parameter is an array of points to be connected. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the Polyline method. For example, to form a line connecting the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.Polyline(Slice(PointArray, 10)); + +Calling the MoveTo function with the value of the first point, and then repeatedly calling LineTo with all subsequent points will draw the same image on the canvas. However, unlike LineTo, Polyline does not change the value of PenPos. + + + + + + + + + + +Draws a set of Bezier curves. +Use PolyBezier to draw cubic Bezier curves using the endpoints and control points specified by the Points parameter. The first curve is drawn from the first point to the fourth point, using the second and third points as control points. Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point. +The Points parameter gives the endpoints to use when generating the Bezier curves. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +This procedure draws lines by using the current pen. + +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the PolyBezier method. For example, to form a Bezier curve using the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.PolyBezier(Slice(PointArray, 10)); + +Control points after a[Index+3] are ignored. Nothing happens if there aren't enough control points. + + + + + + + + + + +Draws a set of Bezier curves and updates the value of PenPos. +Use PolyBezierTo to draw cubic Bezier curves using the endpoints and control points specified by the Points parameter. The first curve is drawn from the first point to the fourth point, using the second and third points as control points. Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point. +The Points parameter gives the endpoints to use when generating the Bezier curves. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +This procedure draws lines by using the current pen and updates the value of PenPos to the value of the last endpoint. + +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the PolyBezierTo method. For example, to form a Bezier curve using the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.PolyBezierTo(Slice(PointArray, 10)); + + + + + + + + + +Draws a rectangle on the canvas. +Use Rectangle to draw a rectangle using Pen and fill it with Brush. Specify the rectangle's coordinates in one of two ways: +Giving four coordinates that define the upper left corner at the point (X1, Y1) and the lower right corner at the point (X2, Y2). +Using a TRect type. +To fill a rectangular region without drawing the boundary in the current pen, use FillRect. To outline a rectangular region without filling it, use FrameRect or Polygon. To draw a rectangle with rounded corners, use RoundRect. + + + +Deselects the Pen, Brush, and Font from the device context. +Call Refresh to return the HDC used by the canvas to a default state. Refresh does not change the values of the Font, Brush, or Pen properties. Calling any of the drawing methods of the canvas after calling Refresh will reselect the Font, Brush, or Pen into the HDC if it is used by the drawing method. + + + + + + + + + + + +Draws a rectangle with rounded corners on the canvas. +Use RoundRect to draw a rounded rectangle using Pen and fill it with Brush. The rectangle will have edges defined by the points (X1,Y1), (X2,Y1), (X2,Y2), (X1,Y2), but the corners will be shaved to create a rounded appearance. The curve of the rounded corners matches the curvature of an ellipse with width X3 and height Y3. +To draw an ellipse instead, use Ellipse. To draw a true rectangle, use Rectangle. + + + + + + + +Draws the graphic specified by the Graphic parameter in the rectangle specified by the Rect parameter. +Call StretchDraw to draw a graphic on the canvas so that the image fits in the specified rectangle. StretchDraw calls the Draw method of the graphic. The graphic object determines how to fit into the rectangle. This may involve changing magnification and/or aspect ratio. +To render the graphic in its natural size, use the Draw method, instead. +If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. + +Note: If the graphic is an icon, it is not stretched. + + + + + + +Returns the width and height, in pixels, of a string rendered in the current font. +Use TextExtent to determine the space a string will occupy in the image. Other elements in the image such as lines, boxes, or additional lines of text can be positioned to accommodate the size of the text. TextExtent returns the width and height of the rectangle that bounds the text on the canvas. +To check only the height, call TextHeight. To check only the width, call TextWidth. + + + + + + + + +Writes a string on the canvas, starting at the point (X,Y), and then updates the PenPos to the end of the string. +Use TextOut to write a string onto the canvas. The string will be written using the current value of Font. Use the TextExtent method to determine the space occupied by the text in the image. To write only the text that fits within a clipping rectangle, use TextRect instead. +After a call to TextOut, the PenPos property indicates the point at the top right of the text on the canvas. + + + + + + + + [] + + + + +Writes a string inside a clipping rectangle. +Use TextRect to write a string within a limited rectangular region. Any portions of the string that fall outside the rectangle passed in the Rect parameter are clipped and don't appear. The upper left corner of the text is placed at the point (X, Y). + + + + + + + + + +Writes a string inside a clipping rectangle. +Use TextRect to write a string within a limited rectangular region. Any portions of the string that fall outside the rectangle passed in the Rect parameter are clipped and don't appear. The upper left corner of the text is placed at the point (X, Y). + + +Specifies the handle for this canvas. +The Handle property specifies the Windows GDI handle to the device context for this canvas. +Set Handle to the HDC for the device context the canvas must draw into. When a windowed control responds to a Windows paint message, the HDC for drawing is passed in to the PaintWindow method. In other cases, an HDC can be obtained for a window by calling the GetDeviceContext method of a control. Additionally, Windows provides API calls to obtain an HDC for a printer or for a memory image. +Read the Handle property to supplement the drawing services provided by the TCanvas object with API calls that require a handle to a device context. Most of the Windows GDI calls require an HDC. +TCanvas does not own the HDC. Applications must create an HDC and set the Handle property. Applications must release the HDC when the canvas no longer needs it. Setting the Handle property of a canvas that already has a valid HDC will not automatically release the initial HDC. + +Note: Some descendants of TCanvas, such as TControlCanvas, do own the HDC. Do not set the Handle property for these objects. They fetch and free their own Handle. + +Determines the color and pattern for filling graphical shapes and backgrounds. +Set the Brush property to specify the color and pattern to use when drawing the background or filling in graphical shapes. The value of Brush is a TBrush object. Set the properties of the TBrush object to specify the color and pattern or bitmap to use when filling in spaces on the canvas. + +Note: Setting the Brush property assigns the specified TBrush object, rather than replacing the current TBrush object. + +Specifies how a graphical image is copied onto the canvas. +Set CopyMode to affect the way graphical images are drawn onto the canvas. The CopyMode is used when copying an image from another canvas using the CopyRect method. CopyMode is also used by TBitmap objects when they draw themselves to a canvas. +Use CopyMode to achieve a variety of affects when rendering an image. Achieve special effects like merged images and making parts of a bitmap transparent by combining multiple images with different CopyModes. + + +Specifies the font to use when writing text on the image. +Set Font to specify the font to use for writing text on the image. The value of Font is a T Font object. Set the properties of the T Font object to specify the font face, color, size, style, and any other aspects of the font. +The Canvas.Font property is only guaranteed to equal the Font property if you have an owner-drawn listbox (where you are expected to use the canvas). Even in that case, it is only guaranteed to equal the Font property once the first paint message is underway. If you use a canvas inside an ownerdraw event, everything should work as expected. Using the canvas for a reason outside the scope of its intended usage may give unpredictable results. + +Note: Setting the Font property assigns the specified T Font object, rather than replacing the current T Font object. + +Specifies the kind of pen the canvas uses for drawing lines and outlining shapes. +Set Pen to specify the pen to use for drawing lines and outlining shapes in the image. The value of Pen is a TPen object. Set the properties of the TPen object to specify the color, style, width, and mode of the pen. + +Note: Setting the Pen property assigns the specified TPen object, rather than replacing the current TPen object. + + +TCanvas provides an abstract drawing space for objects that must render their own images. +Use TCanvas as a drawing surface for objects that draw an image of themselves. Standard window controls such as edit controls or list boxes do not require a canvas, as they are drawn by the system. +TCanvas provides properties, events, and methods that assist in creating an image by: + +Specifying the type of brush, pen, and font to use. +Drawing and filling a variety of shapes and lines. +Writing text. +Rendering graphic images. +Enabling a response to changes in the current image. +TCanvas has two descendants, TControlCanvas and TMetafileCanvas, which assist in drawing images of controls and in creating metafile images for objects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Called when graphic has changed. +Changed is called automatically whenever the TGraphic object is modified. It sets the Modified property to True and triggers the OnChange event. + + + + + + +Set virtual property for reading and writing graphic data stream. +DefineProperties overrides TPersistent.DefineProperties for the ReadData and WriteData methods for reading and writing graphic data from and to a TStream object. It creates a virtual property Data that can be treated as a property to read or write graphic data to the TGraphic object. + + + + + + + +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + + + + + + +Render graphic onto canvas at rectangle, blending with canvas's background. +DrawTransparent renders the graphic onto a canvas at the coordinates specified by the Rect parameter, blending it with the canvas's background. + + + + + + + +Compare graphic to another TGraphic object and return true if objects contain same graphic. +Equals compares the contents of two TGraphic objects. Equals returns false if the TGraphic are different classes or if they contain different graphical data. + +Code Examples +TGraphic (Delphi) +TGraphic (C++) + + + + + + + + + +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + + + + +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Get color palette of graphical image. +GetPalette gets the color palette of the graphical image. You can also use the Palette property to get the color palette of a graphical image. If the graphic does not need or use a palette, the Palette property is zero. + + + + + + +Specifies if graphic is drawn transparently. +GetTransparent specifies whether a graphic should be drawn transparently. +Use the Transparent property to specify that the graphic be drawn transparently. + + + + + + +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + + + + + + + +Generate OnProgress event when graphic is changing. +Progress generates an OnProgress event when the graphic is in the process of changing. +For certain descendants of TGraphic, OnProgress occurs during slow processes such as loading, storing, or transforming image data. OnProgress allows applications to provide feedback to the user about the progress of the process. +Component writers can generate OnProgress events for new descendants of TGraphic by calling the protected Progress method. These events are propagated to the TPicture and TImage objects. + + + + + + +Read graphic data from TStream. +ReadData is used to read the binary graphic from the virtual property Data (created by DefineProperties) when streaming in a TGraphic from the TStream Stream. + + + + + + +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Set color palette of graphical image. +SetPalette sets the color palette of the graphical image. +Use the Palette property to get the color palette of a graphical image. If the graphic does not need or does not use a palette, the Palette property is zero. + + + + + + +Specify if graphic should be drawn transparently. +SetTransparent specifies if a graphic should be drawn transparently. + + + + + + +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + + +Write graphic data to TStream. +WriteData is used to write the binary graphic to the virtual property Data (created by DefineProperties) when streaming a TGraphic out to the TStream Stream. + + + + + + +Indicate whether graphic supports partial transparency. +GetSupportsPartialTransparency indicates whether the graphic supports partial transparency. +TGraphic descendants should override GetSupportsPartialTransparency if they are capable of having partially transparent pixels. + + + + + +Create TGraphic object. +This method creates and intializes a TGraphic object. + + + + + + + +Destroys the TPersistent instance and frees its memory. +Vcl.Graphics.TGraphic.Destroy inherits from System.Classes.TPersistent.Destroy. All content below this line refers to System.Classes.TPersistent.Destroy. +Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + + + + + +Compare graphic to another TGraphic object and return true if objects contain same graphic. +Equals compares the contents of two TGraphic objects. Equals returns false if the TGraphic are different classes or if they contain different graphical data. + +Code Examples +TGraphic (Delphi) +TGraphic (C++) + + + + + + + + + +Loads a graphic image stored in a file. +LoadFromFile reads the file specified in FileName and loads the data into the graphics object. + + + + + + +Saves a graphics image to a file. +SaveToFile writes the graphic to a file, specified by Filename. + +Code Examples +TJPEGImageAssign (Delphi) +TJPEGImageAssign (C++) +ImageProc Sample + + + + + + + + + + +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + + + + + + +Introduces an abstract method that loads the image from a stream. +Each descendant graphic object defines a LoadFromStream method that loads a graphics object from Stream. + + + + + + +Introduces an abstract method that saves the graphic image to a stream. +Each descendant graphic object defines a SaveToStream method that saves the object to a Stream. + + + + + + + + + + +Introduces an abstract method that loads the image from a variable in Clipboard format. +Each descendant graphic object defines a LoadFromClipboardFormat method that replaces the current graphic image with the graphic indicated by AData, which it loads from the Clipboard. +The format for the new graphic object must be registered with the Clipboard in the RegisterClipboardFormat method, or an exception is raised. + + + + + + + + +Introduces an abstract method that assigns the graphic to a variable in clipboard format. +Each descendant graphic object defines a SaveToClipboardFormat method that saves that particular graphic image type to a Clipboard format. An application must have registered the format with the TGraphic object using the RegisterClipboardFormat method. + + + + + + + +Specifies the size of the graphic. +Use the SetSize method to set both the height and width of the graphic. This results in better performance than setting the height and width separately. + + + + + + + + + True + + + + +EnableScaledDrawer Enables scaled drawer for a graphic, which is used to scale the graphic. +AGraphicScalerClass specifies the scaled drawer class, for example TWICScaledGraphicDrawer. + +See also +ScaledDrawer +DisableScaledDrawer + + + + +DisableScaledDrawer Disables scaled drawer for a graphic. + +See also +ScaledDrawer +EnableScaledDrawer + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Indicates whether the graphics object contains a graphic. +Use Empty to determine whether the graphic is bound to an image. Each descendant graphic object defines its own Get method to access the Empty property. + + + + +Specifies the vertical size of the graphic in pixels. +Use Height to determine the height of the graphic image. Each descendant graphic object defines its own Get and Set methods to access the Height property. + +Code Examples +SaveToFile (Delphi) +ScanLine (Delphi) +SaveToFile (C++) +ScanLine (C++) + + + + + +Indicates whether the graphics object has been changed or edited. +If Modified is true, the graphic object has changed. If Modified is false, the graphics object is in the same state as when the object was loaded. +The Modified property indicates only if bitmap objects have been modified. Modified is not true if the graphics object contains an icon or metafile graphic, even if they have been modified. +If the graphics object was modified, save the changes to a file with the SaveToFile method. The next time the application runs, it can load the graphic from the file with the LoadFromFile method. + + + + +Indicates the color palette of the graphical image. +Use Palette to get the color palette of a graphical image. If the graphic does not need or does not use a palette, the Palette property is zero. + +Code Examples +GetDeviceContext (Delphi) +GetDeviceContext (C++) + + + + + +Indicates whether the palette has changed. +Use PaletteModified to determine if the palette used for a graphical image has changed. PaletteModified is used in the OnChange event. PaletteModified remains true until whoever is responsible for realizing this new palette (for example, TImage) sets it to false. + + + + +Indicates whether the image covers its rectangular area. +Use Transparent to specify that the graphic be drawn transparently. Some descendants of TGraphic such as TIcon and TMetafile are always transparent, so setting the property for those objects does not change their behavior. However, the TBitmap graphic's drawing is affected by this property. The TImage component sets this property to be the same as its Transparent property to achieve transparent painting. +When the Transparent property is set to True, you can either specify a color as the transparent color or you can use the default color, which is the pixel in the lower left. The specified color is not displayed in the graphic, which lets the background show through. This can be useful in layering and for non-rectangular graphics. + +Code Examples +FileSelectBtnEdit (Delphi) +TransparentColor (Delphi) +FileSelectBtnEdit (C++) +TransparentColor (C++) + + + + + +Determines the maximum width of the graphics object in pixels. +Each descendant graphic object defines its own Get and Set methods to access the Width property. + +Code Examples +SaveToFile (Delphi) +ScanLine (Delphi) +SaveToFile (C++) +ScanLine (C++) + + + + + +Returns the reference to the scaled drawer. +When the scaled drawer is enabled for graphic, then the ScaledDrawer property returns the reference to it. + +See also +EnableScaledDrawer + + + +Occurs whenever a graphical image changes. +Use OnChange to write a handler to perform an action then the graphical image changes. + + + + +Occurs when a graphical image is in the process of changing. +For certain descendants of TGraphic, OnProgress occurs during slow processes such as loading, storing, or transforming image data. OnProgress allows applications to provide feedback to the user about the progress of the slow process. +Component writers can generate OnProgress events for new descendants of TGraphic by calling the protected Progress method. These events are propagated to the TPicture and TImage objects. +OnProgress is an event handler of type Vcl.Graphics.TProgressEvent. + + +Indicate whether graphic supports partial transparency or an alpha channel. +SupportsPartialTransparency indicates whether the graphic supports partial transparency or an alpha channel. +Some TGraphic descendants, such as TBitmap and TPngImage, can support partial transparency or an alpha channel. When a graphic that supports partial transparency is drawn on a canvas using DrawTransparent, it should be blended with the pixels on the canvas based on the value of the alpha channel. + + + +TGraphic is the abstract base class type for objects such as icons, bitmaps, and metafiles that can store and display visual images. +TGraphic is an abstract class that cannot be instantiated. Descendant graphics objects override many of the methods of TGraphic to address the needs of their particular file format and graphical characteristics. TGraphic also introduces methods that work with TPicture objects and the Clipboard. Properties of TGraphic provide information about the state and size of the graphic image. +When the type of graphic is known, store the graphic in its specific type object. Otherwise, use a TPicture object that can hold any type of TGraphic. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Copies the properties of an object to a destination object. +Vcl.Graphics.TPicture.AssignTo inherits from System.Classes.TPersistent.AssignTo. All content below this line refers to System.Classes.TPersistent.AssignTo. +Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Provides an interface for a method that reads and writes otherwise unpublished data. +Vcl.Graphics.TPicture.DefineProperties inherits from System.Classes.TPersistent.DefineProperties. All content below this line refers to System.Classes.TPersistent.DefineProperties. +Provides an interface for a method that reads and writes otherwise unpublished data. +Descendants of TPersistent override DefineProperties to designate a method for storing the object's unpublished data to a stream such as a form file. By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method. +When overriding DefineProperties, consider including some or all of the following: + +A call to the inherited method +Calls to the filer object's DefineProperty method +Calls to the filer object's DefineBinaryProperty method +DefineProperties is virtual, so descendant classes can override it as necessary but are not required to do so. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Creates a TPicture object. +Call Create to create an instance of TPicture at runtime. Create allocates the memory for the picture object and initializes its internal formats. After creating the TPicture object, use the LoadFromClipboardFormat or LoadFromFile method to assign a graphical image to the picture, so that it is available to the application. + + + + + +Destroys an instance of a picture object. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TPicture reference is not nil before it calls Destroy. +Destroy frees the graphic image it contains before calling the inherited Destroy. + + + + + + +Reads the file specified in Filename and loads the data into the TPicture object. +Use LoadFromFile to read a picture from disk. The TGraphic class created is determined by the file extension of the file. If the file extension is not recognized an EInvalidGraphic exception is raised. + + + + + + +Writes the picture to disk. +Use SaveToFile to save a TPicture object to the file specified in Filename. +The saved picture can be loaded to another TPicture or to an appropriate TGraphic descendant by calling its LoadFromFile method. + + + + + + +Reads the picture from a Stream. +Use LoadFromStream to read a picture from a TStream object. The TGraphic class created is determined by the type of data contained in the stream. +The data in the stream should be previously written by a call to the SaveToStream method of another TPicture or of a TGraphic descendant. + + + + + + +Saves the picture to a stream. +Use SaveToStream to save a picture to the TStream object specified by the Stream parameter. +The saved picture can be loaded to another TPicture or to an appropriate TGraphic descendant by calling its LoadFromStream method. + + + + + + + + +Reads the picture from the handle provided in the given Clipboard format. +Use LoadFromClipboardFormat to read in a graphic from the Clipboard. If the format is not supported, an EInvalidGraphic exception is raised. +The following code snippet shows how to load a picture from the clipboard into a TImage control. + +Note: To load a picture into the clipboard, you can use the code snippet for the SaveToClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + Picture: TPicture; +begin + Picture := TPicture.Create; + try + Picture.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0); + Image1.Picture := Picture; + finally + Picture.Free; + Clipboard.Clear; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TPicture* Picture; + TClipboard* cb = Clipboard(); + + Picture = new TPicture(); + try{ + Picture->LoadFromClipboardFormat(CF_BITMAP, cb->GetAsHandle(CF_BITMAP), 0); + Image1->Picture = Picture; + } + __finally{ + delete Picture; + cb->Clear(); + } +} + + + + + + + + + +Allocates a global handle and writes the picture in its native Clipboard format (CF_BITMAP for bitmaps, CF_METAFILE for metafiles, and so on). +Use SaveToClipboardFormat to copy the picture to a Clipboard format. The resulting values can then be copied to the Windows clipboard using the clipboard's SetAsHandle method. +The palette of the picture is returned in the APalette parameter, the format in the AFormat parameter, and a handle to the data in the AData parameter. Before the picture can be saved, an application must have registered the format using the RegisterClipboardFormat method. +The following code snippet shows how to save a bitmap to the clipboard. + +Note: To load a bitmap from the clipboard, you can use the code snippet for the LoadFromClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + MyFormat : Word; + Picture : TPicture; + AData : THandle; + APalette : HPALETTE; +begin + Picture := TPicture.Create; + try + Picture.LoadFromFile('C:\Users\Public\Pictures\Sample Pictures\desert.bmp'); + Picture.SaveToClipBoardFormat(MyFormat, AData, APalette); + ClipBoard.SetAsHandle(MyFormat,AData); + finally + Picture.Free; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TClipboard* cb = Clipboard(); + unsigned short MyFormat; + TPicture* Picture; + unsigned int AData; + HPALETTE APalette; + + Picture = new TPicture(); + try{ + Picture->LoadFromFile("C:\\Users\\Public\\Pictures\\Sample Pictures\\desert.bmp"); + Picture->SaveToClipboardFormat(MyFormat, AData, APalette); + cb->SetAsHandle(MyFormat, AData); + } + __finally{ + delete Picture; + } +} + + + + + + + + +Indicates if the given Clipboard format is supported by the LoadFromClipboardFormat method. +If the LoadFromClipboardFormat method supports the Clipboard format specified as the value of AFormat, SupportsClipboardFormat returns true. If the format is not supported, the method returns false. + + + + + + +Copies one object to another by copying the contents of that object to the other. +When Source is a object type that is valid for the Graphic property, Assign makes that graphic the value of the Graphic property. +The actions performed by Assign depend on the actual types of the TPicture Graphic property and Source. For example, if the Graphic property and Source are bitmaps (TBitmap), the bitmap contained in Source is copied into the Graphic property. Similar conversions are valid, for example, for TIcon or TMetafile. +If the Source parameter is not a valid object for the Graphic property, Assign calls the inherited method so that the picture can be copied from any object with which it is compatible. + + + + + + + + +Registers a new TGraphic class for use in LoadFromFile. +Use RegisterFileFormat to register a graphic file format with TPicture so that it can be used with a Open or Save dialog box. +The AExtension parameter specifies the three-character system file extension to associate with the graphic class (for example, "bmp" is associated with TBitmap). The ADescription parameter specifies the description of the graphic to appear in the drop down list of the dialog box (for example, "Bitmaps" is the description of TBitmap). The AGraphicClass parameter registers the new graphic class to associate with the file format. + + + + + + + +Registers a new TGraphic class for use in the LoadFromClipboardFormat method. +Use RegisterClipboardFormat register a new graphic format with TPicture so that it can be used with the LoadFromClipboardFormat method. + + + + + + +Removes all references to the specified TGraphic class and all its descendants from the internal lists of file formats and clipboard formats. +Call UnregisterGraphicClass to make a graphic class unavailable to all picture objects. UnregisterGraphicClass reverses the registration accomplished by the RegisterFileFormat, or RegisterFileFormatRes, or RegisterClipboardFormat method. When a graphic class is registered, the global GraphicFilter, GraphicExtension, and GraphicFileMask functions can return dialog filter strings, default file extensions or file filters for the graphic class. Call UnregisterGraphicClass when these values should not be available. For example, component writers who implement custom graphic classes unregister those classes according to the language used. In Delphi, the classes are unregistered in the finalization block of the unit that implements them and, in C++, the classes are unregistered using the #pragma exit directive (C++). +File formats and clipboard formats for the custom class are registered in the initialization block (Delphi) or using #pragma startup (C++). + + + + + + + + +Registers a new TGraphic class for use in the LoadFromFile method. +Use RegisterFileFormatRes by specifying a string resource. +The AExtension parameter specifies the three-character system file extension to associate with the graphic class (for example, "bmp" is associated with TBitmap). +The ADescriptionResID parameter specifies the resource ID for a description of the graphic, which then appears in the drop down list of the dialog box (for example, "Bitmaps" is the description of TBitmap). +The AGraphicClass parameter registers the new graphic class to associate with the file format. + + +Specifies the contents of the picture object as a bitmap graphic (.BMP file format). +Use Bitmap to reference the picture object when it contains a bitmap. If Bitmap is referenced when the picture contains a Metafile or Icon graphic, the graphic won't be converted (Types of Graphic Objects). Instead, the original contents of the picture are discarded and Bitmap returns a new, blank bitmap. + +Note: When assigning the Bitmap property, TPicture assigns the properties of a another TBitmap object. It does not take ownership of the specified value. + +Specifies the graphic that the picture contains. +Use Graphic to specify what graphic the TPicture object contains. The graphic can be a bitmap, icon, metafile, or user-defined graphic class (Types of Graphic Objects). + +Note: When assigning the Graphic property, TPicture assigns the properties of a another TGraphic object. It does not take ownership of the specified object. + +Represents an OLE interface for the picture. +PictureAdapter is for internal use only. + + +Specifies the vertical size (in pixels) of the graphic. +Use Height to find the height of the graphic image contained in the picture object. Height is the native, unstretched, height of the picture. + + +Specifies the contents of the TPicture object as an icon graphic (.ICO file format). +If Icon is referenced when the TPicture contains a Bitmap or Metafile graphic, the graphic won't be converted. Instead, the original contents of the TPicture are discarded and Icon returns a new, blank icon. + +Note: When assigning the Icon property, TPicture assigns the properties of a another Icon object. It does not take ownership of the specified value. + +Specifies the contents of the picture object as an Enhanced Windows metafile graphic (.EMF file format). +If Metafile is referenced when the TPicture contains a Bitmap or Icon graphic, the graphic won't be converted. Instead, the original contents of the TPicture are discarded and Metafile returns a new, blank metafile (Types of Graphic Objects +). + +Note: When assigning the Metafile property, TPicture assigns the properties of a another TMetafile object. It does not take ownership of the specified value. + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies the horizontal size (in pixels) of the picture. +Use Width to find the width of a graphic image. Width contains the native, unstretched, width of the picture. + + +Occurs when the specific graphics item encapsulated by the picture object changes. +Use OnChange to write an event handler to process an action when the graphic is modified. + + + + +Occurs periodically during slow operations that affect the graphic. +OnProgress is generated by the particular graphic that the picture object contains. Whether OnProgress occurs depends upon the type of graphic in the Graphic property. Some graphics generate this event, others do not. Jpeg images, for example, generate an OnProgress event. +Write an OnProgress event handler to provide the user with feedback during slow operations such as loading large compressed images. TImage, for example, hooks the OnProgress event of TPicture. + +Note: The PercentDone parameter on the event handler is only an approximation. With some image formats, the value of PercentDone may actually decrease from the value in previous events, as the graphic object discovers there is more work to do. +OnProgress is an event handler of type Vcl.Graphics.TProgressEvent. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +TPicture contains a bitmap, icon, metafile graphic, or user-defined graphic. +TPicture is a TGraphic container, used to hold a graphic, the type of which is specified in the Graphic property. It is used in place of a TGraphic if the graphic can be of any TGraphic class. LoadFromFile and SaveToFile are polymorphic. For example, if the TPicture is holding an Icon, it is valid to LoadFromFile a bitmap file, where the class TIcon can only read .ICO files. +If the TPicture contains a bitmap graphic, the Bitmap property specifies the graphic. If the TPicture contains an icon graphic, the Icon property specifies the graphic. If the TPicture contains a metafile graphic, the Metafile property specifies the graphic. +The properties of TPicture indicate the type of graphic that the picture object contains, and its size. The methods of TPicture are used to load, save, and manipulate graphics. +To load or save a picture to the Clipboard, use the Assign method of a TClipboard object. +To draw a picture on a canvas, call the Draw or StretchDraw methods of a TCanvas object, passing the Graphic property of a TPicture as a parameter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Indicates whether graphics object contains graphic. +Vcl.Graphics.TMetafile.GetEmpty inherits from Vcl.Graphics.TGraphic.GetEmpty. All content below this line refers to Vcl.Graphics.TGraphic.GetEmpty. +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + + + + +Get vertical size of graphic in pixels. +Vcl.Graphics.TMetafile.GetHeight inherits from Vcl.Graphics.TGraphic.GetHeight. All content below this line refers to Vcl.Graphics.TGraphic.GetHeight. +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Get color palette of graphical image. +Vcl.Graphics.TMetafile.GetPalette inherits from Vcl.Graphics.TGraphic.GetPalette. All content below this line refers to Vcl.Graphics.TGraphic.GetPalette. +Get color palette of graphical image. +GetPalette gets the color palette of the graphical image. You can also use the Palette property to get the color palette of a graphical image. If the graphic does not need or use a palette, the Palette property is zero. + + + + + + +Get horizontal size of graphic in pixels. +Vcl.Graphics.TMetafile.GetWidth inherits from Vcl.Graphics.TGraphic.GetWidth. All content below this line refers to Vcl.Graphics.TGraphic.GetWidth. +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + + + +Render graphic onto canvas at rectangle. +Vcl.Graphics.TMetafile.Draw inherits from Vcl.Graphics.TGraphic.Draw. All content below this line refers to Vcl.Graphics.TGraphic.Draw. +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + + + + +Read graphic data from TStream. +Vcl.Graphics.TMetafile.ReadData inherits from Vcl.Graphics.TGraphic.ReadData. All content below this line refers to Vcl.Graphics.TGraphic.ReadData. +Read graphic data from TStream. +ReadData is used to read the binary graphic from the virtual property Data (created by DefineProperties) when streaming in a TGraphic from the TStream Stream. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Set vertical size of graphic in pixels. +Vcl.Graphics.TMetafile.SetHeight inherits from Vcl.Graphics.TGraphic.SetHeight. All content below this line refers to Vcl.Graphics.TGraphic.SetHeight. +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Specify if graphic should be drawn transparently. +Vcl.Graphics.TMetafile.SetTransparent inherits from Vcl.Graphics.TGraphic.SetTransparent. All content below this line refers to Vcl.Graphics.TGraphic.SetTransparent. +Specify if graphic should be drawn transparently. +SetTransparent specifies if a graphic should be drawn transparently. + + + + + + +Set horizontal size of graphic in pixels. +Vcl.Graphics.TMetafile.SetWidth inherits from Vcl.Graphics.TGraphic.SetWidth. All content below this line refers to Vcl.Graphics.TGraphic.SetWidth. +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Write graphic data to TStream. +Vcl.Graphics.TMetafile.WriteData inherits from Vcl.Graphics.TGraphic.WriteData. All content below this line refers to Vcl.Graphics.TGraphic.WriteData. +Write graphic data to TStream. +WriteData is used to write the binary graphic to the virtual property Data (created by DefineProperties) when streaming a TGraphic out to the TStream Stream. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Instantiates a metafile object. +Call Create to instantiate a metafile at runtime. +Create allocates memory for a metafile object, and calls the inherited Create. Then sets the Enhanced and Transparent properties to true. +To create a metafile image from scratch, draw the image in a metafile canvas. When the metafile canvas is destroyed, it transfers the image into the metafile object provided to the metafile canvas constructor. After the image is drawn on the canvas and the canvas is destroyed, the image is 'playable' in the metafile object. + + + + + +Destroys an instance of a metafile object. +Do not call Destroy directly in an application. Instead, an application should call Free. Free verifies that the TMetafile reference is not nil before it calls Destroy. +Destroy releases the image, which frees the image and the handle when the reference count on the metafile image is zero. Then Destroy calls the inherited Destroy. + + + +Deletes the metafile image. +Use Clear to release the old metafile image, create a new image, and increment a reference count on it. + + + + + + +Indicates whether the TMetafile object has acquired a handle to the underlying GDI object. +Use HandleAllocated to determine whether the Handle property is set to an HMETAFILE value. HandleAllocated indicates whether the underlying GDI object has already been created. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, it automatically creates a metafile and returns its handle if the underlying GDI object does not already exist. + + + + + + + + +Vcl.Graphics.TMetafile.CanLoadFromStream inherits from Vcl.Graphics.TGraphic.CanLoadFromStream. All content below this line refers to Vcl.Graphics.TGraphic.CanLoadFromStream. +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + + + + + + +Loads the metafile from a stream. +Use LoadFromStream by specifying the stream from which the metafile is loaded as the value of Stream. LoadFromStream reads a metafile from a stream and replaces the current image with it. + + + + + + +Writes the metafile to disk. +Use SaveToFile to save the metafile to a file provided by the Filename parameter. To load a metafile from a file, call the LoadFromFile method. + + Note: If the Filename parameter has an extension of ".wmf", the metafile is saved as a WMF file. It is not necessary to set the Enhanced property. + + + + + + + +Writes the metafile to a stream. +Use SaveToStream to save the metafile to the stream specified by the Stream parameter. +If the Enhanced property is True, the metafile is saved as an EMF; if False, it it saved as a WMF. + + + + + + + + +Loads a metafile from the Clipboard. +LoadFromClipboardFormat replaces the current image with the data in the clipboard. LoadFromClipboardFormat ignores the AData and APalette parameters. + + + + + + + + +Saves a metafile to a Clipboard format. +Use SaveToClipboardFormat to copy the metafile to a Clipboard format. The resulting values can then be copied to the Windows clipboard using the clipboard's SetAsHandle method. +The metafile's palette is returned in the APalette parameter, the format in the AFormat parameter, and a handle to the data in the AData parameter. Before the metafile can be saved, an application must have registered the format with the metafile object using the RegisterClipboardFormat method. +To save a metafile to a file, call SaveToFile. + + + + + + +Copies an object to the metafile. +Assign copies the Enhanced and Palette properties of an object to the metafile. If the metafile is nil (Delphi) or NULL (C++), Assign creates one. Otherwise, Assign calls the inherited method. For assignment, metafiles are polymorphic with other TGraphic objects, and with TPicture. + + + + + + +Releases the Windows GDI object represented by the metafile. +Call ReleaseHandle to release the resources used to represent the metafile. ReleaseHandle sets the Handle property to nil. NULL. +Call ReleaseHandle before setting the Handle property, so that the resources associated with the metafile are not lost. + + + + + + + +Specifies the size of the metafile. +Use the SetSize method to set both the height and width of the metafile. This results in better performance than setting the height and width separately. + + + + +Specifies the name of the author or application used to create the metafile. +Use CreatedBy to set the string to an optional name of the author or application used to create the metafile. To set the CreatedBy string of a new metafile, call the TMetafileCanvas CreateWithComment constructor (Delphi) or the TMetafileCanvas constructor that takes a comment (C++). + + +Provides an optional text description that is embedded in the metafile. +Set the Description string of a new metafile by calling the TMetafileCanvas CreateWithComment constructor (Delphi) or the TMetafileCanvas constructor that takes a comment (C++).. + + +Determines how the metafile will be stored on disk. +Use Enhanced to determine how the metafile is stored on disk. If Enhanced is True, the metafile is stored as an .EMF (Win32 Enhanced Metafile). If Enhanced is False, the metafile is stored as a .WMF (Windows 3.1 Metafile, with Aldus header). +The in-memory format is always EMF. WMF has very limited capabilities; storing as WMF will lose information that would be retained by EMF. This property is set to match the metafile type when loaded from a stream or file. If loaded as WMF, then save as WMF. +By default, the Enhanced property is True. + + +Provides access to the Windows GDI metafile handle, for accessing the GDI metafile object. +Use Handle when calling a Windows API function that requires the handle of a metafile object. Pass the handle from the Handle property of the metafile object to the function. + + +Contains the width of the metafile image in 0.01 millimeter units, the native scale used by enhanced metafiles. +MMWidth is used for a more accurate reading of the horizontal size of the graphic. The Width property, by contrast, is always in screen device pixel units; to avoid loss of precision in converting between device pixels and millimeters, set or read the dimensions in millimeters with MMWidth. +The MMWidth property is always in screen device pixel units. + + +Contains the height of the metafile image in 0.01 millimeter units, the native scale used by enhanced metafiles. +MMHeight is used for a more accurate reading of the vertical size of the graphic. The Height property, by contrast, is always in screen device pixel units; to avoid loss of precision in converting between device pixels and millimeters, set or read the dimensions in millimeters with MMHeight. + + +Returns the units per inch that are used for the metafile's coordinate mapping. +Use Inch to find the units per inch assumed by a WMF metafile, and to alter scale when writing as WMF, but otherwise this property is obsolete. Enhanced metafiles maintain complete scale information internally. For example, if the metafile was created in a Twips coordinate system (using MM_TWIPS mapping), the value of Inch is 1440. + + + + + +TMetafile is an encapsulation of the Win32 Enhanced metafile. +TMetafile contains a metafile graphic (EMF file format). +Properties of TMetafile indicate the size and characteristics of the metafile. +To draw a metafile on a canvas, call the Draw or StretchDraw methods of a TCanvas object, passing a TMetafile as a parameter. The Enhanced property determines how the metafile will be stored on disk. If Enhanced is true, the metafile is stored as an .EMF (Win32 Enhanced Metafile) file. If Enhanced is false, the metafile is stored as a .WMF (Windows 3.1 Metafile, with Aldus header). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nil + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + +Indicate whether graphic supports partial transparency. +Vcl.Graphics.TBitmap.GetSupportsPartialTransparency inherits from Vcl.Graphics.TGraphic.GetSupportsPartialTransparency. All content below this line refers to Vcl.Graphics.TGraphic.GetSupportsPartialTransparency. +Indicate whether graphic supports partial transparency. +GetSupportsPartialTransparency indicates whether the graphic supports partial transparency. +TGraphic descendants should override GetSupportsPartialTransparency if they are capable of having partially transparent pixels. + + + + + + +Called when graphic has changed. +Vcl.Graphics.TBitmap.Changed inherits from Vcl.Graphics.TGraphic.Changed. All content below this line refers to Vcl.Graphics.TGraphic.Changed. +Called when graphic has changed. +Changed is called automatically whenever the TGraphic object is modified. It sets the Modified property to True and triggers the OnChange event. + + + + + + + +Render graphic onto canvas at rectangle. +Vcl.Graphics.TBitmap.Draw inherits from Vcl.Graphics.TGraphic.Draw. All content below this line refers to Vcl.Graphics.TGraphic.Draw. +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + + + + + + +Render graphic onto canvas at rectangle, blending with canvas's background. +Vcl.Graphics.TBitmap.DrawTransparent inherits from Vcl.Graphics.TGraphic.DrawTransparent. All content below this line refers to Vcl.Graphics.TGraphic.DrawTransparent. +Render graphic onto canvas at rectangle, blending with canvas's background. +DrawTransparent renders the graphic onto a canvas at the coordinates specified by the Rect parameter, blending it with the canvas's background. + + + + + + +Indicates whether graphics object contains graphic. +Vcl.Graphics.TBitmap.GetEmpty inherits from Vcl.Graphics.TGraphic.GetEmpty. All content below this line refers to Vcl.Graphics.TGraphic.GetEmpty. +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + + + + +Get vertical size of graphic in pixels. +Vcl.Graphics.TBitmap.GetHeight inherits from Vcl.Graphics.TGraphic.GetHeight. All content below this line refers to Vcl.Graphics.TGraphic.GetHeight. +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Get color palette of graphical image. +Vcl.Graphics.TBitmap.GetPalette inherits from Vcl.Graphics.TGraphic.GetPalette. All content below this line refers to Vcl.Graphics.TGraphic.GetPalette. +Get color palette of graphical image. +GetPalette gets the color palette of the graphical image. You can also use the Palette property to get the color palette of a graphical image. If the graphic does not need or use a palette, the Palette property is zero. + + + + + + +Get horizontal size of graphic in pixels. +Vcl.Graphics.TBitmap.GetWidth inherits from Vcl.Graphics.TGraphic.GetWidth. All content below this line refers to Vcl.Graphics.TGraphic.GetWidth. +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + +Create GDI bitmap for TBitmap if it doesn't already exist. +HandleNeeded creates a GDI bitmap for the TBitmap if it doesn't already exist. + + + +Create GDI bitmap for TBitmap's mask if it doesn't already exist. +MaskHandleNeeded is called to create a GDI bitmap for the TBitmap object's mask if it doesn't already exist. + + + +Create color palette for TBitmap's mask if it doesn't already exist. +PaletteNeeded is called to create a color palette for the TBitmap object if it doesn't already exist. A palette is not created if IgnorePalette is true. IgnorePalette is set to true if a palette can't be created. + + + + + + +Read graphic data from TStream. +Vcl.Graphics.TBitmap.ReadData inherits from Vcl.Graphics.TGraphic.ReadData. All content below this line refers to Vcl.Graphics.TGraphic.ReadData. +Read graphic data from TStream. +ReadData is used to read the binary graphic from the virtual property Data (created by DefineProperties) when streaming in a TGraphic from the TStream Stream. + + + + + + +Set vertical size of graphic in pixels. +Vcl.Graphics.TBitmap.SetHeight inherits from Vcl.Graphics.TGraphic.SetHeight. All content below this line refers to Vcl.Graphics.TGraphic.SetHeight. +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Set color palette of graphical image. +Vcl.Graphics.TBitmap.SetPalette inherits from Vcl.Graphics.TGraphic.SetPalette. All content below this line refers to Vcl.Graphics.TGraphic.SetPalette. +Set color palette of graphical image. +SetPalette sets the color palette of the graphical image. +Use the Palette property to get the color palette of a graphical image. If the graphic does not need or does not use a palette, the Palette property is zero. + + + + + + +Set horizontal size of graphic in pixels. +Vcl.Graphics.TBitmap.SetWidth inherits from Vcl.Graphics.TGraphic.SetWidth. All content below this line refers to Vcl.Graphics.TGraphic.SetWidth. +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + + +Write graphic data to TStream. +Vcl.Graphics.TBitmap.WriteData inherits from Vcl.Graphics.TGraphic.WriteData. All content below this line refers to Vcl.Graphics.TGraphic.WriteData. +Write graphic data to TStream. +WriteData is used to write the binary graphic to the virtual property Data (created by DefineProperties) when streaming a TGraphic out to the TStream Stream. + + + + + +Instantiates a bitmap object. +Call Create to instantiate a bitmap object at runtime. Create is also called automatically when a bitmap image is loaded into a TImage. +Create allocates memory for a bitmap object, and calls the inherited Create. Then it creates a TBitmapImage as the internal image that represents the bitmap. + + + + + + + +Instantiates a bitmap object. +Call Create to instantiate a bitmap object at runtime. Create is also called automatically when a bitmap image is loaded into a TImage. +Create allocates memory for a bitmap object, and calls the inherited Create. Then it creates a TBitmapImage as the internal image that represents the bitmap. + + + + + +Disposes of the instance of the bitmap object. +Destroy is the destructor for a TBitmap object. +Do not call the destructor directly in an application. Instead, call Free. Free verifies that the bitmap object is not nil before it calls Destroy. +Destroy releases the internal bitmap image (TBitmapImage object) and frees the canvas before calling the inherited destructor. + + + + + + +Copies a new bitmap image to the bitmap object. +Assign copies the bitmap image contained in Source to the bitmap object. If Source is not a bitmap, Assign calls the inherited Assign method, which can copy an image from any class that knows how to copy to a TBitmap object. If the bitmap needs to be changed, the actual bitmap image is copied before the changes are made (copy on write). + +Note: An object of one type can always be assigned to another object of the same type. Also, the Source can be of type TPicture if the Graphic property of the picture is a bitmap. + + +Creates a memory bitmap image in order to release the bitmap handle, forcing the image into DIB format to save resources. +Use Dormant to change the format of the bitmap in memory thereby reducing the amount of GDI resources used by the application. +Dormant creates a bitmap image in memory using a memory stream object. This preserves the image so that the bitmap can then free the HBITMAP (accessed through the Handle property) that was assigned to it. +DIB handles may use fewer Win95 GDI resources than DDB, but DIBs may also use more memory than DDBs, depending on the current video driver and mode. + + + +Frees the cached file image stored in memory by the bitmap. +Use FreeImage to reduce the memory requirements of an application when color depth and pixel format are not an issue. Freeing the image releases the memory allocated for the bitmap image when it was originally loaded to disk. Consequently, some of the original pixel format of the bitmap is lost (for example, if you changed its format to a DIB) as well as the color depth of the bitmap. +When a bitmap is loaded into a bitmap object, the bitmap object creates an image of the loaded bitmap in memory. If the bitmap isn't changed, the memory image is used when saving the bitmap, to verify that the bitmap has not lost color depth or changed the pixel format. + +Code Examples +LoadFromFile (Delphi) +LoadFromFile (C++) + + + + + + + + + +Indicates whether the TBitmap object has acquired a handle to the underlying GDI object. +Use HandleAllocated to determine whether the Handle property is set to an HBITMAP value. HandleAllocated indicates whether the underlying GDI object has already been created. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, it automatically creates a bitmap and returns its handle if the underlying GDI object does not already exist. + + + + + + + + +Loads a bitmap from the Clipboard into the bitmap object. +LoadFromClipboardFormat is called if the bitmap is registered with the TPicture object using the RegisterClipboardFormat method. +LoadFromClipboardFormat replaces the current image with the data pointed to by the AData parameter. The palette for the bitmap is specified by the APalette parameter. +The following code snippet shows how to load a bitmap from the clipboard and use that picture to draw on the canvas of the form. + +Note: To load a bitmap into the clipboard, you can use the code snippet for the SaveToClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + Bitmap : TBitmap; +begin + Bitmap := TBitMap.Create; + try + Bitmap.LoadFromClipBoardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0); + Canvas.draw(0,0,Bitmap); + finally + Bitmap.Free; + Clipboard.Clear; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TBitmap* Bitmap; + TClipboard* cb = Clipboard(); + + Bitmap = new TBitmap(); + try{ + Bitmap->LoadFromClipboardFormat(CF_BITMAP, cb->GetAsHandle(CF_BITMAP), 0); + Canvas->Draw(0,0,Bitmap); + } + __finally{ + delete Bitmap; + cb->Clear(); + } +} + + + + + + + + + +Vcl.Graphics.TBitmap.CanLoadFromStream inherits from Vcl.Graphics.TGraphic.CanLoadFromStream. All content below this line refers to Vcl.Graphics.TGraphic.CanLoadFromStream. +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + + + + + + +Loads the bitmap from a stream into the bitmap object. +Use LoadFromStream to load the bitmap image from a stream. The Stream parameter specifies the stream from which to read the bitmap image. For example, use LoadFromStream to load a bitmap image from a BLOB stream that reads from a graphic field in a dataset. + + + + + + +Converts the current bitmap image into a monochrome mask, replacing TransparentColor with white and every other color with black. +Use Mask to produce a monochrome mask bitmap based on a given transparent color. Mask produces the same image that MaskHandle does, except that the resulting mask image replaces the image in the TBitmap object, so it only makes sense to call Mask once. Use MaskHandle when only a bitmap handle of the mask image is needed. + + + + + + +Returns the handle to the bitmap so that the TBitmap object no longer knows about the handle. +Use ReleaseHandle to disassociate the bitmap from the bitmap handle. Use it when you need to give a bitmap handle to a routine or object that will assume ownership (or destroy) the bitmap handle. + + + + + + +Returns the handle to the bitmap's mask so that the TBitmap object no longer knows about the mask handle. +Use ReleaseMaskHandle to disassociate the bitmap object from the bitmap mask handle. + + + + + + +Returns the handle to the bitmap's palette and disassociates the palette from the TBitmap object. +Use ReleasePalette to disassociate the palette from the bitmap image. + + + + + + + + + + +Creates a local copy of the bitmap in Clipboard format. +Use SaveToClipboardFormat to copy the bitmap to a Clipboard format. The bitmap's palette is returned in the APalette parameter, the format in the AFormat parameter, and a handle to the data in the AData parameter. Before the bitmap can be saved, an application must have registered the format with the TBitmap object using the RegisterClipboardFormat method. +The following code snippet shows how to save a bitmap to the clipboard. + +Note: To load a bitmap from the clipboard, you can use the code snippet for the LoadFromClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + MyFormat : Word; + Bitmap : TBitMap; + AData : THandle; + APalette : HPALETTE; +begin + Bitmap := TBitmap.Create; + try + Bitmap.LoadFromFile('C:\Users\Public\Pictures\Sample Pictures\desert.bmp'); + Bitmap.SaveToClipBoardFormat(MyFormat, AData, APalette); + ClipBoard.SetAsHandle(MyFormat,AData); + finally + Bitmap.Free; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TClipboard* cb = Clipboard(); + unsigned short MyFormat; + TBitmap* Bitmap; + unsigned int AData; + HPALETTE APalette; + + Bitmap = new TBitmap(); + try{ + Bitmap->LoadFromFile("C:\\Users\\Public\\Pictures\\Sample Pictures\\desert.bmp"); + Bitmap->SaveToClipboardFormat(MyFormat, AData, APalette); + cb->SetAsHandle(MyFormat, AData); + } + __finally{ + delete Bitmap; + } +} + + + + + + + +Saves the bitmap to a stream. +Use SaveToStream to write the bitmap image to the stream specified by the Stream parameter. For example, specify a TBlobStream object as the Stream parameter to save the bitmap image to a graphic field in a dataset. + + + + + + + +Specifies the size of the bitmap. +Use the SetSize method to set both the height and width of the bitmap. This results in better performance than setting the height and width separately. + + + + + + + + + +Loads a bitmap resource into the bitmap object. +LoadFromResourceName loads the specified bitmap resource along with palette information from a module's executable file. +Instance is the handle of the module that contains the resource. +ResName is the name of the resource to load. + +Note: Use this routine to load bitmaps from RES files instead of the LoadBitmap API. LoadBitmap does not support 256-color images. + + + + + + +Loads a bitmap from a resource into the bitmap object. +Use LoadFromResourceID to load a specified bitmap resource along with palette information from a module's executable file. +Instance is the handle of the module that contains the resource. +ResID is the resource ID for the bitmap. + + +Provides access to a drawing surface that represents the bitmap. +Canvas allows drawing on the bitmap by providing a T Canvas object for this purpose. Drawing on the canvas effectively modifies the underlying bitmap image pixels. Any canvas operation is valid on a bitmap (not just Draw and StretchDraw) including line drawing, rectangles, and circles. The bitmap object is passed as a parameter to these methods. +A canvas object is created automatically for the bitmap and the property is read-only. + + +Provides access to the Windows GDI bitmap handle for accessing the GDI bitmap object. +Use Handle to call a Windows API function that requires the handle of a bitmap object (HBITMAP). Pass Handle as the bitmap handle parameter to these functions. +Handle is the HBITMAP encapsulated by the bitmap object. Avoid grabbing the handle directly since it causes the HBITMAP to be copied if more than one TBitmap shares the handle. + +Warning: Be careful when giving the handle to an object or routine. If the receiver takes ownership (and destroys) the bitmap handle, call ReleaseHandle. + +Indicates whether the bitmap is a device-dependent bitmap, or a device-independent bitmap. +HandleType is used to find or modify the type of the bitmap. Device-dependent bitmaps (DDBs) may be faster to draw on the screen, but may be stored in memory in a device-specific format. Device-independent bitmaps (DIBs) are stored in memory in a standard format supported by all devices (including printers). + + +Determines whether the bitmap realizes its palette when drawing its image. +Use IgnorePalette when speed of drawing is a priority. When IgnorePalette is true, the bitmap does not realize its palette when drawing itself, resulting in lower picture quality on 256-color video drivers, but faster drawing of the bitmap image. + +Note: + +Provides access to the Windows GDI bitmap handle for accessing the GDI bitmap object. +Use MaskHandle to call a Windows API function that requires the handle of a bitmap object. Pass MaskHandle as the bitmap handle parameter to these functions. MaskHandle is the HBITMAP encapsulated by the bitmap object's mask. + + +Determines whether the bitmap displays its image in monochrome. +If Monochrome is true if the bitmap displays as a monochrome bitmap. Monochrome is false if the bitmap displays in color, that is, if it contains more than one bit per pixel. + +Note: +Code Examples +LoadFromFile (Delphi) +LoadFromFile (C++) + + + + + +Indicates the bit format of the bitmap image, specifying how the image is displayed and how the pixels of the bitmap image are stored in memory. +Use PixelFormat to change a TBitmap's internal image to a particular memory format and color depth, or to find out what memory format and color depth a TBitmap is using. The possible formats are specified in TPixelFormat. +For example, PixelFormat can be used to set the pixel format of the bitmap image to 8-bit for video drivers that cannot display the native format of a bitmap image. + +Note: The PixelFormat of a JPEG image object applies to the bitmap if the JPEG image is copied to it. +Changing the pixel format is most commonly used with ScanLine, because your code must decode the pixel data accessed by ScanLine. Image-editing tools usually use one pixel for all internal image operations and copy the results to the screen (in whatever format) as the last step. + + +Determines which color of the bitmap is to be transparent when the bitmap is drawn. +Use TransparentColor to determine how to draw the bitmap transparently. When the TransparentMode property is set to tmAuto (default), TransparentColor returns the color of the first pixel in the bitmap image data. For "bottom-up" bitmaps, the first pixel is the bottom leftmost pixel shown onscreen. For "top-down" bitmaps (less common), the first pixel is in the top left corner shown onscreen. +If TransparentColor is assigned, the TransparentMode is automatically set to tmFixed so that the new transparent color can be used later. If you want TransparentColor to disregard any assignments and return the bottom leftmost pixel color again, set TransparentMode to tmAuto. + + +Determines whether the TransparentColor property's value is automatically calculated or stored with the bitmap object. +When TransparentMode is set to tmAuto (the default), the TransparentColor property returns the color of the bottom-leftmost pixel of the bitmap image. When TransparentMode is set to tmFixed, the TransparentColor property refers to the color stored in the bitmap object. + + + +Indicates how reserved byte of each pixel is used in 32 bit bitmaps. +Use AlphaFormat to change the way a TBitmap uses the reserved byte of each pixel in a 32bit Bitmap. + + + +TBitmap is an encapsulation of a Windows bitmap (HBITMAP), including its palette (HPALETTE). +A bitmap is a powerful graphics object used to create, manipulate and store images in memory and as files on a disk. +TBitmap contains an internal image of the bitmap graphic and automatically manages realization of the palette when drawn. +To draw a bitmap on a canvas, call the Draw or StretchDraw methods of a TCanvas object, passing a TBitmap as a parameter. +Creating copies of a TBitmap is very fast since the handle is copied rather than the image. If the image is modified and the handle is shared by more than one TBitmap object, the image is copied before the modification is performed (that is, copy on write). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Render graphic onto canvas at rectangle. +Vcl.Graphics.TIcon.Draw inherits from Vcl.Graphics.TGraphic.Draw. All content below this line refers to Vcl.Graphics.TGraphic.Draw. +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + + + + +Indicates whether graphics object contains graphic. +Vcl.Graphics.TIcon.GetEmpty inherits from Vcl.Graphics.TGraphic.GetEmpty. All content below this line refers to Vcl.Graphics.TGraphic.GetEmpty. +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + + + + +Get vertical size of graphic in pixels. +Vcl.Graphics.TIcon.GetHeight inherits from Vcl.Graphics.TGraphic.GetHeight. All content below this line refers to Vcl.Graphics.TGraphic.GetHeight. +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Get horizontal size of graphic in pixels. +Vcl.Graphics.TIcon.GetWidth inherits from Vcl.Graphics.TGraphic.GetWidth. All content below this line refers to Vcl.Graphics.TGraphic.GetWidth. +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + + +Set vertical size of graphic in pixels. +Vcl.Graphics.TIcon.SetHeight inherits from Vcl.Graphics.TGraphic.SetHeight. All content below this line refers to Vcl.Graphics.TGraphic.SetHeight. +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + + + + +Specify if graphic should be drawn transparently. +Vcl.Graphics.TIcon.SetTransparent inherits from Vcl.Graphics.TGraphic.SetTransparent. All content below this line refers to Vcl.Graphics.TGraphic.SetTransparent. +Specify if graphic should be drawn transparently. +SetTransparent specifies if a graphic should be drawn transparently. + + + + + + +Set horizontal size of graphic in pixels. +Vcl.Graphics.TIcon.SetWidth inherits from Vcl.Graphics.TGraphic.SetWidth. All content below this line refers to Vcl.Graphics.TGraphic.SetWidth. +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + + + +Creates an instance of TIcon. +Call Create to create an empty icon object. Once an image has been read into the icon from a file or stream, or by assigning another icon object, the icon can be drawn on a canvas or added to an image list. Do not create an icon object for setting the icon property of a form or picture. These objects create a TIcon object in their own constructors. Instead, use the LoadFromFile, LoadFromStream, or LoadFromClipboardFormat method on the TIcon object that you can obtain by reading the Icon property. + + + + + +Destroys an instance of TIcon. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TIcon reference is not nil, and only then calls Destroy. + + + + + + +Copies an icon image from another TIcon object. +Call Assign to copy another icon object. Assign copies the icon image from the Source parameter if it is another TIcon object. Otherwise, Assign calls the inherited method, which copies the icon image from any source object that specifies how to copy to a TIcon in its AssignTo method. + + + + + + +Copies an icon image to a TBitmap graphical object. +Call AssignTo to copy an icon to a TBitmap object. AssignTo copies the icon image to the Dest parameter if it is a TBitmap object. Otherwise, AssignTo fails. +The preferred way to copy an icon image to a bitmap is to use the Assign method of the TBitmap class, passing the icon object as the Source parameter. + +Note: The bitmap resulted after a call to AssignTo always has alpha channel (transparency) information and a 32-bit color depth. + + + + + +Indicates whether the TIcon object has acquired a handle to the underlying GDI object. +Use HandleAllocated to determine whether the Handle property is set to an HICON value. HandleAllocated indicates whether the underlying GDI object has already been created. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, it automatically creates an icon and returns its handle if the underlying GDI object does not already exist. + + + + + + + + +Prevents applications from loading icons from the clipboard. +LoadFromClipboardFormat is overridden in TIcon because the clipboard format is not supported. + + + + + + + + +Vcl.Graphics.TIcon.CanLoadFromStream inherits from Vcl.Graphics.TGraphic.CanLoadFromStream. All content below this line refers to Vcl.Graphics.TGraphic.CanLoadFromStream. +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + + + + + + +Loads the icon from a stream. +Use LoadFromStream to read the icon image from a stream. Set the Stream parameter to a stream object that provides access to the memory image of the icon. To load the icon from a .ico file, use the LoadFromFile method. To load the icon from the Clipboard, use the LoadFromClipboardFormat method. + + + + + + +Releases the Windows GDI object represented by the icon. +Call ReleaseHandle to release the resources used to represent the icon. ReleaseHandle sets the Handle property to nil (Delphi) or NULL (C++). +ReleaseHandle informs the TIcon instance that it is no longer responsible for destroying the icon handle. + + + + + + + + +Prevents applications from saving icons to the clipboard. +SaveToClipboardFormat is overridden in TIcon because the format is not supported for the Clipboard. + + + + + + +Saves the icon to a stream. +Use SaveToStream to write the icon image to a stream. Specify the Stream parameter as the stream object that receives the memory image of the icon. To write the icon to a .ico file, use the SaveToFile method. To write the icon to the Clipboard, use the SaveToClipboardFormat method. + + + + + + + +Specifies the size of the icon. +Use the SetSize method to set both the height and width of the icon. This results in better performance than setting the height and width separately. + + + + + + + + + +Loads an icon resource into the icon object. +LoadFromResourceName loads the specified icon resource from a module's executable file. +Instance is the handle of the module that contains the resource. +ResName is the name of the resource to load. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Provides access to the Windows GDI icon handle. +Use Handle to specify the icon when using a Windows API function that requires the handle of an icon object. The Handle property is nil (Delphi) or NULL (C++) if the icon has not been loaded. +Call the ReleaseHandle method before changing the icon image by setting the Handle property. The icon image can also be loaded by assigning another icon object or using the LoadFromClipboardFormat, LoadFromFile, or LoadFromStream method. + + + +TIcon is an encapsulation of a Windows icon. +Use TIcon to represent one of the icons in an image list. Assign an icon to objects that have an Icon property, such as TForm or TPicture. +Icon objects represent the value loaded from a Windows icon file (.ICO file). Draw an icon on a canvas, using the Draw method of the TCanvas object. Icons do not stretch, so do not use StretchDraw (TCanvas) with an icon. + +Note: TIcon can be used to display the value of a multi-resolution (>16 color) icon. However, it can not support the creation of multi-resolution icons, nor the resizing of the image after it is loaded from a file or stream. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wipmHighQualityCubic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CLR + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Grids.xml b/Modules/DelphiVCL/doc/Vcl.Grids.xml new file mode 100644 index 00000000..93ee73c6 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Grids.xml @@ -0,0 +1,10157 @@ + + + + $7FFFFFF + + + + + $7F + + + + + $7FFFFFF + + + + + gsNormal + + + + + gsSelecting + + + + + gsRowSizing + + + + + gsColSizing + + + + + gsRowMoving + + + + + gsColMoving + + + + + goFixedVertLine + + + + + goFixedHorzLine + + + + + goVertLine + + + + + goHorzLine + + + + + goRangeSelect + + + + + goDrawFocusSelected + + + + + goRowSizing + + + + + goColSizing + + + + + goRowMoving + + + + + goColMoving + + + + + goEditing + + + + + goTabs + + + + + goRowSelect + + + + + goAlwaysShowEditor + + + + + goThumbTracking + + + + + goFixedColClick + + + + + goFixedRowClick + + + + + goFixedHotTrack + + + + + goFixedColDefAlign + + + + + goFixedRowDefAlign + + + + + gdSelected + + + + + gdFocused + + + + + gdFixed + + + + + gdRowSelected + + + + + gdHotTrack + + + + + gdPressed + + + + + sdLeft + + + + + sdRight + + + + + sdUp + + + + + sdDown + + + + + esSimple + + + + + esEllipsis + + + + + esPickList + + + + + gdsClassic + + + + + gdsThemed + + + + + gdsGradient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Calculates the pixel locations of the grid boundaries. +Use CalcDrawInfo to determine the pixel locations of the major grid boundaries in the X and Y directions, including things like the first visible column/row, the last visible column/row, the pixel extent of the fixed column/row, etc. + + + + + + +Calculates the pixel locations of the fixed cells. +Use CalcDrawInfo to determine the pixel locations of the fixed cells in the X and Y directions. + + + + + + + + + + + + +Determines the appearance of the mouse cursor during resizing. +Use CalcSizingState to determine if the mouse cursor should be changed to a resize or drag cursor based on where the mouse is in the grid. For example, cursor over a grid line, in the fixed cell region, and column resize is enabled = resize cursor. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Prepares the grid's canvas for painting to reflect a right-to-left or left-to-right orientation. +TCustomGrid uses ChangeGridOrientation internally when painting. ChangeGridOrientation sets the origin and dimensions of the grid's canvas so that painting occurs from right-to-left or from left-to-right based on the value of the RightToLeftOrientation parameter. +RightToLeftOrientation is true if the grid should prepare for painting from right to left. RightToLeftOrientation is false if the grid should restore the canvas to normal. + + + + + + +Creates the inplace editor control. +Grid controls call CreateEditor internally the first time the grid goes into edit mode. CreateEditor is exposed as a protected method so that descendants of TCustomGrid can substitute a specialized descendant of TInplaceEdit to handle cell editing. + + + + + + +Initializes the window-creation parameter record. +The CreateWnd method is called internally to specify the properties of the window that implements this control. These properties are set in the window-creation parameter record passed as Params. The fields of this record become the parameters to a call to the CreateWindowEx API function. +After calling the inherited method, CreateParams adjusts the value of Params to request that the grid receive double click messages, and to implement the values of the ScrollBars and BorderStyle properties. + + + +CreateWnd is used in control initialization. +The CreateWnd method is called internally to specify the properties of the window that implements this control. As implemented in TCustomGrid, CreateWnd makes sure that the grid can use the themes before continuing with the other initializations. + + + + + + + +Processes the unhandled gesturing events. +Vcl.Grids.TCustomGrid.DoGesture inherits from Vcl.Controls.TControl.DoGesture. All content below this line refers to Vcl.Controls.TControl.DoGesture. +Processes the unhandled gesturing events. +DoGesture is run automatically for all gesturing events that were not handled by the user. DoGesture is run only if OnGesture is not set or if it did not handle the gesture event. +Override DoGesture in descending classes to support default behavior for gesture events that were not handled by the user. In TControl, the DoGesture method simply returns and does no special processing. + + + + + + + +Provides special processing when the user presses a key. +After generating an OnKeyDown event, KeyDown calls CanGridAcceptKey to screen out problematic key combinations. KeyDown moves to the appropriate cell in response to navigational key combinations, or sets the EditorMode property to true when the user presses F2. + + + + + + +Provides special processing when the user presses a key. +KeyPress is called automatically after the KeyDown method, but before the user releases the key. +After generating an OnKeyPress event, KeyPress toggles the EditorMode property when the user presses the Enter key. + + + + + + + + + +Provides special processing when the user presses a mouse button. +MouseDown hides the editor window so that it can move selection to the cell that receives the mouse click. If the mouse lands in the hot region for beginning a move or resize of a row or column, MouseDown starts the move or resize, and provides visual feedback by changing the cursor. If the editor window was hidden, it is brought back up in its new location. Finally, MouseDown generates an OnMouseDown event. + + + + + + + + +Provides special processing when the user moves the mouse. +If the grid is in the middle of moving or resizing a row or column, or in the middle of selecting a range of cells using the mouse, MouseMove calculates the changes implied by the mouse move and provides visual feedback to the user. Finally, MouseMove generates an OnMouseMove event. + + + + + + + + + +Provides special processing when the user releases the mouse button. +MouseUp finishes a move or resize operation on a row or column, or if the user is selecting a range of cells using the mouse, MouseUp finishes the select operation. Finally, MouseUp generates an OnMouseUp event. + + + + + + + + +Adds or deletes rows or columns from the grid. +Grid components call AdjustSize internally to fix up the number of rows or columns when the user resizes them using the mouse. Index is the index of the row or column where the insertion or deletion should begin. Amount is the number of rows or columns to insert (Amount > 0) or delete (Amount < 0). Rows is a boolean that indicates whether the rows or the columns are changing. + + + + + + + + + + +Returns the screen coordinates of a specified set of cells. +Call BoxRect to obtain the screen coordinates, in pixels, of the cells that run from the column with index ALeft to the column with index ARight and the row with index ATop to the row with index ABottom. The coordinates of cells that are not visible onscreen are not included in the final rectangle. + + + +Hides the inplace editor when selection moves to another control in a form. +After calling the inherited method, which generates an OnExit event, DoExit hides the inplace editor unless the Options property includes goAlwaysShowEditor. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Returns the screen coordinates of a cell in the grid. +Call CellRect to obtain the boundaries, in pixels, of the cell in the column and row indicated by the ACol and ARow parameters. The top left cell is specified when ACol and ARow are set to zero. +If the indicated cell is not visible, CellRect returns an empty rectangle. + + + + + + + +Indicates whether the Key parameter can be entered into the current cell. +CanEditAcceptKey provides a simple screening of keyboard input while the user is editing the contents of a cell. The CanEditAcceptKey method for TCustomGrid always returns true. Descendants of TCustomGrid override this method to screen out illegal characters. +More refined validation can be obtained by using an edit mask. + + + + + + + + +Indicates whether the grid should respond to a given key combination. +Grid controls call CanGridAcceptKey internally to screen key combinations when the user first presses a key. The CanGridAcceptKey method for TCustomGrid always returns true. Descendants of TCustomGrid override this method to screen out irrelevant key combinations, or key combinations that indicate actions that would violate the Options or mode of the grid. + + + + + + +Indicates whether the current cell in the grid can be edited. +Grid components use CanEditModify internally to determine whether to allow the user to edit the current cell. CanEditModify returns true unless the inplace editor has disallowed editing for the cell. + + + + + + +Indicates whether the inplace edit control can be created to allow editing. +Grid controls call CanEditShow internally before creating the editor for a cell. CanEditShow is called after the grid has determined that the field can be edited by calling CanEditModify. +CanEditShow returns false if the Options property does not indicate that the grid allows editing, or if it indicates that the grid permits row selection. Otherwise, if the Options property indicates that the grid is locked in edit mode, or if the grid has input focus, CanEditShow returns true. If the grid is not locked in edit mode and the grid does not have input focus, CanEditShow returns false. + + + + + + + + +Resize and reposition children and self. +Vcl.Grids.TCustomGrid.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + + + + + + +Performs tasks when the mouse wheel is rotated downward. +Override DoMouseWheelDown to perform tasks when the mouse wheel is rotated downward. +DoMouseWheelDown returns false if the control's parent should handle the message. +In TCustomGrid, DoMouseWheelDown increments the current row and returns true. + + + + + + + + +Performs tasks when the mouse wheel is rotated upward. +Override DoMouseWheelUp to perform tasks when the mouse wheel is rotated downward. +DoMouseWheelUp should return false if the control's parent should handle the message. +In TCustomGrid, DoMouseWheelUp decrements the current row and returns true. + + + + + + + +Triggers the OnFixedCellClick event. +FixedCellClick is called whenever the user clicks in a fixed cell. Descending classes can override FixedCellClick to support custom processing for this event. As defined in TCustomGrid, FixedCellClick simply triggers the OnFixedCellClick event. +OnFixedCellClick is only triggered if the Options property includes either goFixedRowClick or goFixedColClick, or both. Also, at least one fixed column or row must me defined. + + + + + + + + +Changes the current cell to a specified cell. +TCustomGrid calls FocusCell internally to change the currently selected cell. FocusCell changes the current cell and updates the selection appropriately. +ACol is the column of the cell to select. +ARow is the row of the cell to select. +MoveAnchor determines how the selection changes. If the grid does not allow multiple cells to be selected (Options does not include goRangeSelect), MoveAnchor is ignored and the specified cell becomes the selected cell. If the grid allows multiple cells to be selected, MoveAnchor determines whether the new cell becomes the starting cell (anchor) of a new selection, or whether the current selection is updated to range from the current anchor to the specified cell. + + + + + + + + +Returns the value of the indicated cell formatted for editing. +The inplace editor calls GetEditText to obtain the text for the indicated cell. GetEditText returns an empty string. Descendants of TCustomGrid override the GetEditText method to return a string that represents the contents of the cell indicated by the ACol and ARow parameters. + + + + + + + + +Provides the interface for a method that updates the text associated with a cell. +SetEditText is called by the inplace editor so that the grid can store the new value for the current cell. The SetEditText method for TCustomGrid does nothing. Descendants of TCustomGrid override this method to update an internal representation of the cell's value or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnSetEditText. + + + + + + +Provides the interface for a method that limits the number of characters the user can type into cells. +The inplace editor calls GetEditLimit to determine if a limit should be placed on the number of characters a user can type into a cell. GetEditLimit sets no limits. Descendants of TCustomGrid override this method to limit the text for certain cells. + + + + + + + + +Provides the interface for a method that returns an input mask for the specified cell. +The inplace editor calls GetEditMask to obtain any input mask associated with the cell specified by the ACol and ARow parameters. GetEditMask returns an empty string, indicating that the cell has no input mask. Descendants of TCustomGrid override this method to provide an input mask or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnGetEditMask. + + + + + + + + +Indicates whether a specified cell has an ellipsis button or drop-down arrow. +GetEditStyle indicates whether the specified cell can only be edited directly (esSimple), whether it has an ellipsis button that users can click to launch an editor for modifying field values (esEllipsis ), or whether it has a drop-down arrow that users can click to display a pick list of possible values (esPickList). +ACol is the column that contains the cell. ARow is the row that contains the cell. +In TCustomGrid, GetEditStyle always returns esSimple, indicating that there is no ellipsis button or drop-down arrow. Descendant classes can override this methods if they provide a way to add pick lists or ellipsis buttons to cells. + + + + + + + + +Returns the value of the GridWidth property. +GetGridWidth is the protected property access method for the GridWidth property. It computes the value of the GridWidth property based on the column widths, separator width, and the size of the control. + + + + + + +Returns the value of the GridHeight property. +GetGridHeight is the protected property access method for the GridHeight property. It computes the value of the GridHeight property based on the row heights, separator width, and the size of the control. + + + +Hides the inplace editor. +The HideEditor method calls the protected HideEdit method to hide the editor. This method hides the editor window after updating the text to reflect the text in the editor. + + + +Hides the inplace editor when it is not in use. +Grid controls call HideEditor when the grid goes out of edit mode. HideEditor hides the window of the inplace editor. + + + +Displays the inplace editor when the grid enters edit mode. +Grid controls call ShowEditor when the grid enters edit mode. ShowEditor displays the window of the inplace editor over the currently selected cell. If the inplace editor does not yet exist, ShowEditor creates it. + + + + + + +Displays the inplace editor, with its text set to the specified character. +Grid controls call ShowEditorChar when the user types a character into a cell and the editor is not already showing. ShowEditorChar displays the window of the inplace editor over the currently selected cell, and sets its text property to the character Ch. If the inplace editor does not yet exist, ShowEditorChar creates it. + + + +Causes the inplace editor to repaint itself, moving to a new location if necessary. +InvalidateEditor is called when the selected cell changes while the grid is in edit mode. + + + +Tells Windows to repaint the grid after other important Windows messages are handled. +InvalidateGrid is used internally to ensure that the grid is repainted when its properties change. It calls the Invalidate method to indicate that the grid needs repainting. + + + + + + + +Moves a column to a new position. +Call MoveColumn to move the column identified by the FromIndex parameter to the position specified by the ToIndex parameter. + + + + + + + +Provides the interface for a method that responds when the position of a column changes. +ColumnMoved is called immediately after a column in the grid has moved. +The FromIndex parameter is the old index of the column, +The ToIndex parameter is the new index. +The ColumnMoved method of TCustomGrid does nothing. Descendants of TCustomGrid override this method to make internal adjustments or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnColumnMoved. + + + + + + + +Moves a row to a new position. +Call MoveRow to move the row identified by the FromIndex parameter to the position specified by the ToIndex parameter. + + + + + + + +Provides the interface for a method that responds when the position of a row changes. +RowMoved is called immediately after a row in the grid changes position. +The FromIndex parameter is the old index of the row, and the ToIndex parameter is the new index. +The RowMoved method of TCustomGrid does nothing. Descendants of TCustomGrid override this method to make internal adjustments or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnRowMoved. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Provides the prototype for a method that draws the contents of a cell in the grid. +Descendants of TCustomGrid implement the DrawCell method to draw the contents of the cell. If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the 3D effects of the fixed cells or the focus rectangle around the focused cell are drawn after DrawCell. +The ACol and ARow parameters give the column and row indexes of the cell that should be drawn. +The ARect parameter gives the boundaries of the cell in the coordinates of the canvas. +The AState parameter indicates whether the cell is selected, whether the cell has input focus, and whether the cell is in the fixed, non-scrolling portion of the grid. + + + + + + + + + + +Draws the background of a cell in the grid. +DrawCellBackground draws the background of a cell. Descendants of TCustomGrid can override the DrawCellBackground method to supply custom drawing techniques. +If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the three-dimensional effects of the fixed cells or the focus rectangle around the focused cell is drawn after DrawCell. +The ACol and ARow parameters give the column and row indexes of the cell that should be drawn. The ARect parameter gives the boundaries of the cell in the coordinates of the canvas. The AState parameter indicates whether the cell is selected, has input focus, or is in the fixed, nonscrolling portion of the grid. + + + + + + + + + +Draws the background of a highlighted cell in the grid. +DrawCellHighlight draws the background of a highlighted cell. Descendants of TCustomGrid can override the DrawCellHighlight method to implement custom drawing techniques. +If the DefaultDrawing property is true, the background of the highlighted cell is painted before DrawCell is called, and the three-dimensional effects of the fixed cells or the focus rectangle around the focused cell is drawn after DrawCellHighlight. +The ACol and ARow parameters give the column and row indexes of the cell that should be drawn. The ARect parameter gives the boundaries of the cell in the coordinates of the canvas. The AState parameter indicates whether the cell is selected, has input focus or is in the fixed, nonscrolling portion of the grid. + + + + + + +Adds the ColWidths and RowHeights properties to the values saved with the grid. +DefineProperties overrides the inherited method to save the ColWidths and RowHeights properties with the grid when they contain values other than the default widths and heights. + + + + + + + + + +Selects the cell indicated by the ACol and ARow parameters. +Grid controls call MoveColRow internally when changing the selected cell or cells. MoveColRow selects the indicated cell, but does not take care of removing any previous selection. +The ACol and ARow parameters are the column index and the row index of the cell to be selected. The MoveAnchor parameter indicates whether the new cell becomes the upper left corner of the selected region. MoveAnchor is true unless MoveColRow is called when extending a multicell selected region. The Show parameter indicates whether MoveColRow should ensure that the newly selected cell is visible. + + + + + + + + +Determines whether a particular cell in the grid can be selected. +Grid controls call SelectCell internally before attempting to move selection to a the cell identified by the ACol and ARow parameters. ACol and ARow are the column and row indexes for the cell, where the first column has index 0, and the top row has index 0. +The SelectCell method for TCustomGrid always returns true, allowing the cell to be selected. Descendants of TCustomGrid override this method to check the properties of the information displayed in the cell or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnSelectCell. + + + + + + + +Responds to changes in the size of the grid. +SizeChanged provides the interface for a method that responds to changes in the number of rows or columns in the grid. The SizeChanged method of TCustomGrid does nothing. Descendants of TCustomGrid override this method to make internal adjustments or generate events. + + + + + + + + +Indicates whether the indicated coordinates are on one of the resize hot zones of the graph. +Grid controls call Sizing internally with the coordinates of a mouse click to determine whether the user is about to resize a row or column. + + + + + + + +Scrolls the visual image of the cells in the grid. +Grid controls call ScrollData internally when the nonfixed rows or columns scroll. ScrollData updates the image of the grid. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Invalidates the region occupied by a cell so that it will be repainted with the next Windows paint message. +Call InvalidateCell when the contents of a cell change so that the cell will need to be repainted. The ACol parameter is the column index of the cell, and the ARow parameter is the row index. + + + + + + +Invalidates the region occupied by a column so that it will be repainted with the next Windows paint message. +Call InvalidateCol when a column changes so that the area it occupies will need to be repainted. The ACol parameter is the column index. + + + + + + +Invalidates the region occupied by a row so that it will be repainted with the next Windows paint message. +Call InvalidateRow when a row changes so that the area it occupies will need to be repainted. The ARow parameter is the row index. + + + + + + + +Checks whether the associated touch manager stored any of the given options. +Vcl.Grids.TCustomGrid.IsTouchPropertyStored inherits from Vcl.Controls.TControl.IsTouchPropertyStored. All content below this line refers to Vcl.Controls.TControl.IsTouchPropertyStored. +Checks whether the associated touch manager stored any of the given options. +IsTouchPropertyStored is used internally by the VCL framework to check whether the associated touch manager component has stored the given options. Do not call IsTouchPropertyStored directly. IsTouchPropertyStored is used primarily to ensure that controls that do not require gesturing are not storing useless data in the DFMs or executables. + + + +Updates the position of the inplace editor when the grid scrolls. +Grid controls call TopLeftChanged internally, whenever the LeftCol or TopRow property changes. +Descendants of TCustomGrid override this method to make additional adjustments or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnTopLeftChanged. + + + + + + +Extends a move, resize, or selection out of the scrollable region when the user drags the mouse in a direction where the grid is scrolled. +TimedScroll is called periodically as the user continues to drag with the mouse outside of the scrollable cells in the grid. TimedScroll does nothing unless the user is moving a row or column, resizing a row or column, or selecting a multiple cell region using the mouse. TimedScroll scrolls the cells in the grid to allow the operation to continue into the portion of the grid that was hidden due to scrolling. + + + +Draws the image of the grid control on the screen. +Paint is called when the grid receives a paint message. Paint draws the grid, calling the DrawCell method when it is time to paint the contents of each cell. If DefaultDrawing is false, Paint does not draw the background of the cells, provide the raised 3D effects on the fixed cells, or draw the focus rectangle around the selected cell when it has focus. + + + + +Responds when the column widths change. +ColWidthsChanged is called immediately after the column widths change. The change can result from setting the ColWidths property, from setting the DefaultColWidth property, from moving one of the columns, or from resizing the columns with the mouse. +ColWidthsChanged adjusts the scroll bar and the position of the inplace editor to take into account the new column size and positions of the columns. + + + +Responds when the row heights change. +RowHeightsChanged is called immediately after the row heights change. The change can result from setting the RowHeights property, from setting the DefaultRowHeight property, from moving one of the rows, or from resizing the rows with the mouse. +RowHeightsChanged adjusts the scroll bar and the position of the inplace editor to take into account the new row size and positions of the rows. + + + + + + +Deletes a specified column from the grid. +Call DeleteColumn to remove a column from the middle of the grid. Provide the index of the column to remove as ACol. To remove the last column from the grid, set the ColCount property instead. + + + + + + +Deletes a specified from the grid. +Call DeleteRow to remove a row from the middle of the grid. Provide the index of the row to remove as ARow. To remove the last row from the grid, set the RowCount property instead. + + + +Notifies the designer when rows and columns of the grid are moved or resized. +At design time, the designer automatically keeps track of property changes so that it can prompt the user to save any changes. Moving or resizing the rows and columns of the grid using the mouse bypasses this system. When such changes occur, UpdateDesigner notifies the designer that the properties of the grid have changed and that the changes should be saved. + + + + + + + + + +Starts the dragging of a column in the grid. +BeginColumnDrag is called automatically when the user clicks on a column to start dragging. It enables the grid to control whether the column can be repositioned and if so, which column. +Origin is the index of the column to be moved. When BeginColumnDrag is called, this is the index of the column in which the mouse was clicked. TCustomGrid does not change this value. However, descendant classes can override this method to adjust which column can be moved. +Destination is the index of where the column should move. When BeginColumnDrag is called, this is the same as Origin. TCustomGrid does not change this value because the mouse has not yet moved. Descendant classes can override this method to adjust the default destination of the column. +MousePt is the coordinates of the mouse button when the user clicked. +BeginColumnDrag returns true if the drag operation is permitted, false if the drag should be disallowed. + + + + + + + + + +Starts the dragging of a row in the grid. +Call BeginRowDrag to start a drag operation. BeginRowDrag enables the grid to control where the row can be dropped. It is exposed as a protected method so that descendants of TCustomGrid can customize row dragging in a grid. + + + + + + + + + +CheckColumnDrag validates whether the column currently selected for dragging can be dropped at the current location. +Use CheckColumnDrag to validate that the column currently selected for dragging can be dropped at the current location. CheckColumnDrag can change the Origin (the column being dragged) and/or the Destination (the drop target), as needed, to keep the grid's columns in order. + + + + + + + + + +CheckRowDrag validates whether the row currently selected for dragging can be dropped at the current location. +Use CheckRowDrag to validate that the row currently selected for dragging can be dropped at the current location. CheckRowDrag can change the Origin (the row being dragged) and/or the Destination (the drop target), as needed, to keep the grid's rows in order. + + + + + + + + + +Ends the dragging of a column in the grid. +Call EndColumnDrag to end a drag operation. EndColumnDrag enables the grid to control where the column can be dropped. It is exposed as a protected method so that descendants of TCustomGrid can customize column dragging in a grid. + + + + + + + + + +Ends the dragging of a row in the grid. +Call EndRowDrag to end a drag operation. EndRowDrag enables the grid to control where the row can be dropped. It is exposed as a protected method so that descendants of TCustomGrid can customize row dragging in a grid. + + +Determines whether a single line border is drawn around the grid. +Set BorderStyle to bsSingle to add a single line border around the grid's image. Set BorderStyle to bsNone to omit the border. + + + + +Specifies the index of the column that contains the selected cell. +Use Col at runtime to determine the current column in the grid. Setting Col moves focus to the cell in the current row that is in the new column. The first column has an index of 0, the second column an index of 1, and so on. +The selected cell in the grid can be located by reading the Col property and the Row property to obtain the indexes of its column and row. When focus moves to the grid, the selected cell gets input focus. + + +Specifies the background color of the control. +Use Color to read or change the background color of the control. +If a control's Vcl.Controls.TControl.ParentColor property is True, then changing the Color property of the control's parent automatically changes the Color property of the control. When the value of the Color property is changed, the control's ParentColor property is automatically set to False. +The Color of a TLabel is always the color of the background unless you set TLabel.Transparent to False. + + +Specifies the number of columns in the grid. +Read ColCount to determine the number entries in the ColWidths array. Set ColCount to add or delete columns at the right side of the grid. The value of ColCount includes any fixed columns at the left of the grid as well as the scrollable columns in the body of the grid. + + + + + +Determines the width (in pixels) of all columns that have not been explicitly resized. +Set DefaultColWidth to change the size of all columns in the grid. When DefaultColWidth is set, columns that have been resized using the mouse or by setting the ColWidths property are given the DefaultColWidth as well. +When new columns are added to the grid using the ColCount property, they are created with a width of DefaultColWidth. + + +DefaultColAlignment is the default text alignment for all columns where alignment is not explicitly specified using TCustomGrid.ColAlignments. + + + + +Determines whether the Cells are painted when the grid is drawn. +Set DefaultDrawing to true to have the grid automatically paint the cells in the grid, including adding the background color, the 3-D effects on the fixed cells, and the focus rectangle around the selected cell. Set DefaultDrawing to false to skip the painting of the cells when the grid is drawn. +When DefaultDrawing is false, the cells should be painted using the DrawCell method. For TCustomGrid, DrawCell is an abstract method. Descendants of TCustomGrid use DrawCell to provide their own customized drawing code, or to generate an OnDrawCell event. + + +Specifies the height (in pixels) of all rows that have not been explicitly resized. +Set DefaultRowHeight to change the size of all rows in the grid. When DefaultRowHeight is set, rows that have been resized using the mouse or by setting the RowHeights property are given the DefaultRowHeight as well. +When new rows are added to the grid using the RowCount property, they are created with a height of DefaultRowHeight. + + +Determines the style used when drawing the grid. +DrawingStyle determines the style used to draw the grid. The following table lists the possible values of DrawingStyle. + + + + +Value + +Meaning + + + +gdsClassic + + + +The grid control uses the standard, unthemed style. + + + + +gdsThemed + + + +The grid control uses the current operating system theme. + + + + +gdsGradient + + + +The grid control uses gradients for styling. + + + + +Notes about DrawingStyle for Vcl.Grids.TStringGrid: +Setting FixedColor has no effect unless you also set DrawingStyle to gdsClassic. +Setting GradientStartColor and GradientEndColor has no effect unless you set the value of DrawingStyle to gdsGradient. + + + +Determines whether the current cell can be edited. +Set EditorMode to true, at runtime, to put the grid in edit mode. When EditorMode is true, the user can edit cells in the grid. When the user presses F2, EditorMode is set to true. When the user presses Enter, the value of EditorMode is toggled. + +Note: EditorMode has no effect if the Options property does not include goEditing or if the Options property includes goAlwaysShowEditor. + +Specifies the background color of the fixed rows and columns in the grid. +Set FixedColor to specify the color for the nonscrolling cells in the grid. The scrolling region of the grid is drawn using the Color property. + + +Specifies the number of columns on the left of the grid that cannot be scrolled. +Set FixedCols to create or get rid of nonscrolling columns. Nonscrolling columns appear at the left of the grid, and are always visible, even when the user scrolls the other columns in the grid. Use nonscrolling columns for displaying row titles or row numbers, or to implement a scroll lock that the user can set. +Nonscrolling columns are visually distinct from the scrollable columns in the grid. They are painted with a separate background color, and their cells have a raised, 3-D look. + +Note: Grids must include at least one scrolling column. Do not set FixedCols to a value greater than ColCount - 1. + +Specifies the number of rows on the top of the grid that cannot be scrolled. +Set FixedRows to create or get rid of nonscrolling rows. Nonscrolling rows appear at the top of the grid, and are always visible, even when the user scrolls the other rows in the grid. Use nonscrolling rows for displaying column titles or column numbers. +Nonscrolling rows are visually distinct from the scrollable rows in the grid. They are painted with a separate background color, and their cells have a raised, 3-D look. + +Note: Grids must include at least one scrolling row. Do not set FixedRows to a value greater than RowCount - 1. + +Determines the ending gradient color. +GradientEndColor determines the ending gradient color. GradientEndColor is used when the value of DrawingStyle is gdsGradient. GradientEndColor and GradientStartColor define the color range used when drawing individual cells within the grid control. + + +Determines the starting gradient color. +GradientStartColor determines the starting gradient color. GradientStartColor is used when the value of DrawingStyle is gdsGradient. GradientEndColor and GradientStartColor define a color range used when drawing individual cells within the grid control. + + +Specifies the height of the grid in pixels. +Read GridHeight to determine the size of the grid. If GridHeight is less than the value of ClientHeight, all of the rows of the grid appear in the control with an empty region below the grid. If the underlying grid is too tall to appear in the control, GridHeight is the same as ClientHeight, and the user must scroll to see the entire contents of the grid. + + +Specifies the width (in pixels) of the lines that separate the cells of the grid. +Set GridLineWidth to make the lines that separate the cells in the grid heavier or lighter. When GridLineWidth is zero, no separators are drawn between the cells of the grid. +GridLineWidth will have no effect if the Options property does not include goFixedHorzLine, goFixedVertLine, goHorzLine, or goVertLine. + +Note: Values greater than 3 pixels are not recommended for applications that run on Windows 9x or Windows ME because of distortions that can appear. + +Specifies the width of the grid in pixels. +Read GridWidth to determine the size of the grid. If GridWidth is less than the value of ClientWidth, all of the columns of the grid appear in the control with an empty region to the right of the grid. If the underlying grid is too wide to appear in the control, GridWidth is the same as ClientWidth, and the user must scroll to see the entire contents of the grid. + + +Indicates the current position of the mouse cursor. +Read HitTest to determine the position of the mouse when it is over the grid or when the grid has captured the mouse. HitTest may represent a position that is not within the client area of the grid control if the user is moving or resizing the rows or columns, or if the user is selecting a range of cells using the mouse. HitTest is the position of the mouse cursor in the coordinate system where (0,0) is the upper left corner of the grid control's client area. + + +Designates the edit control the grid uses to allow users to edit the contents of the selected cell. +Read InplaceEditor to gain direct access to the edit control that sits on top of the selected cell when the grid is in edit mode. The inplace editor is created the first time the grid is put in edit mode. It is not destroyed until the grid is destroyed. The grid moves the editor when the selected cell changes. The grid hides the editor's window when the grid goes out of edit mode. + + +Specifies the index of the first visible scrollable column in the grid. +Read LeftCol to determine the index of the first column in the scrollable region that is visible. Set LeftCol to scroll the columns in the grid so that the column with index LeftCol is the first column after the fixed columns. + + +Specifies various display and behavioral properties of the grid. +Set Options to include the desired properties for the grid. See the type Vcl.Grids.TGridOptions for definitions of these properties. + + +Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + +Specifies the index of the row that contains the selected cell. +Use Row at runtime to determine the current row in the grid. Setting Row moves focus to the cell in the current column that is in the new row. The first row has an index of 0, the second row an index of 1, and so on. +The selected cell in the grid can be located by reading the Row property and the Col property to obtain the indexes of its row and column. When focus moves to the grid, the selected cell gets input focus. + + +Specifies the number of rows in the grid. +Read RowCount to determine the number of entries in the RowHeights array. Set RowCount to add or delete rows at the bottom of the grid. The value of RowCount includes any fixed rows at the top of the grid as well as the scrollable rows in the body of the grid. + + + +Specifies whether the grid includes horizontal and vertical scroll bars. +Use ScrollBars to give the grid horizontal or vertical scroll bars. + +Note: If all the cells in the grid fit in the ClientWidth, no horizontal scroll bar appears, even if ScrollBars is ssHorizontal or ssBoth. If all the cells fit in the ClientHeight, no vertical scroll bar appears, even if ScrollBars is ssVertical or ssBoth. + +Indicates the boundaries of the current selection. +Set Selection to select a range of cells in the grid. Selection can either represent the first column, first row, last column and last row in the grid, or the row and column coordinates of the upper left and bottom right cells in the selected region. +Selection can only indicate more than one cell when Options includes goRangeSelect. + + + +Specifies the index of the first visible scrollable row in the grid. +Read TopRow to determine the index of the first row in the scrollable region that is visible. Set TopRow to scroll the rows in the grid so that the row with index TopRow is the first row after the fixed rows. + + +Indicates the number of scrollable columns visible in the grid. +Use VisibleColCount to determine the number of scrollable columns fully visible in the grid. VisibleColCount does not include the fixed columns counted by the FixedCols property. It does not include any partially visible columns on the right edge of the grid. + + +Indicates the number of scrollable rows visible in the grid. +Use VisibleRowCount to determine the number of scrollable rows fully visible in the grid. VisibleRowCount does not include the fixed rows counted by the FixedRows property. It does not include any partially visible rows on the bottom of the grid. + + +Determines the event triggered when a user clicks in a fixed cell. +Write an event handler for OnFixedCellClick to supply custom logic to your application in response to a user clicking in a fixed cell. OnFixedCellClick is only triggered if the Options property includes either the goFixedColClick or goFixedRowClick option, or both options. +OnFixedCellClick can be useful when implementing sorting on columns. By clicking in a fixed cell, the applied sorting rule can be reversed. + + + + + + +Creates an instance of TCustomGrid. +Call Create to create a grid control at runtime. Grid controls placed on a form at design time are created automatically. +Owner is a component that is responsible for freeing the grid and for initiating the streaming process when it is saved to a form file. + + + + + +Destroys an instance of TCustomGrid. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the grid reference is not nil, and only then calls Destroy. + + + + + + + + +Returns the row and column indexes of the cell that contains a point specified in screen coordinates. +Call MouseCoord to locate the column and row of the cell which contains a given screen coordinate. Usually, MouseCoord is used to locate the cell that is under the mouse. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +TCustomGrid is the base type for all components that present information in a two-dimensional grid. +Use TCustomGrid as a base class when defining components that represent information in a tabular format. TCustomGrid introduces properties and methods to control the appearance and behavior of the grid, including responses to mouse actions and user editing. +Do not create instances of TCustomGrid. Instead, put a grid control in a form by instantiating a descendant of TCustomGrid. Use TDrawGrid to represent non-textual material in a tabular grid. For text, use a TStringGrid object. If the text represents field values from a dataset, use TDBGrid. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Generates an OnColumnMoved event. +ColumnMoved is called immediately after a column in the grid has moved. It overrides the inherited method to generate an OnColumnMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnColumnMoved event. + + + + + + + + + +Generates an OnDrawCell event. +DrawCell is called automatically whenever a cell in the grid is drawn. If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the 3D effects of the fixed cells or the focus rectangle around the focused cell are drawn after DrawCell. Descendants of TCustomDrawGrid can override this method to draw the contents of the cell or to block the OnDrawCell event. + + + + + + + + +Generates an OnGetEditMask event. +The inplace editor calls GetEditMask to obtain any input mask associated with the cell specified by the ACol and ARow parameters. +GetEditMask returns the Value parameter set by the OnGetEditMask event handler. If there is no OnGetEditMask event handler, GetEditMask returns an empty string, indicating that there is no edit mask. + + + + + + + + +Generates an OnGetEditText event. +The inplace editor calls GetEditText to obtain the text for the indicated cell. GetEditText returns the Value parameter set by the OnGetEditText event handler. If there is no OnGetEditText event handler, GetEditText returns an empty string. + + + + + + + +Generates an OnRowMoved event. +RowMoved is called immediately after a row in the grid changes position. It overrides the inherited method to generate an OnRowMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnRowMoved event. + + + + + + + + +Determines whether a particular cell in the grid can be selected. +Grid controls call SelectCell internally before attempting to move selection to a the cell identified by the ACol and ARow parameters. ACol and ARow are the column and row indexes for the cell, where the first column has index 0, and the top row has index 0. +SelectCell generates an OnSelectCell event. This method then returns true, unless the OnSelectCell event handler indicates that the cell should not be selected. Descendants of TCustomDrawGrid can override this method to check the properties of the information displayed in the cell or block the OnSelectCell event. + + + + + + + + +Generates an OnSetEditText event. +SetEditText is called by the inplace editor so that the grid can store the new value for the current cell. SetEditText overrides the inherited parent class's method to generate an OnSetEditText event. Descendants of TCustomDrawGrid can override this method to update an internal representation of the cell's value, or to block the OnSetEditText event. + + + +Generates an OnTopLeftChanged event. +Grid controls call TopLeftChanged internally, whenever the LeftCol or TopRow property changes. After calling the inherited parent class's method to update the position of the InplaceEditor (inherited from TCustomGrid), TopLeftChanged generates an OnTopLeftChanged event. + + +Occurs immediately after the position of a column changes. +Use OnColumnMoved to perform special processing when the position of a grid column changes. Columns can be moved programmatically or by user manipulation. OnColumnMoved does not occur unless the Options property includes goColMoving. + + +Occurs when a cell in the grid needs to be drawn. +Write an OnDrawCell event handler to draw the contents of all the cells in the grid. Draw on the cell using the methods of the Canvas property. The Rect parameter indicates the location of the cell on the canvas. The Col and Row parameters indicate the column and row indexes of the cell that should be drawn. The State parameter indicates whether the cell has input focus, whether the cell is selected, and whether the cell is a fixed (nonscrolling) cell. +If the OnDrawCell event handler is not assigned, all cells in the draw grid will appear empty. If the DefaultDrawing property is True, the draw grid paints the background color of the cell before the OnDrawCell event, and draws a focus rectangle around the selected cell after the OnDrawCell event handler finishes drawing the contents of the cell. If the DefaultDrawing property is False, the OnDrawCell event handler should paint the background of the cell and provide all visual indication of selection and focus. + + +Occurs when the in-place editor requests an edit mask. +Write an OnGetEditMask event handler to provide the in-place editor with an edit mask that describes the valid input strings a user can type into a cell. Set the Value parameter to the string that describes the edit mask for the cell specified by the ACol and ARow parameters. If the cell does not have an edit mask, set the Value parameter to an empty string. +OnGetEditMask does not occur unless the Options property includes goEditing. + + +Occurs when the in-place editor requests the value of a cell. +Write an OnGetEditText event handler to provide the in-place editor with a string representing the contents of the cell. Set the Value parameter to the string for the cell specified by the ACol and ARow parameters. When the cell enters edit mode, the contents of the cell are drawn as the Value string returned by the OnGetEditText event handler. This image need not match the appearance of the cell when it is not in edit mode, which is drawn using the OnDrawCell event handler. +OnGetEditText does not occur unless the Options property includes goEditing. + + +Occurs immediately after the position of a row changes. +Write an OnRowMoved event handler to provide special processing whenever a row in the grid changes position. Rows can be moved programmatically or by user manipulation. OnRowMoved does not occur unless the Options property includes goRowMoving. + + +Occurs before a cell in the grid is selected. +Write an OnSelectCell event handler to specify whether any particular cell in the grid can be selected. The Col and Row parameters indicate the column and row indexes of the cell that is about to be selected. Set the CanSelect parameter to False to prevent the cell being selected. + + +Occurs when the user edits the value of a cell. +Write an OnSetEditText event handler to perform any special processing of the text edited by the user in an in-place editor. For example, use the OnSetEditText event to retrieve and store the value of a cell so that it can be displayed in an OnDrawCell event handler. OnSetEditText occurs every time the user changes the text. +The Value parameter is the new value for the cell specified by the ACol and ARow parameters. +OnSetEditText does not occur unless the Options property includes goEditing. + + +Occurs immediately after the TopRow property or the LeftCol property changes. +Use OnTopLeftChanged to perform special processing when the non-fixed cells in the grid are scrolled. + + + + + + + + +Returns the screen coordinates of a cell in the grid. +Call CellRect to obtain the boundaries, in pixels, of the cell in the column and row indicated by the ACol and ARow parameters. The top left cell is specified when ACol and ARow are set to zero. +If the indicated cell is not visible, CellRect returns an empty rectangle. + + + + + + + + + +Returns the column and row of the cell at the position with screen coordinates (X,Y). +Call MouseToCell to convert from grid-relative screen coordinates to row and column indexes. The X and Y parameters are the screen coordinates of the point to be converted. MouseToCell returns the ACol parameter as the number of the column over the point (X,Y), and the ARow parameter as the number of the row. +Usually the MouseToCell method is used in a mouse event handler, which supplies the mouse coordinates as the X and Y parameters of the method call. + + + + + + + + + + + + + + + + + + +TCustomDrawGrid is the base class for grids that publish events for painting and manipulating the cells in the grid. +Use TCustomDrawGrid as a base class when defining grid components that publish events for painting or manipulating the cells in the grid. TCustomDrawGrid introduces a number of events and methods that take advantage of the tabular organization of the grid in responding to user actions. +Do not create instances of TCustomDrawGrid. Instead, put a grid control in a form by instantiating a descendant of TCustomDrawGrid. Use TDrawGrid to represent non-textual material in a tabular grid. For text, use a TStringGrid object. If the text represents field values from a dataset, use TDBGrid. If you are displaying Name/Value pairs, use TValueListEditor. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TDrawGrid represents a grid control that displays information in column and row format. +Add a TDrawGrid object to a form to present arbitrary information in a tabular format. TDrawGrid provides many properties to control the appearance of the grid, as well as events and methods that take advantage of the tabular organization of the grid in responding to user actions. +TDrawGrid introduces several events and methods to allow applications to customize the appearance and behavior of the grid. +If the cells of the grid contain text strings that represent objects, consider using a TStringGrid object instead. If the grid displays field values from the records in a dataset, use TDBGrid instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Generates an OnColumnMoved event. +Vcl.Grids.TStringGrid.ColumnMoved inherits from Vcl.Grids.TCustomDrawGrid.ColumnMoved. All content below this line refers to Vcl.Grids.TCustomDrawGrid.ColumnMoved. +Generates an OnColumnMoved event. +ColumnMoved is called immediately after a column in the grid has moved. It overrides the inherited method to generate an OnColumnMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnColumnMoved event. + + + + + + + + + +Generates an OnDrawCell event. +Vcl.Grids.TStringGrid.DrawCell inherits from Vcl.Grids.TCustomDrawGrid.DrawCell. All content below this line refers to Vcl.Grids.TCustomDrawGrid.DrawCell. +Generates an OnDrawCell event. +DrawCell is called automatically whenever a cell in the grid is drawn. If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the 3D effects of the fixed cells or the focus rectangle around the focused cell are drawn after DrawCell. Descendants of TCustomDrawGrid can override this method to draw the contents of the cell or to block the OnDrawCell event. + + + + + + + + +Generates an OnGetEditText event. +Vcl.Grids.TStringGrid.GetEditText inherits from Vcl.Grids.TCustomDrawGrid.GetEditText. All content below this line refers to Vcl.Grids.TCustomDrawGrid.GetEditText. +Generates an OnGetEditText event. +The inplace editor calls GetEditText to obtain the text for the indicated cell. GetEditText returns the Value parameter set by the OnGetEditText event handler. If there is no OnGetEditText event handler, GetEditText returns an empty string. + + + + + + + + +Generates an OnSetEditText event. +Vcl.Grids.TStringGrid.SetEditText inherits from Vcl.Grids.TCustomDrawGrid.SetEditText. All content below this line refers to Vcl.Grids.TCustomDrawGrid.SetEditText. +Generates an OnSetEditText event. +SetEditText is called by the inplace editor so that the grid can store the new value for the current cell. SetEditText overrides the inherited parent class's method to generate an OnSetEditText event. Descendants of TCustomDrawGrid can override this method to update an internal representation of the cell's value, or to block the OnSetEditText event. + + + + + + + +Generates an OnRowMoved event. +Vcl.Grids.TStringGrid.RowMoved inherits from Vcl.Grids.TCustomDrawGrid.RowMoved. All content below this line refers to Vcl.Grids.TCustomDrawGrid.RowMoved. +Generates an OnRowMoved event. +RowMoved is called immediately after a row in the grid changes position. It overrides the inherited method to generate an OnRowMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnRowMoved event. + + + + + + +Creates an instance of TStringGrid. +Call Create to create an instance of TStringGrid at runtime. For string grids placed on forms at design time, Create is called automatically. +AOwner is another component, typically a form, that becomes the grid's Owner. The Owner is responsible for freeing the grid. + + + + + +Destroys an instance of TStringGrid. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the string grid is not nil, and only then calls Destroy. +Destroy frees the helper objects used to manage the array of strings and their associated objects. + + + + + + + +TStringGrid represents a grid control designed to simplify the handling of strings and associated objects. +Add a TStringGrid object to a form to present textual data in a tabular format. TStringGrid provides many properties to control the appearance of the grid, as well as events and methods that take advantage of the tabular organization of the grid in responding to user actions. +TStringGrid introduces the ability to associate an object with each string in the grid. These objects can encapsulate any information or behavior represented by the strings that are presented to the user. +For a TStringGrid, the DrawingStyle property controls whether the current settings have any effect for FixedColor, and for GradientStartColor and GradientEndColor: + +Setting FixedColor has no effect unless you also set DrawingStyle to gdsClassic. +Setting GradientStartColor and GradientEndColor has no effect unless you set the value of DrawingStyle to gdsGradient. +Note: If the strings to be presented in a grid represent field values from the records in a dataset, use TDBGrid instead. +Note: To display the string and the associated object or control, use TDrawGrid instead. . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.MPlayer.xml b/Modules/DelphiVCL/doc/Vcl.MPlayer.xml new file mode 100644 index 00000000..c535dac0 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.MPlayer.xml @@ -0,0 +1,3327 @@ + + + + btPlay + + + + + btPause + + + + + btStop + + + + + btNext + + + + + btPrev + + + + + btStep + + + + + btBack + + + + + btRecord + + + + + btEject + + + + + mgEnabled + + + + + mgDisabled + + + + + mgColored + + + + + dtAutoSelect + + + + + dtAVIVideo + + + + + dtCDAudio + + + + + dtDAT + + + + + dtDigitalVideo + + + + + dtMMMovie + + + + + dtOther + + + + + dtOverlay + + + + + dtScanner + + + + + dtSequencer + + + + + dtVCR + + + + + dtVideodisc + + + + + dtWaveAudio + + + + + tfMilliseconds + + + + + tfHMS + + + + + tfMSF + + + + + tfFrames + + + + + tfSMPTE24 + + + + + tfSMPTE25 + + + + + tfSMPTE30 + + + + + tfSMPTE30Drop + + + + + tfBytes + + + + + tfSamples + + + + + tfTMSF + + + + + mpNotReady + + + + + mpStopped + + + + + mpPlaying + + + + + mpRecording + + + + + mpSeeking + + + + + mpPaused + + + + + mpOpen + + + + + nvSuccessful + + + + + nvSuperseded + + + + + nvAborted + + + + + nvFailure + + + + + mpCanStep + + + + + mpCanEject + + + + + mpCanPlay + + + + + mpCanRecord + + + + + mpUsesWindow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Provides responses when the user types arrow keys or the space bar. +KeyDown overrides the inherited method to implement the media player's response to certain keystrokes. It changes the current button when the user types the left or right arrow keys. When the user presses the space bar, KeyDown simulates a click on the current button. + + + +Initializes the media player after it is loaded from a stream. +Loaded provides an opportunity for a component to initialize itself after all its parts have loaded from a stream. TMediaPlayer overrides the inherited method to implement the AutoOpen property. + + + + + + +Enables or Disables the media player's buttons. +AutoButtonSet implements the automatic enabling and disabling of the media player's buttons when the AutoEnable property is true. The Btn parameter indicates which of the media player's buttons the user pressed. + + + + + + + +Responds when components are about to be inserted or removed. +By default, components pass along the notification to their owned components, if any. Notification calls the inherited Notification and then, if the Display window is deleted at runtime, it sets the video display back to original window. + + + +Renders the image of the media player. +When the media player component receives a WM_PAINT message, like other custom controls, it responds by initializing the control's canvas and calling Paint. Paint draws the frame and all visible buttons. +When creating a descendant media player class, Paint can be overridden to draw the image of the corresponding media player object. + + + + + + +Responds to a notification that the MCI device has completed an operation. +MMNotify responds to a notification message from Windows that a multimedia command completed by updating button states if the AutoEnable property is true, setting internal flags to reflect the outcome of the command, then calling the DoNotify method to trigger the OnNotify event and any other special responses. + + + + + + + +Generates an OnClick event. +Click for media-player components is the implementation method for the OnClick event. By default, Click does nothing other than call any event handler attached to the media player's OnClick event. Click can be overridden in descendant classes to customize responses to clicks. + + + + + + +Determines the action that takes place when an OnPostClick event occurs. +PostClick is the implementation method for the OnPostClick event. By default, PostClick does nothing other than call any event handler attached to the media player's OnPostClick event. PostClick can be overridden in descendant types to customize responses to clicks. + + + +Generates an OnNotify event. +DoNotify is the implementation method for a media-player component's OnNotify event. The media player's MMNotify method calls DoNotify after correcting the enabling and disabling of buttons and setting internal flags from the values passed in the notification message parameters. +By default, DoNotify does nothing except call any event handler attached to the media player's OnNotify event. DoNotify can be overridden to provide other responses in addition to the inherited event-handler call. + + + +Signals that the media player has finished updating. +Updated calls the inherited Updated before it modifies the layout of the media player buttons and forces a repaint. + + + + + + +Creates a media player object. +Call Create to instantiate a media player at runtime. For media players created at design time, Create is called automatically. +Create allocates memory for a media player and calls the inherited Create. Then it loads the bitmaps for the media player's buttons and initializes its properties, setting AutoEnable, AutoRewind, Colored, Enabled, and Visible to true, AutoOpen to false, and DeviceType to dtAutoSelect. + + + + + +Destroys an instance of the media player. +Do not call Destroy directly in an application. Call Free instead. Free checks that the TMediaPlayer reference is not nil before it calls Destroy. +Destroy first verifies that no device is open, then destroys the bitmaps used for the media player's buttons and calls the inherited Destroy. + + + +Opens a multimedia device. +Use Open to open a multimedia device. The multimedia device type must be specified in the DeviceType property before a device can be opened. +Upon completion, Open stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Open method is completed. The Notify property determines whether Open generates an OnNotify event. + + + +Closes the open multimedia device. +Upon completion, Close stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Close method is completed. The Notify property determines whether Close generates an OnNotify event. +Close is called automatically when the application is terminated. + + + +Plays the media loaded in the open multimedia device. +Play is called when the Play button on the media player control is clicked at runtime. +Upon completion, Play stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Play method has completed. The Notify property determines whether Play generates an OnNotify event. +If the StartPos property is set, playing starts at the position specified in StartPos. Otherwise, playing starts at the current position, specified in the Position property. Similarly, if the EndPos property is set, playing stops at the position specified in EndPos. Otherwise, playing stops at the end of the medium. +Whether the medium (specified in the Position property) is rewound before playing starts depends on the AutoRewind property. + + + +Halts playing or recording. +Stop is called when the Stop button on the media player control is clicked at runtime. +Upon completion, Stop stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Stop method has completed. The Notify property determines whether Stop generates an OnNotify event. + + + +Toggles the open multimedia device on or off. +If the device is already paused when Pause is called, the device resumes playing or recording by calling the Resume method. Pause is called when the Pause button on the media player control is clicked at runtime. +Upon completion, Pause stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Pause method has completed. The Notify property determines whether Pause generates an OnNotify event. + + + +Moves forward a number of frames (determined by the Frames property) in the currently loaded medium. +Step is called when the Step button on the media player control is clicked at runtime. +Upon completion, Step stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Step method has completed. The Notify property determines whether Step generates an OnNotify event. + + + +Steps backward a number of frames (determined by the value of the Frames property) in the currently loaded medium. +Back is called when the Back button on the media player control is clicked at runtime. +Upon completion, Back stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Back method has been completed. The Notify property determines whether Back generates an OnNotify event. + + + +Sets the current position to the beginning of the previous track if the position was at the beginning of a track when Previous was called. +If the position is at the first track or somewhere other than the beginning of a track when Previous was called, Previous sets the current position to the beginning of the current track. If the device doesn't use tracks, Previous sets the current position to the beginning of the medium, which is specified in the Start property. Previous is called when the Previous button on the media player control is clicked at runtime. +Upon completion, Previous stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Previous method has completed. The Notify property determines whether Previous generates an OnNotify event. + + + +Moves to the beginning of the next track of the currently loaded medium. +If the current position is at the last track when Next is called, Next makes the current position the beginning of the last track. If the multimedia device doesn't use tracks, Next goes to the end of the medium. Next is called when the Next button on the media player control is clicked at runtime. +Upon completion, Next stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Next method has completed. The Notify property determines whether Next generates an OnNotify event. + + + +Begins recording from the current Position or from the position specified in StartPos. +StartRecording is called when the Record button on the media player control is clicked at runtime. +Upon completion, StartRecording stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the StartRecording method has completed. The Notify property determines whether StartRecording generates an OnNotify event. +By default, the Notify property becomes true, and the Wait property becomes false upon completion of the StartRecording method. However, if these properties have been set to specific values prior to calling StartRecording, they remain unchanged. + + + +Releases the loaded medium from the open multimedia device. +Eject is called when the Eject button on the media player control is clicked at runtime. It ejects the loaded medium from the open multimedia device. +Upon completion, Eject stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Eject method has been completed. The Notify property determines whether Eject generates an OnNotify event. + + + +Saves the currently loaded medium to the file specified in the FileName property. +Save is ignored for devices that don't use media stored in files (videodiscs, for example). +Upon completion, Save stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Save method has completed. The Notify property determines whether Save generates an OnNotify event. + + + +Pauses the open multimedia device. +If the device is already paused when PauseOnly is called, the device will remain paused. +Upon completion, PauseOnly stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the PauseOnly method has completed. The Notify property determines whether PauseOnly generates an OnNotify event. + + + +Resumes playing or recording the currently paused multimedia device. +Resume is called when the Pause button on the media player control is clicked at runtime, when the device is paused. +Upon completion, Resume stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Resume method has completed. The Notify property determines whether Resume generates an OnNotify event. + + + +Sets the current position to the beginning of the the medium, which is stored in the Start property. +Upon completion, Rewind stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Rewind method has completed. The Notify property determines whether Rewind generates an OnNotify event. + + + + +Determines the capabilities of the open multimedia device. +The various capabilities specified in Capabilities are determined when the device is opened with the Open method. + +Note: Currently, there is no way to check whether a device can step forward or backward. Capabilities includes mpCanStep only if the device type (specified in the DeviceType property) is Animation, AVI Video, Digital Video, Overlay, or VCR. + +Specifies the MCI error code returned by the media control method. +Error specifies the MCI error code returned by the most recent media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop). The ErrorMessage property describes the Error. +The error code returned by media control methods are the same error code returned by the mciSendCommand function. The message describing the error code is stored in the ErrorMessage property. +The value of Error is zero if the most recent media control method didn't cause an error. If a method results in an error, a value other than zero is stored in Error. If the error occurs during the opening of the device, an EMCIDeviceError exception occurs. + + +Describes the error code stored in the Error property. +ErrorMessage specifies the error message that describes the error code returned from the most recent media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop). +The error code described by the message is stored in the Error property. + + +Specifies the starting position within the currently loaded medium. +Start is the beginning of the medium for devices that don't use tracks, or the beginning of the first track for devices that use tracks. Start is defined when a multimedia device is opened with the Open method. Start is specified according to the current time format, which is stored in the TimeFormat property. Start is read-only at runtime and is unavailable at design time. + + +Specifies the length of the medium in the open multimedia device. +Length is specified using the current time format, which is specified by the TimeFormat property. + + +Specifies the number of playable tracks on the open multimedia device. +Tracks indicates how many of playable tracks are available on the open multimedia device. +Tracks is undefined for devices that don't use tracks. + + +Specifies the number of frames moved forward or backward. +Frames specifies the number of frames the Step method steps forward or the Back method steps backward. Frames defaults to ten percent of the length of the currently loaded medium, which is specified by the Length property. +The definition of a frame varies by multimedia device. For display media, a frame is one still image. + + +Indicates the state of the currently open multimedia device. +Mode specifies the current state or mode of the currently open multimedia device. +The TMPModes type defines the modes for a multimedia device used with a TMediaPlayer. + + +Specifies the current position within the currently loaded medium. +The value of Position is specified according to the current time format, which is specified in the TimeFormat property. +Position defaults to the beginning of the medium. If the medium supports multiple tracks, Position defaults to the beginning of the first track. + + +Determines whether a media control method returns control to the application only after it has been completed. +Wait determines whether a media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop) returns control to the application only after it has been completed. +Wait is unavailable at design time. +If Wait is true, the media player component waits until the next media control method has completed before returning control to the application. If Wait is false, the application won't wait for the next media control method to finish before continuing. +Wait affects only the next media control method called after setting Wait. Wait must be reset to affect any subsequent call to a media control method. +By default, Play and StartRecording function as if Wait is false. Wait must be set to true before calling Play or StartRecording to prevent control from returning to the application before playing or recording has finished. By default, all other media control methods function as if Wait is true. + +Note: Wait is usually set to false only if the next media control is expected to take a long time, so that the application can execute other code before the media control method has completed. If Wait is set to false, you should set Notify to true so the application is notified when the media control method completes. + +Determines whether an OnNotify event is generated. +Notify determines whether the next call to a media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop) generates an OnNotify event when the method has completed. +If Notify is true, the next media control method generates OnNotify event upon completion and stores the notification message in the NotifyValue property. If Notify is false, the method does not generate an OnNotify event and NotifyValue remains unchanged. +Notify affects only the next call to a media control method. After an OnNotify event, Notify must be reset to affect any subsequent media control methods. +By default, Play and StartRecording function as if Notify is true. Set Notify to false before calling Play or StartRecording to prevent an OnNotify event from being generated when playing or recording has finished. By default, all other media control methods function as if Notify is false. + +Tip: Set Notify to true if the next media control is expected to take a long time, so the application is notified when the media control method has completed. If Notify is set to true, it is recommended to set Wait to false so that control returns to the application before the media control method is finished. +Note: When trying to resume a device that doesn't support Resume, the device is resumed as if the Play method was called. If Notify was assigned true before calling Resume (or any other media control method), Notify doesn't affect the call to Resume. Resume does not generate an OnNotify event upon completion, and NotifyValue remains unchanged. + +Indicates the result of the last media control method that requested a notification. +NotifyValue reports the result of the last media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop) that requested a notification. +To request notification, set Notify to true before calling a media control method. + + +Specifies the position within the currently loaded medium from which to begin playing or recording. +StartPos is specified using the current time format, which is specified in the TimeFormat property. +The StartPos property affects only the next Play or StartRecording method called after setting StartPos. Reset must be set to StartPos to affect any subsequent calls to Play or StartRecording. +StartPos does not affect the current position of the medium (specified in the Position property) until the next Play or StartRecording method is called. + + +Specifies the position within the currently loaded medium at which to stop playing or recording. +EndPos is specified using the current time format, which is specified in the TimeFormat property. +The EndPos property affects only the next Play or StartRecording method called after setting EndPos. Reset EndPos to affect any subsequent calls to Play or StartRecording. + + +Specifies the device ID for the currently open multimedia device. +The value of DeviceID is determined when a device is opened with the Open method. If no device is open, DeviceID is 0. + + +Determines the format used to specify position information. +TimeFormat determines how the StartPos, Length, Position, Start, and EndPos properties are interpreted. For example, if Position is 180 and TimeFormat is tfMilliseconds, the current position is 180 milliseconds into the medium. If Position is 180 and TimeFormat is tfMSF, the current position is 180 minutes into the medium. +Not all formats are supported by every device. When trying to set an unsupported format, the assignment is ignored. +The current timing information is always passed in a 4-byte integer. In some formats, the timing information returned is not really one integer, but single bytes of information packed in the long integer. + + +Specifies a rectangular area in the control specified by the Display property that is used to display output from a multimedia device. +To display output in a specific rectangle area on a form assign a TRect record to DisplayRect. The Rect function can be used to create a TRect record. +Media that use a rectangle to display output usually perform best if the default DisplayRect size is used. To set DisplayRect to the default size, position the rectangle in the upper left corner and use 0, 0 for the lower right corner. +DisplayRect is ignored if Display is nil (Delphi) or NULL (C++). +Examples of multimedia devices that use a window to display output are Animation, AVI Video, Digital Video, Overlay, and VCR. + +Note: DisplayRect can be set only after the media device is opened. + + +Determines which buttons on the media player control have color. +ColoredButtons controls which buttons on the media player are colored. +If a button is not colored with ColoredButtons, it appears in black-and-white when visible. All media player control buttons are colored by default. + + + +Determines which buttons on the media player are usable. +EnabledButtons controls which buttons on the media player are enabled and usable. +An enabled button is colored and usable. A disabled button is dimmed and not usable. If a button is not enabled with EnabledButtons, it is disabled. By default, all buttons are enabled. +If the AutoEnable property is true, AutoEnable supersedes EnabledButtons. The buttons automatically enabled or disabled by the media player override any buttons enabled or disabled with the EnabledButtons property. + + +Indicates which of the buttons on the media player are visible. +VisibleButtons determines which buttons on the media player that are visible. If a button is not made visible with VisibleButtons, it does not appear on the media player control. By default, all buttons are visible when a media player component is added to a form. + + + +Determines whether the media player automatically enables and disables individual buttons in the component. +Use AutoEnable to automatically enable or disable the control buttons on the media player. If AutoEnable is true, the media player automatically enables or disables its control buttons. The media player determines which buttons to enable or disable by the current mode specified in the Mode property, and the current multimedia device type specified in the DeviceType property. +AutoEnable overrides the EnabledButtons property. The buttons enabled or disabled automatically by the media player supersede any buttons enabled or disabled with EnabledButtons. +If AutoEnable is false, the media player does not enable or disable buttons. The buttons must enabled or disabled with the EnabledButtons property. +The following table shows whether buttons are automatically enabled or disabled for each device mode: + + + + + +Button + +Play + +Record + +Pause + +Stop + +Not Open + + + +Back + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Eject + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Next + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Pause + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + +Disabled + + + + +Play + + + +Disabled + + + +Disabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Prev + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Record + + + +Disabled + + + +Disabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Step + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Stop + + + +Enabled + + + +Enabled + + + +Disabled + + + +Disabled + + + +Disabled + + + + + + +Determines if the media player is opened automatically when the application is run. +Use AutoOpen to have the media player automatically open at runtime. +If AutoOpen is true, the media player attempts to open the multimedia device specified by the DeviceType property (or FileName if DeviceType is dtAutoSelect) when the form containing the media player component is created at runtime. +If AutoOpen is false, the device must be opened with a call to the Open method. +If an error occurs when opening the device, an exception of type EMCIDeviceError exception is raised that contains the error message. Upon completion, a numerical error code is stored in the Error property, and the corresponding error message is stored in the ErrorMessage property. +The Wait property determines whether control is returned to the application before opening the multimedia device. The Notify property determines whether opening the device generates an OnNotify event. + + +Determines if the media player control rewinds before playing or recording. +If AutoRewind is true and the current position is at the end of the medium, Play or StartRecording moves the current position to the beginning of the medium before playing or recording. If AutoRewind is false, the user must click the Prev button or write code to call Previous to move to the beginning. +If values have been assigned to StartPos or EndPos or if the multimedia device uses tracks, AutoRewind has no effect on playing or recording. When calling Play or StartRecording, the current position remains at the end of the medium. + + + +Specifies a multimedia device type to open with the media player. +DeviceType specifies a multimedia device type to open with the Open method. The default is dtAutoSelect. +If DeviceType is dtAutoSelect, the device type is determined by the file extension specified in the FileName property. If no device type is associated with the extension, the correct device type must be explicitly specified by setting DeviceType to a value other than dtAutoSelect. +A multimedia device is typically associated with an appropriate file name extension when the device is installed. Associations are specified in the registry or SYSTEM.INI file. See the documentation for the specific device for instructions about how to associate file name extensions with the device. + + + +Specifies the display window for a multimedia device that uses a window for output. +To use Display, assign the name of a windowed control such as a form or panel to Display to display output in that control. +The default value of Display is nil (Delphi) or NULL (C++), meaning that the device creates its own window to display output. Also, by freeing the control assigned to Display after the device has been opened, video output will be in its own default window. +Examples of multimedia devices that use a window to display output are Animation, AVI Video, Digital Video, Overlay, and VCR. + + +Specifies the opened or saved media file. +FileName specifies the media file to be opened by the Open method, or the file to save by the Save method. +At design time, use a file open dialog box to specify the FileName property by clicking the ellipsis button (...) in the Object Inspector. + + +Determines whether more than one application can share a multimedia device. +If Shareable is false, no other components or applications can access the device. If Shareable is true, more than one component or application can access the device. Shareable defaults to false. +Be sure to set Shareable before opening a device. +Some devices are not shareable. If Shareable is set to true for a device that isn't shareable, the Open method fails and the error code is returned to the Error property. + + + + + + + + + + +Occurs when the user presses and releases the mouse button while the mouse pointer is over one of the control buttons, or when the user presses Spacebar while the media player control has focus. +When the media player control has focus and the Spacebar is pressed, the user can use the Left Arrow or Right Arrow keys to select which control button to click. +The EMPNotify type is a method pointer that is called when an OnClick event for a TMediaPlayer components occurs. The Button argument can be one of the following values: btBack, btEject, btNext, btPause, btPlay, btPrev, btRecord, btStep, or btStop. +The default value of the event handler's DoDefault argument is true. If DoDefault is true, the media player control calls the method that corresponds to the clicked button. For example, if the user clicks the Play button (btPlay), the Play method is called. +If DoDefault is false, the user must write code that executes when a media player control button is clicked in the OnClick event handler. The following table lists the default methods corresponding to the media player control buttons: + + + + + +Control button + +Button value + +Method called + + + +Play + + + +btPlay + + + +Play + + + + +Record + + + +btRecord + + + +StartRecording + + + + +Stop + + + +btStop + + + +Stop + + + + +Next + + + +btNext + + + +Next + + + + +Prev + + + +btPrev + + + +Previous + + + + +Step + + + +btStep + + + +Step + + + + +Back + + + +btBack + + + +Back + + + + +Pause + + + +btPause + + + +Pause + + + + +Eject + + + +btEject + + + +Eject + + + + + + + + + + + +Occurs after the OnClick event handler is called. +OnPostClick is generated after the code of the OnClick event handler has been called. If Wait is true when the media player was clicked, OnPostClick won't be called until the completion of the OnClick code. If Wait is false, control can return to the application before completion of the OnClick code; therefore, the OnPostClick event may occur before the actions initiated by the OnClick event have completed. +For example, if the user clicks the Play button and the DoDefault parameter of the OnClick event handler for the media player is true, the media is played. If the media is long enough, it will still be playing when the OnPostClick event is generated if Wait is true. If Wait is false, however, OnPostClick won't occur until the media has finished playing. + + +Occurs upon the completion of a media control method. +OnNotify occurs upon the completion of a media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, Resume, Rewind, StartRecording, Step, or Stop) when the Notify property is set to true before the call to the media control method. After an OnNotify event, the Notify property must be reset to true for the next OnNotify event to occur. + + + +TMediaPlayer controls devices that provide a Media Control Interface (MCI) driver. +The TMediaPlayer component includes a set of buttons (Play, Stop, Eject, and so on) that control a multimedia device such as a CD-ROM drive, MIDI sequencer, or VCR. A multimedia device may be hardware or software. +The media player component contains of multiple buttons. These buttons can be clicked with the mouse, but are not separate objects or button components. + + + + + +Button + +Value + +Action + + + +Play + + + +btPlay + + + +Plays the media player + + + + +Pause + + + +btPause + + + +Pauses playing or recording. If already paused when clicked, resumes playing or recording. + + + + +Stop + + + +btStop + + + +Stops playing or recording + + + + +Next + + + +btNext + + + +Skips to the next track, or to the end if the medium doesn't use tracks + + + + +Prev + + + +btPrev + + + +Skips to the previous track, or to the beginning if the medium doesn't use tracks + + + + +Step + + + +btStep + + + +Moves forward a number of frames + + + + +Back + + + +btBack + + + +Moves backward a number of frames + + + + +Record + + + +btRecord + + + +Starts recording + + + + +Eject + + + +btEject + + + +Ejects the medium + + + + +The multimedia device is played, paused, stopped, and so on when the user clicks the corresponding button on the TMediaPlayer component. The device can also be controlled by the control methods that correspond to the buttons (Play, Pause, Stop, Next, Previous, Step, Back, StartRecording, and Eject). +The type of multimedia device (such as dtWaveAudio or dtVideodisc) is specified by the DeviceType property. If the device stores its media in a file, the name of the media file is specified by the FileName property. If DeviceType is dtAutoSelect, the media player attempts to determine the type of device from the extension of the file specified by FileName. +To have the media player attempt to open the device specified by DeviceType automatically when the media player component is created at runtime, set the AutoOpen property to true. + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Menus.xml b/Modules/DelphiVCL/doc/Vcl.Menus.xml new file mode 100644 index 00000000..6df32d0a --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Menus.xml @@ -0,0 +1,3999 @@ + + + + mbNone + + + + + mbBreak + + + + + mbBarBreak + + + + + maAutomatic + + + + + maManual + + + + + maParent + + + + + fkCommand + + + + + fkHandle + + + + + fkShortCut + + + + + paLeft + + + + + paRight + + + + + paCenter + + + + + tbRightButton + + + + + tbLeftButton + + + + + maLeftToRight + + + + + maRightToLeft + + + + + maTopToBottom + + + + + maBottomToTop + + + + + maNone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $60 + + + + + $C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ITERATOR_OBJECTS + ITERATOR_OBJECTS + ITERATOR_OBJECTS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Copies the properties of an object to a destination object. +Vcl.Menus.TMenuItem.AssignTo inherits from System.Classes.TPersistent.AssignTo. All content below this line refers to System.Classes.TPersistent.AssignTo. +Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + + + + +Designates methods for storing an object's unpublished data on a stream such as a form file. +Vcl.Menus.TMenuItem.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Initializes the component after the form file has been read into memory. +Vcl.Menus.TMenuItem.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + + + + +Forwards notification messages to all owned components. +Vcl.Menus.TMenuItem.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Sets the visual ordering of a child control. +Vcl.Menus.TMenuItem.SetChildOrder inherits from System.Classes.TComponent.SetChildOrder. All content below this line refers to System.Classes.TComponent.SetChildOrder. +Sets the visual ordering of a child control. +SetChildOrder is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to actually implement the ordering. TWinControl uses this ordering information to Z-align the controls. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Iterates through all the menu items of this menu item and updates them. +UpdateItems is called whenever the image list attached to the menu is changed or when OwnerDraw is changed. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Creates an instance of TMenuItem. +Use Create to create a menu item at runtime. Menu items defined at design time using the Menu designer are created automatically. +AOwner is the component that is responsible for freeing the menu item. It becomes the value of the Owner property. + + + + + +Destroys an instance of TMenuItem. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMenuItem reference is not nil, and only then calls Destroy. + + + +Calls the action link's Update method if the menu item is associated with an action link. +InitiateAction calls the action link, if there is one for the menu item, to update the association between the action and the menu item. + + + + + + + +Inserts a menu item into a specified position in the Items array. +Use Insert to insert a new menu item to the dropdown menu for this menu item. If this menu item is the value of the Items property of a main menu or pop-up menu, Insert inserts an item into that menu. Specify the new menu item to add as the value of the Item parameter, and the position in the Items array as the value of the Index parameter. + + + + + + +Removes a menu item from the Items property array. +Call Delete to remove a menu item and all its submenus from a menu. The Index parameter is the index of the item to be deleted, where 0 specifies the first item in the menu, 1 specifies the second item, and so on. +Delete does not free the removed item's memory. To remove an item from the menu and free its memory, call the Free method in the item you want to remove. +To temporarily hide a menu item, without deleting it, use the Visible property. + + + +Removes and frees all menu items listed in the Items property. +Use Clear to free all the items listed in the Items property array. + + + +Simulates a mouse click. +Click generates an OnClick event, as if the user had clicked the menu item. Unlike a real mouse click, Click does not generate a WM_COMMAND message to the window associated with the menu. +Component writers can override click to provide a different response when the user selects the menu item. + + + + + + + +Locates a menu item in the Items property array given its caption. +Use Find to locate the menu item in the Items property array with the caption specified by the ACaption parameter. Find ignores accelerator characters when comparing item captions to the ACaption parameter. +Find returns the first menu item in the Items property array with the specified caption. If no item is found, Find returns nil (Delphi) or NULL (C++). + + + + + + + +Returns the position of a menu item within the Items array. +Call IndexOf to locate a menu item in the submenu headed by this menu item. IndexOf returns 0 for the first menu item, 1 for the second menu item, and so on. If the menu item is not in the submenu, IndexOf returns -1. + +Note: IndexOf may not correspond to the position of the item in the menu the user sees if the menu includes some items that are not visible. + + + + + +Indicates whether the menu item represents a separator bar. +Call IsLine to determine whether the menu item is a separator bar. IsLine checks the Caption of the menu item and returns true if the value of Caption is '-'. Menu items with this Caption appear as separator bars. + + + + + + + +Enumerates all child components. +Vcl.Menus.TMenuItem.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + + + + +Returns a TComponent enumerator. +Vcl.Menus.TMenuItem.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + + + + +Returns the Image list that supplies an image for the menu item. +Use GetImageList to access the list of images that contains the image for this menu item. The ImageIndex property identifies a specific image from the list that GetImageList returns. +GetImageList first checks the Parent of this menu item for a SubMenuImages property. If the parent menu item does not maintain a list of images, it checks that menu item's parent, and so on until reaching a top-level menu item (a menu item where Parent is not set). If none of the parent menu items has a SubMenuImages property, GetImageList checks the top-level menu for an Images property. +GetImageList returns the first image list it finds. If it doesn't find an image list, GetImageList returns nil (Delphi) or NULL (C++). + + + + + + +Returns the parent component of the menu item. +GetParentComponent is called by the streaming system that loads and saves components. It ensures that objects are loaded and saved with their parent objects. GetParentComponent is overridden in descendant classes to return the appropriate parent for their particular type of component. TMenuItem overrides it to identify its associated menu, if it has one, as its parent. + + + + + + + + +Returns the main menu of which the menu item is part. +GetParentMenu returns the menu that contains the menu item. + + + + + + +Indicates that the menu item has a parent that is responsible for loading and saving its data. +TMenuItem overrides HasParent to return true, indicating that menu items have a parent. Applications seldom call the HasParent method. It is used by the streaming system that loads and saves forms to determine when another object is responsible for writing a component to a stream. + + + + + + +Inserts a separator bar at the beginning of the Items property array. +Use NewTopLine to insert a separator bar at the beginning of the items property array. This is useful when building up submenus dynamically at runtime. +NewTopLine returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + + + +Inserts a separator bar at the end of the Items property array. +Use NewBottomLine to insert a separator bar at the end of the items property array. This is useful when building up submenus dynamically at runtime. +NewBottomLine returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + + + + +Inserts a separator bar before a specified item from the Items property array. +Use InsertNewLineBefore to insert a separator bar before the menu item specified by AItem. If AItem is not an item in the Items property array, InsertNewLineBefore raises an exception. +InsertNewLineBefore returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + + + + +Inserts a separator bar after a specified item from the Items property array. +Use InsertNewLineAfter to insert a separator bar after the menu item specified by AItem. If AItem is not an item in the Items property array, InsertNewLineAfter raises an exception. +InsertNewLineAfter returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + + + +Adds one or more menu items to the end of the Items property array. +Use Add to add new menu items to the dropdown menu for this menu item. If this menu item is the value of the Items property of a main menu or pop-up menu, Add adds the items to the end of the menu. +Specify a single new menu item to add as the value of the Item parameter, or an array of new menu items as the value of the AItems parameter. AItems_Size is the index of the last item in the AItems array (one less than the number of items). + + + + + + + + + + +Adds one or more menu items to the end of the Items property array. +Use Add to add new menu items to the dropdown menu for this menu item. If this menu item is the value of the Items property of a main menu or pop-up menu, Add adds the items to the end of the menu. +Specify a single new menu item to add as the value of the Item parameter, or an array of new menu items as the value of the AItems parameter. AItems_Size is the index of the last item in the AItems array (one less than the number of items). + + + + + + +Removes a menu item from the Items property array +Call Remove to remove a menu item and all its submenus from a menu. The Item parameter is the item to be removed. If Item is not a menu item in the Items array, Remove raises an exception. +Remove does not free the item's memory. To remove an item from the menu and free its memory, call the Free method in the item you want to remove. +To temporarily hide a menu item, without deleting it, use the Visible property. + + + + + + +Adjusts the captions of subitems so that every item has an accelerator and there are no duplicate accelerator keys. +Call RethinkHotkeys to adjust the accelerator keys for the items in the Items property and in any submenu of those items. RethinkHotkeys checks for items that do not have an accelerator key or that have duplicate accelerator keys. It then replaces any duplicate accelerators with unique characters and adds accelerator keys to items that don't have them. RethinkHotkeys gives first priority to existing accelerator key mappings, but may change them if necessary to ensure uniqueness. +RethinkHotkeys lets a menu adjust the accelerator keys when the AutoHotkeys property is false. For any menu or submenu that has AutoHotkeys set to true, this adjustment occurs automatically. +RethinkHotkeys returns true if RethinkHotkeys changed the Caption property of any menu items, false otherwise. + + + + + + +Removes superfluous separator lines from the Items property array. +Call RethinkLines to remove superfluous separators from the items in the Items property and in any submenu of those items. RethinkLines removes separators that appear at the very beginning or end of a submenu and separators that immediately follow another separator. +RethinkLines lets a menu remove superfluous separators when the AutoLineReduction property is false. For any menu or submenu that has AutoLineReduction set to true, this adjustment occurs automatically. +RethinkLines returns true if RethinkLines removed any menu items, false otherwise. + + + + + + +Sets the parent component. +Vcl.Menus.TMenuItem.SetParentComponent inherits from System.Classes.TComponent.SetParentComponent. All content below this line refers to System.Classes.TComponent.SetParentComponent. +Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + +Specifies the Windows Command ID associated with the menu item. +Use Command in an application that directly handles WM_COMMAND messages. When the user selects the menu item, Windows sends a WM_COMMAND to the window associated with the menu. The ItemID of the message contains the value of the Command property of the menu item that was selected. + + +Indicates the Windows menu handle of the drop-down menu associated with the menu item. +Use Handle when calling a Windows API function that requires a menu handle. Handle is only valid if the Count property is greater than 0. + + +Indicates the number of subitems of the menu item. +Read Count to determine the number of subitems listed in the Items property array. When the user clicks on a menu item that has subitems, a dropdown menu appears which displays those subitems. Each subitem can, in turn, contain additional subitems. The Count property counts only the immediate subitems of the menu item. + + + +Indicates the index of the menu item within its parent menu. +Use MenuIndex to locate the menu item in the Items property of its parent menu item. Changing this value moves the menu item within its menu. + +Note: MenuIndex may not correspond to the position of the item in the menu the user sees. The menu can include items that are not visible. + +Identifies the parent menu item of this menu item. +Read Parent to determine the menu item that represents the dropdown menu that contains this menu item. If the menu item is a top level menu item in a main menu or pop-up menu, Parent is the value of that menu's Items property. + + +Designates the action associated with the menu item. +Action designates the action object that is associated with the menu item. Actions can be associated with a menu item by using the action list editor at design-time. Actions are a way of centralizing user responses to commands. + + + + +Indicates whether the menu item's checked state toggles automatically when the item is clicked. +When AutoCheck is true, then every time the menu item is clicked, the value of the Checked property toggles automatically before the OnClick event occurs. When AutoCheck is false, the application must explicitly set the value of the Checked property (for example, in an OnClick event handler). + + +Determines whether the accelerator keys for submenu items can be reset automatically. +Set AutoHotkeys to indicate whether the accelerator keys for the items in the Items property can be reset if necessary to ensure that every menu item has an accelerator key and no two items have the same accelerator key. This ensures that menu items added dynamically at runtime can have accelerator keys that do not introduce conflicts. TMenuItem tries to preserve all existing accelerator key mappings when adjusting the accelerator keys, but may be forced to change some in order to ensure that every item has a unique accelerator. +Before the menu is displayed, it checks and adjusts the accelerator key mappings if AutoHotkeys is maAutomatic or if AutoHotkeys is maParent and the parent menu item adjusts accelerator key mappings. Otherwise, the menu does not alter the items listed in the Items property, but may adjust the accelerator keys for submenus, depending on the AutoHotkeys property of the menu item that is the parent of the submenu. + +Note: When AutoHotkeys disallows automatic adjustment of accelerator keys, an application can still adjust the menu items by calling the RethinkHotkeys method. AutoHotkeys merely controls whether this adjustment occurs automatically. + +Determines whether redundant separator bars are automatically removed from the submenu. +Set AutoLineReduction to indicate whether the menu item should automatically ensure that the submenu defined by its Items property does not start or end with a separator bar and that two separator bars do not appear next to each other. This ensures that menus built dynamically at run time do not have separator bars in undesired positions. +Before the menu is displayed, the menu item removes superfluous separator bars if AutoLineReduction is maAutomatic or AutoLineReduction is maParent and the parent menu item removes superfluous separator bars. Otherwise, the menu item does not remove separators from the Items property, but may remove superfluous separators from submenus, depending on the AutoLineReduction property of the menu item that is the parent of the submenu. + +Note: When AutoLineReduction disallows automatic removal of separator bars, an application can still remove superfluous separators by calling the RethinkLines method. AutoLineReduction merely controls whether this adjustment occurs automatically. + +Designates a bitmap that is drawn for the menu item. +Use Bitmap to provide a custom image that appears next to the caption in the menu item. On owner-draw menus, Bitmap can be used from an OnDrawItem event handler to represent the entire menu item or a portion of the menu item. + +Note: If the ImageIndex property is set and the parent menu has a non-nil (Delphi) or NULL (C++) Images property, the image identified by ImageIndex is used instead of Bitmap. + +Determines whether the menu item starts a new column in the menu. +Set Break to break a long menu into columns at the item described by this menu item. The value of Break indicates whether the menu is broken into columns, and if so, whether a bar appears between the columns of the parent menu. +The default is mbNone (no breaking into columns). + + +Specifies the text of the menu item. +Set Caption to the string the user sees for this item in the menu. To underline a character in a string, include an ampersand (&) before the character. This type of character is called an accelerator character. If Caption includes an accelerator character, the user can select the menu item by pressing Alt while typing the underlined character. + +Tip: To automatically assign or adjust the accelerator characters in menu item captions, use the RethinkHotkeys method. +Use the Caption property to identify the menu item as a line that separates the menu into parts. Specify a hyphen character (-) as the value of Caption for the menu item to indicate that the menu item is a separator. To separate the menu into multiple columns, use the Break property instead. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Specifies whether a check mark should appear beside the Caption. +Use Checked to allow a menu item to work like a check box. If Checked is true, the menu item appears checked. If Checked is false, the menu item remains unchecked. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Lists the images that can appear beside individual items in a submenu of this menu item. +Use SubMenuImages to supply a set of images that can appear beside items listed in the Items property. Individual menu items set their ImageIndex property to indicate which image in the list appears to the left of the menu item caption. + +Tip: If the application uses action lists, this property can be the value of the command list's Images property. This way, menu items and buttons that do the same thing can display the same image. + +Specifies whether the menu item is invoked when the parent item is double clicked. +Set Default to specify whether a menu item is the default item in a submenu. Default menu items are executed when the parent item is double-clicked, allowing users to avoid navigating the submenus that contain them. +The default item appears in boldface. A submenu can have only one default item. If the Items list of the parent menu item already contains a default menu item, setting the Default property to true sets the Default property of the previous default item to false. + + +Specifies whether the menu item is enabled. +Use Enabled to enable or disable a menu item. If Enabled is true, the Click method is called when the user selects the item with the mouse. If Enabled is false, the menu item appears dimmed and the user cannot select it. However, calling the Click method works even when Enabled is false. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Identifies the logical group to which the menu item belongs. +Use GroupIndex to control how menus are merged. In applications that contain multiple forms, items from the menus of secondary forms can be merged into the application's main menu as those forms become active. MDI applications always merge the menus of child windows with the main menu of the parent window. +By default, all menu items in a menu bar (main menu) have the same GroupIndex value. To use GroupIndex to merge menus, set the GroupIndex value of each successive menu item to a value equal to or greater than that of the previous menu item. +When a menu item in a menu bar that is merged into the application's main menu has the same GroupIndex value as a menu item in the main menu, the menu item in the application's main menu is replaced by the corresponding menu item. If multiple menu items in the application's main menu have the same GroupIndex value, they can be replaced only by separate menu items from the other form's menu that also have repeated GroupIndex values. Thus, the first main menu item with a given value is replaced by the first item in the second form with that value, the second item in the main form is replaced by the second item in the second form, and so on. +When a menu item in a menu bar that is merged into the application's main menu has a GroupIndex that falls between the GroupIndex values of two adjacent items on the application's main menu, that menu item is inserted between the two adjacent items. If the item's GroupIndex value is greater than all other GroupIndex values in the application's main menu, the item appears at the end of the main menu. If the GroupIndex value is less than all other GroupIndex values in the application's main menu, the menu item appears at the beginning of the main menu bar. +When an object created by an OLE 2.0 server application is activated, the server can try to merge its menus with the menus of the container application. The GroupIndex property is used to replace up to three main menu items with items from the server, in the manner described above. The server application uses the following predefined GroupIndex values to locate menu items to replace: + + + + + +Group + +Index + +Description + + + +Edit + + + +1 + + + +Server menu items for editing the active OLE object + + + + +View + + + +3 + + + +Server menu items for modifying the view of the OLE object. + + + + +Help + + + +5 + + + +Server menu items for accessing the server's online Help. + + + + + +Note: See the documentation for the OLE server for information about whether it attempts menu merge during in-place activation. +GroupIndex can also be used to define groups of menu items that act like radio buttons. To allow menu items to behave like radio buttons, set the RadioItem property to all menu items in the group to true, and assign each menu item the same value of GroupIndex. Checking any menu item in the group will then uncheck the others. + + +Specifies the help context ID associated with the menu item. +Use HelpContext to associate the menu item with a screen in the Help system of the application. Each screen in the Help system should have a unique context ID. When a menu item is selected using the keyboard, pressing F1 displays a Help screen. Which Help screen appears depends on the value of the HelpContext property. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Specifies the text string that can appear when the user moves the mouse pointer over a menu item. +Set Hint to a string that provides more information about the meaning of the menu item than the Caption. The hint text appears in the Status Bar when the user pauses with the mouse over the menu item if Help Hints are enabled (that is, if the Form's and the Application's ShowHint properties are True). It is also available for the code in the application's OnHint event handler. +The value of Hint can specify both a short value for the Help Hint window and a longer string to be used by the OnHint event handler. To provide both a short and a long hint, set Hint to the short string, followed by a vertical bar (|), followed by the long string. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Indicates which image maintained by the parent menu appears next to the menu item. +Set ImageIndex to designate an image that should appear next to the caption when the menu item is drawn. On top-level menu items, ImageIndex specifies a zero-offset index into the Images property of the parent menu (TMenu or TPopupMenu). On submenu items, ImageIndex is the zero-offset index into the parent item's SubMenuImages property. +If the parent menu or item does not maintain a list of images, use the Bitmap property to provide an image for a single menu item. However, any image specified by ImageIndex takes precedence over the Bitmap property. Bitmap is only used when ImageIndex has a negative value or the parent's Images or SubMenuImages property is nil (Delphi) or NULL (C++). + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Displays the name of linked items from the Image Collection. + + + + +Specifies whether the menu item is mutually exclusive with other menu items in its group. +Use RadioItem to make the menu item behave like a radio button with a group of other menu items. The group of menu items is the set of all menu items in a pop-up or drop-down menu that have the same value of GroupIndex. When RadioItem is true, only one menu item in the group that contains the menu item can be checked at a time. The single selected menu item in the group is indicated by a round dot next to the Caption. + +Note: RadioItem does not automatically select the item when the user clicks it at runtime: you must still explicitly set the Checked property to true in response to the OnClick event. RadioItem simply changes the appearance of the Checked state (from a check mark to a round dot) and automatically unchecks other menu items in the same group when you set the Checked property to true. +RadioItem does not work for the top-level items in a main menu. + +Note: Under Windows NT 3.51, the round dot indicator only appears if the "new shell" has been installed. + +Shortcut that opens the menu item. +The string representation of this shortcut appears to the right of the menu item in the menu. + +Note: ShortCut is not stored with the menu item if it is supplied by an action. + +Specifies whether the menu item appears in the menu. +Use Visible to prevent the user from seeing an item in the menu. For example, remove menu items that do not apply to the current component of a pop-up menu in an OnPopup event handler. +If Visible is true, the menu item appears. If Visible is false, the menu item is hidden. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + +Occurs when the user clicks menu item. +Write an OnClick event handler to implement the desired behavior for when the user selects the menu item. An advantage of using the OnClick event handler over directly handling WM_COMMAND messages sent when the user selects the menu item, is that only the OnClick event occurs when the Click method is called. + +Note: This event handler is not stored with the menu item if it is supplied by a TAction object. + +Occurs when an owner-draw menu needs to be drawn. +Write an OnDrawItem event handler to render the image of a menu item in an owner-draw menu. In the event handler, use the Bitmap property or the ImageIndex property to access a bitmap that represents the menu item. + +Note: OnDrawItem will only occur if the parent menu's OwnerDraw property is true or the parent menu's Images property has been set. +Tip: For more precise information about the menu item's state, use the OnAdvancedDrawItem event instead. + +Occurs when an owner-draw menu needs to be drawn. +Write an OnAdvancedDrawItem event handler to render the image of a menu item in an owner-draw menu. +In the event handler, use the Bitmap property or the ImageIndex property to access a bitmap that represents the menu item. + +Note: OnAdvancedDrawItem will only occur if the parent menu's OwnerDraw property is true or the parent menu's Images property has been set. + +Occurs on owner-draw menu items to determine menu item size before the menu is drawn. +Write an OnMeasureItem event handler to indicate the size of owner-draw menu items. If the menu item is using a bitmap image, the event handler can use the Bitmap property or the ImageIndex property to access the bitmap to determine its size. + +Note: OnMeasureItem will only occur if the parent menu's OwnerDraw property is true or the parent menu's Images property has been set. + + +TMenuItem describes the properties of an item in a menu. +Use TMenuItem to specify the appearance and behavior of an item in a menu. Each TMainMenu or TPopupMenu component can contain multiple menu items. When a menu is defined at design time, the Menu Designer automatically creates menu item objects for each command on the menu. +The Caption property can be used to define an accelerator key to the menu item of a TMainMenu. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Applies the BiDiMode property to the menu when the Windows control is created. +AdjustBiDiBehavior is called automatically when the Windows control for the menu is created. It ensures that the BiDiMode property is properly reflected in the menu if the application is running in a Middle Eastern locale. + + + + + + + +Generates an OnChange event. +DoChange is called automatically when the properties of any menu items change. The Source parameter specifies the menu item (if any) that changed. The Rebuild parameter indicates whether the change requires the menu to regenerate its items. + + + +Updates the menu when the BiDiMode property changes. +Do not call DoBiDiModeChanged. It is called automatically when the menu's BiDiMode property changes to update the menu to reflect the current setting. + + + + + + +Returns the value of the Handle property. +GetHandle is the protected implementation of the Handle property. Override this method to change the implementation of the handle property. For example, TMainMenu overrides GetHandle to adjust for menus added by embedded OLE objects. + + + + + + +Indicates whether menu items can contain more than simple captions. +IsOwnerDraw returns true when the OwnerDraw property is true or the Images property is not nil (Delphi) or NULL (C++). This is used internally to determine how the menu should be painted. + + + +Calls the DoChange method when the menu is first loaded into memory. +Loaded is called automatically immediately after the menu is loaded into memory. It calls the DoChange method to allow any necessary fixup. + + + + + + + + +Responds when the menu changes. +MenuChanged is called automatically when changes occur that affect the structure of the menu. The Sender parameter indicates the object that originates the change. Its value can be nil (Delphi) or NULL (C++). Source indicates which menu item is affected. Rebuild indicates whether the menu must be rebuilt to reflect the change (for example when items are added or deleted). +MenuChanged calls the DoChange method, which generates an OnChange event. + +Note: Changes that affect individual items rather than the menu as a whole trigger the UpdateItems method instead of MenuChanged. For example, when the Images property changes, UpdateItems is called rather than MenuChanged. + + + + + + +Responds when components are added or deleted. +TMenu overrides the inherited method to set the Images property to nil (Delphi) or NULL (C++) if the ImageList is deleted. + + + + + + + +Ensures that the menu item indexes reflect the order in which they are loaded and saved. +SetChildOrder is called automatically when menus are loaded into memory. The Child parameter specifies the child object that was just loaded. The Order parameter specifies the order in which it was loaded. SetChildOrder assigns the MenuIndex for each child to match the order in which the items are loaded. + + + +Causes all menu items to update themselves. +UpdateItems is called automatically when changes occur that must be reflected by individual menu items. Changes that affect the menu as a whole trigger the MenuChanged method instead. + + + + + + + + + + + +Returns the caption for an item in the menu. +DoGetMenuString is used internally to obtain menu item captions, given the Windows menu handle. The Menu parameter indicates the menu's handle. The ItemID parameter specifies the menu item whose caption is desired. If the Flag parameter is MF_BYCOMMAND, ItemID is the Command property of the menu item. If Flag is MF_BYPOSITION, ItemID is the 0-based index of the menu item. The caption is returned in a buffer pointed to by the Str parameter. MaxCount indicates the size of that buffer. +Unlike the Windows API function GetMenuString, DoGetMenuString returns the correct caption for owner-draw menu items. + + +Occurs when the menu changes. +Write an OnChange event handler to respond to changes in the menu's structure. OnChange occurs when the menu is loaded into memory, and in response to property changes that affect the menu's structure. + + + + + + +Creates an instance of TMenu. +Call Create to create a menu at runtime. Menus placed on forms at design time are created automatically. Create calls the inherited Create method, then sets the initial values for the menu component, including creating an Items property. +The AOwner parameter indicates the component (usually a form) that is responsible for managing the memory associated with the menu. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Destroys the menu component. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMenu reference is not nil, and only then calls Destroy. Destroy frees the Items property, and then calls the inherited Destroy method. + + + + + + + +Calls the Click method of the menu item with the specified value as its Command property. +Call DispatchCommand to simulate a click on the menu item associated with a command ID. If DispatchCommand locates a menu item that matches the command ID, it calls the Click method for that menu item and returns true. If there is no such item, DispatchCommand returns false. + + + + + + + +Dispatches a pop-up menu command. +Call DispatchPopup to simulate a click on the menu item associated with the pop-up menu handle. If DispatchPopup locates a menu item that matches the pop-up menu handle, it calls the Click method for that menu item and returns true. If there is no such item, DispatchPopup returns false. + + + +Locates and returns a menu item. +Call FindItem to locate a menu item in the menu or one of its submenus. The menu item is identified by either a pop-up menu handle, command ID, or menu shortcut value. The Kind parameter specifies how the menu item is to be identified. + + + + + + + + + + + + + +Executes a callback for child menu items. +GetChildren is called automatically by the streaming system so that child menu items are saved and read with their parent menu. + + + +Returns the help context ID associated with a menu item. +Call GetHelpContext to obtain the ID for context-sensitive help on a particular menu item. Identify the menu item as the item that matches the Value property. If ByCommand is true, Value is the Command property of the TMenuItem. If ByCommand is false, Value is the Handle property. + + + + + + + + +Lists the images that can appear beside individual menu items. +Use Images to hold the set of images that can appear beside menu items in the menu. Individual menu items set their ImageIndex property to indicate which image in the list appears to the left of the menu item caption. +Images in the list should be 16x16. + +Tip: If the application uses action lists, this property should be the value of the action list's Images property. This way, menu items and buttons that do the same thing can display the same image. + + + + + +Indicates whether menu items read from right to left. +Call IsRightToLeft to determine the layout of main menu items. IsRightToLeft returns true if the application is running on a system with a Middle Eastern locale and the BiDiMode property is not bdLeftToRight. + + + + + + + +Dispatches a key message if it represents a shortcut key for an item in the menu. +Call IsShortCut when processing a KeyDown message to identify shortcut keys and trigger the appropriate menu action. IsShortCut decodes the key message passed in the Message parameter. It then encodes the state of the Shift, Control, and Alt keys with the value of the character that was typed to obtain the ShortCut property of a menu item. If IsShortCut locates a menu item associated with the shortcut key combination, it calls the item's Click method and returns true. If no item in the menu has a shortcut corresponding to the message, IsShortCut returns false. + + + +Ensures that the menu's layout follows the current settings of the BiDiMode and ParentBiDiMode properties. +ParentBiDiMode changed is called when the menu's BiDiMode property must be updated to reflect the bi-directional mode of its associated control. + + + + + + +Ensures that the menu's layout follows the current settings of the BiDiMode and ParentBiDiMode properties. +ParentBiDiMode changed is called when the menu's BiDiMode property must be updated to reflect the bi-directional mode of its associated control. + + + + + + +Responds to keyboard input for the menu. +ProcessMenuChar handles keyboard messages from Windows. It checks whether the character typed is an accelerator character from one of the menu's items. If so, ProcessMenuChar executes the menu item (or, if the item is disabled, selects it). If the key is not an accelerator, ProcessMenuChar checks for captions that begin with the character. If there is only one, it is treated like an accelerator. Otherwise, the first item beginning with that character is selected. +When calling ProcessMenuChar programmatically, the User, MenuFlag, and Menu fields of Message parameter must be supplied. + + +Determines whether the accelerator keys for menu items can be reset automatically. +Set AutoHotkeys to indicate whether the menu should automatically ensure that accelerator keys for its items are reset if necessary so that every menu item has an accelerator key and no two items have the same accelerator key. This ensures that menu items added dynamically at runtime can have accelerator keys that do not introduce conflicts. TMenu tries to preserve all existing accelerator key mappings when adjusting the accelerator keys, but may be forced to change some in order to ensure that every item has a unique accelerator. +Before the menu is displayed, the menu checks and adjusts the accelerator key mappings if AutoHotkeys is maAutomatic. When AutoHotkeys is maManual, the menu does not alter the top-level menu items, but may adjust the accelerator keys for submenus, depending on the AutoHotkeys property of the menu item that is the parent of the submenu. +When AutoHotkeys is maManual, an application can still adjust the menu items by calling the Items property's RethinkHotkeys method. AutoHotkeys merely controls whether this adjustment occurs automatically. + +Note: The AutoHotkeys property of a menu is linked to the AutoHotkeys property of the TMenuItems object that implements its Items property. Setting one sets the other. + +Determines whether redundant separator bars are automatically removed from the menu. +Set AutoLineReduction to indicate whether the menu should automatically ensure that the menu does not start or end with a separator bar and that two separator bars do not appear next to each other. This ensures that menus built dynamically at runtime do not have separator bars in undesired positions. +Before the menu is displayed, it removes superfluous separator bars when AutoLineReduction is maAutomatic. When AutoLineReduction is maManual, the menu does not remove separators from the top-level menu items, but may remove superfluous separators from submenus, depending on the AutoLineReduction property of the menu item that is the parent of the submenu. +When AutoLineReduction is maManual, an application can still remove superfluous separators by calling the Items property's RethinkLines method. AutoLineReduction merely determines whether this adjustment occurs automatically. + +Note: The AutoLineReduction property of a menu is linked to the AutoLineReduction property of the TMenuItems object that implements its Items property. Setting one sets the other. + +Determines the layout of the menu in Middle East locales. +Set BiDiMode to control the layout of menu items. BiDiMode controls whether the menu items read from left to right or right to left. + + +Provides access to the Windows menu handle for the menu. +Use Handle to call a Windows API function that requires a menu handle. Handle is the handle for the menu that contains only the items described by the Items property. + + +Specifies whether the menu items are drawn by the application. +Set OwnerDraw to true to indicate that the application will draw menu items in an OnDrawItem event handler. When OwnerDraw is true, menu items receive an OnMeasureItem and an OnDrawItem event when they need to be rendered on screen. +Set OwnerDraw to false to accept the default drawing. When OwnerDraw is false, menu items display the caption with an optional image to the left (If the Images and ImageIndex properties are set). +Owner-draw menus are useful for displaying the value that appears when selecting a menu item. For example, in a menu that allows users to choose a color, an owner-draw menu could display rectangles drawn in the designated color, rather than color names. + + +Indicates whether the BiDiMode property is inherited from the control that uses the menu. +By default, ParentBiDiMode is true, indicating that the layout of menu items follows the BiDiMode setting of the associated form or control. Change ParentBiDiMode to false to override the default BiDiMode setting and control the menu's layout independently. + + +Provides access to the handle of the window that uses the menu. +Read WindowHandle to get the window handle of the control that receives WM_COMMAND messages when the user clicks on an item in the menu. When menu items are selected, use this handle in an OnClick event handler to send messages to the control that uses the menu or to make Windows API calls that affect the control. +Set WindowHandle to associate the menu with a control. + + +Describes the elements of the menu. +Use Items to access information about the elements in the menu. Items is a single TMenuItem object that describes the elements of the menu in its own Items property. + +Note: Because Items is the default property of TMenuItem, the Items property of TMenu can be treated as an indexed array of menu items that describe the individual items in the menu. That is, instead of writing +Note: FirstItem�:= Menu1.Items.Items[0]; +Note: you can use +Note: FirstItem�:= Menu1.Items[0]; +Set the Items property at design time by clicking on the Items property in the Property Inspector. The Menu Designer automatically inserts a menu item. As each menu item is entered, outlined regions appear at the possible locations of additional menu items. Click in those regions to specify additional menu items. At runtime, create a TMenuItem that describes the elements of the menu programmatically, and set the Items property of the menu. + + + +TMenu is the base type for menu components such as TMainMenu and TPopupMenu. +Use TMenu as a base class when defining a component that represents a collection of menu items. TMenu introduces properties and methods to create a Windows menu that represents a set of menu items, dispatch commands associated with those menu items, and locate the help context id for any of those menu items. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Responds when the menu changes. +Vcl.Menus.TMainMenu.MenuChanged inherits from Vcl.Menus.TMenu.MenuChanged. All content below this line refers to Vcl.Menus.TMenu.MenuChanged. +Responds when the menu changes. +MenuChanged is called automatically when changes occur that affect the structure of the menu. The Sender parameter indicates the object that originates the change. Its value can be nil (Delphi) or NULL (C++). Source indicates which menu item is affected. Rebuild indicates whether the menu must be rebuilt to reflect the change (for example when items are added or deleted). +MenuChanged calls the DoChange method, which generates an OnChange event. + +Note: Changes that affect individual items rather than the menu as a whole trigger the UpdateItems method instead of MenuChanged. For example, when the Images property changes, UpdateItems is called rather than MenuChanged. + + + + + +Returns the value of the Handle property. +Vcl.Menus.TMainMenu.GetHandle inherits from Vcl.Menus.TMenu.GetHandle. All content below this line refers to Vcl.Menus.TMenu.GetHandle. +Returns the value of the Handle property. +GetHandle is the protected implementation of the Handle property. Override this method to change the implementation of the handle property. For example, TMainMenu overrides GetHandle to adjust for menus added by embedded OLE objects. + + + + + + +Combines the main menu of one form with the main menu of another in non-MDI applications. +Call Merge to merge another main menu with this one. Specify the menu you want merged with this menu as the Menu parameter. +For example, to use the main menu of the first form in an application as the main menu for the application, call Merge to merge the main menu of any additional forms in the application with the main menu of the first form. +Depending on the value of the GroupIndex property of menu items on the main menu, the merged menu items can replace menu items on the menu bar, or insert menu items into the menu bar. See GroupIndex for information on how to do these things. +To merge and unmerge main menus automatically when other forms are displayed, change the value of the AutoMerge property to true on all forms whose menus should be merged in. + + + + + + +Reverses the merging of two menus in a non-MDI application. +Call Unmerge to remove items from another main menu that were added using the Merge method. The Menu parameter is the merged menu whose items should be removed from the main menu. + + + +Populates an OLE menu with items from the main menu. +Call PopulateOle2Menu to merge the menu items with GroupIndex values specified by the Groups parameter into the menu that uses the SharedMenu handle. PopulateOle2Menu appends all menu items in the specified groups to the menu, and increments the corresponding entries in the Widths array for every menu item appended. PopulateOle2Menu is used by OLE containers when merging menus. + +Note: PopulateOle2Menu populates the menu specified by the SharedMenu parameter but does not set this as the OLE menu associated with the menu. + + + + + + + + + + + + + + + + + + + + + + + + + +Returns the main menu's accelerator table. +Call GetOle2AcceleratorTable to obtain a handle to an accelerator table for all menu items with a GroupIndex value that appears in the Groups parameter. The AccelTable parameter is set to the accelerator table handle, and the AccelCount is set to the number of entries in the table. GetOle2AcceleratorTable is used by OLE containers when merging menus. + + + +Associates the handle for an OLE menu with the main menu. +Call SetOle2MenuHandle to temporarily replace the menu of a form with the menu represented by the Handle parameter. To restore the original menu, call SetOle2MenuHandle with the Handle parameter set to 0. SetOle2MenuHandle allows an OLE container to use menu items provided by an OLE server. + + + + + + + + +Determines if the main menus of secondary forms merge with the main menu of the main form in non-MDI applications at runtime. +To merge a form's menus with the main menu in the main form, set the AutoMerge property of each main menu you want merged to true. Make sure that the AutoMerge property of the main menu of the main form (the one other menus are merged into) remains false. How menus merge depends on the value of the GroupIndex property for each menu item. +If the application is an MDI application (the FormStyle properties are set so the main form is a parent form and subsequent forms are child forms), menu merging occurs automatically without using the AutoMerge property. + + + + + + + + +TMainMenu encapsulates a menu bar and its accompanying drop-down menus for a form. +Use TMainMenu to provide the main menu for a form. To begin designing a menu, add a main menu to a form, and double-click the component. +TMainMenu introduces properties and methods for merging the drop-down menus of the main menu with the main menu of another form. +TMainMenu introduces properties and methods for assisting in the menu negotiation process of an OLE container. + +Tip: To create a menu that users can configure at runtime, use the TActionMainMenuBar component with an action manager instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Specifies whether the control's alignment is in a right-to-left mode. +Call UseRightToLeftAlignment to determine whether the control's alignment is in a right-to-left mode. This information can be used when painting the control or when responding to mouse events. +UseRightToLeftAlignment returns the setting from the control that activated the popup. If the popup was not activated by a control, UseRightToLeftAlignment returns the setting used in the global Application object. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Generates an OnPopup event. +DoPopup is called automatically just before the pop-up menu appears to generate an OnPopup event. Override DoPopup in a descendant class to change the event. + + + + + + +Used to set starting point coordinates. +SetPopupPoint is used internally to set the coordinates of the point where the pop-up menu will appear. + + + + + + +Creates an instance of TPopupMenu. +Call Create to create to create a pop-up menu at runtime. Pop-up menus placed in forms or data modules at design time are created automatically. + + + + + +Destroys an instance of TPopupMenu. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TPopupMenu reference is not nil, and only then calls Destroy. + + + +Closes the pop-up menu onscreen. +Call CloseMenu to close the pop-up menu. + + + + + + + +Displays the pop-up menu onscreen. +Call Popup to bring up the pop-up menu. The menu appears at the screen coordinates indicated by the values (in pixels) of X and Y. + + +Indicates the component that last displayed the popup menu in response to a right mouse click. +Read PopupComponent to determine which control is currently using the popup menu. In applications where multiple controls share the same pop-up menu, use PopupComponent to determine which of them displayed the menu. +Set PopupComponent to associate a control with the menu before calling the Popup method programmatically to bring up the pop-up menu. + + +Indicates the location where the pop-up menu appears. +This public property is used internally to locate the popup menu. Its value is set by the Popup method. + + +Determines where the pop-up menu appears when the user clicks the right mouse button. +Set Alignment to control the placement of the popup menu. Alignment controls whether the menu appears to the left of the mouse, to the right of the mouse, or centered over the mouse. +By default, the menu appears with its top left corner under the mouse (paLeft). + + + + +Determines whether the pop-up menu appears automatically when the user clicks the right mouse button. +Set AutoPopup to true to cause the pop-up menu to appear automatically when the user clicks the right mouse button on a control that has the pop-up menu specified as its PopupMenu property. The application key present on keyboards specifically designed for 32-bit Windows will also show this menu when pressed. +Set AutoPopup to false if the appearance of the pop-up menu should be controlled programmatically. To display a pop-up menu when AutoPopup is false, use the Popup method. + + + +Specifies a context ID for the entire pop-up menu. +Use HelpContext to associate a help screen with the entire pop-up menu. Each screen in the Help system should have a unique context ID. When a component is selected in the application, pressing F1 displays the Help screen associated with the value of HelpContext. +To associate a help screen with the individual items in the pop-up menu, use the HelpContext property of the associated TMenuItem objects. + + + +Specifies how the menu appears when it is first displayed. +Use MenuAnimation to specify how the popup menu appears on the screen. The menu can simply appear as a whole, or can slide into view like a window shade being drawn from any edge. + +Note: MenuAnimation only has an effect when running on Windows 98, NT 5.0, or later. + + + +Specifies which mouse button activates the popup menu when it is associated with a toolbar button. +Use TrackButton to specify which mouse button activates the popup menu when it is associated with a toolbar button. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Occurs just before the pop-up menu appears. +Write an OnPopup event handler to take specific action just before the pop-up menu appears. For example, use an OnPopup event handler to set the Checked, Enabled, or Visible property of individual items in the menu so that they are appropriate to the PopupComponent. + + + +TPopupMenu encapsulates the properties, methods, and events of a pop-up menu. +Use TPopupMenu to define the pop-up menu that appears when the user clicks on a control with the right mouse button. To make a pop-up menu available, assign the TPopupMenu object to the control's PopupMenu property. + +Tip: To create a popup menu that users can configure at runtime, use the TStandardMenuPopup component with an action manager instead. +Note: If the popup menu's ParentBiDiMode is true, the popup menu's BiDiMode is set to the BiDiMode of the control that activates it. If a control cannot be found, the BiDiMode is set to the value of the Application object's BiDiMode. The popup menu's BiDiMode affects all of its menu items. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $26 + + + + + $2D + + + + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.NumberBox.xml b/Modules/DelphiVCL/doc/Vcl.NumberBox.xml new file mode 100644 index 00000000..3021bbc4 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.NumberBox.xml @@ -0,0 +1,5138 @@ + + + + $11 + + + + + $1 + + + + + $A + + + + + $64 + + + + + nbmInteger + + + + + nbmFloat + + + + + nbmCurrency + + + + + nbspNone + + + + + nbspCompact + + + + + nbspInline + + + + + nbcfPrefix + + + + + nbcfPostfix + + + + + nbcfPrefixSpace + + + + + nbcfPostfixSpace + + + + + nbbtUp + + + + + nbbtDown + + + + + + + + + + + + + + + + + + + + + + Defines spin button properties and behavior + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Defines width of arrow + if value is 0 then arrow has width, which adjusts automatically + + + + + + + Defines width of button + + + + + + + Defines placement of spin button + + + + + + + Defines arrow color for normal state + + + + + + + Defines arrow color for hot state + + + + + + + Defines arrow color for pressed state + + + + + + + Defines arrow color for disabled state + + + + + + + Defines timer inerval to repeat click of the button + + + + + + + Defines visiblity of dividers if Placement is nbspInline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Resize and reposition children and self. +Vcl.NumberBox.TCustomNumberBox.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + + + + + + + +Responds to key press events. +Vcl.NumberBox.TCustomNumberBox.KeyDown inherits from Vcl.Controls.TWinControl.KeyDown. All content below this line refers to Vcl.Controls.TWinControl.KeyDown. +Responds to key press events. +When a windowed control receives a key-down message (WM_KEYDOWN) from Windows, its message handler calls the DoKeyDown method. If DoKeyDown determines that the control should, in fact, process the character, it calls KeyDown, passing the key code and shift-key state in the Key and Shift parameters, respectively. +KeyDown calls any event handler attached to the OnKeyDown event. Override KeyDown to provide other responses in addition to the event handler call. +The Key parameter is the key on the keyboard. For nonalphanumeric keys, you must use WinAPI virtual key codes to determine the key pressed. For more information see Representing Keys and Shortcuts. +The Shift parameter indicates whether the SHIFT, ALT, or CTRL keys are combined with the keystroke. +Either KeyDown or the OnKeyDown event handler it calls can suppress further processing of a key by setting the Key parameter to zero. + + + + + + + + +Responds to keyboard input. +Vcl.NumberBox.TCustomNumberBox.KeyPress inherits from Vcl.Controls.TWinControl.KeyPress. All content below this line refers to Vcl.Controls.TWinControl.KeyPress. +Responds to keyboard input. +When a windowed control receives a key-press message (WM_CHAR) from Windows, its message handler calls the DoKeyPress method. If DoKeyPress determines that the control should, in fact, process the character, it calls KeyPress, passing the key code in the Key parameter. +KeyPress calls any event handler attached to the OnKeyPress event. Override KeyPress to provide other responses in addition to the event handler call. +Either KeyPress or the OnKeyPress event handler it calls can suppress further processing of a character by setting the Key parameter to zero. + +Note: The Key parameter is the character represented by the key that is pressed, not a Windows virtual key code. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Generates an OnChange event. +Vcl.NumberBox.TCustomNumberBox.Change inherits from Vcl.StdCtrls.TCustomEdit.Change. All content below this line refers to Vcl.StdCtrls.TCustomEdit.Change. +Generates an OnChange event. +Applications do not call the Change method directly. It is triggered automatically by Windows events. Change is exposed as a protected method so that derived classes can make additional responses when the text changes beyond invoking the OnChange event handler. If Derived classes that override the Change method do not call the inherited method, the OnChange event handler will not be called. + + + +Initializes the control after it is loaded from a stream. +Vcl.NumberBox.TCustomNumberBox.Loaded inherits from Vcl.Controls.TControl.Loaded. All content below this line refers to Vcl.Controls.TControl.Loaded. +Initializes the control after it is loaded from a stream. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. +Loaded overrides the inherited method in order to initialize the control from its associated Action. To change the properties the control copies from its action, override the ActionChange method. + + + + + + +Creates an instance of TCustomEdit. +Vcl.NumberBox.TCustomNumberBox.Create inherits from Vcl.StdCtrls.TCustomEdit.Create. All content below this line refers to Vcl.StdCtrls.TCustomEdit.Create. +Creates an instance of TCustomEdit. +Call Create to create and initialize an instance of TCustomEdit. +AOwner is another component, typically the form, that is responsible for freeing the edit control. It becomes the value of the Owner property. +Derived objects that override the Create method should call the inherited Create before performing any additional initialization. + + + + + +Destroys an instance of TWinControl. +Vcl.NumberBox.TCustomNumberBox.Destroy inherits from Vcl.Controls.TWinControl.Destroy. All content below this line refers to Vcl.Controls.TWinControl.Destroy. +Destroys an instance of TWinControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TWinControl reference is not nil, and only then calls Destroy. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + +TCustomEdit is the base class from which all edit-box and memo controls are derived. +Vcl.NumberBox.TCustomNumberBox inherits from Vcl.StdCtrls.TCustomEdit. All content below this line refers to Vcl.StdCtrls.TCustomEdit. +TCustomEdit is the base class from which all edit-box and memo controls are derived. +TCustomEdit encapsulates the behavior common to all components for editing text by introducing methods and properties that provide: +Basic text editing functions such as selecting text, modifying selected text, and case conversions. +Ability to respond to changes in the contents of the text. +Access control of the text for making it read-only or introducing a password character to hide the actual value. +Do not create instances of TCustomEdit. Use TCustomEdit as a base class when declaring control objects that permit the user to enter or modify text. Properties and methods of TCustomEdit provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TNumberBox is a numeric input control that supports the input of integer numbers, floating point numbers with a given set of decimal digits and proper formatting, and currency values. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Samples.Spin.xml b/Modules/DelphiVCL/doc/Vcl.Samples.Spin.xml new file mode 100644 index 00000000..9b62a9d2 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Samples.Spin.xml @@ -0,0 +1,5311 @@ + + + + $190 + + + + + $64 + + + + + tbFocusRect + + + + + tbAllowTimer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Initializes the control after it is loaded from a stream. +Loaded overrides the inherited method in order to set the button bounds. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. + + + + + + + +Responds to keypress events. +The KeyDown responds to keypress events. +Shift indicates which shift keys (SHIFT, CTRL, or ALT) are combined with the keystroke. +The Key parameter is one of the following keyboard keys: Space, Down, or Up. +If Key is Down, the OnDownClick event is handled, if Up - OnUpClick, and if Space - the click event for the focused button. + + + + + + + +Responds to notifications indicating that components are being destroyed. +Notification responds to notifications indicating that the focus controls are about to be destroyed. +Notification calls the Notification inherited method. + + + +Creates the underlying window. +Vcl.Samples.Spin.TSpinButton.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + + + + +Creates and initializes a TSpinButton instance. +The Create method creates and initializes a TSpinButton instance. + + + + + + + + + + + +Sets the Left, Top, Width, and Height properties of the control in a single operation. +SetBounds sets the Left, Top, Width, and Height properties of the control in a single operation. Specify the values for the Left, Top, Width, and Height properties as the value of the ALeft, ATop, AWidth, and AHeight parameters, respectively. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately. +SetBounds calls the SetBounds inherited method. + + + + + + +The bitmap that appears on the Down button. +DownGlyph represents the bitmap that appears on the Down button. +You can provide up to four images (one for each state) within a single bitmap, depending on the value of the DownNumGlyphs property. All images must be the same size and next to each other in a row. +The four states of the button are described in the following table: + + + +Button state + +Description + + + +Up + + + +This image appears when the button is up. This image is also used when the button has focus (for example, if the user tabs to it); in this case, a focus rectangle is drawn around the button. If no other images exist in the bitmap, bit buttons also use this image for all other states. + + + + +Disabled + + + +This image usually appears dimmed to indicate that the button cannot be selected. + + + + +Clicked + + + +This image appears when the button is clicked. The Up image reappears when the user releases the mouse button. + + + + +Down + + + +This image appears when the button stays down. + + + +Specifies the number of Glyphs that appear on the Down button. +DownNumGlyphs specifies the number of Glyphs that appear on the Down button. If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the NumGlyphs property. The default value is 1. + + + + + + +Designates a windowed control associated with the TSpinButton. +Use FocusControl to set focus to a control. + + + + + + + + +The bitmap that appears on the Up button. +UpGlyph specifies the bitmap that appears on the Up button. +You can provide up to four images (one for each state) within a single bitmap, depending on the value of the UpNumGlyphs property. All images must be the same size and next to each other in a row. +The four states of the button are described in the following table: + + + +Button state + +Description + + + +Up + + + +This image appears when the button is up. This image is also used when the button has focus (for example, if the user tabs to it); in this case, a focus rectangle is drawn around the button. If no other images exist in the bitmap, bit buttons also use this image for all other states. + + + + +Disabled + + + +This image usually appears dimmed to indicate that the button cannot be selected. + + + + +Clicked + + + +This image appears when the button is clicked. The Up image reappears when the user releases the mouse button. + + + + +Down + + + +This image appears when the button stays down. + + + + + +Number of Glyphs that appear on the Up button. +UpNumGlyphs specifies the number of Glyphs that appear on the Up button. If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the NumGlyphs property. The default value is 1. + + + + + +Occurs when the user clicks the down button of the TSpinButton. +Use the OnDownClick event handler to specify what happens with the focused control value when the user clicks the down button of the TSpinButton. + + + + + + + + + + +Occurs when the user clicks the up button of the TSpinButton. +Use the OnUpClick event handler to specify what happens with the focused control value when the user clicks the up button of the TSpinButton. + + + +TSpinButton allows the user to navigate through a range of values using the arrow buttons. +A TSpinButton is a control with two TTimerSpeedButtons, each button displaying an arrow. TSpinButton allows the navigation through a range of values using the arrow buttons to customize the value held by the control. Usually, it is used to increase or decrease the value of the focused control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Verifies whether the pressed key is valid. +IsValidChar verifies whether the pressed key is valid. IsValidChar returns True if the Key is "+", "-", or one of the number keys. + + + + + + +Is the control's action in response to a mouse click on the up button of the TSpinEdit. +UpClick is called automatically when the user left-clicks the up button of the control. The method increases the edit box's Value. + + + + + + +Represents the control's action in response to a mouse click on the down button of the TSpinEdit. +DownClick is called automatically when the user left-clicks the down button of the control. The method decreases the edit box's Value. + + + + + + + +Responds to key press events. +KeyDown responds to key press events considering the Key parameter. +Shift indicates which shift keys (SHIFT, CTRL, or ALT) were down when the user moved the mouse. +The Key parameter can be either the Down or Up keyboard key. If the key is Up, then the method calls UpClick; if the key is Down, then the method calls DownClick. + + + + + + +Responds to keyboard input. +KeyPress responds to key press events. The method uses IsValidChar to validate the key. +The Key parameter is a keyboard key. KeyPress calls the KeyPress inherited method. + + + + + + +Initializes a window creation parameter record passed in the Params parameter. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. +CreateWnd calls the inherited method and then specifies the style for the created window. + + + +Creates a Windows control corresponding to the edit control. +CreateWnd is called when the edit control is created and whenever a change to the edit control requires the window to be re-created. + + + + + + +Creates and initializes a TSpinEdit instance. +The Create method creates and initializes a TSpinEdit instance. + + + + + +Destroys a TSpinEdit instance. +The Destroy method destroys a TSpinEdit instance. Destroy calls the Destroy inherited method. + + + + + + + +The method is blank. +TSpinEdit has no need to call a specified method for the control's child, so GetChildren doesn't perform any action. + + + + +Specifies the TSpinButton of the TSpinEdit. +Button is a read-only property that specifies the spin button of the TSpinEdit. + + + + + + + + + + + +Specifies whether Value can be edited. +EditorEnabled specifies whether Value can be edited or not. + + + + +Specifies the increment value. +Increment specifies the increment used to increase or decrease the Value property by clicking one of the TSpinEdit buttons or using the Up and Down keys while TSpinEdit is focused. + + + +Specifies the maximum value. +MaxValue specifies the maximum Value that TSpinEdit can take. + + +Specifies the minimum value. +MinValue specifies the minimum Value that TSpinEdit can take. + + + + + + + + + + + + + +Specifies the value listed in the TSpinEdit. +Value specifies the value listed in the TSpinEdit. The value can be changed by clicking one of the TSpinEdit buttons or using the Up and Down keys while TSpinEdit is focused. + + + + + + + + + + + + + + + + + + + +TSpinEdit combines a TEdit box with a TSpinButton. +A TSpinEdit component is a TEdit with a TSpinButton attached. +The Value of the edit box is numerical. By pressing the up and down buttons of TSpinButton, the Value is increased or decreased. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.StdCtrls.xml b/Modules/DelphiVCL/doc/Vcl.StdCtrls.xml new file mode 100644 index 00000000..21920086 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.StdCtrls.xml @@ -0,0 +1,30043 @@ + + + + tlTop + + + + + tlCenter + + + + + tlBottom + + + + + epNone + + + + + epPathEllipsis + + + + + epEndEllipsis + + + + + epWordEllipsis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TGroupBox represents a Windows group box. +The TGroupBox component represents a standard Windows group box, used to group related controls on a form. When another control component is placed within a group box, the group box becomes the parent of that component. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TLabel is a nonwindowed control that displays text on a form. +Use TLabel to add text that the user cannot edit on a form. This text can be used to label another control, and can set focus to that control when the user types an accelerator key. The Caption property can be used to define an accelerator key to a label control. +Because TLabel is not a descendant of TWinControl, it does not have its own window and cannot receive direct input from the keyboard. To add an object to a form that can respond to keyboard input (other than setting focus to another object when an accelerator key is typed) in addition to displaying text, use TStaticText. +To add an object to a form that displays text that a user can scroll or edit, use TEdit. + + + + ecNormal + + + + + ecUpperCase + + + + + ecLowerCase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Generates an OnChange event. +Applications do not call the Change method directly. It is triggered automatically by Windows events. Change is exposed as a protected method so that derived classes can make additional responses when the text changes beyond invoking the OnChange event handler. If Derived classes that override the Change method do not call the inherited method, the OnChange event handler will not be called. + + + + + + + +Responds to key press events. +Vcl.StdCtrls.TCustomEdit.KeyDown inherits from Vcl.Controls.TWinControl.KeyDown. All content below this line refers to Vcl.Controls.TWinControl.KeyDown. +Responds to key press events. +When a windowed control receives a key-down message (WM_KEYDOWN) from Windows, its message handler calls the DoKeyDown method. If DoKeyDown determines that the control should, in fact, process the character, it calls KeyDown, passing the key code and shift-key state in the Key and Shift parameters, respectively. +KeyDown calls any event handler attached to the OnKeyDown event. Override KeyDown to provide other responses in addition to the event handler call. +The Key parameter is the key on the keyboard. For nonalphanumeric keys, you must use WinAPI virtual key codes to determine the key pressed. For more information see Representing Keys and Shortcuts. +The Shift parameter indicates whether the SHIFT, ALT, or CTRL keys are combined with the keystroke. +Either KeyDown or the OnKeyDown event handler it calls can suppress further processing of a key by setting the Key parameter to zero. + + + + + + +Responds to keyboard input. +Vcl.StdCtrls.TCustomEdit.KeyPress inherits from Vcl.Controls.TWinControl.KeyPress. All content below this line refers to Vcl.Controls.TWinControl.KeyPress. +Responds to keyboard input. +When a windowed control receives a key-press message (WM_CHAR) from Windows, its message handler calls the DoKeyPress method. If DoKeyPress determines that the control should, in fact, process the character, it calls KeyPress, passing the key code in the Key parameter. +KeyPress calls any event handler attached to the OnKeyPress event. Override KeyPress to provide other responses in addition to the event handler call. +Either KeyPress or the OnKeyPress event handler it calls can suppress further processing of a character by setting the Key parameter to zero. + +Note: The Key parameter is the character represented by the key that is pressed, not a Windows virtual key code. + + + + + +Initializes a window-creation parameter record passed in the Params parameter. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomEdit overrides the inherited method to specify a scrollable single-line edit control that reflects the current values of the BorderStyle, HideSelection, PasswordChar, and ReadOnly properties. + + + + + + +Creates a Windows control to represent the control. +CreateWindowHandle calls the inherited CreateWindowHandle method after working around a Win95 bug involving setting the read-only style on machines with Far East locales. + + + +Creates a Windows control corresponding to the edit control. +CreateWnd is called when the edit control is created, and whenever a change to the edit control requires the window to be recreated. After calling the inherited method, CreateWnd sends the newly created window messages to enforce the MaxLength and PasswordChar properties. + + + +Destroys the Windows control that corresponds to the edit control. +The Windows control for the edit box can be temporarily destroyed and recreated in order to set properties that require changing the window creation parameters. When this happens, DestroyWnd is called. +Before the window is destroyed, DestroyWnd saves a copy of any properties that are needed to recreate the window after it is destroyed. + + + + + + +Sets the MaxLength property. +DoSetMaxLength is the property access function for the MaxLength property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the MaxLength property. +DoSetMaxLength sends an EM_LIMITTEXT message to the window of the edit control. + + + + + + +Sets the value of the TextHint property. +DoSetTextHint is a protected method used to set the value of the TextHint property. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Returns the SelLength property. +GetSelLength is the property access function for the SelLength property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelLength property. +GetSelLength sends an EM_GETSEL message to the window of the edit control and returns the difference between the starting position and the ending position. + + + + + + +Returns the SelStart property. +GetSelStart is the property access method for the SelStart property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelStart property. +GetSelStart sends an EM_GETSEL message to the window of the edit control and returns the starting position. + + + + + + +Returns the SelText property. +GetSelText is the property access method for the SelText property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelText property. + + + + + + +Sets the Alignment property. +SetAlignment is exposed as a protected method so derived classes can customize their implementation of the Alignment property. + + + + + + +Sets the AutoSize property. +SetAutoSize is the protected write implementation of the AutoSize property. +TCustomEdit overrides the inherited method to update the height of the edit control to reflect the current font when the value of AutoSize changes to true. + + + + + + +Sets the SelLength property. +SetSelLength is the property access method for the SelLength property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelLength property. +SetSelLength sends an EM_SETSEL message to the window of the edit control, specifying a selection that begins at SelStart and ends at SelStart + Value. + + + + + + +Sets the SelStart property. +SetSelStart is the property access method for the SelStart property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelStart property. +SetSelLength sends an EM_SETSEL message to the window of the edit control to position the cursor on the position indicated by Value. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Determines whether all the text in the edit control is automatically selected when the control gets focus. +Set AutoSelect to select all the text when the edit control gets focus. AutoSelect only applies to single-line edit controls. +Use AutoSelect when the user is more likely to replace the text in the edit control than to append to it. + + +Determines whether the height of the edit control automatically resizes to accommodate the text. +Use AutoSize to make the edit control adjust its size automatically so the client area accommodates the height of the text. When AutoSize is false, the edit control has a fixed height. When AutoSize is true, the size of the control is readjusted whenever a change occurs that could affect the height of the control, such as a change to the font or border style. + +Note: AutoSize only adjusts the height of the edit control. Even with AutoSize set to true, text in the edit control may appear truncated if it extends beyond the width of the control. + +Determines whether the edit control has a single line border around the client area. +Use BorderStyle to affect the sharpness with which the client area of the edit control stands out. BorderStyle can have a value of either bsSingle or bsNone. If BorderStyle is bsSingle, the edit control has a single-line border around the client area. If BorderStyle is bsNone, there will be no border. + + + + +Determines the case of the text within the edit control. +Use CharCase to force the contents of the edit control to assume a particular case. +When CharCase is set to ecLowerCase or ecUpperCase, the case of characters is converted as the user types them into the edit control. Changing the CharCase property to ecLowerCase or ecUpperCase changes the actual contents of the text, not just the appearance. Any case information is lost and can't be recaptured by changing CharCase to ecNormal. + + +Determines whether the visual indication of the selected text remains when focus shifts to another control. +Set HideSelection to false to provide visual feedback of the selected portion of the text even when the edit control does not have focus. Set HideSelection to true to show the selection only when the edit control has focus. HideSelection does not affect the actual value of the selection, only the visual indication. Always setting HideSelection to false can make forms with many edit controls look too busy. + + +Specifies the maximum number of characters the user can enter into the edit control. +Use MaxLength to limit the number of characters that can be entered into the edit control. A value of 0 indicates that there is no application-defined limit on the length. +Use MaxLength to limit the length of the text in an edit control if that text will be copied into a fixed-length buffer. + +Note: Setting MaxLength will not truncate the existing text, it merely prevents the user from adding more text after reaching the limit of MaxLength characters. +Note: Even when MaxLength is 0, there may be limitations imposed by the operating system on the number of characters that may be entered into an edit control. +Note: The unit of MaxLength is characters (not bytes) if the application is using themes. + +Determines whether characters typed in the edit control are converted from ANSI to OEM and then back to ANSI. +To ensure that any characters typed in the edit control can be unambiguously converted to the OEM character set, set OEMConvert to true. This causes all characters to be converted from ANSI to OEM and then back to ANSI as they are typed. Set OEMConvert to false to avoid the overhead of this conversion when it does not matter whether the text can be unambiguously mapped to an OEM string. +OEMConvert is most useful for edit controls used to enter file names when the application does not use Unicode file names. + + +Allows only numbers to be typed into the text edit. +Use NumbersOnly to prohibit entry of non-numeric characters in the textfield. Note, however, that a user can paste non-numeric characters in the textfield even when this property is set. + +Code Examples +StdCtrlsProp (Delphi) +StdCtrlsProp (C++) + + + + + +Indicates the character, if any, to display in place of the actual characters typed in the control. +Use the PasswordChar property to create an edit control that displays a special character in place of any entered text. If PasswordChar is set to the null character (ANSI character zero), the edit control displays its text normally. If PasswordChar is any other character, the edit control displays PasswordChar in place of each character typed. PasswordChar affects the appearance of the edit control only. The value of the Text property reflects the actual characters that are typed. + + +Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + +Occurs when the text for the edit control may have changed. +Write an OnChange event handler to take specific action whenever the text for the edit control may have changed. Use the Modified property to see if a change actually occurred. The Text property of the edit control will already be updated to reflect any changes. This event provides the first opportunity to respond to modifications that the user types into the edit control. + + + + + + +Creates an instance of TCustomEdit. +Call Create to create and initialize an instance of TCustomEdit. +AOwner is another component, typically the form, that is responsible for freeing the edit control. It becomes the value of the Owner property. +Derived objects that override the Create method should call the inherited Create before performing any additional initialization. + + + +Deletes all text from the edit control. +Use Clear to replace the Text property with an empty string. Clear removes all text, not just the selected text. To remove just the selected text, use ClearSelection. + + + +Removes the selected text from the edit control. +Use ClearSelection to delete the selected text from the edit control. If no text is selected, ClearSelection does nothing. If all of the text is selected, ClearSelection clears all text, like the Clear method. + +Note: Calling ClearSelection does the same thing as sending the edit control a WM_CLEAR message. + + +Copies the selected text in the edit control to the Clipboard in CF_TEXT format. +Use CopyToClipboard to replace the contents of the Clipboard with the selected text. CopyToClipboard does not clear the Clipboard if no text is selected. If no text is selected, CopyToClipboard does nothing. + +Note: Calling CopyToClipboard does the same thing as sending the edit control a WM_COPY message. + + +Copies the selected text to the Clipboard in CF_TEXT format and then deletes the selection. +Use CutToClipboard to replace the contents of the Clipboard with the selected text while clearing the selected text. If no text is selected, CutToClipboard does nothing. + +Note: Calling CopyToClipboard does the same thing as sending the edit control a WM_CUT message. + + + + + +Provides message handling for all messages that the control does not fully process itself. +Override DefaultHandler to change the default message handling for the edit control. The Message parameter can be cast to a TMessage type to obtain the WParam, LParam, and Result of the message. If the Result of the message is non-zero, the message has already been handled. Set the Result field to a non-zero value to prevent further processing of the message by the inherited method. + +Note: In Delphi, calling inherited in a message-handling method results in a call to the ancestor's DefaultHandler method if that ancestor does not specify a handler for the message being handled. + + + + + +Indicates how text is aligned within the control. +Vcl.StdCtrls.TCustomEdit.GetControlsAlignment inherits from Vcl.Controls.TControl.GetControlsAlignment. All content below this line refers to Vcl.Controls.TControl.GetControlsAlignment. +Indicates how text is aligned within the control. +Use GetControlsAlignment to determine the alignment of the control. For controls that do not have an Alignment property, GetControlsAlignment returns taLeftJustify. + +Note: GetControlsAlignment returns the alignment of text before it is altered by the BiDiMode property. To check whether the alignment should be reversed to reflect the BiDiMode property, call UseRightToLeftAlignment. + + +Pastes the contents of the Clipboard into edit control, replacing the current selection. +Use PasteFromClipboard to replace the selected text with the contents of the Clipboard, or, if no text is selected, to insert the contents of the Clipboard at the cursor. If the Clipboard is empty, or if it does not contain anything in CF_TEXT format, PasteFromClipboard does nothing. + +Note: Calling PasteFromClipboard does the same thing as sending the edit control a WM_PASTE message. + + +Backs out all changes in the undo buffer. +Call Undo to cancel all changes made to the Text property since the last call to the ClearUndo method. If ClearUndo was never called, Undo rolls back all changes. +To determine whether there are any changes in the undo buffer, check the CanUndo property. + + + +Clears the undo buffer so that no changes to the text can be backed out. +Use ClearUndo to commit changes to the Text property. After calling ClearUndo, the CanUndo property is false and the Undo method does nothing. + + + + + + +Sets the SelText property. +SetSelText is the property access method for the SelText property. + + + +Selects all text in the edit control. +Use SelectAll to select all text in the edit control. To select only part of the text, use the SelStart and SelLength properties. + + + + + + + + +Copies the selected text into a buffer and returns the number of characters copied. +Use GetSelTextBuf to copy the selected text into a character buffer. If there is no selection, the buffer receives an empty string. If the selection contains more than (BufSize - 1) characters, only the first (BufSize - 1) characters are copied. GetSelTextBuf returns the number of characters that were actually copied into the buffer. + + + + + + +Replaces the selected text with a null-terminated string. +Use SetSelTextBuf to replace the current selection by the contents of the null-terminated string pointed to by Buffer. If no text is selected, the contents of Buffer are inserted at the cursor. SetSelTextBuf does the same thing as setting the SelText property, except that it takes a pointer to a char type rather than a string. + + +Determines how the text is aligned within the text edit control. +Use Alignment to change the way the text is formatted in the text edit control. Alignment can take one of the following values: + + + + + +Value + +Meaning + + + +taLeftJustify + + + +Align text to the left side of the control + + + + +taCenter + + + +Center text horizontally in the control. + + + + +taRightJustify + + + +Align text to the right side of the control. + + + + + + +Indicates whether the edit control contains changes that can be backed out. +Read CanUndo to determine whether the user has made any changes to the text that can be undone by calling the Undo method. This is useful when enabling or disabling menu items that correspond to these commands. + + +Indicates whether the user edited the text of the edit control. +Use Modified to determine whether the user changed the Text property of the edit control. Modified is only reset to False when you assign a value to the Text property. In particular, it is not reset when the control receives focus. + + +When set to True, it allows you to call or invoke an Undo operation in order to undo a change previously made by using SetSelText or SetSelTextBuf. By default it is set to false. + + +Determines whether the user can change the text of the edit control. +To restrict the edit control to display only, set the ReadOnly property to true. Set ReadOnly to false to allow the contents of the edit control to be edited. +Setting ReadOnly to true ensures that the text is not altered, while still allowing the user to select text. The selected text can then be manipulated by the application, or copied to the Clipboard. + + +Specifies the number of characters (bytes) that are selected. +Read SelLength to determine the length, in bytes, of the selected text. This is the same as the number of characters, unless you are using a multi-byte character set. Set SelLength to change the selection to consist of the first SelLength bytes starting at SelStart. + +Note: Setting SelLength to a value greater than the number of characters from SelStart to the end of the text results in the selection of all characters from SelStart to the end of the text. Reading SelLength immediately after setting it to a value greater than the number of available characters returns the number of characters actually selected, not the value that was just set. + +Specifies the position of the first selected character in the text. +Read SelStart to determine the position of the first selected character, where 0 indicates the first character. If there is no selected text, SelStart indicates the position of the cursor. Set SelStart to remove the current selection and position the cursor just before the indicated character. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. + + +Specifies the selected portion of the edit control's text. +Read SelText to determine the value of the selected text. Set SelText to replace the selected text with a new string. If there is no selection, but the edit control has focus, set SelText to insert a new string into the text at the cursor. + + + +A hint or message to be displayed when the Text property is empty. +Use TextHint to cue the user on what kind of entry is expected in the text field. Runtime themes must be enabled. + +Code Examples +StdCtrlsProp (Delphi) +StdCtrlsProp (C++) + + + + + + + +TCustomEdit is the base class from which all edit-box and memo controls are derived. +TCustomEdit encapsulates the behavior common to all components for editing text by introducing methods and properties that provide: +Basic text editing functions such as selecting text, modifying selected text, and case conversions. +Ability to respond to changes in the contents of the text. +Access control of the text for making it read-only or introducing a password character to hide the actual value. +Do not create instances of TCustomEdit. Use TCustomEdit as a base class when declaring control objects that permit the user to enter or modify text. Properties and methods of TCustomEdit provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TEdit is a wrapper for a Windows single-line edit control. +Use a TEdit object to put a standard Windows edit control on a form. Edit controls are used to retrieve text that users type. Edit controls can also display text to the user. +When only displaying text to the user, choose an edit control to allow users to select text and copy it to the Clipboard. Choose a label object if the selection capabilities of an edit control are not needed. +TEdit implements the generic behavior introduced in TCustomEdit. TEdit publishes many of the properties inherited from TCustomEdit, but does not introduce any new behavior. For specialized edit controls, use other descendant classes of TCustomEdit or derive from it. + + + + ssNone + + + + + ssHorizontal + + + + + ssVertical + + + + + ssBoth + + + + + csDropDown + + + + + csSimple + + + + + csDropDownList + + + + + csOwnerDrawFixed + + + + + csOwnerDrawVariable + + + + + iaLeft + + + + + iaRight + + + + + iaTop + + + + + iaBottom + + + + + iaCenter + + + + + cbUnchecked + + + + + cbChecked + + + + + cbGrayed + + + + + lbStandard + + + + + lbOwnerDrawFixed + + + + + lbOwnerDrawVariable + + + + + lbVirtual + + + + + lbVirtualOwnerDraw + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Initializes a window-creation parameter record passed in the Params parameter. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomMemo overrides the inherited method to specify a scrollable multiline edit control. The Params parameter is updated to reflect the current values of the Alignment, ScrollBars, and WordWrap properties, in addition to the BorderStyle, HideSelection, PasswordChar, and ReadOnly properties that the inherited method specifies. + + + + + + +Creates a window based on the window-creation parameter record. +The CreateWnd method calls CreateWindowHandle to create the edit control window once it has been specified in the window-creation parameters. CreateWindowHandle creates the window by calling the CreateWindowEx API function, passing parameters from the record passed in the Params parameter. CreateWindowHandle overrides the inherited method to interpret the Caption in Params as the initial text rather than as the window caption. + + + +Creates a Windows control corresponding to the edit control. +Vcl.StdCtrls.TCustomMemo.CreateWnd inherits from Vcl.StdCtrls.TCustomEdit.CreateWnd. All content below this line refers to Vcl.StdCtrls.TCustomEdit.CreateWnd. +Creates a Windows control corresponding to the edit control. +CreateWnd is called when the edit control is created, and whenever a change to the edit control requires the window to be recreated. After calling the inherited method, CreateWnd sends the newly created window messages to enforce the MaxLength and PasswordChar properties. + + + + + + +Returns the value of the CaretPos property. +CaretPos represents the coordinates of the cursor. GetCaretPos is the protected implementation of the CaretPos property. Override this method to change the way the caret position is computed. + + + + + + + +Returns the interactive gestures and their options. +Vcl.StdCtrls.TCustomMemo.DoGetGestureOptions inherits from Vcl.Controls.TControl.DoGetGestureOptions. All content below this line refers to Vcl.Controls.TControl.DoGetGestureOptions. +Returns the interactive gestures and their options. +DoGetGestureOptions is used internally to access the interactive gestures and their options associated with a TControl. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Checks whether the associated touch manager stored any of the given options. +Vcl.StdCtrls.TCustomMemo.IsTouchPropertyStored inherits from Vcl.Controls.TControl.IsTouchPropertyStored. All content below this line refers to Vcl.Controls.TControl.IsTouchPropertyStored. +Checks whether the associated touch manager stored any of the given options. +IsTouchPropertyStored is used internally by the VCL framework to check whether the associated touch manager component has stored the given options. Do not call IsTouchPropertyStored directly. IsTouchPropertyStored is used primarily to ensure that controls that do not require gesturing are not storing useless data in the DFMs or executables. + + + + + + +Ensures that return characters are not entered into the text when WantReturns is false. +KeyPress is called automatically when the user presses a key. After calling the inherited KeyPress, which calls the OnKeyPress event handler, KeyPress discards return characters when WantReturns is false. + + + +Initializes the memo control when it is first loaded into memory. +Loaded overrides the inherited method so that the Modified property is set to false when the form containing the memo is first loaded into memory. Derived classes can override the Loaded method to perform additional initializations after the memo's form is loaded. + + + + + + +Sets the CaretPos property. +SetCaretPos is the property write access method for the CaretPos property. The CaretPos property returns the coordinates of the cursor. SetCaretPos sets the cursor position to Value. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sets the Lines property. +SetLines is the protected write implementation for the Lines property. +SetLines is exposed as a protected method so derived classes can customize their implementation of the Lines property. + + + + + + +Sets the ScrollBars property. +SetScrollBars is the property access method for the ScrollBars property. +SetScrollBars is exposed as a protected method so derived classes can customize their implementation of the ScrollBars property. + + + + + + +Sets the WordWrap property. +SetWordWrap is the property access method for the WordWrap property. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Determines whether the memo control has scroll bars. +Use ScrollBars to give a multiline edit control horizontal or vertical scroll bars. ScrollBars can take one of the following values: + + + + + +Value + +Meaning + + + +ssNone + + + +The control has no scroll bars. + + + + +ssHorizontal + + + +The control has a single scroll bar on the bottom edge. + + + + +ssVertical + + + +The control has a single scroll bar on the right edge. + + + + +ssBoth + + + +The control has a scroll bar on both the bottom and right edges. + + + + + + +Determines whether the user can insert return characters into the text. +Set WantReturns to true to allow users to enter return characters into the text. Set WantReturns to false to allow the form to handle return characters instead. +For example, in a form with a default button (such as an OK button) and a memo control, if WantReturns is false, pressing Enter chooses the default button. If WantReturns is true, pressing Enter inserts a return character in the text. + +Note: If WantReturns is false, users can still enter return characters into the text by pressing Ctrl+Enter. + +Determines whether the user can insert tab characters into the text. +Set WantTabs to true to allow users to enter tab characters into the text. Set WantTabs to false if you want the tab character to select the next control on the form instead. + +Note: If WantTabs is true, users can tab into the edit control, but they can't tab out. + +Determines whether the edit control inserts soft carriage returns so that the text wraps at the right margin. +Set WordWrap to true to make the edit control wrap text at the right margin so that it fits in the client area. The wrapping has cosmetic purposes only. The text does not include any return characters that were not explicitly entered. Set WordWrap to false to have the edit control display a separate line only where return characters were explicitly entered into the text. + +Note: Most of the times when WordWrap is true, the horizontal scroll bar is not necessary. However, exceptions appear; when the line cannot be cut into pieces, the wrapping cannot occur. In these cases, the scroll bar is still required. + + + + + +Creates and initializes an instance of TCustomMemo. +Call Create to instantiate a TCustomMemo object. +AOwner is the component, typically the form, that is responsible for freeing the memo object. This becomes the value of the Owner property. +Derived objects that override the Create method should call the inherited Create before making any additional initializations. + + + + + +Destroys an instance of TCustomMemo. +Do not call Destroy directly in an application. Instead, call Free. Free checks that the TCustomMemo reference is not nil, and only then calls Destroy. +Destroy frees the TStrings object that implements the Lines property before calling the inherited destructor. + + +Indicates the position of the caret in the client area of the memo. +Use CaretPos to determine the coordinates of the cursor. CaretPos defines a location onscreen, in characters, with the origin in the top left corner of the memo. X specifies the horizontal coordinate of the point, Y specifies the vertical coordinate. +To determine the position of the caret in terms of characters of text only (rather than X/Y location), use the SelStart property. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Contains the individual lines of text in the memo control. +Use Lines to manipulate text in an memo control on a line-by-line basis. Lines is a TStrings object, so the TStrings methods may be used for Lines to perform manipulations such as counting the lines of text, adding new lines, deleting lines, or replacing lines with new text. For example: + +MyMemo.Lines.Add(...); + +To work with all the text at once, use the Text property. To manipulate individual lines of text, the Lines property works better. + +Note: Although Lines is implemented as a TStrings descendant, it does not implement the support for associating objects with the strings in the list. + + +TCustomMemo is the base type for memo components, which are multiline edit boxes, including TMemo and TDBMemo. +TCustomMemo introduces new properties and methods to expand the capabilities of TCustomEdit for handling multiline edit boxes. +Do not create instances of TCustomMemo. Use TCustomMemo as a base class when declaring control objects that implement a multiline edit control. Properties and methods of TCustomMemo provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TMemo is a wrapper for a Windows multiline edit control. +Use TMemo to put a standard Windows multiline edit control on a form. Multiline edit boxes allow the user to enter more than one line of text. They are appropriate for representing lengthy information. +TMemo implements the generic behavior introduced in TCustomMemo. TMemo publishes many of the properties inherited from TCustomMemo, but does not introduce any new behavior. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TComboBox combines an edit box with a scrollable list. +A TComboBox component is an edit box with a scrollable drop-down list attached to it. Users can select an item from the list or type directly into the edit box. + +Note: The width of the button in a TComboBox is equal to the width that Windows uses for scrollbars. This width depends on the color scheme that the user has chosen (by right-clicking the desktop, selecting Properties, and choosing Appearance). If you carefully size your combo box so all the text is visible, then a user running under a different color scheme may find that the text is obscured by the button. One solution is to set the scrollbar wide when developing the application. Most color schemes use a scrollbar that is at most 21 pixels wide. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TButton is a push button control. +Use TButton to put a standard push button on a form. TButton introduces several properties to control its behavior in a dialog box setting. Users choose button controls to initiate actions. +To use a button that displays a bitmap instead of a label, use TBitBtn. To use a button that can remain in a pressed position, use TSpeedButton. +The Caption property can be used to define an accelerator key to a control. + +Note: Because the TButton caption is always centered, changing the BiDiMode alignment has no effect. +Note: Changing the color of the Caption is not supported for TButton. Instead, use a button type whose Caption color can be changed using the Font property, such as TSpeedButton or TBitBtn. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TCheckBox represents a check box that can be on (checked) or off (unchecked). +A TCheckBox component presents an option for the user. The user can check the box to select the option, or uncheck it to deselect the option. +The Caption property can be used to define an accelerator key to a control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Returns whether the button control is checked. +Vcl.StdCtrls.TRadioButton.GetChecked inherits from Vcl.StdCtrls.TButtonControl.GetChecked. All content below this line refers to Vcl.StdCtrls.TButtonControl.GetChecked. +Returns whether the button control is checked. +GetChecked is the read implementation of the Checked property. + + + + + +Called when the StyleElements property changes. +Vcl.StdCtrls.TRadioButton.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + + + + +Sets the Checked property. +Vcl.StdCtrls.TRadioButton.SetChecked inherits from Vcl.StdCtrls.TButtonControl.SetChecked. All content below this line refers to Vcl.StdCtrls.TButtonControl.SetChecked. +Sets the Checked property. +SetChecked is the write implementer for the Checked property. + + + + + + + + +Initializes a window-creation parameter data structure. +Vcl.StdCtrls.TRadioButton.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + +Creates the underlying window. +Vcl.StdCtrls.TRadioButton.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + + + + +Creates an instance of TRadioButton. +Call Create to instantiate a radio button at runtime. Radio buttons added to forms at design time are created automatically. +AOwner is the component, typically a form, that becomes the value of the Owner property. The Owner is responsible for freeing the radio button object. + + + + + + +Returns the alignment of any text in the control. +Use GetControlsAlignment to determine the orientation of text in controls that do not have an Alignment property. +GetControlsAlignment overrides the inherited method, returning taRightJustify if UseRightToLeftAlignment returns false. If UseRightToLeftAlignment returns true, GetControlsAlignment returns the opposite of the Alignment property. + + + + + + +Determines the position of the caption relative to the radio button. +Set Alignment to determine whether the caption of the radio button should appear to the left of the radio button (taLeftJustify) or to the right of the radio button (taRightJustify). + +Note: Do not confuse the Alignment property with the alignment of the caption in the text area of the radio button. The caption always appears left aligned. Alignment only controls on which side of the button the text area appears. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TRadioButton is a wrapper for a system radio button. +Use TRadioButton to add a radio button to a form. Radio buttons present a set of mutually exclusive options to the user- that is, only one radio button in a set can be selected at a time. When the user selects a radio button, the previously selected radio button becomes unselected. Radio buttons are frequently grouped in a radio group box (TGroupBox). Add the group box to the form first, then get the radio buttons from the Component palette and put them into the group box. Or you can add a TRadioGroup, a group that already has radio buttons in it, so that you do not have to get the buttons from the Tool Palette. +By default, all radio buttons that are directly contained in the same windowed control container, such as a TRadioGroup or TPanel, are grouped. For example, two radio buttons on a form can be checked at the same time only if they are contained in separate containers, such as two different group boxes. +The Caption property can be used to define an accelerator key to the control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TListBox displays a collection of items in a scrollable list. +Use TListBox to display a scrollable list of items that users can select, add, or delete. TListBox is a wrapper for the Windows listbox control. For specialized list boxes, use other descendant classes of TCustomListBox or derive your own class from TCustomListBox. +TListBox implements the generic behavior introduced in TCustomListBox. TListBox publishes many of the properties inherited from TCustomListBox, but does not introduce any new behavior. + + + + scLineUp + + + + + scLineDown + + + + + scPageUp + + + + + scPageDown + + + + + scPosition + + + + + scTrack + + + + + scTop + + + + + scBottom + + + + + scEndScroll + + + + + sbsNone + + + + + sbsSingle + + + + + sbsSunken + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TStaticText is a windowed control that displays text on a form. +The TStaticText component functions like TLabel, except that it descends from TWinControl and therefore has a window handle. Use TStaticText instead of TLabel when the component's accelerator key must belong to a windowed control for example, on an ActiveX property page. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.Themes.xml b/Modules/DelphiVCL/doc/Vcl.Themes.xml new file mode 100644 index 00000000..7bc10414 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.Themes.xml @@ -0,0 +1,16434 @@ + + + + teButton + + + + + teClock + + + + + teComboBox + + + + + teDatePicker + + + + + teEdit + + + + + teExplorerBar + + + + + teFlyOut + + + + + teHeader + + + + + teLink + + + + + teListView + + + + + teMenu + + + + + teMenuBand + + + + + teMonthCal + + + + + teNavigation + + + + + tePage + + + + + teProgress + + + + + teRebar + + + + + teScrollBar + + + + + teSpin + + + + + teStartPanel + + + + + teStatus + + + + + teTab + + + + + teTaskBand + + + + + teTaskBar + + + + + teTaskDialog + + + + + teTextStyle + + + + + teToolBar + + + + + teToolTip + + + + + teTrackBar + + + + + teTrayNotify + + + + + teTreeview + + + + + teWindow + + + + + teCategoryButtons + + + + + teCategoryPanelGroup + + + + + teCheckListBox + + + + + teControlBar + + + + + teDataNavButtons + + + + + teGrid + + + + + teHint + + + + + tePanel + + + + + teTabSet + + + + + teTextLabel + + + + + teMPlayerButtons + + + + + teToggleSwitch + + + + + teSearchIndicators + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [teButton..teWindow] + + + + + [teCategoryButtons..teTextLabel] + + + + + tbButtonDontCare + + + + + tbButtonRoot + + + + + tbPushButtonNormal + + + + + tbPushButtonHot + + + + + tbPushButtonPressed + + + + + tbPushButtonDisabled + + + + + tbPushButtonDefaulted + + + + + tbPushButtonDefaultedAnimating + + + + + tbRadioButtonUncheckedNormal + + + + + tbRadioButtonUncheckedHot + + + + + tbRadioButtonUncheckedPressed + + + + + tbRadioButtonUncheckedDisabled + + + + + tbRadioButtonCheckedNormal + + + + + tbRadioButtonCheckedHot + + + + + tbRadioButtonCheckedPressed + + + + + tbRadioButtonCheckedDisabled + + + + + tbCheckBoxUncheckedNormal + + + + + tbCheckBoxUncheckedHot + + + + + tbCheckBoxUncheckedPressed + + + + + tbCheckBoxUncheckedDisabled + + + + + tbCheckBoxCheckedNormal + + + + + tbCheckBoxCheckedHot + + + + + tbCheckBoxCheckedPressed + + + + + tbCheckBoxCheckedDisabled + + + + + tbCheckBoxMixedNormal + + + + + tbCheckBoxMixedHot + + + + + tbCheckBoxMixedPressed + + + + + tbCheckBoxMixedDisabled + + + + + tbCheckBoxImplicitNormal + + + + + tbCheckBoxImplicitHot + + + + + tbCheckBoxImplicitPressed + + + + + tbCheckBoxImplicitDisabled + + + + + tbCheckBoxExcludedNormal + + + + + tbCheckBoxExcludedHot + + + + + tbCheckBoxExcludedPressed + + + + + tbCheckBoxExcludedDisabled + + + + + tbGroupBoxNormal + + + + + tbGroupBoxDisabled + + + + + tbUserButton + + + + + tbCommandLinkNormal + + + + + tbCommandLinkHot + + + + + tbCommandLinkPressed + + + + + tbCommandLinkDisabled + + + + + tbCommandLinkDefaulted + + + + + tbCommandLinkDefaultedAnimating + + + + + tbCommandLinkGlyphNormal + + + + + tbCommandLinkGlyphHot + + + + + tbCommandLinkGlyphPressed + + + + + tbCommandLinkGlyphDisabled + + + + + tbCommandLinkGlyphDefaulted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tbPushButtonDefaultedAnimating + + + + + tbRadioButtonCheckedDisabled + + + + + tbCheckBoxExcludedDisabled + + + + + tbGroupBoxDisabled + + + + + tbUserButton + + + + + tbCommandLinkDefaultedAnimating + + + + + tbCommandLinkGlyphDefaulted + + + + + tcbCategoryButtonsDontCare + + + + + tcbCategoryButtonsRoot + + + + + tcbBackground + + + + + tcbCategoryNormal + + + + + tcbCategorySelected + + + + + tcbButtonNormal + + + + + tcbButtonHot + + + + + tcbButtonSelected + + + + + tcbCategoryGlyphOpened + + + + + tcbCategoryGlyphClosed + + + + + tcbCategoryChevronOpened + + + + + tcbCategoryChevronClosed + + + + + + + + + + + + + + + + + + + tcbCategorySelected + + + + + tcbButtonSelected + + + + + tcbCategoryGlyphClosed + + + + + tcbCategoryChevronClosed + + + + + tcpCategoryPanelGroupDontCare + + + + + tcpCategoryPanelGroupRoot + + + + + tcpBackground + + + + + tcpGradientHeader + + + + + tcpThemedHeader + + + + + tcpChevronOpenedNormal + + + + + tcpChevronOpenedHot + + + + + tcpChevronOpenedPressed + + + + + tcpChevronClosedNormal + + + + + tcpChevronClosedHot + + + + + tcpChevronClosedPressed + + + + + tcpChevronClosedLeftNormal + + + + + tcpChevronClosedLeftHot + + + + + tcpChevronClosedLeftPressed + + + + + tcpThemedChevronOpenedNormal + + + + + tcpThemedChevronOpenedHot + + + + + tcpThemedChevronOpenedPressed + + + + + tcpThemedChevronClosedNormal + + + + + tcpThemedChevronClosedHot + + + + + tcpThemedChevronClosedPressed + + + + + + + + + + + + + + + + + + + + + + + + + + + tcpChevronOpenedPressed + + + + + tcpChevronClosedPressed + + + + + tcpChevronClosedLeftPressed + + + + + tcpThemedChevronOpenedPressed + + + + + tcpThemedChevronClosedPressed + + + + + tclCheckListBoxDontCare + + + + + tclCheckListBoxRoot + + + + + tclListItemNormal + + + + + tclListItemDisabled + + + + + tclHeaderItemNormal + + + + + tclHeaderItemDisabled + + + + + + + + + + + + + tclListItemDisabled + + + + + tclHeaderItemDisabled + + + + + tcbControlBarDontCare + + + + + tcbControlBarRoot + + + + + tcbGradientItemFrame + + + + + + + + + + tcClockDontCare + + + + + tcClockRoot + + + + + tcTimeNormal + + + + + tcTimeHot + + + + + tcTimePressed + + + + + + + + + + + + tcTimePressed + + + + + tcTimeNormal + + + + + tcComboBoxDontCare + + + + + tcComboBoxRoot + + + + + tcDropDownButtonNormal + + + + + tcDropDownButtonHot + + + + + tcDropDownButtonPressed + + + + + tcDropDownButtonDisabled + + + + + tcBackground + + + + + tcTransparentBackgroundNormal + + + + + tcTransparentBackgroundHot + + + + + tcTransparentBackgroundDisabled + + + + + tcTransparentBackgroundFocused + + + + + tcBorderNormal + + + + + tcBorderHot + + + + + tcBorderFocused + + + + + tcBorderDisabled + + + + + tcReadOnlyNormal + + + + + tcReadOnlyHot + + + + + tcReadOnlyPressed + + + + + tcReadOnlyDisabled + + + + + tcDropDownButtonRightNormal + + + + + tcDropDownButtonRightHot + + + + + tcDropDownButtonRightPressed + + + + + tcDropDownButtonRightDisabled + + + + + tcDropDownButtonLeftNormal + + + + + tcDropDownButtonLeftHot + + + + + tcDropDownButtonLeftPressed + + + + + tcDropDownButtonLeftDisabled + + + + + tcCueBannerNormal + + + + + tcCueBannerHot + + + + + tcCueBannerPressed + + + + + tcCueBannerDisabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tcDropDownButtonDisabled + + + + + tcBackground + + + + + tcTransparentBackgroundFocused + + + + + tcBorderDisabled + + + + + tcReadOnlyDisabled + + + + + tcDropDownButtonRightDisabled + + + + + tcDropDownButtonLeftDisabled + + + + + tcCueBannerDisabled + + + + + tdpDatePickerDontCare + + + + + tdbDatePickerRoot + + + + + tdbDateTextNormal + + + + + tdbDateTextDisabled + + + + + tdbDateTextSelected + + + + + tdbDateBorderNormal + + + + + tdbDateBorderHot + + + + + tdbDateBorderFocused + + + + + tdbDateBorderDisabled + + + + + tdbShowCalendarButtonRightNormal + + + + + tdbShowCalendarButtonRightHot + + + + + tdbShowCalendarButtonRightPressed + + + + + tdbShowCalendarButtonRightDisabled + + + + + + + + + + + + + + + + + + + + tdbDateTextSelected + + + + + tdbDateBorderDisabled + + + + + tdbShowCalendarButtonRightDisabled + + + + + teEditDontCare + + + + + teEditRoot + + + + + teEditTextNormal + + + + + teEditTextHot + + + + + teEditTextSelected + + + + + teEditTextDisabled + + + + + teEditTextFocused + + + + + teEditTextReadOnly + + + + + teEditTextAssist + + + + + teEditCaret + + + + + teBackgroundNormal + + + + + teBackgroundHot + + + + + teBackgroundDisabled + + + + + teBackgroundFocused + + + + + teBackgroundReadOnly + + + + + teBackgroundAssist + + + + + tePassword + + + + + teBackgroundWithBorderNormal + + + + + teBackgroundWithBorderHot + + + + + teBackgroundWithBorderDisabled + + + + + teBackgroundWithBorderFocused + + + + + teEditBorderNoScrollNormal + + + + + teEditBorderNoScrollHot + + + + + teEditBorderNoScrollFocused + + + + + teEditBorderNoScrollDisabled + + + + + teEditBorderHScrollNormal + + + + + teEditBorderHScrollHot + + + + + teEditBorderHScrollFocused + + + + + teEditBorderHScrollDisabled + + + + + teEditBorderVScrollNormal + + + + + teEditBorderVScrollHot + + + + + teEditBorderVScrollFocused + + + + + teEditBorderVScrollDisabled + + + + + teEditBorderHVScrollNormal + + + + + teEditBorderHVScrollHot + + + + + teEditBorderHVScrollFocused + + + + + teEditBorderHVScrollDisabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + teEditTextAssist + + + + + teEditCaret + + + + + teBackgroundAssist + + + + + tePassword + + + + + teBackgroundWithBorderFocused + + + + + teEditBorderNoScrollDisabled + + + + + teEditBorderHScrollDisabled + + + + + teEditBorderVScrollDisabled + + + + + teEditBorderHVScrollDisabled + + + + + tebExplorerBarDontCare + + + + + tebExplorerBarRoot + + + + + tebHeaderBackgroundNormal + + + + + tebHeaderBackgroundHot + + + + + tebHeaderBackgroundPressed + + + + + tebHeaderCloseNormal + + + + + tebHeaderCloseHot + + + + + tebHeaderClosePressed + + + + + tebHeaderPinNormal + + + + + tebHeaderPinHot + + + + + tebHeaderPinPressed + + + + + tebHeaderPinSelectedNormal + + + + + tebHeaderPinSelectedHot + + + + + tebHeaderPinSelectedPressed + + + + + tebIEBarMenuNormal + + + + + tebIEBarMenuHot + + + + + tebIEBarMenuPressed + + + + + tebNormalGroupBackground + + + + + tebNormalGroupCollapseNormal + + + + + tebNormalGroupCollapseHot + + + + + tebNormalGroupCollapsePressed + + + + + tebNormalGroupExpandNormal + + + + + tebNormalGroupExpandHot + + + + + tebNormalGroupExpandPressed + + + + + tebNormalGroupHead + + + + + tebSpecialGroupBackground + + + + + tebSpecialGroupCollapseNormal + + + + + tebSpecialGroupCollapseHot + + + + + tebSpecialGroupCollapsePressed + + + + + tebSpecialGroupExpandNormal + + + + + tebSpecialGroupExpandHot + + + + + tebSpecialGroupExpandPressed + + + + + tebSpecialGroupHead + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tebHeaderBackgroundPressed + + + + + tebHeaderClosePressed + + + + + tebHeaderPinPressed + + + + + tebHeaderPinSelectedPressed + + + + + tebIEBarMenuPressed + + + + + tebNormalGroupBackground + + + + + tebNormalGroupCollapsePressed + + + + + tebNormalGroupExpandPressed + + + + + tebNormalGroupHead + + + + + tebSpecialGroupBackground + + + + + tebSpecialGroupCollapsePressed + + + + + tebSpecialGroupExpandPressed + + + + + tebSpecialGroupHead + + + + + tebSpecialGroupCollapseNormal + + + + + tebSpecialGroupExpandNormal + + + + + tfFlyOutDontCare + + + + + tfFlyOutRoot + + + + + tfFlyOutHeader + + + + + tfFlyOutBodyNormal + + + + + tfFlyOutBodyEmphasized + + + + + tfFlyOutLabelNormal + + + + + tfFlyOutLabelSlected + + + + + tfFlyOutLabelEmphasized + + + + + tfFlyOutLabelDisabled + + + + + tfFlyOutLinkNormal + + + + + tfFlyOutLinkHover + + + + + tfFlyOutDivider + + + + + tfFlyOutWindow + + + + + tfFlyOutLinkArea + + + + + tfFlyOutLinkHeaderNormal + + + + + tfFlyOutLinkHeaderHover + + + + + + + + + + + + + + + + + + + + + + + tfFlyOutHeader + + + + + tfFlyOutBodyEmphasized + + + + + tfFlyOutLabelDisabled + + + + + tfFlyOutLinkHover + + + + + tfFlyOutDivider + + + + + tfFlyOutWindow + + + + + tfFlyOutLinkArea + + + + + tfFlyOutLinkHeaderHover + + + + + tgGridDontCare + + + + + tgGridRoot + + + + + tgCellNormal + + + + + tgCellSelected + + + + + tgCellRowSelectedLeft + + + + + tgCellRowSelectedCenter + + + + + tgCellRowSelectedRight + + + + + tgFixedCellNormal + + + + + tgFixedCellHot + + + + + tgFixedCellPressed + + + + + tgGradientCellNormal + + + + + tgGradientCellSelected + + + + + tgGradientCellRowSelectedLeft + + + + + tgGradientCellRowSelectedCenter + + + + + tgGradientCellRowSelectedRight + + + + + tgGradientFixedCellNormal + + + + + tgGradientFixedCellHot + + + + + tgGradientFixedCellPressed + + + + + tgClassicCellNormal + + + + + tgClassicCellSelected + + + + + tgClassicCellRowSelectedLeft + + + + + tgClassicCellRowSelectedCenter + + + + + tgClassicCellRowSelectedRight + + + + + tgClassicFixedCellNormal + + + + + tgClassicFixedCellHot + + + + + tgClassicFixedCellPressed + + + + + tgDropDownButtonNormal + + + + + tgDropDownButtonHot + + + + + tgDropDownButtonPressed + + + + + tgDropDownButtonDisabled + + + + + tgEllipsisButtonNormal + + + + + tgEllipsisButtonHot + + + + + tgEllipsisButtonPressed + + + + + tgIndicatorArrow + + + + + tgIndicatorEdit + + + + + tgIndicatorInsert + + + + + tgIndicatorMultiDot + + + + + tgIndicatorMultiArrow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tgCellRowSelectedRight + + + + + tgFixedCellPressed + + + + + tgGradientCellRowSelectedRight + + + + + tgGradientFixedCellPressed + + + + + tgClassicCellRowSelectedRight + + + + + tgClassicFixedCellPressed + + + + + tgDropDownButtonDisabled + + + + + tgEllipsisButtonPressed + + + + + thHeaderDontCare + + + + + thHeaderRoot + + + + + thHeaderItemNormal + + + + + thHeaderItemHot + + + + + thHeaderItemPressed + + + + + thHeaderItemLeftNormal + + + + + thHeaderItemLeftHot + + + + + thHeaderItemLeftPressed + + + + + thHeaderItemRightNormal + + + + + thHeaderItemRightHot + + + + + thHeaderItemRightPressed + + + + + thHeaderSortArrowSortedUp + + + + + thHeaderSortArrowSortedDown + + + + + thHeaderDropDownNormal + + + + + thHeaderDropDownSoftHot + + + + + thHeaderDropDownHot + + + + + thHeaderDropDownFilterNormal + + + + + thHeaderDropDownFilterSoftHot + + + + + thHeaderDropDownFilterHot + + + + + thHeaderOverflowNormal + + + + + thHeaderOverflowHot + + + + + + + + + + + + + + + + + + + + + + + + + + + + thHeaderItemPressed + + + + + thHeaderItemLeftPressed + + + + + thHeaderItemRightPressed + + + + + thHeaderSortArrowSortedDown + + + + + thHeaderDropDownHot + + + + + thHeaderDropDownFilterHot + + + + + thHeaderOverflowHot + + + + + thHintDontCare + + + + + thHintRoot + + + + + thHintNormal + + + + + thHintBalloon + + + + + + + + + + + tlListviewDontCare + + + + + tlListviewRoot + + + + + tlListItemNormal + + + + + tlListItemHot + + + + + tlListItemSelected + + + + + tlListItemDisabled + + + + + tlListItemSelectedNotFocus + + + + + tlListItemHotSelected + + + + + tlListGroup + + + + + tlListDetail + + + + + tlListSortDetail + + + + + tlEmptyText + + + + + tlGroupHeaderOpen + + + + + tlGroupHeaderOpenHot + + + + + tlGroupHeaderOpenSelected + + + + + tlGroupHeaderOpenSelectedHot + + + + + tlGroupHeaderOpenSelectedNotFocused + + + + + tlGroupHeaderOpenSelectedNotFocusedHot + + + + + tlGroupHeaderOpenMixedSelection + + + + + tlGroupHeaderOpenMixedSelectionHot + + + + + tlGroupHeaderClose + + + + + tlGroupHeaderCloseHot + + + + + tlGroupHeaderCloseSelected + + + + + tlGroupHeaderCloseSelectedHot + + + + + tlGroupHeaderCloseSelectedNotFocused + + + + + tlGroupHeaderCloseSelectedNotFocusedHot + + + + + tlGroupHeaderCloseMixedSelection + + + + + tlGroupHeaderCloseMixedSelectionHot + + + + + tlGroupHeaderLineOpen + + + + + tlGroupHeaderLineOpenHot + + + + + tlGroupHeaderLineOpenSelected + + + + + tlGroupHeaderLineOpenSelectedHot + + + + + tlGroupHeaderLineOpenSelectedNotFocused + + + + + tlGroupHeaderLineOpenSelectedNotFocusedHot + + + + + tlGroupHeaderLineOpenMixedSelection + + + + + tlGroupHeaderLineOpenMixedSelectionHot + + + + + tlGroupHeaderLineClose + + + + + tlGroupHeaderLineCloseHot + + + + + tlGroupHeaderLineCloseSelected + + + + + tlGroupHeaderLineCloseSelectedHot + + + + + tlGroupHeaderLineCloseSelectedNotFocused + + + + + tlGroupHeaderLineCloseSelectedNotFocusedHot + + + + + tlGroupHeaderLineCloseMixedSelection + + + + + tlGroupHeaderLineCloseMixedSelectionHot + + + + + tlExpandButtonNormal + + + + + tlExpandButtonHover + + + + + tlExpandButtonPushed + + + + + tlCollapseButtonNormal + + + + + tlCollapseButtonHover + + + + + tlCollapseButtonPushed + + + + + tlColumnDetail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tlListItemHotSelected + + + + + tlListGroup + + + + + tlListDetail + + + + + tlListSortDetail + + + + + tlEmptyText + + + + + tlGroupHeaderCloseMixedSelectionHot + + + + + tlGroupHeaderLineCloseMixedSelectionHot + + + + + tlExpandButtonPushed + + + + + tlCollapseButtonPushed + + + + + tlColumnDetail + + + + + tlLinkDontCare + + + + + tlLinkRoot + + + + + tlLinkNormal + + + + + tlLinkLinked + + + + + + + + + + + tlLinkLinked + + + + + tmMenuDontCare + + + + + tmMenuRoot + + + + + tmMenuItemNormal + + + + + tmMenuItemSelected + + + + + tmMenuItemDemoted + + + + + tmMenuDropDown + + + + + tmMenuBarItem + + + + + tmMenuBarDropDown + + + + + tmChevron + + + + + tmSeparator + + + + + tmMenuBarBackgroundActive + + + + + tmMenuBarBackgroundInactive + + + + + tmMenuBarItemNormal + + + + + tmMenuBarItemHot + + + + + tmMenuBarItemPushed + + + + + tmMenuBarItemDisabled + + + + + tmMenuBarItemDisabledHot + + + + + tmMenuBarItemDisabledPushed + + + + + tmPopupBackground + + + + + tmPopupBorders + + + + + tmPopupCheckNormal + + + + + tmPopupCheckDisabled + + + + + tmPopupBulletNormal + + + + + tmPopupBulletDisabled + + + + + tmPopupCheckBackgroundDisabled + + + + + tmPopupCheckBackgroundNormal + + + + + tmPopupCheckBackgroundBitmap + + + + + tmPopupGutter + + + + + tmPopupItemNormal + + + + + tmPopupItemHot + + + + + tmPopupItemDisabled + + + + + tmPopupItemDisabledHot + + + + + tmPopupSeparator + + + + + tmPopupSubMenuNormal + + + + + tmPopupSubMenuDisabled + + + + + tmSystemCloseNormal + + + + + tmSystemCloseDisabled + + + + + tmSystemMaximizeNormal + + + + + tmSystemMaximizeDisabled + + + + + tmSystemMinimizeNormal + + + + + tmSystemMinimizeDisabled + + + + + tmSystemRestoreNormal + + + + + tmSystemRestoreDisabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tmMenuItemDemoted + + + + + tmMenuDropDown + + + + + tmMenuBarItem + + + + + tmMenuBarDropDown + + + + + tmChevron + + + + + tmSeparator + + + + + tmMenuBarBackgroundInactive + + + + + tmMenuBarItemDisabledPushed + + + + + tmPopupBackground + + + + + tmPopupBorders + + + + + tmPopupBulletDisabled + + + + + tmPopupCheckBackgroundBitmap + + + + + tmPopupGutter + + + + + tmPopupItemDisabledHot + + + + + tmPopupSeparator + + + + + tmPopupSubMenuDisabled + + + + + tmSystemCloseDisabled + + + + + tmSystemMaximizeDisabled + + + + + tmSystemMinimizeDisabled + + + + + tmSystemRestoreDisabled + + + + + tmbMenuBandDontCare + + + + + tmbMenuBandRoot + + + + + tmbNewAppButtonNormal + + + + + tmbNewAppButtonHot + + + + + tmbNewAppButtonPressed + + + + + tmbNewAppButtonDisabled + + + + + tmbNewAppButtonChecked + + + + + tmbNewAppButtonNotChecked + + + + + tmbSeparatorNormal + + + + + tmbSeparatorHot + + + + + tmbSeparatorPressed + + + + + tmbSeparatorDisabled + + + + + tmbSeparatorChecked + + + + + tmbSeparatorNotChecked + + + + + + + + + + + + + + + + + + + + + tmbNewAppButtonNotChecked + + + + + tmbSeparatorNotChecked + + + + + tmcMonthCalDontCare + + + + + tmcMonthCalRoot + + + + + tmcBackground + + + + + tmcBorders + + + + + tmcGridBackground + + + + + tmcColHeaderSplitter + + + + + tmcGridCellBackgroundSelected + + + + + tmcGridCellBackgroundHot + + + + + tmcGridCellBackgroundSelectedHot + + + + + tmcGridCellBackgroundSelectedNotFocused + + + + + tmcGridCellBackgroundToday + + + + + tmcGridCellHot + + + + + tmcGridCellHasState + + + + + tmcGridCellHasStateHot + + + + + tmcGridCellToday + + + + + tmcGridCellUpperHot + + + + + tmcGridCellUpperHasState + + + + + tmcGridCellUpperHasStateHot + + + + + tmcTrailingGridCellHot + + + + + tmcTrailingGridCellHasState + + + + + tmcTrailingGridCellHasStateHot + + + + + tmcTrailingGridCellToday + + + + + tmcTrailingGridCellUpperHot + + + + + tmcTrailingGridCellUpperHasState + + + + + tmcTrailingGridCellUpperHasStateHot + + + + + tmcNavNextNormal + + + + + tmcNavNextHot + + + + + tmcNavNextPressed + + + + + tmcNavNextDisabled + + + + + tmcNavPrevNormal + + + + + tmcNavPrevHot + + + + + tmcNavPrevPressed + + + + + tmcNavPrevDisabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tmcBackground + + + + + tmcBorders + + + + + tmcGridBackground + + + + + tmcColHeaderSplitter + + + + + tmcGridCellBackgroundToday + + + + + tmcGridCellToday + + + + + tmcGridCellUpperHasStateHot + + + + + tmcTrailingGridCellToday + + + + + tmcTrailingGridCellUpperHasStateHot + + + + + tmcNavNextDisabled + + + + + tmcNavPrevDisabled + + + + + tmpbPlayNormal + + + + + tmpbPlayHot + + + + + tmpbPlayPressed + + + + + tmpbPlayDisabled + + + + + tmpbPauseNormal + + + + + tmpbPauseHot + + + + + tmpbPausePressed + + + + + tmpbPauseDisabled + + + + + tmpbStopNormal + + + + + tmpbStopHot + + + + + tmpbStopPressed + + + + + tmpbStopDisabled + + + + + tmpbNextNormal + + + + + tmpbNextHot + + + + + tmpbNextPressed + + + + + tmpbNextDisabled + + + + + tmpbPrevNormal + + + + + tmpbPrevHot + + + + + tmpbPrevPressed + + + + + tmpbPrevDisabled + + + + + tmpbStepNormal + + + + + tmpbStepHot + + + + + tmpbStepPressed + + + + + tmpbStepDisabled + + + + + tmpbBackNormal + + + + + tmpbBackHot + + + + + tmpbBackPressed + + + + + tmpbBackDisabled + + + + + tmpbRecordNormal + + + + + tmpbRecordHot + + + + + tmpbRecordPressed + + + + + tmpbRecordDisabled + + + + + tmpbEjectNormal + + + + + tmpbEjectHot + + + + + tmpbEjectPressed + + + + + tmpbEjectDisabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tnNavigatrionDontCare + + + + + tnNavigatrionRoot + + + + + tnBackButtonNormal + + + + + tnBackButtonHot + + + + + tnBackButtonPressed + + + + + tnBackButtonDisabled + + + + + tnForwardButtonNormal + + + + + tnForwardButtonHot + + + + + tnForwardButtonPressed + + + + + tnForwardButtonDisabled + + + + + tnMenuButtonNormal + + + + + tnMenuButtonHot + + + + + tnMenuButtonPressed + + + + + tnMenuButtonDisabled + + + + + + + + + + + + + + + + + + + + + tnBackButtonDisabled + + + + + tnForwardButtonDisabled + + + + + tnMenuButtonDisabled + + + + + tdnbDontCare + + + + + tdnbNavigatorRoot + + + + + tdnbFirstNormal + + + + + tdnbFirstHot + + + + + tdnbFirstPressed + + + + + tdnbFirstDisabled + + + + + tdnbPriorNormal + + + + + tdnbPriorHot + + + + + tdnbPriorPressed + + + + + tdnbPriorDisabled + + + + + tdnbNextNormal + + + + + tdnbNextHot + + + + + tdnbNextPressed + + + + + tdnbNextDisabled + + + + + tdnbLastNormal + + + + + tdnbLastHot + + + + + tdnbLastPressed + + + + + tdnbLastDisabled + + + + + tdnbInsertNormal + + + + + tdnbInsertHot + + + + + tdnbInsertPressed + + + + + tdnbInsertDisabled + + + + + tdnbDeleteNormal + + + + + tdnbDeleteHot + + + + + tdnbDeletePressed + + + + + tdnbDeleteDisabled + + + + + tdnbEditNormal + + + + + tdnbEditHot + + + + + tdnbEditPressed + + + + + tdnbEditDisabled + + + + + tdnbPostNormal + + + + + tdnbPostHot + + + + + tdnbPostPressed + + + + + tdnbPostDisabled + + + + + tdnbCancelNormal + + + + + tdnbCancelHot + + + + + tdnbCancelPressed + + + + + tdnbCancelDisabled + + + + + tdnbRefreshNormal + + + + + tdnbRefreshHot + + + + + tdnbRefreshPressed + + + + + tdnbRefreshDisabled + + + + + tdnbApplyUpdatesNormal + + + + + tdnbApplyUpdatesHot + + + + + tdnbApplyUpdatesPressed + + + + + tdnbApplyUpdatesDisabled + + + + + tdnbCancelUpdatesNormal + + + + + tdnbCancelUpdatesHot + + + + + tdnbCancelUpdatesPressed + + + + + tdnbCancelUpdatesDisabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tpPageDontCare + + + + + tpPageRoot + + + + + tpUpNormal + + + + + tpUpHot + + + + + tpUpPressed + + + + + tpUpDisabled + + + + + tpDownNormal + + + + + tpDownHot + + + + + tpDownPressed + + + + + tpDownDisabled + + + + + tpUpHorzNormal + + + + + tpUpHorzHot + + + + + tpUpHorzPressed + + + + + tpUpHorzDisabled + + + + + tpDownHorzNormal + + + + + tpDownHorzHot + + + + + tpDownHorzPressed + + + + + tpDownHorzDisabled + + + + + + + + + + + + + + + + + + + + + + + + + tpPanelDontCare + + + + + tpPanelRoot + + + + + tpPanelBackground + + + + + tpPanelBevel + + + + + tpDockPanelHorzNormal + + + + + tpDockPanelHorzSelected + + + + + tpDockPanelVertNormal + + + + + tpDockPanelVertSelected + + + + + tpDockPanelPinNormal + + + + + tpDockPanelCloseNormal + + + + + tpProgressDontCare + + + + + tpProgressRoot + + + + + tpBar + + + + + tpBarVert + + + + + tpChunk + + + + + tpChunkVert + + + + + tpFill + + + + + tpFillVert + + + + + tpPulseOverlay + + + + + tpMoveOverlay + + + + + tpPulseOverlayVert + + + + + tpMoveOverlayVert + + + + + tpTransparentBarNormal + + + + + tpTransparentBarPartial + + + + + tpTransparentBarVertNormal + + + + + tpTransparentBarVertPartial + + + + + trRebarDontCare + + + + + trRebarRoot + + + + + trGripper + + + + + trGripperVert + + + + + trBand + + + + + trChevronNormal + + + + + trChevronHot + + + + + trChevronPressed + + + + + trChevronVertNormal + + + + + trChevronVertHot + + + + + trChevronVertPressed + + + + + trBackground + + + + + trSplitterNormal + + + + + trSplitterHot + + + + + trSplitterPressed + + + + + trSlipperVertNormal + + + + + trSlipperVertHot + + + + + trSlipperVertPressed + + + + + tsScrollBarDontCare + + + + + tsScrollBarRoot + + + + + tsArrowBtnUpNormal + + + + + tsArrowBtnUpHot + + + + + tsArrowBtnUpPressed + + + + + tsArrowBtnUpDisabled + + + + + tsArrowBtnDownNormal + + + + + tsArrowBtnDownHot + + + + + tsArrowBtnDownPressed + + + + + tsArrowBtnDownDisabled + + + + + tsArrowBtnLeftNormal + + + + + tsArrowBtnLeftHot + + + + + tsArrowBtnLeftPressed + + + + + tsArrowBtnLeftDisabled + + + + + tsArrowBtnRightNormal + + + + + tsArrowBtnRightHot + + + + + tsArrowBtnRightPressed + + + + + tsArrowBtnRightDisabled + + + + + tsArrowBtnUpHover + + + + + tsArrowBtnDownHover + + + + + tsArrowBtnLeftHover + + + + + tsArrowBtnRightHover + + + + + tsThumbBtnHorzNormal + + + + + tsThumbBtnHorzHot + + + + + tsThumbBtnHorzPressed + + + + + tsThumbBtnHorzDisabled + + + + + tsThumbBtnVertNormal + + + + + tsThumbBtnVertHot + + + + + tsThumbBtnVertPressed + + + + + tsThumbBtnVertDisabled + + + + + tsLowerTrackHorzNormal + + + + + tsLowerTrackHorzHot + + + + + tsLowerTrackHorzPressed + + + + + tsLowerTrackHorzDisabled + + + + + tsLowerTrackHorzHover + + + + + tsUpperTrackHorzNormal + + + + + tsUpperTrackHorzHot + + + + + tsUpperTrackHorzPressed + + + + + tsUpperTrackHorzDisabled + + + + + tsUpperTrackHorzHover + + + + + tsLowerTrackVertNormal + + + + + tsLowerTrackVertHot + + + + + tsLowerTrackVertPressed + + + + + tsLowerTrackVertDisabled + + + + + tsLowerTrackVertHover + + + + + tsUpperTrackVertNormal + + + + + tsUpperTrackVertHot + + + + + tsUpperTrackVertPressed + + + + + tsUpperTrackVertDisabled + + + + + tsUpperTrackVertHover + + + + + tsGripperHorzNormal + + + + + tsGripperHorzHot + + + + + tsGripperHorzPressed + + + + + tsGripperHorzDisabled + + + + + tsGripperHorzHover + + + + + tsGripperVertNormal + + + + + tsGripperVertHot + + + + + tsGripperVertPressed + + + + + tsGripperVertDisabled + + + + + tsGripperVertHover + + + + + tsSizeBoxRightAlign + + + + + tsSizeBoxLeftAlign + + + + + tsSizeBoxTopRightAlign + + + + + tsSizeBoxTopLeftAlign + + + + + tsSizeBoxHalfBottomRightAlign + + + + + tsSizeBoxHalfBottomLeftAlign + + + + + tsSizeBoxHalfTopRightAlign + + + + + tsSizeBoxHalfTopLeftAlign + + + + + tsSpinDontCare + + + + + tsSpinRoot + + + + + tsUpNormal + + + + + tsUpHot + + + + + tsUpPressed + + + + + tsUpDisabled + + + + + tsDownNormal + + + + + tsDownHot + + + + + tsDownPressed + + + + + tsDownDisabled + + + + + tsUpHorzNormal + + + + + tsUpHorzHot + + + + + tsUpHorzPressed + + + + + tsUpHorzDisabled + + + + + tsDownHorzNormal + + + + + tsDownHorzHot + + + + + tsDownHorzPressed + + + + + tsDownHorzDisabled + + + + + tspStartPanelDontCare + + + + + tspStartPanelRoot + + + + + tspUserPane + + + + + tspMorePrograms + + + + + tspMoreProgramsArrowNormal + + + + + tspMoreProgramsArrowHot + + + + + tspMoreProgramsArrowPressed + + + + + tspProgList + + + + + tspProgListSeparator + + + + + tspPlacesList + + + + + tspPlacesListSeparator + + + + + tspLogOff + + + + + tspLogOffButtonsNormal + + + + + tspLogOffButtonsHot + + + + + tspLogOffButtonsPressed + + + + + tspUserPicture + + + + + tspPreview + + + + + tspMoreProgramsTabNormal + + + + + tspMoreProgramsTabHot + + + + + tspMoreProgramsTabSelected + + + + + tspMoreProgramsTabDisabled + + + + + tspMoreProgramsTabFocused + + + + + tspNSCHost + + + + + tspSoftwareExplorerNormal + + + + + tspSoftwareExplorerHot + + + + + tspSoftwareExplorerSelected + + + + + tspSoftwareExplorerDisabled + + + + + tspSoftwareExplorerFocused + + + + + tspOpenBoxNormal + + + + + tspOpenBoxHot + + + + + tspOpenBoxSelected + + + + + tspOpenBoxDisabled + + + + + tspOpenBoxFocused + + + + + tspSearchView + + + + + tspMoreProgramsArrowBackNormal + + + + + tspMoreProgramsArrowBackHot + + + + + tspMoreProgramsArrowBackPressed + + + + + tspTopMatch + + + + + tspLogOffSplitButtonDropDown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tsStatusDontCare + + + + + tsStatusRoot + + + + + tsPane + + + + + tsGripperPane + + + + + tsGripper + + + + + ttTabDontCare + + + + + ttTabRoot + + + + + ttTabItemNormal + + + + + ttTabItemHot + + + + + ttTabItemSelected + + + + + ttTabItemDisabled + + + + + ttTabItemFocused + + + + + ttTabItemLeftEdgeNormal + + + + + ttTabItemLeftEdgeHot + + + + + ttTabItemLeftEdgeSelected + + + + + ttTabItemLeftEdgeDisabled + + + + + ttTabItemLeftEdgeFocused + + + + + ttTabItemRightEdgeNormal + + + + + ttTabItemRightEdgeHot + + + + + ttTabItemRightEdgeSelected + + + + + ttTabItemRightEdgeDisabled + + + + + ttTabItemRightEdgeFocused + + + + + ttTabItemBothEdgeNormal + + + + + ttTabItemBothEdgeHot + + + + + ttTabItemBothEdgeSelected + + + + + ttTabItemBothEdgeDisabled + + + + + ttTabItemBothEdgeFocused + + + + + ttTopTabItemNormal + + + + + ttTopTabItemHot + + + + + ttTopTabItemSelected + + + + + ttTopTabItemDisabled + + + + + ttTopTabItemFocused + + + + + ttTopTabItemLeftEdgeNormal + + + + + ttTopTabItemLeftEdgeHot + + + + + ttTopTabItemLeftEdgeSelected + + + + + ttTopTabItemLeftEdgeDisabled + + + + + ttTopTabItemLeftEdgeFocused + + + + + ttTopTabItemRightEdgeNormal + + + + + ttTopTabItemRightEdgeHot + + + + + ttTopTabItemRightEdgeSelected + + + + + ttTopTabItemRightEdgeDisabled + + + + + ttTopTabItemRightEdgeFocused + + + + + ttTopTabItemBothEdgeNormal + + + + + ttTopTabItemBothEdgeHot + + + + + ttTopTabItemBothEdgeSelected + + + + + ttTopTabItemBothEdgeDisabled + + + + + ttTopTabItemBothEdgeFocused + + + + + ttPane + + + + + ttBody + + + + + ttAeroWizardBody + + + + + tbsDontCare + + + + + tbsRoot + + + + + tbsBackground + + + + + tbsTabNormal + + + + + tbsTabSelected + + + + + ttbTaskBandDontCare + + + + + ttbTaskBandRoot + + + + + ttbGroupCount + + + + + ttbFlashButton + + + + + ttpFlashButtonGroupMenu + + + + + ttbTaskBarDontCare + + + + + ttbTaskBarRoot + + + + + ttbBackgroundBottom + + + + + ttbBackgroundRight + + + + + ttbBackgroundTop + + + + + ttbBackgroundLeft + + + + + ttbSizingBarBottom + + + + + ttbSizingBarRight + + + + + ttbSizingBarTop + + + + + ttbSizingBarLeft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ttbTaskBarDontCare + + + + + ttbTaskBarDontCare + + + + + ttdTaskDialogDontCare + + + + + ttdTaskDialogRoot + + + + + ttdPrimaryPanel + + + + + ttdMainInstructionPane + + + + + ttdMainIcon + + + + + ttdContentPane + + + + + ttdContentIcon + + + + + ttdExpandedContent + + + + + ttdCommandLinkPane + + + + + ttdSecondaryPanel + + + + + ttdControlPane + + + + + ttdButtonSection + + + + + ttdButtonWrapper + + + + + ttdExpandoText + + + + + ttdExpandoButtonNormal + + + + + ttdExpandoButtonHover + + + + + ttdExpandoButtonPressed + + + + + ttdExpandoButtonExpandedNormal + + + + + ttdExpandoButtonExpandedHover + + + + + ttdExpandoButtonExpandedPressed + + + + + ttdVerificationText + + + + + ttdFootnotePane + + + + + ttdFootnoteArea + + + + + ttdFootnoteSeparator + + + + + ttdExpandedFooterArea + + + + + ttdProgressBar + + + + + ttdImageAlignment + + + + + ttdRadioButtonPane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ttdPrimaryPanel + + + + + ttdMainInstructionPane + + + + + ttdMainIcon + + + + + ttdContentPane + + + + + ttdContentIcon + + + + + ttdExpandedContent + + + + + ttdCommandLinkPane + + + + + ttdSecondaryPanel + + + + + ttdControlPane + + + + + ttdButtonSection + + + + + ttdButtonWrapper + + + + + ttdExpandoText + + + + + ttdExpandoButtonExpandedPressed + + + + + ttdVerificationText + + + + + ttdFootnotePane + + + + + ttdFootnoteArea + + + + + ttdFootnoteSeparator + + + + + ttdExpandedFooterArea + + + + + ttdProgressBar + + + + + ttdImageAlignment + + + + + ttdRadioButtonPane + + + + + ttlTextLabelDontCare + + + + + ttlTextLabelRoot + + + + + ttlTextLabelNormal + + + + + ttlTextLabelDisabled + + + + + + + + + + + ttlTextLabelDisabled + + + + + ttsTextStyleDontCare + + + + + ttsTextStyleRoot + + + + + ttsMainInstruction + + + + + ttsInstruction + + + + + ttsBodyTitle + + + + + ttsBodyText + + + + + ttsSecondaryText + + + + + ttsHyperLinkTextNormal + + + + + ttsHyperLinkTextHot + + + + + ttsHyperLinkTextPressed + + + + + ttsHyperLinkTextDisabled + + + + + ttsExpanded + + + + + ttsLabel + + + + + ttsControlLabelNormal + + + + + ttsControlLabelDisabled + + + + + + + + + + + + + + + + + + + + + + ttsMainInstruction + + + + + ttsInstruction + + + + + ttsBodyTitle + + + + + ttsBodyText + + + + + ttsSecondaryText + + + + + ttsHyperLinkTextDisabled + + + + + ttsExpanded + + + + + ttsLabel + + + + + ttsControlLabelDisabled + + + + + ttsToggleSwitchDontCare + + + + + ttsToggleSwitchRoot + + + + + ttsTrackOffNormal + + + + + ttsTrackOffHot + + + + + ttsTrackOffDisabled + + + + + ttsTrackOnNormal + + + + + ttsTrackOnHot + + + + + ttsTrackOnDisabled + + + + + ttsThumbNormal + + + + + ttsThumbHot + + + + + ttsThumbDisabled + + + + + tsiTextNormal + + + + + tsiTextHot + + + + + tsiTextPressed + + + + + tsiTextDisabled + + + + + tsiAudioNormal + + + + + tsiAudioHot + + + + + tsiAudioPressed + + + + + tsiAudioDisabled + + + + + ttbToolBarDontCare + + + + + ttbToolBarRoot + + + + + ttbButtonNormal + + + + + ttbButtonHot + + + + + ttbButtonPressed + + + + + ttbButtonDisabled + + + + + ttbButtonChecked + + + + + ttbButtonCheckedHot + + + + + ttbButtonNearHot + + + + + ttbButtonOtherSideHot + + + + + ttbDropDownButtonNormal + + + + + ttbDropDownButtonHot + + + + + ttbDropDownButtonPressed + + + + + ttbDropDownButtonDisabled + + + + + ttbDropDownButtonChecked + + + + + ttbDropDownButtonCheckedHot + + + + + ttbDropDownButtonNearHot + + + + + ttbDropDownButtonOtherSideHot + + + + + ttbSplitButtonNormal + + + + + ttbSplitButtonHot + + + + + ttbSplitButtonPressed + + + + + ttbSplitButtonDisabled + + + + + ttbSplitButtonChecked + + + + + ttbSplitButtonCheckedHot + + + + + ttbSplitButtonNearHot + + + + + ttbSplitButtonOtherSideHot + + + + + ttbSplitButtonDropDownNormal + + + + + ttbSplitButtonDropDownHot + + + + + ttbSplitButtonDropDownPressed + + + + + ttbSplitButtonDropDownDisabled + + + + + ttbSplitButtonDropDownChecked + + + + + ttbSplitButtonDropDownCheckedHot + + + + + ttbSplitButtonDropDownNearHot + + + + + ttbSplitButtonDropDownOtherSideHot + + + + + ttbSeparatorNormal + + + + + ttbSeparatorHot + + + + + ttbSeparatorPressed + + + + + ttbSeparatorDisabled + + + + + ttbSeparatorChecked + + + + + ttbSeparatorCheckedHot + + + + + ttbSeparatorNearHot + + + + + ttbSeparatorOtherSideHot + + + + + ttbSeparatorVertNormal + + + + + ttbSeparatorVertHot + + + + + ttbSeparatorVertPressed + + + + + ttbSeparatorVertDisabled + + + + + ttbSeparatorVertChecked + + + + + ttbSeparatorVertCheckedHot + + + + + ttbSeparatorVertNearHot + + + + + ttbSeparatorVertOtherSideHot + + + + + ttbDropDownButtonGlyphNormal + + + + + ttbDropDownButtonGlyphHot + + + + + ttbDropDownButtonGlyphPressed + + + + + ttbDropDownButtonGlyphDisabled + + + + + ttbDropDownButtonGlyphChecked + + + + + ttbDropDownButtonGlyphCheckedHot + + + + + ttbDropDownButtonGlyphNearHot + + + + + ttbDropDownButtonGlyphOtherSideHot + + + + + tttToolTipDontCare + + + + + tttToolTipRoot + + + + + tttStandardNormal + + + + + tttStandardLink + + + + + tttStandardTitleNormal + + + + + tttStandardTitleLink + + + + + tttBaloonNormal + + + + + tttBaloonLink + + + + + tttBaloonTitleNormal + + + + + tttBaloonTitleLink + + + + + tttBaloonStemUpLeft + + + + + tttBaloonStemDownLeft + + + + + tttCloseNormal + + + + + tttCloseHot + + + + + tttClosePressed + + + + + tttBalloonStemUpLeftWall + + + + + tttBalloonStemUpCentered + + + + + tttBalloonStemUpRightWall + + + + + tttBalloonStemDownRightWall + + + + + tttBalloonStemDownCentered + + + + + tttBalloonStemLeftWall + + + + + tttWrenchNormal + + + + + tttWrenchHot + + + + + tttWrenchPressed + + + + + ttbTrackBarDontCare + + + + + ttbTrackBarRoot + + + + + ttbTrack + + + + + ttbTrackVert + + + + + ttbThumbNormal + + + + + ttbThumbHot + + + + + ttbThumbPressed + + + + + ttbThumbFocused + + + + + ttbThumbDisabled + + + + + ttbThumbBottomNormal + + + + + ttbThumbBottomHot + + + + + ttbThumbBottomPressed + + + + + ttbThumbBottomFocused + + + + + ttbThumbBottomDisabled + + + + + ttbThumbTopNormal + + + + + ttbThumbTopHot + + + + + ttbThumbTopPressed + + + + + ttbThumbTopFocused + + + + + ttbThumbTopDisabled + + + + + ttbThumbVertNormal + + + + + ttbThumbVertHot + + + + + ttbThumbVertPressed + + + + + ttbThumbVertFocused + + + + + ttbThumbVertDisabled + + + + + ttbThumbLeftNormal + + + + + ttbThumbLeftHot + + + + + ttbThumbLeftPressed + + + + + ttbThumbLeftFocused + + + + + ttbThumbLeftDisabled + + + + + ttbThumbRightNormal + + + + + ttbThumbRightHot + + + + + ttbThumbRightPressed + + + + + ttbThumbRightFocused + + + + + ttbThumbRightDisabled + + + + + ttbThumbTics + + + + + ttbThumbTicsVert + + + + + ttnTrayNotifyDontCare + + + + + ttnTrayNotifyRoot + + + + + ttnBackground + + + + + ttnAnimBackground + + + + + ttTreeviewDontCare + + + + + ttTreeviewRoot + + + + + ttItemNormal + + + + + ttItemHot + + + + + ttItemSelected + + + + + ttItemDisabled + + + + + ttItemSelectedNotFocus + + + + + ttItemHotSelected + + + + + ttGlyphClosed + + + + + ttGlyphOpened + + + + + ttBranch + + + + + ttHotGlyphClosed + + + + + ttHotGlyphOpen + + + + + twWindowDontCare + + + + + twWindowRoot + + + + + twCaptionActive + + + + + twCaptionInactive + + + + + twCaptionDisabled + + + + + twSmallCaptionActive + + + + + twSmallCaptionInactive + + + + + twSmallCaptionDisabled + + + + + twMinCaptionActive + + + + + twMinCaptionInactive + + + + + twMinCaptionDisabled + + + + + twSmallMinCaptionActive + + + + + twSmallMinCaptionInactive + + + + + twSmallMinCaptionDisabled + + + + + twMaxCaptionActive + + + + + twMaxCaptionInactive + + + + + twMaxCaptionDisabled + + + + + twSmallMaxCaptionActive + + + + + twSmallMaxCaptionInactive + + + + + twSmallMaxCaptionDisabled + + + + + twFrameLeftActive + + + + + twFrameLeftInactive + + + + + twFrameRightActive + + + + + twFrameRightInactive + + + + + twFrameBottomActive + + + + + twFrameBottomInactive + + + + + twSmallFrameLeftActive + + + + + twSmallFrameLeftInactive + + + + + twSmallFrameRightActive + + + + + twSmallFrameRightInactive + + + + + twSmallFrameBottomActive + + + + + twSmallFrameBottomInactive + + + + + twSysButtonNormal + + + + + twSysButtonHot + + + + + twSysButtonPushed + + + + + twSysButtonDisabled + + + + + twMDISysButtonNormal + + + + + twMDISysButtonHot + + + + + twMDISysButtonPushed + + + + + twMDISysButtonDisabled + + + + + twMinButtonNormal + + + + + twMinButtonHot + + + + + twMinButtonPushed + + + + + twMinButtonDisabled + + + + + twMDIMinButtonNormal + + + + + twMDIMinButtonHot + + + + + twMDIMinButtonPushed + + + + + twMDIMinButtonDisabled + + + + + twMaxButtonNormal + + + + + twMaxButtonHot + + + + + twMaxButtonPushed + + + + + twMaxButtonDisabled + + + + + twCloseButtonNormal + + + + + twCloseButtonHot + + + + + twCloseButtonPushed + + + + + twCloseButtonDisabled + + + + + twSmallCloseButtonNormal + + + + + twSmallCloseButtonHot + + + + + twSmallCloseButtonPushed + + + + + twSmallCloseButtonDisabled + + + + + twMDICloseButtonNormal + + + + + twMDICloseButtonHot + + + + + twMDICloseButtonPushed + + + + + twMDICloseButtonDisabled + + + + + twRestoreButtonNormal + + + + + twRestoreButtonHot + + + + + twRestoreButtonPushed + + + + + twRestoreButtonDisabled + + + + + twMDIRestoreButtonNormal + + + + + twMDIRestoreButtonHot + + + + + twMDIRestoreButtonPushed + + + + + twMDIRestoreButtonDisabled + + + + + twHelpButtonNormal + + + + + twHelpButtonHot + + + + + twHelpButtonPushed + + + + + twHelpButtonDisabled + + + + + twMDIHelpButtonNormal + + + + + twMDIHelpButtonHot + + + + + twMDIHelpButtonPushed + + + + + twMDIHelpButtonDisabled + + + + + twHorzScrollNormal + + + + + twHorzScrollHot + + + + + twHorzScrollPushed + + + + + twHorzScrollDisabled + + + + + twHorzThumbNormal + + + + + twHorzThumbHot + + + + + twHorzThumbPushed + + + + + twHorzThumbDisabled + + + + + twVertScrollNormal + + + + + twVertScrollHot + + + + + twVertScrollPushed + + + + + twVertScrollDisabled + + + + + twVertThumbNormal + + + + + twVertThumbHot + + + + + twVertThumbPushed + + + + + twVertThumbDisabled + + + + + twDialog + + + + + twCaptionSizingTemplate + + + + + twSmallCaptionSizingTemplate + + + + + twFrameLeftSizingTemplate + + + + + twSmallFrameLeftSizingTemplate + + + + + twFrameRightSizingTemplate + + + + + twSmallFrameRightSizingTemplate + + + + + twFrameBottomSizingTemplate + + + + + twSmallFrameBottomSizingTemplate + + + + + twFrame + + + + + ecBorderColor + + + + + ecFillColor + + + + + ecTextColor + + + + + ecEdgeLightColor + + + + + ecEdgeHighLightColor + + + + + ecEdgeShadowColor + + + + + ecEdgeDkShadowColor + + + + + ecEdgeFillColor + + + + + ecTransparentColor + + + + + ecGradientColor1 + + + + + ecGradientColor2 + + + + + ecGradientColor3 + + + + + ecGradientColor4 + + + + + ecGradientColor5 + + + + + ecShadowColor + + + + + ecGlowColor + + + + + ecTextBorderColor + + + + + ecTextShadowColor + + + + + ecGlyphTextColor + + + + + ecGlyphTransparentColor + + + + + ecFillColorHint + + + + + ecBorderColorHint + + + + + ecAccentColorHint + + + + + ecTextColorHint + + + + + ecHeading1TextColor + + + + + ecHeading2TextColor + + + + + ecBodyTextColor + + + + + eeRaisedInner + + + + + eeSunkenInner + + + + + eeRaisedOuter + + + + + eeSunkenOuter + + + + + eeBump + + + + + eeEtched + + + + + eeRaised + + + + + eeSunken + + + + + efLeft + + + + + efTop + + + + + efRight + + + + + efBottom + + + + + efTopLeft + + + + + efTopRight + + + + + efBottomLeft + + + + + efBottomRight + + + + + efRect + + + + + efDiagonal + + + + + efDiagonalEndTopLeft + + + + + efDiagonalEndTopRight + + + + + efDiagonalEndBottomLeft + + + + + efDiagonalEndBottomRight + + + + + efMiddle + + + + + efSoft + + + + + efAdjust + + + + + efFlat + + + + + efMono + + + + + emSizing + + + + + emContent + + + + + emCaption + + + + + esMinimum + + + + + esActual + + + + + esStretch + + + + + stfTextColor + + + + + stfBorderColor + + + + + stfBorderSize + + + + + stfShadowColor + + + + + stfShadowOffset + + + + + stfGlowSize + + + + + scBorder + + + + + scButtonDisabled + + + + + scButtonFocused + + + + + scButtonHot + + + + + scButtonNormal + + + + + scButtonPressed + + + + + scCategoryButtons + + + + + scCategoryButtonsGradientBase + + + + + scCategoryButtonsGradientEnd + + + + + scCategoryPanelGroup + + + + + scComboBox + + + + + scComboBoxDisabled + + + + + scEdit + + + + + scEditDisabled + + + + + scGrid + + + + + scGenericBackground + + + + + scGenericGradientBase + + + + + scGenericGradientEnd + + + + + scHintGradientBase + + + + + scHintGradientEnd + + + + + scListBox + + + + + scListBoxDisabled + + + + + scListView + + + + + scPanel + + + + + scPanelDisabled + + + + + scSplitter + + + + + scToolBarGradientBase + + + + + scToolBarGradientEnd + + + + + scTreeView + + + + + scWindow + + + + + sfButtonTextDisabled + + + + + sfButtonTextFocused + + + + + sfButtonTextHot + + + + + sfButtonTextNormal + + + + + sfButtonTextPressed + + + + + sfCaptionTextInactive + + + + + sfCaptionTextNormal + + + + + sfCategoryPanelGroupHeaderHot + + + + + sfCategoryPanelGroupHeaderNormal + + + + + sfCatgeoryButtonsCategoryNormal + + + + + sfCatgeoryButtonsCategorySelected + + + + + sfCatgeoryButtonsHot + + + + + sfCatgeoryButtonsNormal + + + + + sfCatgeoryButtonsSelected + + + + + sfCheckBoxTextDisabled + + + + + sfCheckBoxTextFocused + + + + + sfCheckBoxTextHot + + + + + sfCheckBoxTextNormal + + + + + sfCheckBoxTextPressed + + + + + sfComboBoxItemDisabled + + + + + sfComboBoxItemFocused + + + + + sfComboBoxItemHot + + + + + sfComboBoxItemNormal + + + + + sfComboBoxItemSelected + + + + + sfEditBoxTextDisabled + + + + + sfEditBoxTextFocused + + + + + sfEditBoxTextHot + + + + + sfEditBoxTextNormal + + + + + sfEditBoxTextSelected + + + + + sfGridItemFixedHot + + + + + sfGridItemFixedNormal + + + + + sfGridItemFixedPressed + + + + + sfGridItemNormal + + + + + sfGridItemSelected + + + + + sfGroupBoxTextDisabled + + + + + sfGroupBoxTextNormal + + + + + sfHeaderSectionTextDisabled + + + + + sfHeaderSectionTextHot + + + + + sfHeaderSectionTextNormal + + + + + sfHeaderSectionTextPressed + + + + + sfListItemTextDisabled + + + + + sfListItemTextFocused + + + + + sfListItemTextHot + + + + + sfListItemTextNormal + + + + + sfListItemTextSelected + + + + + sfMenuItemTextDisabled + + + + + sfMenuItemTextHot + + + + + sfMenuItemTextNormal + + + + + sfMenuItemTextSelected + + + + + sfPanelTextDisabled + + + + + sfPanelTextNormal + + + + + sfPopupMenuItemTextDisabled + + + + + sfPopupMenuItemTextHot + + + + + sfPopupMenuItemTextNormal + + + + + sfPopupMenuItemTextSelected + + + + + sfRadioButtonTextDisabled + + + + + sfRadioButtonTextFocused + + + + + sfRadioButtonTextHot + + + + + sfRadioButtonTextNormal + + + + + sfRadioButtonTextPressed + + + + + sfSmCaptionTextInactive + + + + + sfSmCaptionTextNormal + + + + + sfStatusPanelTextDisabled + + + + + sfStatusPanelTextNormal + + + + + sfTabTextActiveDisabled + + + + + sfTabTextActiveHot + + + + + sfTabTextActiveNormal + + + + + sfTabTextInactiveDisabled + + + + + sfTabTextInactiveHot + + + + + sfTabTextInactiveNormal + + + + + sfTextLabelDisabled + + + + + sfTextLabelFocused + + + + + sfTextLabelHot + + + + + sfTextLabelNormal + + + + + sfToolItemTextDisabled + + + + + sfToolItemTextHot + + + + + sfToolItemTextNormal + + + + + sfToolItemTextSelected + + + + + sfTreeItemTextDisabled + + + + + sfTreeItemTextFocused + + + + + sfTreeItemTextHot + + + + + sfTreeItemTextNormal + + + + + sfTreeItemTextSelected + + + + + sfWindowTextDisabled + + + + + sfWindowTextNormal + + + + + sbmLeftToRight + + + + + sbmRightToLeft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Triggers the OnThemeChange event. +DoOnThemeChange calls the user-supplied OnThemeChange event, if it exists; otherwise nothing happens. + + + + + + +Returns the flags set for the current style. +Call GetFlags to obtain the flags that are set for the current style. +GetFlags is the read implementation for the Flags property. + + + + + +Constructs an object and initializes its data before the object is first used. +Vcl.Themes.TCustomStyleServices.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + +Resets the application theme. +ApplyThemeChange is called automatically by the TApplication object whenever the operating system theme is changed. + +Note: ApplyThemeChange is used internally by the VCL and should not be called manually by applications. + + + + + + nil + + + + + +Gets the color reference for a specified TColor. +Use ColorToRGB to convert the Color parameter to its RGB representation. +If Details is not nil, the function returns the system color that is defined for Color under the current style. For example, if Color is clBtnFace, the function returns the system color defined for the button face in the current style, as a TColorRef value. + + + + + + + + +Gets the color reference for a specified TColor. +Use ColorToRGB to convert the Color parameter to its RGB representation. +If Details is not nil, the function returns the system color that is defined for Color under the current style. For example, if Color is clBtnFace, the function returns the system color defined for the button face in the current style, as a TColorRef value. + + + + + + + + + + + + + + + + + + + nil + + + + + +Draws the edge or edges of the rectangle that contains the element in the current style. +Call DrawEdge to draw one or more edges of the given element. +Edge indicates the types of inner and outer edges and Flags specifies the types of borders. + +Note: The first overload of this method is deprecated; use the second overload instead. + + + + + + + + + + nil + + + + + +Draws the edge or edges of the rectangle that contains the element in the current style. +Call DrawEdge to draw one or more edges of the given element. +Edge indicates the types of inner and outer edges and Flags specifies the types of borders. + +Note: The first overload of this method is deprecated; use the second overload instead. + + + + + + + + + $0 + + + + + +Draws the specified element. +Call DrawElement to draw the element specified by Details, using the current style. +R is the rectangle where the element is drawn and ClipRect is a clipping rectangle. + + + + + + + + + nil + + + + + $0 + + + + + +Draws the specified element. +Call DrawElement to draw the element specified by Details, using the current style. +R is the rectangle where the element is drawn and ClipRect is a clipping rectangle. + + + + + + + + + + + +Draws an icon over the given element. +Call DrawIcon to draw the image that resides at the Index index in the image list specified by Images. The icon is drawn in the rectangle specified by R, over the element indicated by Details. + + + + + + + + + + + +Draws the background of the given user interface element's parent. +Call DrawParentBackground to draw the background of a user interface element's parent, using the current style. +If OnlyIfTransparent is True, the drawing is performed only if the element is transparent in the current style. Bounds represents the area to be drawn. + + + + + + + + + + nil + + + + + +Draws the background of the given user interface element's parent. +Call DrawParentBackground to draw the background of a user interface element's parent, using the current style. +If OnlyIfTransparent is True, the drawing is performed only if the element is transparent in the current style. Bounds represents the area to be drawn. + + + + + + + + + + nil + + + + + +Draws the background of the given user interface element's parent. +Call DrawParentBackground to draw the background of a user interface element's parent, using the current style. +If OnlyIfTransparent is True, the drawing is performed only if the element is transparent in the current style. Bounds represents the area to be drawn. + + + + + + + + + + + + $0 + + + + + +Draws text over an element, using the current style. +Call DrawText to draw the S string in the rectangle specified by R. The S string has the format and additional options indicated by the Flags and Options parameters. The drawing is performed with the settings of the current style. + +Note: The first overload of this function is deprecated. Use the following two overloads that use TTextFormat to specify the text formatting. + + + + + + + + + + $1FFFFFFF + + + + + $0 + + + + + +Draws text over an element, using the current style. +Call DrawText to draw the S string in the rectangle specified by R. The S string has the format and additional options indicated by the Flags and Options parameters. The drawing is performed with the settings of the current style. + +Note: The first overload of this function is deprecated. Use the following two overloads that use TTextFormat to specify the text formatting. + + + + + + + + + + + $0 + + + + + +Draws text over an element, using the current style. +Call DrawText to draw the S string in the rectangle specified by R. The S string has the format and additional options indicated by the Flags and Options parameters. The drawing is performed with the settings of the current style. + +Note: The first overload of this function is deprecated. Use the following two overloads that use TTextFormat to specify the text formatting. + + + + + + + + + +Gets the background rectangle of the content area of the element. +Call GetElementContentRect to retrieve the rectangle that contains the background area of a control, when styles are enabled. +Details represents the user interface element from which the information is being retrieved. + + + + + + + + + +Determines the color of the element specified by Details. +GetElementColor determines the color value used for the property determined by ElementColor. + + + + + + + + + + $0 + + + + + +Determines the margins of the element in the current style. +Call GetElementMargins to retrieve the margins of the control specified by Details. + + + + + + + + + + + $0 + + + + + +Determines the margins of the element in the current style. +Call GetElementMargins to retrieve the margins of the control specified by Details. + + + + + + + + + +Determines the region of the element in the current style. +Call GetElementRegion to obtain the region of the element, bounded by the given rectangle. + + + + + + + + + + +Determines the region of the element in the current style. +Call GetElementRegion to obtain the region of the element, bounded by the given rectangle. + + + + + + + + + + $0 + + + + + +Determines the size for the specified part of a control. +Call GetElementSize to obtain the size of the rectangle that contains the part of the control specified by Details. +ElementSize represents the type of size to be returned: minimum, actual, or stretch. + + + + + + + + + + + $0 + + + + + +Determines the size for the specified part of a control. +Call GetElementSize to obtain the size of the rectangle that contains the part of the control specified by Details. +ElementSize represents the type of size to be returned: minimum, actual, or stretch. + + + + + + + +Returns the color defined in the style for the element specified by Color. +Use GetStyleColor to obtain the color defined for a certain control. +For example, if Color is scButtonPressed, GetStyleColor returns the color assigned for the button when it is pressed. +The style colors give you access to the colors used for controls in the current style. There are two categories of style colors. The first category includes colors used for control parts that are rendered directly from an image. In this case, the style color offers you a way to access the color of that image and is purely informational. The second category includes the colors used for controls that are rendered from code at run time (Panel, ListBox, Grid, and so on). + + + + + + + +Returns the font color for the element specified by Font. +Call GetStyleFontColor to obtain the font color defined in the current style for a specific part and state of a control. +For example, if Font is sfEditBoxDisabled, GetStyleFontColor returns the color of the text in an edit box, when the edit box is disabled. + + + + + + + +Returns the system color defined in the current style. +The current style has a set of colors defined for system color constants that resemble the style colors. For instance, you can call GetSystemColor with clBtnFace to obtain the styled color of a button face. + + + + + + + + + + + + +Returns the rectangle that contains the given text, drawn in the current style. +Call GetTextExtent to obtain the rectangle required to draw the given text with the specified formatting in the current style. + + + + + + + + + + + + +Returns the rectangle that contains the given text, drawn in the current style. +Call GetTextExtent to obtain the rectangle required to draw the given text with the specified formatting in the current style. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Determines whether the given element has transparent parts. +Call HasTransparentParts to check whether the element specified by Details has transparent parts in the current style. + + + + + + + +Loads a style from the specified file. +Call LoadFromFile to load a style from the specified file. + + + + + + + +Draws the border of a control. +Call PaintBorder to draw the border of a control using the current style. + + + + + + +Saves the current style settings to the specified file. +Call SaveToFile to save the current style in the specified filename. + + + + + + + + + + + + + + + + + +Checks whether the provided style is a valid style. +Call IsValidStyle to verify whether the style specified by Stream is a valid style. + + + + + + + + +Checks whether the provided style is a valid style. +Call IsValidStyle to verify whether the style specified by Stream is a valid style. + + +Determines whether the operating system supports styles. +Use Available to check whether the operating system supports styles. + + +Determines whether styles are enabled for the current application. +Use Enabled to check whether the current application has styles enabled. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Returns the flags set for the current style. +Use Flags to obtain the flags that are set for the current style. + + + + +Determines whether the current style is a system style. +IsSystemStyle returns True if the current style is a default operating system style, and False if it is a custom style. + + +Returns the name of the current style. +Use Name to obtain a string that represents the name of the current style. This is the same name you can use with StyleManager.SetStyle to activate the style. + + + + +Occurs when the operating system theme changes. +Use the OnThemeChange event to implement custom processing that should occur whenever the operating system theme changes. + + + +TCustomStyleServices is a class that provides access to style functionality. +Use the methods and properties of TCustomStyleServices to get information about a style or to perform painting of custom controls. +Do not instantiate TCustomStyleServices; instead, call the StyleServices function to access the methods and properties of TCustomStyleServices. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Get client height of the system control + + + + + + + Get client width of the system control + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + special property to use CallDefaultProc method + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + [] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Windows + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + +Handles a message from a control. +HandleMessage sends the message received from a control to the style engine. + + + +Parameter + +Meaning + + +Control + +The component that passes the message. + + +Message + +The message that is passed to the engine. + + +DefWndProc + +The default window procedure to be called for the message. + + + +Initializes data about styles and style engines. + +Note: This function is reserved for internal use only. Do not call it directly. + + + + + + + + +Checks whether a file represents a valid style. +IsValidStyle returns True if the file specified by FileName is recognized as a valid style. +The second overload of IsValidStyle returns, in addition, information about the style. + + + +Parameter + +Meaning + + +FileName + +The file name to be verified whether it represents a valid style. + + +StyleInfo + +A record that contains the information about the style. + + + + + + + + +Checks whether a file represents a valid style. +IsValidStyle returns True if the file specified by FileName is recognized as a valid style. +The second overload of IsValidStyle returns, in addition, information about the style. + + + +Parameter + +Meaning + + +FileName + +The file name to be verified whether it represents a valid style. + + +StyleInfo + +A record that contains the information about the style. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + +Loads a style from the specified file. +Note that LoadFromFile does not automatically switch to the loaded style. To do that, call the SetStyle method. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + +Loads a style from the specified resource. +Note that LoadFromResource does not automatically switch to the loaded style. To do that, call the SetStyle method. + + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResType + +A string that identifies the type of resource. + + + + + + + + + + + +Loads a style from the specified resource. +Note that LoadFromResource does not automatically switch to the loaded style. To do that, call the SetStyle method. + + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResType + +A string that identifies the type of resource. + + + + + + + + + +Notifies the style engine of an event that occured. + + + +Parameter + +Meaning + + +Operation + +The action that is performed. + + +Data + +The data on which the operation is executed. + + + + + + +Registers the instance of a style specified by the Style parameter. + + + + + + + + + +Registers a style class with extension, description, and resource type. + + + +Parameter + +Meaning + + +Extension + +A string that specifies the extension used with the style files. + + +Description + +A string that specifies a description of the style. + + +ResourceType + +A string associated with the resource type. + + +StyleClass + +Specifies the style class to be registered. + + + + + + + + + + + +Registers a style class with extension, description, and resource type. + + + +Parameter + +Meaning + + +Extension + +A string that specifies the extension used with the style files. + + +Description + +A string that specifies a description of the style. + + +ResourceType + +A string associated with the resource type. + + +StyleClass + +Specifies the style class to be registered. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Sets the active style by name, instance, or handle. + + + +Parameter + +Meaning + + +Name + +The name of the style to be set as the active style. + + +Style + +A style instance to be set as the active style. + + +Handle + +The handle of the style to be set as the active style, as returned by the LoadFromFile or LoadFromResource method. + + + + + + +Sets the active style by name, instance, or handle. + + + +Parameter + +Meaning + + +Name + +The name of the style to be set as the active style. + + +Style + +A style instance to be set as the active style. + + +Handle + +The handle of the style to be set as the active style, as returned by the LoadFromFile or LoadFromResource method. + + + + + + +Sets the active style by name, instance, or handle. + + + +Parameter + +Meaning + + +Name + +The name of the style to be set as the active style. + + +Style + +A style instance to be set as the active style. + + +Handle + +The handle of the style to be set as the active style, as returned by the LoadFromFile or LoadFromResource method. + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + + + + + +Loads a style from a resource without raising an exception. +TryLoadFromResource returns True if the style was successfully loaded, or False otherwise. + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResType + +A string that identifies the type of resource. + + +Handle + +The handle of the loaded style. + + + + + + + True + + + + + +Sets the style specified by name as the active style, without raising an exception. +TrySetStyle returns True if the style was successfully set as the active style, and False otherwise. + + + +Parameter + +Meaning + + +Name + +A string that specifies the name of the style to be set as active. + + +ShowErrorDialog + +Specifies whether an error dialog box is shown if the style cannot be set as the active style. + + + + + + + + + True + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Uninitializes data about styles and style engines. + +Note: This function is reserved for internal use only. Do not call it directly. + + + + + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + + +Unregisters a style class specified by the StyleClass parameter. + + + + + + +Unregisters the style engine specified by the AEngineClass parameter. + + +Specifies whether the style manager should automatically load all styles of registered types or not. By default, AutoDiscoverStyleResources is set to True. Set it to False if you want to turn off automatic discovery. + + + + +Returns the current style that is set for the application. + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Specifies whether the style engine is enabled. Enabled returns True if the style engine is active, and False otherwise. + + +Returns an instance of the current style engine. + + +Use it to get or set the reference to the style engine class. + + +Returns the flags of the active style. + + +Indicates whether the active style is a custom style. IsCustomStyleActive returns True if the active style is a custom style, and False if the active style is a system style. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Returns an array with the descriptors of all the registered style classes. + + + +Returns an array with the names of all the registered style classes. + + +Returns the native system style, for example, the Windows theme. + + +Embarcadero Technologies does not currently have any additional information. + + + + + +Specifies the type of border to use for the forms in the application. +Use the FormBorderStyle property to specify whether to use the system's border or the current style's border for the forms in the current application. +By default, the border of the current style is used. + + +Enables the animation effect in controls when custom styles are used. +Set the AnimationOnControls property to True to enable the fade effect in controls when the mouse enters or leaves the area of the control. +By default, the value of AnimationOnControls is set to False. + + +Embarcadero Technologies does not currently have any additional information. + + + + +The SystemHooks property allows displaying styled menus, common dialogs and tooltips. +When a style is applied to the VCL application using the TStyleManager, the following values show styled menus, common dialogs and tooltips, according to the set style. +The property includes these values by default: + +shMenus shows styled menus. +shDialogs shows styled common dialogs. (Only for Seattle version and superior). +shToolTips shows tool tips. (Only for Seattle version and superior). +To enable / disable a system hook, just add or remove the value from the enumerated property. +For example: + +Use a TCheckBox to show a styled dialog. +Use the OnClick event from a Button to execute a TOpenDialog component. +Note: Find the Common Dialog components under the Dialogs category of the Tool Palette. + +For Delphi: + +procedure TForm1.CheckBox1Click(Sender: TObject); +begin + if CheckBox1.Checked then + //When checking the checkbox, the value is added to the property and common dialog ares styled. + TStyleManager.SystemHooks := TStyleManager.SystemHooks + [shDialogs] + else + //When unchecking the checkbox, the value is removed from the property and the style does not apply to common dialogs. + TStyleManager.SystemHooks := TStyleManager.SystemHooks - [shDialogs] +end; + +procedure TForm2.Button2Click(Sender: TObject); +begin + OpenDialog1.Execute; //Opens the dialog. +end; + + + +For C++: + +void __fastcall TForm1::CheckBox1Click(TObject *Sender) +{ +if (CheckBox1->Checked) { + //One possible way to add the value. + TStyleManager::SystemHooks = TStyleManager::SystemHooks + (TStyleManager::TSystemHooks() << TStyleManager::TSystemHook::shDialogs); + //Another possible way to add the value. + StyleManager::SystemHooks = TStyleManager::SystemHooks << TStyleManager::TSystemHook::shDialogs; } +else { + //One possible way to remove the value. + TStyleManager::SystemHooks = TStyleManager::SystemHooks - (TStyleManager::TSystemHooks() << TStyleManager::TSystemHook::shDialogs); + //Another possible way to add the value. + TStyleManager::SystemHooks = TStyleManager::SystemHooks >> TStyleManager::TSystemHook::shDialogs; } +} + +void __fastcall TForm1::Button1Click(TObject *Sender) +{ + OpenDialog1->Execute(); //Opens the dialog. +} + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Embarcadero Technologies does not currently have any additional information. + + + + +Eliminates flickering in VCL Style Forms. +Set it to TRUE in project sources for the following scenarios: + +TPanel bevel and caption. +TGraphicControl subtypes, such as TSplitter, TLabel or TImage, on TPanels. +TListBox when you move the horizontal splitter above. +PageControl for the horizontal scroll buttons. +Note: The TListBox does not flicker when resizing the window. + + + +Embarcadero Technologies does not currently have any additional information. + + + + + + + +Handles styles-related operations. +Use TStyleManager to: + +Register and unregister style classes. +Set the active style. +Load styles from files or resources. +Retrieve styles and their descriptors. +Replace and retrieve the style engine. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $52C + + + + + $52D + + + + + $513 + + + + + $648 + + + + + $649 + + + + + $646 + + + + + $647 + + + + + $645 + + + + + $64A + + + + + $64B + + + + + $671 + + + + + $67B + + + + + $67C + + + + + $67D + + + + + $67E + + + + + $67F + + + + + + + + + + + + + nil + + + + + + + + + + + + + + ThemeControl is for use at design time to determine if a TControl should be themed. + This function is generally for use with Graphic controls like TSpeedButton or + TBitBtn to allow them to determine if they should render themed. + + The control to be themed + Returns true if themes are enabled and we're at runtime or if + themes are enabled, the control is in design mode and it's owner is + an unthemed designer. + + + + + + + + + + + + + + + + nil + + + + + + + + + + + + + nil + + + + + + + + + + + nil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/Vcl.WinXCtrls.xml b/Modules/DelphiVCL/doc/Vcl.WinXCtrls.xml new file mode 100644 index 00000000..16049164 --- /dev/null +++ b/Modules/DelphiVCL/doc/Vcl.WinXCtrls.xml @@ -0,0 +1,18734 @@ + + + + $32 + + + + + $32 + + + + + $14 + + + + + $F + + + + + $18 + + + + + $FF000010 + + + + + $FF000008 + + + + + $FF000008 + + + + + $FF000005 + + + + + $32 + + + + + $50 + + + + + $32 + + + + + $C8 + + + + + $F + + + + + $14 + + + + + $10 + + + + + aicBlack + + + + + aicWhite + + + + + aisSmall + + + + + aisMedium + + + + + aisLarge + + + + + aisXLarge + + + + + aitMomentumDots + + + + + aitRotatingSector + + + + + aitSectorRing + + + + + tssOff + + + + + tssOn + + + + + sbiText + + + + + sbiAudio + + + + + svmDocked + + + + + svmOverlay + + + + + svcCollapse + + + + + svcCompact + + + + + svpLeft + + + + + svpRight + + + + + svsOpened + + + + + svsOpening + + + + + svsClosed + + + + + svsClosing + + + + + + + + + + + + + + + + + + + +The base class for TActivityIndicator. +An animated rotating display indicating that the application is performing some activity. +Create the activity indicator, set the color, size and type, and call StartAnimation to start the animation. You can modify the speed of the animation with the FrameDelay property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Loads the appropriate animation frames from resources. +ReloadFrames takes into account the current values IndicatorType, IndicatorSize, and IndicatorColor. + + + + +Displays a single frame of the current activity indicator animation sequence. + + + + +Renders the image of a custom control. +Vcl.WinXCtrls.TCustomActivityIndicator.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + +Respond to control resize. +Vcl.WinXCtrls.TCustomActivityIndicator.Resize inherits from Vcl.Controls.TControl.Resize. All content below this line refers to Vcl.Controls.TControl.Resize. +Respond to control resize. +Resize is called automatically immediately after the control's dimensions change. As implemented in TControl, Resize calls the control's OnResize event handler if it is assigned. + + + +Specifies whether the activity indicator is currently animated. +Default is False. + + + + +Specifies how fast the activity indicator displays its animation sequence. +Set this property to a lower value to speed up the animation. + + + + +The color of the activity indicator. +Possible values are: + +aicBlack: Default. The elements of the indicator are black. +aicWhite: The elements of the indicator are white. + + + +The size of the activity indicator. +Possible values are: + +aisSmall: 24 x 24 pixels. +aisMedium: Default. 32 x 32 pixels. +aisLarge: 48 x 48 pixels. +aisXLarge: 64 x 64 pixels. + + + +The type of the activity indicator. +Possible values are: + +aitMomentumDots : Default. Traditional Windows 8/10 rotating sequence of dots, accelerating and deccelerating in a circular pattern. +aitRotatingSector : Alternating sectors of a segmented ring are highlighted in sequence to indicate activity. +aitSectorRing : Sectors of a segmented ring are highlighted in sequence until the ring is completely highlighted. On the next pass, each sector is displayed in a dimmed state. + + + + + + +Creates an instance of the TCustomActivityIndicator. +Create sets the default values for all the activity indicator properties. + + + + + +Destroys an instance of TCustomControl. +Vcl.WinXCtrls.TCustomActivityIndicator.Destroy inherits from Vcl.Controls.TCustomControl.Destroy. All content below this line refers to Vcl.Controls.TCustomControl.Destroy. +Destroys an instance of TCustomControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it destroys the TCanvas object in its Canvas property. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + +Sets the Animate property to True. + + + + +Sets the Animate property to False. + + + + + + + + +An animated rotating display indicating that the application is performing some activity. +Create the activity indicator, set the color, size and type, and set the Animate property to True to start the animation. You can modify the speed of the animation with the FrameDelay property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TToggleSwitchStateCaptions encapsulates the text strings used to depict the Off and On states. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies the text string to be used when the toggle switch is in the Off state. + + + + + Specifies the text string to be used when the toggle switch is in the On state. + + + + + + + + Internal class used to connect an action to a TToggleSwitch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Protected field that holds reference to the associated client control. + + + + + + + + + + + + + + + + + + + + + + +The base class for TToggleSwitch. +TToggleSwitch implements a clickable control that allows a user to toggle between an On state and an Off state. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Protected field used to control whether mouse clicks should be processed by the control. + + + + + Protected field used to hold the image of the background of the control. This field is used to + support transparency. + + + + + Protected field used to indicate that the control is being manipulated with the mouse instead of + the keyboard. + + + + +Creates the underlying window. +Vcl.WinXCtrls.TCustomToggleSwitch.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + +Initializes the control after it is loaded from a stream. +Vcl.WinXCtrls.TCustomToggleSwitch.Loaded inherits from Vcl.Controls.TControl.Loaded. All content below this line refers to Vcl.Controls.TControl.Loaded. +Initializes the control after it is loaded from a stream. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. +Loaded overrides the inherited method in order to initialize the control from its associated Action. To change the properties the control copies from its action, override the ActionChange method. + + + +Modifies the size of the toggle switch. +AdjustBounds takes into account the size of the toggle switch and the size of the caption text. + + + + + + + + + +Resize and reposition children and self. +Vcl.WinXCtrls.TCustomToggleSwitch.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + +Changes the current state of the toggle switch. + + + + + + + + +Updates the control to reflect changes in its associated action. +Vcl.WinXCtrls.TCustomToggleSwitch.ActionChange inherits from Vcl.Controls.TWinControl.ActionChange. All content below this line refers to Vcl.Controls.TWinControl.ActionChange. +Updates the control to reflect changes in its associated action. +ActionChange is called automatically when the associated action changes. It updates the control to reflect the action's current Caption, Enabled, Hint, Visible, and HelpContext properties and its OnClick event handler. +The Sender parameter is the associated action. The CheckDefaults parameter specifies whether properties and event handlers should be changed if they differ from the default values. When CheckDefaults is true, properties and event handlers are only changed when the current values are the default values (that is, when the values have not been previously changed). When CheckDefaults is false, properties and event handlers are changed, regardless of their current values. + + + + + + +Returns the associated action link class TToggleSwitchActionLink. + + + +Returns the position of the switch portion of the control. +GetGlyphPosition takes into account the size of the switch, the size of the caption text and the alignment. + + + + + + + + +Repaints the control when the keyboard toggles the switch. + + + + +Repaints the toggle switch. + + + + +The caption text of the current toggle switch state. + + + + + + + +Draws the toggle switch. + + + + + + + +Renders the image of a custom control. +Vcl.WinXCtrls.TCustomToggleSwitch.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + +Respond to user click. +Vcl.WinXCtrls.TCustomToggleSwitch.Click inherits from Vcl.Controls.TControl.Click. All content below this line refers to Vcl.Controls.TControl.Click. +Respond to user click. +Click is called automatically when the user left-clicks the control. Component or application code can call Click to simulate a user mouse click. This is often done in menu actions and hotkey handlers. +As implemented in TControl, Click queries whether the OnClick event handler exists and is different from the OnExecute handler for the control's Action. If this is true, the OnClick event handler is called. If this is false, and the Action OnExecute event handler exists, the Action's Execute method is called. Override Click to provide additional behavior. + + + +Responds to losing input focus. +Vcl.WinXCtrls.TCustomToggleSwitch.DoExit inherits from Vcl.Controls.TWinControl.DoExit. All content below this line refers to Vcl.Controls.TWinControl.DoExit. +Responds to losing input focus. +DoExit is called automatically when the control loses the input focus. As implemented in TWinControl, DoExit calls the OnExit event handler, if defined. +Descendant classes that override DoExit should always call the inherited method. + + + + + + + +Responds to a key press. +If the Key is vk_Space, KeyDown sets a flag that KeyUp uses. + + + + + + + +Responds to an end of a key press. +If the Key is vk_Space, the toggle switch changes state. + + + + + + + + + +Responds to a mouse click. +If the Button is mbLeft, MouseDown sets a flag that MouseUp uses. + + + + + + + + + +Responds to a mouse click. +If the Button is mbLeft, the toggle switch changes state. + + + + + + +Setter for the AutoSize property. + + + +Specifies whether the toggle switch caption is displayed on the right or the left side. +Default is taRightJustify. + + + + +Indicates whether the control adjusts its bounds based on the SwitchHeight, SwitchWidth, and StateCaptions properties. +Default is True. + + + + +The color of the toggle switch when it is disabled. +Default is clBtnShadow. + + + + +The color of the toggle switch frame. +Default is clWindowText. + + + + +Indicates whether the toggle switch is in read-only mode. +If True, the user cannot change the state of the toggle switch. You can still change the State programatically. +Default is False. + + + + +The current state of the toggle switch. +Possible values are: + +tssOff: Default. The toggle switch is in the off state. +tssOn: The toggle switch is in the on state. + + + +The captions of the toggle switch. + + + + +Indicates whether to display the captions of the switch. +Default is True. + + + + +The height of the toggle switch excluding the captions. + + + + +The width of the toggle switch excluding the captions. + + + + +The color of the toggle switch thumb. +Default is clWindowText. + + + + +The width of the thumb inside the toggle switch frame. + + + +Specifies the background color of the control. +Use Color to read or change the background color of the control. +If a control's Vcl.Controls.TControl.ParentColor property is True, then changing the Color property of the control's parent automatically changes the Color property of the control. When the value of the Color property is changed, the control's ParentColor property is automatically set to False. +The Color of a TLabel is always the color of the background unless you set TLabel.Transparent to False. + + +Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + +Determines whether the user can tab to a control. +Use the TabStop to allow or disallow access to the control using the Tab key. +If TabStop is True, the control is in the tab order. If TabStop is False, the control is not in the tab order and the user cannot press the TAB key to move to the control. + +Note: TabStop is not meaningful for a form unless the form assigns another form to be its parent. + + + + + +Creates an instance of the TCustomToggleSwitch. +Create sets the default values for all the toggle switch properties. + + + + + +Destroys an instance of TCustomControl. +Vcl.WinXCtrls.TCustomToggleSwitch.Destroy inherits from Vcl.Controls.TCustomControl.Destroy. All content below this line refers to Vcl.Controls.TCustomControl.Destroy. +Destroys an instance of TCustomControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it destroys the TCanvas object in its Canvas property. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + + + + +Indicates how text is aligned within the control. +Vcl.WinXCtrls.TCustomToggleSwitch.GetControlsAlignment inherits from Vcl.Controls.TControl.GetControlsAlignment. All content below this line refers to Vcl.Controls.TControl.GetControlsAlignment. +Indicates how text is aligned within the control. +Use GetControlsAlignment to determine the alignment of the control. For controls that do not have an Alignment property, GetControlsAlignment returns taLeftJustify. + +Note: GetControlsAlignment returns the alignment of text before it is altered by the BiDiMode property. To check whether the alignment should be reversed to reflect the BiDiMode property, call UseRightToLeftAlignment. + + +Indicates whether the toggle switch is in the On state. + + + + + + + + + + + +A clickable control that allows a user to toggle between an On state and an Off state. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal class used to implement custom VCL Style support for the TSearchBox. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TSearchBox implements an edit box with an embedded button displaying a search indicator icon. + Use this control to present an edit box to capture search criteria. When the search indicator icon is clicked or + the Enter key is pressed (Text indicator), the OnInvokeSearch event is generated. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Protected field providing access to the canvas upon which the search indicator button is drawn. + + + + + + + + + + + + LoadImages is used to load the search indicator icons from resources. + + + + + RepaintButton sends a WM_NCPAINT message to the control to instruct the nonclient area of the + control to be repainted. The search indicator is positioned in the nonclient area of the control. + + + + + DrawButton is used to display the search indicator button. + + + + + + + + MouseCancel is used to release mouse capturing when the control loses keyboard focus. + + + + + Event dispatch method used to generate the OnInvokeSearch event. + + + + + + + + + + Property providing access to the internal FCanvas field. Used for drawing search indicator. + + + + + + + + + + + + + + Specifies the width of the search indicator button. + + + + + Specifies the type of indicator icon to display. + sbiText - Magnifier icon to indicate text based searching + sbiAudio - Microphone icon to indicate audio based searching + + + + + This event occurs when the search indicator button is clicked. When SearchIndicator is set to sbiText, + the OnInvokeSearch event also occurs when the Enter key is pressed. + + + + + + + Exception class representing errors in the TRelativePanel control. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TRelativePanelControlItem determines how the associated TControl instance is positioned with respect to the + TRelativePanel or to other sibling controls on the same TRelativePanel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TRelativePanel implements a container control that allows child controls to be positioned relative to the panel + itself, or relative to other child controls of the panel. When a control is placed on a TRelativePanel and the + child control is selected in the Form Designer, the Object Inspector will display several additional properties + at the bottom of the list that determine how the child control will be aligned within the TRelativePanel. + + The TRelativePanel positions child controls by first aligning each control to the panel as specified. Centering + child controls (vertically and horizontally) takes precedence over left-right and top-bottom alignment. Next, + each child control is positioned relative to its sibling controls. The list of child controls is processed in + order. Therefore, if a child control is to be positioned relative to a sibling, the sibling control should + have a lower index in the collection. + + Note, that it is possible to specify relationships between controls that lead to controls being positioned + outside of the TRelativePanel. For example, if Label1 is positioned Above Edit1, but Edit1 is aligned to the + Top of the TRelativePanel, Label1 will not be visible because it will be clipped by the panel. + + + + + + + + Protected method that is used to validate that the specified control is indeed a sibling to the associated TControl. + + + + + + + + + + + + + + + + + + Protected method that returns the TRelativePanel that owns the collection of which this item belongs. + + + + + + + + + + + + + + This method determines if the associated control's width needs to be restored to its previous value. + + + + + This method determines if the associated control's height needs to be restored to its previous value. + + + + + This property is used to store the previous width of the associated control. This value is used in + situations where the control's size is changed because of complementary alignment values being chosen. For + example, AlignLeftWith and AlignRightWith. + + + + + This property is used to store the previous height of the associated control. This value is used + in situations where the control's size is changed because of complementary alignment values being chosen. + For example, AlignTopWith and AlignBottomWith. + + + + + This property provides access to the TControl instance associated with this collection item. + + + + + The associated TControl is positioned to above the sibling control referenced in this property. + + + + + The associated TControl is aligned with the bottom of the sibling control referenced in this property. + + + + + The associated TControl is aligned with the bottom edge of the panel. + + + + + The associated TControl is aligned horizontally centered with the sibling control referenced in this property. + + + + + The associated TControl is centered horizontally in the panel. + + + + + The associated TControl is aligned with the left edge of the sibling control referenced in this property. + + + + + The associated TControl is aligned with the left edge of the panel. + + + + + The associated TControl is aligned with the right edge of the sibling control referenced in this property. + + + + + The associated TControl is aligned with the right edge of the panel. + + + + + The associated TControl is aligned with the top of the sibling control referenced in this property. + + + + + The associated TControl is aligned with the top edge of the panel. + + + + + The associated TControl is aligned vertically centered with the sibling control referenced in this property. + + + + + The associated TControl is centered vertically in the panel. + + + + + The associated TControl is positioned to below of the sibling control referenced in this property. + + + + + The associated TControl is positioned to the left of the sibling control referenced in this property. + + + + + The associated TControl is positioned to the right of the sibling control referenced in this property. + + + + + + + + Internal class used to implement the TRelativePanel.ControlCollection property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Read access method supporting the Controls array property. + + + + + + + + + Read accessor method supporting the Items array property. + + + + + + + TRelativePanelControlItem determines how the associated TControl instance is positioned with respect to the + TRelativePanel or to other sibling controls on the same TRelativePanel. + + + + + + + + This method is used to associate a TControl instance with a particular item in the collection. + + + + + + + + + Protected method overrides inherited method to add typecasting for TRelativePanelControlItem type. + + + + + + + + + + + + + + + + + + + Use this method to add a new item to the collection. + + + + + + TRelativePanelControlItem determines how the associated TControl instance is positioned with respect to the + TRelativePanel or to other sibling controls on the same TRelativePanel. + + + + + + + + Use this method to add a TControl instance to the collection. + + + + + + + + Use this method to remove a TControl instance from the collection. + + + + + + + + Use this method to get the index of the TRelativePanelControlItem instance that is asociated with + the specified TControl. + + + + + + + + + Returns the TRelativePanel that owns the collection. + + + + + + TRelativePanel implements a container control that allows child controls to be positioned relative to the panel + itself, or relative to other child controls of the panel. When a control is placed on a TRelativePanel and the + child control is selected in the Form Designer, the Object Inspector will display several additional properties + at the bottom of the list that determine how the child control will be aligned within the TRelativePanel. + + The TRelativePanel positions child controls by first aligning each control to the panel as specified. Centering + child controls (vertically and horizontally) takes precedence over left-right and top-bottom alignment. Next, + each child control is positioned relative to its sibling controls. The list of child controls is processed in + order. Therefore, if a child control is to be positioned relative to a sibling, the sibling control should + have a lower index in the collection. + + Note, that it is possible to specify relationships between controls that lead to controls being positioned + outside of the TRelativePanel. For example, if Label1 is positioned Above Edit1, but Edit1 is aligned to the + Top of the TRelativePanel, Label1 will not be visible because it will be clipped by the panel. + + + + + + + + Array property that provides access to the individual TControl instances managed by the associated control item. + + + + + Array property that provides access to the individual TRelativePanelControlItem instances in the collection. + + + + + + + + TCustomRelativePanel is the base class for the TRelativePanel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Helper function that returns the index of the specified child control in the ControlCollection. + + + + + + + + + Helper function that sets the index of the specified child control within the ControlCollection. + Changing the index of a child control will affect the alignment process. Child controls are aligned based on + their position in the collection. + + + + + + + + + This property is defined as published in order to support the TSelectionEditor descendant that is responsible for adding the set of new properties to child controls. The custom selection editor also removes the ControlCollection property from the Object Inspector. + + + + + + + + TRelativePanel implements a container control that allows child controls to be positioned relative to the panel + itself, or relative to other child controls of the panel. When a control is placed on a TRelativePanel and the + child control is selected in the Form Designer, the Object Inspector will display several additional properties + at the bottom of the list that determine how the child control will be aligned within the TRelativePanel. + + The TRelativePanel positions child controls by first aligning each control to the panel as specified. Centering + child controls (vertically and horizontally) takes precedence over left-right and top-bottom alignment. Next, + each child control is positioned relative to its sibling controls. The list of child controls is processed in + order. Therefore, if a child control is to be positioned relative to a sibling, the sibling control should + have a lower index in the collection. + + Note, that it is possible to specify relationships between controls that lead to controls being positioned + outside of the TRelativePanel. For example, if Label1 is positioned Above Edit1, but Edit1 is aligned to the + Top of the TRelativePanel, Label1 will not be visible because it will be clipped by the panel. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TCustomSplitView is the base class for TSplitView. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Proteced method used to change the opened and closed state of the control. + + + + + + + + Event dispatch method that generates the OnClosing event. + + + + + Event dispatch method that generates the OnClosed event. + + + + + Event dispatch method that generates the OnOpening event. + + + + + Event dispatch method that generates the OnOpened event. + + + + + Use this property to control the speed of the opening and closing animation. The smaller the + AnimationDelay, the faster the animation. + + + + + Specifies the number of pixels by which the width of the control is adjusted during each step of the + opening and closing animation. + + + + + Specifies the appearance of the control when closed. + svcCollapse - The TSplitView is completely hidden. + svcCompact - A smaller potion of the TSplitView remains visible. + + + + + Specifies the width of the control when closed and CloseStyle is set to svcCompact. + + + + + Specifies how the TSplitView appears when opened. + svmDocked - The control is docked to the left or right edge of the form, and the client area is reduced by the + width of the control. + svmOverlay - The control is displayed on top of the client area of the form. + + + + + Specifies whether the TSplitView is currently open. + + + + + Specifies the width of the TSplitView when in the opened state. + + + + + Specifies whether the TSplitView is placed on the left or right side of the form. + + + + + Specifies whether the control animates the opening and closing process. + + + + + Specifies the current width of the control. + + + + + This event occurs when the TSplitView is closed. + + + + + This event occurs when the TSplitView is starting to close. This event only occurs if UseAnimation is True. + + + + + This event occurs when the TSplitView is opened. + + + + + This event occurs when the TSplitView is starting to open. This event only occurs if UseAnimation is True. + + + + + + + + + + + + + + + Use this method to open the TSplitView. + + + + + Use this method to close the TSplitView. If CloseStyle is set to svcCollapse, the TSplitView will be + completely hidden. If CloseStyle is set to svcCompact, the width of the TSplitView will be changed to the + CompactWidth size. + + + + + + + + + TSplitView implements a container that can be opened and closed. When opened, the TSplitView can be docked to + the left or right edge of the form, or it can be displayed on top of the form's client area. When closed, the + TSplitView can be completely hidden (CloseStyle := svcCollapse), or a smaller portion of the split view can + remain visible (CloseStyle := svcCompact). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules/DelphiVCL/doc/docs.xml b/Modules/DelphiVCL/doc/docs.xml new file mode 100644 index 00000000..d527be1e --- /dev/null +++ b/Modules/DelphiVCL/doc/docs.xml @@ -0,0 +1,19741 @@ + + + + TBitBtn is a push button control that can include a bitmap on its face. +Bitmap buttons exhibit the same behavior as button controls. Use them to initiate actions from forms and dialog boxes. +Bitmap buttons implement properties that specify the bitmap images, along with their appearance and placement on the button. You can choose from predefined bitmap buttons styles or use your own customized bitmap for the button. Although the button can be associated with only one bitmap, the bitmap (glyph property) can be subdivided into four equal-sized portions, which are displayed based on the state of the button: up, down, disabled, and clicked. +The Kind property of TBitBtn provides commonly used buttons, such as OK, Cancel, Help, and so on. These predefined button types have corresponding graphical images and default behaviors, so you can easily add them to your application with little or no coding necessary. +The recommended way to implement the response of other button kinds to user clicks is to assign an action from an action list as the value of the Action property. By setting the Action property, you make the button a client of the action, and the action handles updating the button's properties and responding when the user clicks the button. +If you are not using the built-in response to a specific kind of button or an action to respond when the user clicks the button, then you can specify the button's response by writing an OnClick event handler. + + + Updates the button control to reflect changes in its associated action. +Vcl.Buttons.TBitBtn.ActionChange inherits from Vcl.StdCtrls.TButtonControl.ActionChange. All content below this line refers to Vcl.StdCtrls.TButtonControl.ActionChange. +Updates the button control to reflect changes in its associated action. +ActionChange is called automatically when the associated action changes. It updates the button control to reflect the action's current Checked state. Then it calls the inherited method, which checks the associated properties for that client type. +The Sender parameter is the associated action. The CheckDefaults parameter specifies whether properties and event handlers should be changed if they differ from the default values. When CheckDefaults is true, properties and event handlers are only changed when the current values are the default values (that is, when the values have not been previously changed). When CheckDefaults is false, properties and event handlers are changed, regardless of their current values. + + + Copy any TGraphic from a TImageList into the Glyph property of a TBitBtn. +CopyImage can be used to display any TGraphic on a TBitBtn. You can use any image that can be loaded into an imagelist using an Image List Editor. + + + Creates underlying screen object. +Vcl.Buttons.TBitBtn.CreateHandle inherits from Vcl.Controls.TWinControl.CreateHandle. All content below this line refers to Vcl.Controls.TWinControl.CreateHandle. +Creates underlying screen object. +CreateHandle creates the Microsoft Windows screen object that underlies the control. if it does not already exist. The new window handle becomes the value of the Handle property. +CreateHandle creates or locates the parent control's window before it creates a window for the control itself. + +Note: If the Parent property is nil (Delphi) or NULL (C++), CreateHandle raises an exception. + + + Initializes a window-creation parameter data structure. +Vcl.Buttons.TBitBtn.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + Returns the appropriate action link class that is associated with button controls. +Vcl.Buttons.TBitBtn.GetActionLinkClass inherits from Vcl.StdCtrls.TButtonControl.GetActionLinkClass. All content below this line refers to Vcl.StdCtrls.TButtonControl.GetActionLinkClass. +Returns the appropriate action link class that is associated with button controls. +GetActionLinkClass is used to get the appropriate class type for the action link used with button controls. GetActionLinkClass is used internally to create action link objects for clients when a button control has an associated action. The action link is used to link the action to the button control client. Each Action link class type is designed to link specific actions to clients based upon the types of properties the client supports. For button controls, GetActionLinkClass returns the TButtonActionLink class type. + + + Returns the handle to a palette for use by the control. +Vcl.Buttons.TBitBtn.GetPalette inherits from Vcl.Controls.TControl.GetPalette. All content below this line refers to Vcl.Controls.TControl.GetPalette. +Returns the handle to a palette for use by the control. +As implemented in TControl, GetPalette returns a null handle, indicating that the control does not have a palette. Override GetPalette to implement derived objects that use a palette. Create a palette handle for the control by a call to the Windows API function CreatePalette. GetPalette should return the palette handle for the control. +Specifying the palette for a control tells the application that the control's palette needs to be realized and designates the palette to use for realization. +GetPalette is called only if the run-time video mode requires color palette support, for example, in 256-color mode. + + + Sets the Style property for a button. +Vcl.Buttons.TBitBtn.SetButtonStyle inherits from Vcl.StdCtrls.TCustomButton.SetButtonStyle. All content below this line refers to Vcl.StdCtrls.TCustomButton.SetButtonStyle. +Sets the Style property for a button. +The SetButtonStyle method is called to change the Style property according to the button's state, whenever a button changes its focus state. + + + Called when the StyleElements property changes. +Vcl.Buttons.TBitBtn.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + Rebuilds the image list associated with the button. +Vcl.Buttons.TBitBtn.UpdateImageList inherits from Vcl.StdCtrls.TCustomButton.UpdateImageList. All content below this line refers to Vcl.StdCtrls.TCustomButton.UpdateImageList. +Rebuilds the image list associated with the button. +The UpdateImageList method is called to update the image list associated with the button control. + + + Updates the image list associated with the button. +Vcl.Buttons.TBitBtn.UpdateImages inherits from Vcl.StdCtrls.TCustomButton.UpdateImages. All content below this line refers to Vcl.StdCtrls.TCustomButton.UpdateImages. +Updates the image list associated with the button. +The UpdateImages method is called to add images to the image list associated with the button control. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Constructs an instance of the button control and initializes its values. +Use Create to programmatically instantiate a button. Buttons added using the form designer are created automatically. +The AOwner parameter specifies the component, typically a form, that is responsible for freeing the button. + + + Destroys the bitmap button object. +Do not call Destroy directly in an application. Instead, call Free. Free checks that the bitmap button is not nil, and only then calls Destroy. + + + Simulates a mouse click, as if the user had clicked the button. +Use Click to simulate a mouse click. Click performs the following tasks: + +If the value of the Kind property is bkClose, Click closes the form. +If the value of Kind is bkHelp, Click displays the Help screen assigned with the HelpContext property. +Any associated action fires, or, if there is no associated action, any code attached to the OnClick event is executed. + + + Specifies the bitmap that appears on the bitmap button. +Use the Open dialog box that appears as an editor in the Object Inspector to choose a bitmap file (with a .BMP extension) to use on the button, or specify a TBitmap object at runtime. +You can provide up to four images within a single bitmap. All images must be the same size and next to each other in a row. Bit buttons display one of these images depending on their state. + + + + + +Image position + +Button state + +Description + + + +First + + + +Up + + + +This image appears when the button is up (unselected). This image is also used when the button has focus (for example, if the user tabs to it); in this case, a focus rectangle is drawn around the button. If no other images exist in the bitmap, bit buttons also use this image for all other states. + + + + +Second + + + +Disabled + + + +This image usually appears dimmed to indicate that the button can't be selected. + + + + +Third + + + +Clicked + + + +This image appears when the button is clicked. The Up image reappears when the user releases the mouse button. + + + + +Fourth + + + +Down + + + +This image appears when the button stays down (indicating that it remains selected). + + + + +If only one image is present, bit buttons attempt to represent the other states by altering the image slightly for the different states, although the Down state is always the same as the Up state. If you aren't satisfied with the results, you can provide additional images in the bitmap. +If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the Num Glyphs property. + +Note: The lower left pixel of the bitmap is reserved for the "transparent" color. Any pixel in the bitmap which matches that lower left pixel will be transparent. + + + Specifies the kind of bitmap button. +Use Kind to specify the appearance of the TBitBtn control and its response when the user clicks the button. A standard set of buttons are included and operate as expected without the addition of code. However, you can write additional code in the button events, if you want to. This does not include the Custom button kind, which can be programmed in any way you like. +The images (such as the green check mark on the OK button) appear on the button when using this version of TBitBtn. + + + Specifies where the image appears on the bitmap button. +Layout indicates whether the text appears on the left of the button (blGlyphLeft), the right of the button (blGlyphRight), the top (blGlyphTop) or the bottom (blGlyphBottom). + + + Specifies the number of pixels between the edge of the image (specified in the Glyph property) and the edge of the button. +The margin is the space between the image edge and the button edge. The format of the edges depends on the layout of the image and text (specified in the Layout property). For example, if Layout is blGlyphLeft, the margin appears between the left edge of the image and the left edge of the button. If Margin is 3, three pixels separate the image and the button edges. If Margin is 0, there is no space between the image and the button edges. +If Margin is -1 (the default value), the image and text (specified in the Caption property) are centered. The number of pixels between the image and button edge is equal to the number of pixels between the opposite edge of the button and the text. + + + Indicates the number of images that are in the graphic specified in the Glyph property. +If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the NumGlyphs property. The default value is 1. + + + Determines the appearance of a bitmap button. +Style indicates whether the TBitBtn control uses the modern button look, or reflects the look of a 16-bit Windows pushbutton. + + + Determines where the image and text appear on a bitmap or speed button. +Spacing determines the number of pixels between the image (specified in the Glyph property) and the text (specified in the Caption property). The default value is 4 pixels. +If Spacing is a positive number, its value is the number of pixels between the image and text. If Spacing is 0, no pixels will be between the image and text. If Spacing is -1, the text appears centered between the image and the button edge. The number of pixels between the image and text is equal to the number of pixels between the text and the button edge opposite the glyph. + + + + + The usual list of actions (without published properties) in VCL + + + TActionList maintains a list of actions that can be used by components and controls such as menu items and buttons. +Use Action lists to centralize the response to user commands (actions). Action list components maintain a list of actions that are available to the client controls in an application. Add action list components to your form or data module from the standard page of the component palette. Double-click the action list to display the Action List editor, from which you can add, delete, and rearrange actions. + +Note: While it is possible to maintain the actions for an application using TActionList, it can be simpler to use Vcl.ActnMan.TActionManager instead. + + + This class is designed to communicate with some of the object in VCL + + + List of additional combinations of hot keys in VCL + + + TCustomAction is the base class for VCL actions intended to be used with menu items and controls. +TCustomAction introduces support for the properties, events, and methods of menu items and controls that are clients of action objects. +Most properties and events introduced in TCustomAction are public; therefore, use TCustomAction as a base class when deriving your own actions that publish specific subset of properties of associated controls. +Action objects centralize the response to user commands (actions) and represent user interface elements in applications that use actions. They provide an easy way to synchronize, for example, the enabled state and caption of a speed button and a menu item, and handle the response when users click these components. Each such component, called the client, has its properties dynamically updated by the action and forwards user actions to the action for a response. +At design time, you can work in the Action List editor with actions contained in an action list or in the Action Manager editor of the action manager. The action list or action manager is a container for actions, which it organizes into categories. +Component and control public properties and events that are supported in TCustomAction, either directly or through an ancestor, are: + +Caption +Checked +Enabled +HelpType +HelpContext +HelpKeyword +Hint +ImageIndex +ShortCut +Visible +OnHint +OnUpdate +OnExecute +Because the OnHint, OnUpdate, and OnExecute events are public, they do not appear in the Object Inspector. That is, the Object Inspector does not support generating custom event handlers for these events. +TCustomAction can also act as the base class for predefined action classes. You can derive from TCustomAction if you want to retain the public scope of supported properties and events or modify the public scope to the published scope. +For predefined actions that augment the behavior of TCustomAction, see the action classes in the Vcl.StdActns, Vcl.DBActns, and Vcl.ExtActns units. + + + Copies the properties of this action to a destination object. +AssignTo is overridden so that existing objects of type TCustomAction can be copied to other action objects of the same type. AssignTo ensures the correct assignment of property values. + + + Creates the TShortCutList object for the action. +CreateShortCutList creates an empty VCL shortcut list object for the current action. +Notice that implementations of shortcuts are FireMonkey or VCL framework-specific. + + + Sets the new Value of the ImageIndex property for the action and action's clients. +Vcl.ActnList.TCustomAction.SetImageIndex inherits from System.Actions.TContainedAction.SetImageIndex. All content below this line refers to System.Actions.TContainedAction.SetImageIndex. +Sets the new Value of the ImageIndex property for the action and action's clients. +SetImageIndex always propagates this Value to all clients of the action. + + + Generates an OnChange event. +Vcl.ActnList.TCustomAction.Change inherits from System.Classes.TBasicAction.Change. All content below this line refers to System.Classes.TBasicAction.Change. +Generates an OnChange event. +Change is called automatically when the action's properties change. This method calls the OnChange event handler, if one is assigned. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +Vcl.ActnList.TCustomAction.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Instantiates and initializes a VCL TCustomAction object. +Applications do not need to call the constructor directly. Actions are created automatically when you add them to an action manager (in the Action Manager editor) or action list component (in the Action List editor) at design time. +If you want to create an action at run time, assign a +TActionList or TActionManager component to its ActionList property after calling Create. +AOwner is the component that is responsible for freeing the action. It becomes the value of the Owner property. +Create simply calls an inherited System.Actions.TContainedAction.Create constructor. + + + Frees an instance of TCustomAction. +Do not call the destructor directly in an application. Instead, call Free. Free ensures that the action is not nil before calling the destructor. +If the action is contained in an action list or action manager, Destroy removes the action from that list. + + + Responds when a client control "fires". +Execute is called automatically when a client control "fires" (for example, when the user clicks a button or selects a menu item). It returns True if an event handler is found to handle the action, False if there was no event handler or if the action was not enabled. +Execute first ensures that the action is updated. Then, if the Enabled property is True, it attempts to handle the action by generating an OnExecute event on the action list that contains this action (if the action belongs to an action list). If the action list's OnExecute event handler does not handle the action, Execute generates an OnActionExecute event on the application itself. If neither the action list nor the application handles the action in response to these events, Execute generates an OnExecute event on itself. If this action has no OnExecute event handler, Execute instructs the application to locate the current target control and call the ExecuteTarget method, which is the mechanism by which predefined action classes perform their function. + + + Provides an opportunity to execute centralized code when an application is idle. +Vcl.ActnList.TCustomAction.Update inherits from System.Classes.TBasicAction.Update. All content below this line refers to System.Classes.TBasicAction.Update. +Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Embarcadero Technologies does not currently have any additional information. + + + Displays the name of linked items from the Image Collection. + + + Holds the action list to which the action belongs. +Vcl.ActnList.TCustomAction.ActionList inherits from System.Actions.TContainedAction.ActionList. All content below this line refers to System.Actions.TContainedAction.ActionList. +Holds the action list to which the action belongs. + + + + + TAction is the base class for VCL action objects. TAction implements actions to be used with menu items and controls. The published properties and events of TAction actions can be managed in the Object Inspector at design time. +The TAction class is almost the same as TCustomAction. TAction extends only the following features of TCustomAction: + +Changes the public scope to published for the AutoCheck, Caption, Checked, Enabled, GroupIndex, HelpType, HelpContext, HelpKeyword, Hint, ImageIndex, SecondaryShortCuts, ShortCut, and Visible properties. +Sets the published scope for the OnExecute, OnUpdate, and OnHint events. +The published scope of these properties and events provides the possibility to use the Object Inspector assistance for editing values of these properties and events. +The DisableIfNoHandler property is set to True while an action is created, that is, the action is inaccessible if it does not have an OnExecute event handler. +TAction is a generic action component. It can be added to action lists when there is no predefined action class that implements the desired response to user commands. Unlike predefined action classes, which have built-in methods that respond when users click the client controls, TAction has no built-in response to user commands. Instead, when using TAction, you can provide the response when the action "fires" by writing (using the Object Inspector's assistance) an OnExecute event handler, and configure the properties of TAction to reflect the current conditions by writing an OnUpdate event handler. +Action objects are used to centralize the response to user commands (actions) and to represent user interface elements in applications that use action lists or action bands. +TAction can also act as a base class for predefined action classes. You can derive from TAction if you want to retain the published scope of the supported properties and events. If you want to use the public scope to some of the supported properties and events, you can derive from TCustomAction. +For predefined actions that augment the behavior of TAction, see the action classes in the Vcl.StdActns, Vcl.DBActns, and Vcl.ExtActns units. + + + Creates and initializes a TAction object. +Applications do not usually create action objects explicitly. Actions are created automatically when you add them to an action manager or action list component at design time. When instantiating TAction at run time, assign a TActionList or TActionManager component to the new action's ActionList property after calling Create. +Create sets the DisableIfNoHandler to True, that is, the action is inaccessible if it does not have an OnExecute event handler. + + + + + The base class for TActivityIndicator. +An animated rotating display indicating that the application is performing some activity. +Create the activity indicator, set the color, size and type, and call StartAnimation to start the animation. You can modify the speed of the animation with the FrameDelay property. + + + Loads the appropriate animation frames from resources. +ReloadFrames takes into account the current values IndicatorType, IndicatorSize, and IndicatorColor. + + + Displays a single frame of the current activity indicator animation sequence. + + + Renders the image of a custom control. +Vcl.WinXCtrls.TCustomActivityIndicator.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + Respond to control resize. +Vcl.WinXCtrls.TCustomActivityIndicator.Resize inherits from Vcl.Controls.TControl.Resize. All content below this line refers to Vcl.Controls.TControl.Resize. +Respond to control resize. +Resize is called automatically immediately after the control's dimensions change. As implemented in TControl, Resize calls the control's OnResize event handler if it is assigned. + + + Specifies whether the activity indicator is currently animated. +Default is False. + + + Specifies how fast the activity indicator displays its animation sequence. +Set this property to a lower value to speed up the animation. + + + The color of the activity indicator. +Possible values are: + +aicBlack: Default. The elements of the indicator are black. +aicWhite: The elements of the indicator are white. + + + The size of the activity indicator. +Possible values are: + +aisSmall: 24 x 24 pixels. +aisMedium: Default. 32 x 32 pixels. +aisLarge: 48 x 48 pixels. +aisXLarge: 64 x 64 pixels. + + + The type of the activity indicator. +Possible values are: + +aitMomentumDots : Default. Traditional Windows 8/10 rotating sequence of dots, accelerating and deccelerating in a circular pattern. +aitRotatingSector : Alternating sectors of a segmented ring are highlighted in sequence to indicate activity. +aitSectorRing : Sectors of a segmented ring are highlighted in sequence until the ring is completely highlighted. On the next pass, each sector is displayed in a dimmed state. + + + Creates an instance of the TCustomActivityIndicator. +Create sets the default values for all the activity indicator properties. + + + Destroys an instance of TCustomControl. +Vcl.WinXCtrls.TCustomActivityIndicator.Destroy inherits from Vcl.Controls.TCustomControl.Destroy. All content below this line refers to Vcl.Controls.TCustomControl.Destroy. +Destroys an instance of TCustomControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it destroys the TCanvas object in its Canvas property. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + Sets the Animate property to True. + + + Sets the Animate property to False. + + + + + An animated rotating display indicating that the application is performing some activity. +Create the activity indicator, set the color, size and type, and set the Animate property to True to start the animation. You can modify the speed of the animation with the FrameDelay property. + + + TToggleSwitchStateCaptions encapsulates the text strings used to depict the Off and On states. + + + Specifies the text string to be used when the toggle switch is in the Off state. + + + Specifies the text string to be used when the toggle switch is in the On state. + + + + + Internal class used to connect an action to a TToggleSwitch + + + Protected field that holds reference to the associated client control. + + + + + The base class for TToggleSwitch. +TToggleSwitch implements a clickable control that allows a user to toggle between an On state and an Off state. + + + Protected field used to control whether mouse clicks should be processed by the control. + + + Protected field used to hold the image of the background of the control. This field is used to + support transparency. + + + Protected field used to indicate that the control is being manipulated with the mouse instead of + the keyboard. + + + Creates the underlying window. +Vcl.WinXCtrls.TCustomToggleSwitch.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + Initializes the control after it is loaded from a stream. +Vcl.WinXCtrls.TCustomToggleSwitch.Loaded inherits from Vcl.Controls.TControl.Loaded. All content below this line refers to Vcl.Controls.TControl.Loaded. +Initializes the control after it is loaded from a stream. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. +Loaded overrides the inherited method in order to initialize the control from its associated Action. To change the properties the control copies from its action, override the ActionChange method. + + + Modifies the size of the toggle switch. +AdjustBounds takes into account the size of the toggle switch and the size of the caption text. + + + Resize and reposition children and self. +Vcl.WinXCtrls.TCustomToggleSwitch.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Changes the current state of the toggle switch. + + + Updates the control to reflect changes in its associated action. +Vcl.WinXCtrls.TCustomToggleSwitch.ActionChange inherits from Vcl.Controls.TWinControl.ActionChange. All content below this line refers to Vcl.Controls.TWinControl.ActionChange. +Updates the control to reflect changes in its associated action. +ActionChange is called automatically when the associated action changes. It updates the control to reflect the action's current Caption, Enabled, Hint, Visible, and HelpContext properties and its OnClick event handler. +The Sender parameter is the associated action. The CheckDefaults parameter specifies whether properties and event handlers should be changed if they differ from the default values. When CheckDefaults is true, properties and event handlers are only changed when the current values are the default values (that is, when the values have not been previously changed). When CheckDefaults is false, properties and event handlers are changed, regardless of their current values. + + + Returns the associated action link class TToggleSwitchActionLink. + + + Returns the position of the switch portion of the control. +GetGlyphPosition takes into account the size of the switch, the size of the caption text and the alignment. + + + Repaints the control when the keyboard toggles the switch. + + + Repaints the toggle switch. + + + The caption text of the current toggle switch state. + + + Draws the toggle switch. + + + Renders the image of a custom control. +Vcl.WinXCtrls.TCustomToggleSwitch.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + Respond to user click. +Vcl.WinXCtrls.TCustomToggleSwitch.Click inherits from Vcl.Controls.TControl.Click. All content below this line refers to Vcl.Controls.TControl.Click. +Respond to user click. +Click is called automatically when the user left-clicks the control. Component or application code can call Click to simulate a user mouse click. This is often done in menu actions and hotkey handlers. +As implemented in TControl, Click queries whether the OnClick event handler exists and is different from the OnExecute handler for the control's Action. If this is true, the OnClick event handler is called. If this is false, and the Action OnExecute event handler exists, the Action's Execute method is called. Override Click to provide additional behavior. + + + Responds to losing input focus. +Vcl.WinXCtrls.TCustomToggleSwitch.DoExit inherits from Vcl.Controls.TWinControl.DoExit. All content below this line refers to Vcl.Controls.TWinControl.DoExit. +Responds to losing input focus. +DoExit is called automatically when the control loses the input focus. As implemented in TWinControl, DoExit calls the OnExit event handler, if defined. +Descendant classes that override DoExit should always call the inherited method. + + + Responds to a key press. +If the Key is vk_Space, KeyDown sets a flag that KeyUp uses. + + + Responds to an end of a key press. +If the Key is vk_Space, the toggle switch changes state. + + + Responds to a mouse click. +If the Button is mbLeft, MouseDown sets a flag that MouseUp uses. + + + Responds to a mouse click. +If the Button is mbLeft, the toggle switch changes state. + + + Setter for the AutoSize property. + + + Specifies whether the toggle switch caption is displayed on the right or the left side. +Default is taRightJustify. + + + Indicates whether the control adjusts its bounds based on the SwitchHeight, SwitchWidth, and StateCaptions properties. +Default is True. + + + The color of the toggle switch when it is disabled. +Default is clBtnShadow. + + + The color of the toggle switch frame. +Default is clWindowText. + + + Indicates whether the toggle switch is in read-only mode. +If True, the user cannot change the state of the toggle switch. You can still change the State programatically. +Default is False. + + + The current state of the toggle switch. +Possible values are: + +tssOff: Default. The toggle switch is in the off state. +tssOn: The toggle switch is in the on state. + + + The captions of the toggle switch. + + + Indicates whether to display the captions of the switch. +Default is True. + + + The height of the toggle switch excluding the captions. + + + The width of the toggle switch excluding the captions. + + + The color of the toggle switch thumb. +Default is clWindowText. + + + The width of the thumb inside the toggle switch frame. + + + Specifies the background color of the control. +Use Color to read or change the background color of the control. +If a control's Vcl.Controls.TControl.ParentColor property is True, then changing the Color property of the control's parent automatically changes the Color property of the control. When the value of the Color property is changed, the control's ParentColor property is automatically set to False. +The Color of a TLabel is always the color of the background unless you set TLabel.Transparent to False. + + + Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + + Determines whether the user can tab to a control. +Use the TabStop to allow or disallow access to the control using the Tab key. +If TabStop is True, the control is in the tab order. If TabStop is False, the control is not in the tab order and the user cannot press the TAB key to move to the control. + +Note: TabStop is not meaningful for a form unless the form assigns another form to be its parent. + + + Creates an instance of the TCustomToggleSwitch. +Create sets the default values for all the toggle switch properties. + + + Destroys an instance of TCustomControl. +Vcl.WinXCtrls.TCustomToggleSwitch.Destroy inherits from Vcl.Controls.TCustomControl.Destroy. All content below this line refers to Vcl.Controls.TCustomControl.Destroy. +Destroys an instance of TCustomControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it destroys the TCanvas object in its Canvas property. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + Indicates how text is aligned within the control. +Vcl.WinXCtrls.TCustomToggleSwitch.GetControlsAlignment inherits from Vcl.Controls.TControl.GetControlsAlignment. All content below this line refers to Vcl.Controls.TControl.GetControlsAlignment. +Indicates how text is aligned within the control. +Use GetControlsAlignment to determine the alignment of the control. For controls that do not have an Alignment property, GetControlsAlignment returns taLeftJustify. + +Note: GetControlsAlignment returns the alignment of text before it is altered by the BiDiMode property. To check whether the alignment should be reversed to reflect the BiDiMode property, call UseRightToLeftAlignment. + + + Indicates whether the toggle switch is in the On state. + + + + + A clickable control that allows a user to toggle between an On state and an Off state. + + + Internal class used to implement custom VCL Style support for the TSearchBox. + + + TSearchBox implements an edit box with an embedded button displaying a search indicator icon. + Use this control to present an edit box to capture search criteria. When the search indicator icon is clicked or + the Enter key is pressed (Text indicator), the OnInvokeSearch event is generated. + + + Protected field providing access to the canvas upon which the search indicator button is drawn. + + + LoadImages is used to load the search indicator icons from resources. + + + RepaintButton sends a WM_NCPAINT message to the control to instruct the nonclient area of the + control to be repainted. The search indicator is positioned in the nonclient area of the control. + + + DrawButton is used to display the search indicator button. + + + MouseCancel is used to release mouse capturing when the control loses keyboard focus. + + + Event dispatch method used to generate the OnInvokeSearch event. + + + Property providing access to the internal FCanvas field. Used for drawing search indicator. + + + Specifies the width of the search indicator button. + + + Specifies the type of indicator icon to display. + sbiText - Magnifier icon to indicate text based searching + sbiAudio - Microphone icon to indicate audio based searching + + + This event occurs when the search indicator button is clicked. When SearchIndicator is set to sbiText, + the OnInvokeSearch event also occurs when the Enter key is pressed. + + + + + Exception class representing errors in the TRelativePanel control. + + + TRelativePanelControlItem determines how the associated TControl instance is positioned with respect to the + TRelativePanel or to other sibling controls on the same TRelativePanel. + + + Protected method that is used to validate that the specified control is indeed a sibling to the associated TControl. + + + Protected method that returns the TRelativePanel that owns the collection of which this item belongs. + + + This method determines if the associated control's width needs to be restored to its previous value. + + + This method determines if the associated control's height needs to be restored to its previous value. + + + This property is used to store the previous width of the associated control. This value is used in + situations where the control's size is changed because of complementary alignment values being chosen. For + example, AlignLeftWith and AlignRightWith. + + + This property is used to store the previous height of the associated control. This value is used + in situations where the control's size is changed because of complementary alignment values being chosen. + For example, AlignTopWith and AlignBottomWith. + + + This property provides access to the TControl instance associated with this collection item. + + + The associated TControl is positioned to above the sibling control referenced in this property. + + + The associated TControl is aligned with the bottom of the sibling control referenced in this property. + + + The associated TControl is aligned with the bottom edge of the panel. + + + The associated TControl is aligned horizontally centered with the sibling control referenced in this property. + + + The associated TControl is centered horizontally in the panel. + + + The associated TControl is aligned with the left edge of the sibling control referenced in this property. + + + The associated TControl is aligned with the left edge of the panel. + + + The associated TControl is aligned with the right edge of the sibling control referenced in this property. + + + The associated TControl is aligned with the right edge of the panel. + + + The associated TControl is aligned with the top of the sibling control referenced in this property. + + + The associated TControl is aligned with the top edge of the panel. + + + The associated TControl is aligned vertically centered with the sibling control referenced in this property. + + + The associated TControl is centered vertically in the panel. + + + The associated TControl is positioned to below of the sibling control referenced in this property. + + + The associated TControl is positioned to the left of the sibling control referenced in this property. + + + The associated TControl is positioned to the right of the sibling control referenced in this property. + + + + + Internal class used to implement the TRelativePanel.ControlCollection property. + + + Read access method supporting the Controls array property. + + + Read accessor method supporting the Items array property. + + + This method is used to associate a TControl instance with a particular item in the collection. + + + Protected method overrides inherited method to add typecasting for TRelativePanelControlItem type. + + + Use this method to add a new item to the collection. + + + Use this method to add a TControl instance to the collection. + + + Use this method to remove a TControl instance from the collection. + + + Use this method to get the index of the TRelativePanelControlItem instance that is asociated with + the specified TControl. + + + Returns the TRelativePanel that owns the collection. + + + Array property that provides access to the individual TControl instances managed by the associated control item. + + + Array property that provides access to the individual TRelativePanelControlItem instances in the collection. + + + + + TCustomRelativePanel is the base class for the TRelativePanel. + + + Helper function that returns the index of the specified child control in the ControlCollection. + + + Helper function that sets the index of the specified child control within the ControlCollection. + Changing the index of a child control will affect the alignment process. Child controls are aligned based on + their position in the collection. + + + This property is defined as published in order to support the TSelectionEditor descendant that is responsible for adding the set of new properties to child controls. The custom selection editor also removes the ControlCollection property from the Object Inspector. + + + + + TRelativePanel implements a container control that allows child controls to be positioned relative to the panel + itself, or relative to other child controls of the panel. When a control is placed on a TRelativePanel and the + child control is selected in the Form Designer, the Object Inspector will display several additional properties + at the bottom of the list that determine how the child control will be aligned within the TRelativePanel. + + The TRelativePanel positions child controls by first aligning each control to the panel as specified. Centering + child controls (vertically and horizontally) takes precedence over left-right and top-bottom alignment. Next, + each child control is positioned relative to its sibling controls. The list of child controls is processed in + order. Therefore, if a child control is to be positioned relative to a sibling, the sibling control should + have a lower index in the collection. + + Note, that it is possible to specify relationships between controls that lead to controls being positioned + outside of the TRelativePanel. For example, if Label1 is positioned Above Edit1, but Edit1 is aligned to the + Top of the TRelativePanel, Label1 will not be visible because it will be clipped by the panel. + + + TCustomSplitView is the base class for TSplitView. + + + Proteced method used to change the opened and closed state of the control. + + + Event dispatch method that generates the OnClosing event. + + + Event dispatch method that generates the OnClosed event. + + + Event dispatch method that generates the OnOpening event. + + + Event dispatch method that generates the OnOpened event. + + + Use this property to control the speed of the opening and closing animation. The smaller the + AnimationDelay, the faster the animation. + + + Specifies the number of pixels by which the width of the control is adjusted during each step of the + opening and closing animation. + + + Specifies the appearance of the control when closed. + svcCollapse - The TSplitView is completely hidden. + svcCompact - A smaller potion of the TSplitView remains visible. + + + Specifies the width of the control when closed and CloseStyle is set to svcCompact. + + + Specifies how the TSplitView appears when opened. + svmDocked - The control is docked to the left or right edge of the form, and the client area is reduced by the + width of the control. + svmOverlay - The control is displayed on top of the client area of the form. + + + Specifies whether the TSplitView is currently open. + + + Specifies the width of the TSplitView when in the opened state. + + + Specifies whether the TSplitView is placed on the left or right side of the form. + + + Specifies whether the control animates the opening and closing process. + + + Specifies the current width of the control. + + + This event occurs when the TSplitView is closed. + + + This event occurs when the TSplitView is starting to close. This event only occurs if UseAnimation is True. + + + This event occurs when the TSplitView is opened. + + + This event occurs when the TSplitView is starting to open. This event only occurs if UseAnimation is True. + + + Use this method to open the TSplitView. + + + Use this method to close the TSplitView. If CloseStyle is set to svcCollapse, the TSplitView will be + completely hidden. If CloseStyle is set to svcCompact, the width of the TSplitView will be changed to the + CompactWidth size. + + + + + TSplitView implements a container that can be opened and closed. When opened, the TSplitView can be docked to + the left or right edge of the form, or it can be displayed on top of the form's client area. When closed, the + TSplitView can be completely hidden (CloseStyle := svcCollapse), or a smaller portion of the split view can + remain visible (CloseStyle := svcCompact). + + + Is a bind source that supports adapters to connect to different types of data. +The TBaseObjectBindSource class implements a bind source that supports adapters to connect to different types of data. The adapter can be provided by setting a property (InternalAdapter) or by implementing the OnCreateAdapter event. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the member for the given member name. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetMember inherits from Data.Bind.Components.TBaseBindScopeComponent.GetMember. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.GetMember. +Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + Forwards notification messages to all owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Initializes the component after the form file has been read into memory. +Data.Bind.ObjectScope.TBaseObjectBindSource.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Adds the given bind component to the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.AddExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.AddExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.AddExpression. +Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + Removes the given binding component from the Expressions list. +Data.Bind.ObjectScope.TBaseObjectBindSource.RemoveExpression inherits from Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. All content below this line refers to Data.Bind.Components.TBaseBindScopeComponent.RemoveExpression. +Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a TComponent enumerator. +Data.Bind.ObjectScope.TBaseObjectBindSource.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the bind source adapter is positioned in the last record. +Read Eof (end of file) to determine if ItemIndex is located in the last record. If Eof is True, the bind source has an adapter and the active record is the last one or there are no records. Eof is False if the ItemIndex is located in any other position. + + + Indicates whether the bind source adapter is positioned in the first record. +Read BOF (beginning of file) to determine if ItemIndex is located in the first record. If BOF is True, the bind source has an adapter and the active record is the first one. BOF is also True if there is no active record. BOF is False in all other cases. + + + Specifies whether the bind source has permission to modify the data. +Check CanModify to determine if data can be edited. When CanModify is set to True, the bind source can edit the data. When CanModify is set to False, the bind source cannot edit the data. + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TBaseObjectBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Data.Bind.ObjectScope.TBaseObjectBindSource.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Specifies whether the bind source adapter is active. +Read Active to determine whether the bind source adapter is active. By default, the Active property is set to True. +When Active is False, the bind source does not have an adapter or its adapter is not active. When Active is True, the bind source has an active adapter. + + + Specifies whether the bind source is automatically activated. Set AutoActive to True for automatic activation. + + + Specifies the index of the current record. +ItemIndex holds the index of the current record of the dataset the bind source adapter is currently on. The first item has the index 0, the second item has the index 1, and so on. If no item is selected, the value of ItemIndex is -1. + + + Indicates whether the data is in edit mode. +Read Editing to determine whether the bind source adapter can currently edit the data. If the Editing property is True, the data provided by the bind source adapter is in editing mode. Otherwise, it is False. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the internal adapter of the bind source. +The InternalAdapter property holds the internal adapter of the bind source. InternalAdapter uses the GetInternalAdapter method to return the internal adapter of the bind source. + +Note: The GetInternalAdapter method always returns nil. Descendant classes must override this method to return the internal adapter. + + + + + Bind source which delegates + + + Bind source which supports adapters to connect to different types of data + + + Is a base class that implements a bind source for creating sample data. +If you want to create your own custom prototype bind source, then you should derive your class from TCustomPrototypeBindSource. When designing applications, TPrototypeBindSource is available from the Tool Palette. + + + Embarcadero Technologies does not currently have any additional information. + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.ObjectScope.TCustomPrototypeBindSource.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Is a bind source for creating sample data. +If you want to create your own custom prototype bind source, then you should derive your class from TCustomPrototypeBindSource. When designing applications that make use of the LiveBindings framework, you can use a TPrototypeBindSource component readily available in the Tool Palette to generate sample data for your bindings. +These tutorials in the Tutorials section describe the use of TPrototypeBindSource: + +Tutorial: Using TPrototypeBindSource and the LiveBindings Designer +Mobile Tutorial: Using LiveBindings to Populate a ListView (iOS and Android) +Tutorial: Using LiveBindings and DataModules with the Metropolis UI +Mobile Tutorial: Using LiveBindings to Populate a ListBox in Mobile Applications (iOS and Android) + + + Adapter base class for providing data to a TAdapterBindScope + + + Adapter to provide a generic TList to TAdapterBindSource + + + Adapter to provide an arbitrary object to TAdapterBindSource + + + Base class for an adapter field + + + Base class to get a value using RTTI + + + Base class to get a value of a particular type using RTTI + + + Use RTTI to read the value of a field + + + Use RTTI to read the value of a property + + + Base class to set a value using RTTI + + + Use RTTI to set the value of a field + + + Use RTTI to set the value of a property + + + Adapter field which supports reading + + + Adapter field which supports reading and writing + + + Adapter field which supports an object property + + + Custom scope to allow the expression engine to access field names as if they are members of the + wrapped TBindSourceAdapter + + + Custom scope to allow the expression engine to access field names as if they are members of the + wrapped field + + + Implementation of IGetMemberObject to get the object associated with an adapter + + + Implementation of IGetMemberObject to get the object associated with object field + + + Adapter to provide a generic TList to TAdaptiveBindScope + + + TGroupBox represents a Windows group box. +The TGroupBox component represents a standard Windows group box, used to group related controls on a form. When another control component is placed within a group box, the group box becomes the parent of that component. + + + TLabel is a nonwindowed control that displays text on a form. +Use TLabel to add text that the user cannot edit on a form. This text can be used to label another control, and can set focus to that control when the user types an accelerator key. The Caption property can be used to define an accelerator key to a label control. +Because TLabel is not a descendant of TWinControl, it does not have its own window and cannot receive direct input from the keyboard. To add an object to a form that can respond to keyboard input (other than setting focus to another object when an accelerator key is typed) in addition to displaying text, use TStaticText. +To add an object to a form that displays text that a user can scroll or edit, use TEdit. + + + TCustomEdit is the base class from which all edit-box and memo controls are derived. +TCustomEdit encapsulates the behavior common to all components for editing text by introducing methods and properties that provide: +Basic text editing functions such as selecting text, modifying selected text, and case conversions. +Ability to respond to changes in the contents of the text. +Access control of the text for making it read-only or introducing a password character to hide the actual value. +Do not create instances of TCustomEdit. Use TCustomEdit as a base class when declaring control objects that permit the user to enter or modify text. Properties and methods of TCustomEdit provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Generates an OnChange event. +Applications do not call the Change method directly. It is triggered automatically by Windows events. Change is exposed as a protected method so that derived classes can make additional responses when the text changes beyond invoking the OnChange event handler. If Derived classes that override the Change method do not call the inherited method, the OnChange event handler will not be called. + + + Responds to key press events. +Vcl.StdCtrls.TCustomEdit.KeyDown inherits from Vcl.Controls.TWinControl.KeyDown. All content below this line refers to Vcl.Controls.TWinControl.KeyDown. +Responds to key press events. +When a windowed control receives a key-down message (WM_KEYDOWN) from Windows, its message handler calls the DoKeyDown method. If DoKeyDown determines that the control should, in fact, process the character, it calls KeyDown, passing the key code and shift-key state in the Key and Shift parameters, respectively. +KeyDown calls any event handler attached to the OnKeyDown event. Override KeyDown to provide other responses in addition to the event handler call. +The Key parameter is the key on the keyboard. For nonalphanumeric keys, you must use WinAPI virtual key codes to determine the key pressed. For more information see Representing Keys and Shortcuts. +The Shift parameter indicates whether the SHIFT, ALT, or CTRL keys are combined with the keystroke. +Either KeyDown or the OnKeyDown event handler it calls can suppress further processing of a key by setting the Key parameter to zero. + + + Responds to keyboard input. +Vcl.StdCtrls.TCustomEdit.KeyPress inherits from Vcl.Controls.TWinControl.KeyPress. All content below this line refers to Vcl.Controls.TWinControl.KeyPress. +Responds to keyboard input. +When a windowed control receives a key-press message (WM_CHAR) from Windows, its message handler calls the DoKeyPress method. If DoKeyPress determines that the control should, in fact, process the character, it calls KeyPress, passing the key code in the Key parameter. +KeyPress calls any event handler attached to the OnKeyPress event. Override KeyPress to provide other responses in addition to the event handler call. +Either KeyPress or the OnKeyPress event handler it calls can suppress further processing of a character by setting the Key parameter to zero. + +Note: The Key parameter is the character represented by the key that is pressed, not a Windows virtual key code. + + + Initializes a window-creation parameter record passed in the Params parameter. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomEdit overrides the inherited method to specify a scrollable single-line edit control that reflects the current values of the BorderStyle, HideSelection, PasswordChar, and ReadOnly properties. + + + Creates a Windows control to represent the control. +CreateWindowHandle calls the inherited CreateWindowHandle method after working around a Win95 bug involving setting the read-only style on machines with Far East locales. + + + Creates a Windows control corresponding to the edit control. +CreateWnd is called when the edit control is created, and whenever a change to the edit control requires the window to be recreated. After calling the inherited method, CreateWnd sends the newly created window messages to enforce the MaxLength and PasswordChar properties. + + + Destroys the Windows control that corresponds to the edit control. +The Windows control for the edit box can be temporarily destroyed and recreated in order to set properties that require changing the window creation parameters. When this happens, DestroyWnd is called. +Before the window is destroyed, DestroyWnd saves a copy of any properties that are needed to recreate the window after it is destroyed. + + + Sets the MaxLength property. +DoSetMaxLength is the property access function for the MaxLength property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the MaxLength property. +DoSetMaxLength sends an EM_LIMITTEXT message to the window of the edit control. + + + Sets the value of the TextHint property. +DoSetTextHint is a protected method used to set the value of the TextHint property. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the SelLength property. +GetSelLength is the property access function for the SelLength property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelLength property. +GetSelLength sends an EM_GETSEL message to the window of the edit control and returns the difference between the starting position and the ending position. + + + Returns the SelStart property. +GetSelStart is the property access method for the SelStart property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelStart property. +GetSelStart sends an EM_GETSEL message to the window of the edit control and returns the starting position. + + + Returns the SelText property. +GetSelText is the property access method for the SelText property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelText property. + + + Sets the Alignment property. +SetAlignment is exposed as a protected method so derived classes can customize their implementation of the Alignment property. + + + Sets the AutoSize property. +SetAutoSize is the protected write implementation of the AutoSize property. +TCustomEdit overrides the inherited method to update the height of the edit control to reflect the current font when the value of AutoSize changes to true. + + + Sets the SelLength property. +SetSelLength is the property access method for the SelLength property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelLength property. +SetSelLength sends an EM_SETSEL message to the window of the edit control, specifying a selection that begins at SelStart and ends at SelStart + Value. + + + Sets the SelStart property. +SetSelStart is the property access method for the SelStart property. It is exposed as a protected method so that descendants of TCustomEdit can customize the implementation of the SelStart property. +SetSelLength sends an EM_SETSEL message to the window of the edit control to position the cursor on the position indicated by Value. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether all the text in the edit control is automatically selected when the control gets focus. +Set AutoSelect to select all the text when the edit control gets focus. AutoSelect only applies to single-line edit controls. +Use AutoSelect when the user is more likely to replace the text in the edit control than to append to it. + + + Determines whether the height of the edit control automatically resizes to accommodate the text. +Use AutoSize to make the edit control adjust its size automatically so the client area accommodates the height of the text. When AutoSize is false, the edit control has a fixed height. When AutoSize is true, the size of the control is readjusted whenever a change occurs that could affect the height of the control, such as a change to the font or border style. + +Note: AutoSize only adjusts the height of the edit control. Even with AutoSize set to true, text in the edit control may appear truncated if it extends beyond the width of the control. + + + Determines whether the edit control has a single line border around the client area. +Use BorderStyle to affect the sharpness with which the client area of the edit control stands out. BorderStyle can have a value of either bsSingle or bsNone. If BorderStyle is bsSingle, the edit control has a single-line border around the client area. If BorderStyle is bsNone, there will be no border. + + + Determines the case of the text within the edit control. +Use CharCase to force the contents of the edit control to assume a particular case. +When CharCase is set to ecLowerCase or ecUpperCase, the case of characters is converted as the user types them into the edit control. Changing the CharCase property to ecLowerCase or ecUpperCase changes the actual contents of the text, not just the appearance. Any case information is lost and can't be recaptured by changing CharCase to ecNormal. + + + Determines whether the visual indication of the selected text remains when focus shifts to another control. +Set HideSelection to false to provide visual feedback of the selected portion of the text even when the edit control does not have focus. Set HideSelection to true to show the selection only when the edit control has focus. HideSelection does not affect the actual value of the selection, only the visual indication. Always setting HideSelection to false can make forms with many edit controls look too busy. + + + Specifies the maximum number of characters the user can enter into the edit control. +Use MaxLength to limit the number of characters that can be entered into the edit control. A value of 0 indicates that there is no application-defined limit on the length. +Use MaxLength to limit the length of the text in an edit control if that text will be copied into a fixed-length buffer. + +Note: Setting MaxLength will not truncate the existing text, it merely prevents the user from adding more text after reaching the limit of MaxLength characters. +Note: Even when MaxLength is 0, there may be limitations imposed by the operating system on the number of characters that may be entered into an edit control. +Note: The unit of MaxLength is characters (not bytes) if the application is using themes. + + + Determines whether characters typed in the edit control are converted from ANSI to OEM and then back to ANSI. +To ensure that any characters typed in the edit control can be unambiguously converted to the OEM character set, set OEMConvert to true. This causes all characters to be converted from ANSI to OEM and then back to ANSI as they are typed. Set OEMConvert to false to avoid the overhead of this conversion when it does not matter whether the text can be unambiguously mapped to an OEM string. +OEMConvert is most useful for edit controls used to enter file names when the application does not use Unicode file names. + + + Allows only numbers to be typed into the text edit. +Use NumbersOnly to prohibit entry of non-numeric characters in the textfield. Note, however, that a user can paste non-numeric characters in the textfield even when this property is set. + +Code Examples +StdCtrlsProp (Delphi) +StdCtrlsProp (C++) + + + Indicates the character, if any, to display in place of the actual characters typed in the control. +Use the PasswordChar property to create an edit control that displays a special character in place of any entered text. If PasswordChar is set to the null character (ANSI character zero), the edit control displays its text normally. If PasswordChar is any other character, the edit control displays PasswordChar in place of each character typed. PasswordChar affects the appearance of the edit control only. The value of the Text property reflects the actual characters that are typed. + + + Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + + Occurs when the text for the edit control may have changed. +Write an OnChange event handler to take specific action whenever the text for the edit control may have changed. Use the Modified property to see if a change actually occurred. The Text property of the edit control will already be updated to reflect any changes. This event provides the first opportunity to respond to modifications that the user types into the edit control. + + + Creates an instance of TCustomEdit. +Call Create to create and initialize an instance of TCustomEdit. +AOwner is another component, typically the form, that is responsible for freeing the edit control. It becomes the value of the Owner property. +Derived objects that override the Create method should call the inherited Create before performing any additional initialization. + + + Deletes all text from the edit control. +Use Clear to replace the Text property with an empty string. Clear removes all text, not just the selected text. To remove just the selected text, use ClearSelection. + + + Removes the selected text from the edit control. +Use ClearSelection to delete the selected text from the edit control. If no text is selected, ClearSelection does nothing. If all of the text is selected, ClearSelection clears all text, like the Clear method. + +Note: Calling ClearSelection does the same thing as sending the edit control a WM_CLEAR message. + + + Copies the selected text in the edit control to the Clipboard in CF_TEXT format. +Use CopyToClipboard to replace the contents of the Clipboard with the selected text. CopyToClipboard does not clear the Clipboard if no text is selected. If no text is selected, CopyToClipboard does nothing. + +Note: Calling CopyToClipboard does the same thing as sending the edit control a WM_COPY message. + + + Copies the selected text to the Clipboard in CF_TEXT format and then deletes the selection. +Use CutToClipboard to replace the contents of the Clipboard with the selected text while clearing the selected text. If no text is selected, CutToClipboard does nothing. + +Note: Calling CopyToClipboard does the same thing as sending the edit control a WM_CUT message. + + + Provides message handling for all messages that the control does not fully process itself. +Override DefaultHandler to change the default message handling for the edit control. The Message parameter can be cast to a TMessage type to obtain the WParam, LParam, and Result of the message. If the Result of the message is non-zero, the message has already been handled. Set the Result field to a non-zero value to prevent further processing of the message by the inherited method. + +Note: In Delphi, calling inherited in a message-handling method results in a call to the ancestor's DefaultHandler method if that ancestor does not specify a handler for the message being handled. + + + Indicates how text is aligned within the control. +Vcl.StdCtrls.TCustomEdit.GetControlsAlignment inherits from Vcl.Controls.TControl.GetControlsAlignment. All content below this line refers to Vcl.Controls.TControl.GetControlsAlignment. +Indicates how text is aligned within the control. +Use GetControlsAlignment to determine the alignment of the control. For controls that do not have an Alignment property, GetControlsAlignment returns taLeftJustify. + +Note: GetControlsAlignment returns the alignment of text before it is altered by the BiDiMode property. To check whether the alignment should be reversed to reflect the BiDiMode property, call UseRightToLeftAlignment. + + + Pastes the contents of the Clipboard into edit control, replacing the current selection. +Use PasteFromClipboard to replace the selected text with the contents of the Clipboard, or, if no text is selected, to insert the contents of the Clipboard at the cursor. If the Clipboard is empty, or if it does not contain anything in CF_TEXT format, PasteFromClipboard does nothing. + +Note: Calling PasteFromClipboard does the same thing as sending the edit control a WM_PASTE message. + + + Backs out all changes in the undo buffer. +Call Undo to cancel all changes made to the Text property since the last call to the ClearUndo method. If ClearUndo was never called, Undo rolls back all changes. +To determine whether there are any changes in the undo buffer, check the CanUndo property. + + + Clears the undo buffer so that no changes to the text can be backed out. +Use ClearUndo to commit changes to the Text property. After calling ClearUndo, the CanUndo property is false and the Undo method does nothing. + + + Sets the SelText property. +SetSelText is the property access method for the SelText property. + + + Selects all text in the edit control. +Use SelectAll to select all text in the edit control. To select only part of the text, use the SelStart and SelLength properties. + + + Copies the selected text into a buffer and returns the number of characters copied. +Use GetSelTextBuf to copy the selected text into a character buffer. If there is no selection, the buffer receives an empty string. If the selection contains more than (BufSize - 1) characters, only the first (BufSize - 1) characters are copied. GetSelTextBuf returns the number of characters that were actually copied into the buffer. + + + Replaces the selected text with a null-terminated string. +Use SetSelTextBuf to replace the current selection by the contents of the null-terminated string pointed to by Buffer. If no text is selected, the contents of Buffer are inserted at the cursor. SetSelTextBuf does the same thing as setting the SelText property, except that it takes a pointer to a char type rather than a string. + + + Determines how the text is aligned within the text edit control. +Use Alignment to change the way the text is formatted in the text edit control. Alignment can take one of the following values: + + + + + +Value + +Meaning + + + +taLeftJustify + + + +Align text to the left side of the control + + + + +taCenter + + + +Center text horizontally in the control. + + + + +taRightJustify + + + +Align text to the right side of the control. + + + Indicates whether the edit control contains changes that can be backed out. +Read CanUndo to determine whether the user has made any changes to the text that can be undone by calling the Undo method. This is useful when enabling or disabling menu items that correspond to these commands. + + + Indicates whether the user edited the text of the edit control. +Use Modified to determine whether the user changed the Text property of the edit control. Modified is only reset to False when you assign a value to the Text property. In particular, it is not reset when the control receives focus. + + + When set to True, it allows you to call or invoke an Undo operation in order to undo a change previously made by using SetSelText or SetSelTextBuf. By default it is set to false. + + + Determines whether the user can change the text of the edit control. +To restrict the edit control to display only, set the ReadOnly property to true. Set ReadOnly to false to allow the contents of the edit control to be edited. +Setting ReadOnly to true ensures that the text is not altered, while still allowing the user to select text. The selected text can then be manipulated by the application, or copied to the Clipboard. + + + Specifies the number of characters (bytes) that are selected. +Read SelLength to determine the length, in bytes, of the selected text. This is the same as the number of characters, unless you are using a multi-byte character set. Set SelLength to change the selection to consist of the first SelLength bytes starting at SelStart. + +Note: Setting SelLength to a value greater than the number of characters from SelStart to the end of the text results in the selection of all characters from SelStart to the end of the text. Reading SelLength immediately after setting it to a value greater than the number of available characters returns the number of characters actually selected, not the value that was just set. + + + Specifies the position of the first selected character in the text. +Read SelStart to determine the position of the first selected character, where 0 indicates the first character. If there is no selected text, SelStart indicates the position of the cursor. Set SelStart to remove the current selection and position the cursor just before the indicated character. +To select a particular range of the text, first set SelStart to position the cursor, and then set SelLength to extend the selection. + + + Specifies the selected portion of the edit control's text. +Read SelText to determine the value of the selected text. Set SelText to replace the selected text with a new string. If there is no selection, but the edit control has focus, set SelText to insert a new string into the text at the cursor. + + + A hint or message to be displayed when the Text property is empty. +Use TextHint to cue the user on what kind of entry is expected in the text field. Runtime themes must be enabled. + +Code Examples +StdCtrlsProp (Delphi) +StdCtrlsProp (C++) + + + + + TEdit is a wrapper for a Windows single-line edit control. +Use a TEdit object to put a standard Windows edit control on a form. Edit controls are used to retrieve text that users type. Edit controls can also display text to the user. +When only displaying text to the user, choose an edit control to allow users to select text and copy it to the Clipboard. Choose a label object if the selection capabilities of an edit control are not needed. +TEdit implements the generic behavior introduced in TCustomEdit. TEdit publishes many of the properties inherited from TCustomEdit, but does not introduce any new behavior. For specialized edit controls, use other descendant classes of TCustomEdit or derive from it. + + + TCustomMemo is the base type for memo components, which are multiline edit boxes, including TMemo and TDBMemo. +TCustomMemo introduces new properties and methods to expand the capabilities of TCustomEdit for handling multiline edit boxes. +Do not create instances of TCustomMemo. Use TCustomMemo as a base class when declaring control objects that implement a multiline edit control. Properties and methods of TCustomMemo provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + Initializes a window-creation parameter record passed in the Params parameter. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomMemo overrides the inherited method to specify a scrollable multiline edit control. The Params parameter is updated to reflect the current values of the Alignment, ScrollBars, and WordWrap properties, in addition to the BorderStyle, HideSelection, PasswordChar, and ReadOnly properties that the inherited method specifies. + + + Creates a window based on the window-creation parameter record. +The CreateWnd method calls CreateWindowHandle to create the edit control window once it has been specified in the window-creation parameters. CreateWindowHandle creates the window by calling the CreateWindowEx API function, passing parameters from the record passed in the Params parameter. CreateWindowHandle overrides the inherited method to interpret the Caption in Params as the initial text rather than as the window caption. + + + Creates a Windows control corresponding to the edit control. +Vcl.StdCtrls.TCustomMemo.CreateWnd inherits from Vcl.StdCtrls.TCustomEdit.CreateWnd. All content below this line refers to Vcl.StdCtrls.TCustomEdit.CreateWnd. +Creates a Windows control corresponding to the edit control. +CreateWnd is called when the edit control is created, and whenever a change to the edit control requires the window to be recreated. After calling the inherited method, CreateWnd sends the newly created window messages to enforce the MaxLength and PasswordChar properties. + + + Returns the value of the CaretPos property. +CaretPos represents the coordinates of the cursor. GetCaretPos is the protected implementation of the CaretPos property. Override this method to change the way the caret position is computed. + + + Returns the interactive gestures and their options. +Vcl.StdCtrls.TCustomMemo.DoGetGestureOptions inherits from Vcl.Controls.TControl.DoGetGestureOptions. All content below this line refers to Vcl.Controls.TControl.DoGetGestureOptions. +Returns the interactive gestures and their options. +DoGetGestureOptions is used internally to access the interactive gestures and their options associated with a TControl. + + + Embarcadero Technologies does not currently have any additional information. + + + Checks whether the associated touch manager stored any of the given options. +Vcl.StdCtrls.TCustomMemo.IsTouchPropertyStored inherits from Vcl.Controls.TControl.IsTouchPropertyStored. All content below this line refers to Vcl.Controls.TControl.IsTouchPropertyStored. +Checks whether the associated touch manager stored any of the given options. +IsTouchPropertyStored is used internally by the VCL framework to check whether the associated touch manager component has stored the given options. Do not call IsTouchPropertyStored directly. IsTouchPropertyStored is used primarily to ensure that controls that do not require gesturing are not storing useless data in the DFMs or executables. + + + Ensures that return characters are not entered into the text when WantReturns is false. +KeyPress is called automatically when the user presses a key. After calling the inherited KeyPress, which calls the OnKeyPress event handler, KeyPress discards return characters when WantReturns is false. + + + Initializes the memo control when it is first loaded into memory. +Loaded overrides the inherited method so that the Modified property is set to false when the form containing the memo is first loaded into memory. Derived classes can override the Loaded method to perform additional initializations after the memo's form is loaded. + + + Sets the CaretPos property. +SetCaretPos is the property write access method for the CaretPos property. The CaretPos property returns the coordinates of the cursor. SetCaretPos sets the cursor position to Value. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the Lines property. +SetLines is the protected write implementation for the Lines property. +SetLines is exposed as a protected method so derived classes can customize their implementation of the Lines property. + + + Sets the ScrollBars property. +SetScrollBars is the property access method for the ScrollBars property. +SetScrollBars is exposed as a protected method so derived classes can customize their implementation of the ScrollBars property. + + + Sets the WordWrap property. +SetWordWrap is the property access method for the WordWrap property. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether the memo control has scroll bars. +Use ScrollBars to give a multiline edit control horizontal or vertical scroll bars. ScrollBars can take one of the following values: + + + + + +Value + +Meaning + + + +ssNone + + + +The control has no scroll bars. + + + + +ssHorizontal + + + +The control has a single scroll bar on the bottom edge. + + + + +ssVertical + + + +The control has a single scroll bar on the right edge. + + + + +ssBoth + + + +The control has a scroll bar on both the bottom and right edges. + + + Determines whether the user can insert return characters into the text. +Set WantReturns to true to allow users to enter return characters into the text. Set WantReturns to false to allow the form to handle return characters instead. +For example, in a form with a default button (such as an OK button) and a memo control, if WantReturns is false, pressing Enter chooses the default button. If WantReturns is true, pressing Enter inserts a return character in the text. + +Note: If WantReturns is false, users can still enter return characters into the text by pressing Ctrl+Enter. + + + Determines whether the user can insert tab characters into the text. +Set WantTabs to true to allow users to enter tab characters into the text. Set WantTabs to false if you want the tab character to select the next control on the form instead. + +Note: If WantTabs is true, users can tab into the edit control, but they can't tab out. + + + Determines whether the edit control inserts soft carriage returns so that the text wraps at the right margin. +Set WordWrap to true to make the edit control wrap text at the right margin so that it fits in the client area. The wrapping has cosmetic purposes only. The text does not include any return characters that were not explicitly entered. Set WordWrap to false to have the edit control display a separate line only where return characters were explicitly entered into the text. + +Note: Most of the times when WordWrap is true, the horizontal scroll bar is not necessary. However, exceptions appear; when the line cannot be cut into pieces, the wrapping cannot occur. In these cases, the scroll bar is still required. + + + Creates and initializes an instance of TCustomMemo. +Call Create to instantiate a TCustomMemo object. +AOwner is the component, typically the form, that is responsible for freeing the memo object. This becomes the value of the Owner property. +Derived objects that override the Create method should call the inherited Create before making any additional initializations. + + + Destroys an instance of TCustomMemo. +Do not call Destroy directly in an application. Instead, call Free. Free checks that the TCustomMemo reference is not nil, and only then calls Destroy. +Destroy frees the TStrings object that implements the Lines property before calling the inherited destructor. + + + Indicates the position of the caret in the client area of the memo. +Use CaretPos to determine the coordinates of the cursor. CaretPos defines a location onscreen, in characters, with the origin in the top left corner of the memo. X specifies the horizontal coordinate of the point, Y specifies the vertical coordinate. +To determine the position of the caret in terms of characters of text only (rather than X/Y location), use the SelStart property. + + + Embarcadero Technologies does not currently have any additional information. + + + Contains the individual lines of text in the memo control. +Use Lines to manipulate text in an memo control on a line-by-line basis. Lines is a TStrings object, so the TStrings methods may be used for Lines to perform manipulations such as counting the lines of text, adding new lines, deleting lines, or replacing lines with new text. For example: + +MyMemo.Lines.Add(...); + +To work with all the text at once, use the Text property. To manipulate individual lines of text, the Lines property works better. + +Note: Although Lines is implemented as a TStrings descendant, it does not implement the support for associating objects with the strings in the list. + + + + + TMemo is a wrapper for a Windows multiline edit control. +Use TMemo to put a standard Windows multiline edit control on a form. Multiline edit boxes allow the user to enter more than one line of text. They are appropriate for representing lengthy information. +TMemo implements the generic behavior introduced in TCustomMemo. TMemo publishes many of the properties inherited from TCustomMemo, but does not introduce any new behavior. + + + TComboBox combines an edit box with a scrollable list. +A TComboBox component is an edit box with a scrollable drop-down list attached to it. Users can select an item from the list or type directly into the edit box. + +Note: The width of the button in a TComboBox is equal to the width that Windows uses for scrollbars. This width depends on the color scheme that the user has chosen (by right-clicking the desktop, selecting Properties, and choosing Appearance). If you carefully size your combo box so all the text is visible, then a user running under a different color scheme may find that the text is obscured by the button. One solution is to set the scrollbar wide when developing the application. Most color schemes use a scrollbar that is at most 21 pixels wide. + + + TButton is a push button control. +Use TButton to put a standard push button on a form. TButton introduces several properties to control its behavior in a dialog box setting. Users choose button controls to initiate actions. +To use a button that displays a bitmap instead of a label, use TBitBtn. To use a button that can remain in a pressed position, use TSpeedButton. +The Caption property can be used to define an accelerator key to a control. + +Note: Because the TButton caption is always centered, changing the BiDiMode alignment has no effect. +Note: Changing the color of the Caption is not supported for TButton. Instead, use a button type whose Caption color can be changed using the Font property, such as TSpeedButton or TBitBtn. + + + TCheckBox represents a check box that can be on (checked) or off (unchecked). +A TCheckBox component presents an option for the user. The user can check the box to select the option, or uncheck it to deselect the option. +The Caption property can be used to define an accelerator key to a control. + + + TRadioButton is a wrapper for a system radio button. +Use TRadioButton to add a radio button to a form. Radio buttons present a set of mutually exclusive options to the user- that is, only one radio button in a set can be selected at a time. When the user selects a radio button, the previously selected radio button becomes unselected. Radio buttons are frequently grouped in a radio group box (TGroupBox). Add the group box to the form first, then get the radio buttons from the Component palette and put them into the group box. Or you can add a TRadioGroup, a group that already has radio buttons in it, so that you do not have to get the buttons from the Tool Palette. +By default, all radio buttons that are directly contained in the same windowed control container, such as a TRadioGroup or TPanel, are grouped. For example, two radio buttons on a form can be checked at the same time only if they are contained in separate containers, such as two different group boxes. +The Caption property can be used to define an accelerator key to the control. + + + Returns whether the button control is checked. +Vcl.StdCtrls.TRadioButton.GetChecked inherits from Vcl.StdCtrls.TButtonControl.GetChecked. All content below this line refers to Vcl.StdCtrls.TButtonControl.GetChecked. +Returns whether the button control is checked. +GetChecked is the read implementation of the Checked property. + + + Called when the StyleElements property changes. +Vcl.StdCtrls.TRadioButton.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + Sets the Checked property. +Vcl.StdCtrls.TRadioButton.SetChecked inherits from Vcl.StdCtrls.TButtonControl.SetChecked. All content below this line refers to Vcl.StdCtrls.TButtonControl.SetChecked. +Sets the Checked property. +SetChecked is the write implementer for the Checked property. + + + Initializes a window-creation parameter data structure. +Vcl.StdCtrls.TRadioButton.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + Creates the underlying window. +Vcl.StdCtrls.TRadioButton.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + Creates an instance of TRadioButton. +Call Create to instantiate a radio button at runtime. Radio buttons added to forms at design time are created automatically. +AOwner is the component, typically a form, that becomes the value of the Owner property. The Owner is responsible for freeing the radio button object. + + + Returns the alignment of any text in the control. +Use GetControlsAlignment to determine the orientation of text in controls that do not have an Alignment property. +GetControlsAlignment overrides the inherited method, returning taRightJustify if UseRightToLeftAlignment returns false. If UseRightToLeftAlignment returns true, GetControlsAlignment returns the opposite of the Alignment property. + + + Determines the position of the caption relative to the radio button. +Set Alignment to determine whether the caption of the radio button should appear to the left of the radio button (taLeftJustify) or to the right of the radio button (taRightJustify). + +Note: Do not confuse the Alignment property with the alignment of the caption in the text area of the radio button. The caption always appears left aligned. Alignment only controls on which side of the button the text area appears. + + + + + TListBox displays a collection of items in a scrollable list. +Use TListBox to display a scrollable list of items that users can select, add, or delete. TListBox is a wrapper for the Windows listbox control. For specialized list boxes, use other descendant classes of TCustomListBox or derive your own class from TCustomListBox. +TListBox implements the generic behavior introduced in TCustomListBox. TListBox publishes many of the properties inherited from TCustomListBox, but does not introduce any new behavior. + + + TStaticText is a windowed control that displays text on a form. +The TStaticText component functions like TLabel, except that it descends from TWinControl and therefore has a window handle. Use TStaticText instead of TLabel when the component's accelerator key must belong to a windowed control for example, on an ActiveX property page. + + + TSpinButton allows the user to navigate through a range of values using the arrow buttons. +A TSpinButton is a control with two TTimerSpeedButtons, each button displaying an arrow. TSpinButton allows the navigation through a range of values using the arrow buttons to customize the value held by the control. Usually, it is used to increase or decrease the value of the focused control. + + + Initializes the control after it is loaded from a stream. +Loaded overrides the inherited method in order to set the button bounds. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. + + + Responds to keypress events. +The KeyDown responds to keypress events. +Shift indicates which shift keys (SHIFT, CTRL, or ALT) are combined with the keystroke. +The Key parameter is one of the following keyboard keys: Space, Down, or Up. +If Key is Down, the OnDownClick event is handled, if Up - OnUpClick, and if Space - the click event for the focused button. + + + Responds to notifications indicating that components are being destroyed. +Notification responds to notifications indicating that the focus controls are about to be destroyed. +Notification calls the Notification inherited method. + + + Creates the underlying window. +Vcl.Samples.Spin.TSpinButton.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + Creates and initializes a TSpinButton instance. +The Create method creates and initializes a TSpinButton instance. + + + Sets the Left, Top, Width, and Height properties of the control in a single operation. +SetBounds sets the Left, Top, Width, and Height properties of the control in a single operation. Specify the values for the Left, Top, Width, and Height properties as the value of the ALeft, ATop, AWidth, and AHeight parameters, respectively. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately. +SetBounds calls the SetBounds inherited method. + + + The bitmap that appears on the Down button. +DownGlyph represents the bitmap that appears on the Down button. +You can provide up to four images (one for each state) within a single bitmap, depending on the value of the DownNumGlyphs property. All images must be the same size and next to each other in a row. +The four states of the button are described in the following table: + + + +Button state + +Description + + + +Up + + + +This image appears when the button is up. This image is also used when the button has focus (for example, if the user tabs to it); in this case, a focus rectangle is drawn around the button. If no other images exist in the bitmap, bit buttons also use this image for all other states. + + + + +Disabled + + + +This image usually appears dimmed to indicate that the button cannot be selected. + + + + +Clicked + + + +This image appears when the button is clicked. The Up image reappears when the user releases the mouse button. + + + + +Down + + + +This image appears when the button stays down. + + + Specifies the number of Glyphs that appear on the Down button. +DownNumGlyphs specifies the number of Glyphs that appear on the Down button. If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the NumGlyphs property. The default value is 1. + + + Designates a windowed control associated with the TSpinButton. +Use FocusControl to set focus to a control. + + + The bitmap that appears on the Up button. +UpGlyph specifies the bitmap that appears on the Up button. +You can provide up to four images (one for each state) within a single bitmap, depending on the value of the UpNumGlyphs property. All images must be the same size and next to each other in a row. +The four states of the button are described in the following table: + + + +Button state + +Description + + + +Up + + + +This image appears when the button is up. This image is also used when the button has focus (for example, if the user tabs to it); in this case, a focus rectangle is drawn around the button. If no other images exist in the bitmap, bit buttons also use this image for all other states. + + + + +Disabled + + + +This image usually appears dimmed to indicate that the button cannot be selected. + + + + +Clicked + + + +This image appears when the button is clicked. The Up image reappears when the user releases the mouse button. + + + + +Down + + + +This image appears when the button stays down. + + + Number of Glyphs that appear on the Up button. +UpNumGlyphs specifies the number of Glyphs that appear on the Up button. If you have multiple images in a bitmap, you must specify the number of images that are in the bitmap with the NumGlyphs property. The default value is 1. + + + Occurs when the user clicks the down button of the TSpinButton. +Use the OnDownClick event handler to specify what happens with the focused control value when the user clicks the down button of the TSpinButton. + + + Occurs when the user clicks the up button of the TSpinButton. +Use the OnUpClick event handler to specify what happens with the focused control value when the user clicks the up button of the TSpinButton. + + + + + TSpinEdit combines a TEdit box with a TSpinButton. +A TSpinEdit component is a TEdit with a TSpinButton attached. +The Value of the edit box is numerical. By pressing the up and down buttons of TSpinButton, the Value is increased or decreased. + + + Verifies whether the pressed key is valid. +IsValidChar verifies whether the pressed key is valid. IsValidChar returns True if the Key is "+", "-", or one of the number keys. + + + Is the control's action in response to a mouse click on the up button of the TSpinEdit. +UpClick is called automatically when the user left-clicks the up button of the control. The method increases the edit box's Value. + + + Represents the control's action in response to a mouse click on the down button of the TSpinEdit. +DownClick is called automatically when the user left-clicks the down button of the control. The method decreases the edit box's Value. + + + Responds to key press events. +KeyDown responds to key press events considering the Key parameter. +Shift indicates which shift keys (SHIFT, CTRL, or ALT) were down when the user moved the mouse. +The Key parameter can be either the Down or Up keyboard key. If the key is Up, then the method calls UpClick; if the key is Down, then the method calls DownClick. + + + Responds to keyboard input. +KeyPress responds to key press events. The method uses IsValidChar to validate the key. +The Key parameter is a keyboard key. KeyPress calls the KeyPress inherited method. + + + Initializes a window creation parameter record passed in the Params parameter. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. +CreateWnd calls the inherited method and then specifies the style for the created window. + + + Creates a Windows control corresponding to the edit control. +CreateWnd is called when the edit control is created and whenever a change to the edit control requires the window to be re-created. + + + Creates and initializes a TSpinEdit instance. +The Create method creates and initializes a TSpinEdit instance. + + + Destroys a TSpinEdit instance. +The Destroy method destroys a TSpinEdit instance. Destroy calls the Destroy inherited method. + + + The method is blank. +TSpinEdit has no need to call a specified method for the control's child, so GetChildren doesn't perform any action. + + + Specifies the TSpinButton of the TSpinEdit. +Button is a read-only property that specifies the spin button of the TSpinEdit. + + + Specifies whether Value can be edited. +EditorEnabled specifies whether Value can be edited or not. + + + Specifies the increment value. +Increment specifies the increment used to increase or decrease the Value property by clicking one of the TSpinEdit buttons or using the Up and Down keys while TSpinEdit is focused. + + + Specifies the maximum value. +MaxValue specifies the maximum Value that TSpinEdit can take. + + + Specifies the minimum value. +MinValue specifies the minimum Value that TSpinEdit can take. + + + Specifies the value listed in the TSpinEdit. +Value specifies the value listed in the TSpinEdit. The value can be changed by clicking one of the TSpinEdit buttons or using the Up and Down keys while TSpinEdit is focused. + + + + + TPersistent is the ancestor for all objects that have assignment and streaming capabilities. +TPersistent encapsulates the behavior common to all objects that can be assigned to other objects, and that can read and write their properties to and from a form file (.xfm or .dfm file). For this purpose, TPersistent introduces methods that can be overridden to: + +Define the procedure for loading and storing unpublished data to a stream. +Provide the means to assign values to properties. +Provide the means to assign the contents of one object to another. +Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects. + + + Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + Provides an interface for a method that reads and writes otherwise unpublished data. +Descendants of TPersistent override DefineProperties to designate a method for storing the object's unpublished data to a stream such as a form file. By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method. +When overriding DefineProperties, consider including some or all of the following: + +A call to the inherited method +Calls to the filer object's DefineProperty method +Calls to the filer object's DefineBinaryProperty method +DefineProperties is virtual, so descendant classes can override it as necessary but are not required to do so. + + + Returns the owner of an object. +GetOwner is used by the GetNamePath method to find the owner of a persistent object. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. As implemented in TPersistent, GetOwner returns nil (Delphi) or NULL (C++). +For TOwnedCollection, GetOwner returns the owner of the collection. For TCollectionItem collection items, GetOwner returns the collection object into which the collection item has been inserted. For TComponent, GetOwner returns the value of the Owner property. + + + Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + Copies the contents of another similar object. +Assign copies properties and other attributes of the specified Source object to the current object. The standard form of a call to Assign is: + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +which tells the current object to copy the contents of the Source object to itself. +Most objects override Assign to handle the assignment of properties from similar objects. When overriding Assign, call the inherited method if the destination object cannot handle the assignment of properties from the class of the Source parameter. +If no overridden Assign method can handle the assignment of properties from Source, the method implemented in TPersistent calls the source object's AssignTo method. This allows the source object to handle the assignment. If the Source object is nil (Delphi) or NULL (C++), Assign raises an EConvertError exception. +In general, the statement + +Destination := Source; {Delphi} + +Destination = Source; // C++ + +is not the same as the statement + +Destination.Assign(Source); {Delphi} + +Destination->Assign(Source); // C++ + +The assignment operator makes Destination reference the same object as Source, whereas the Assign method copies the contents of the object referenced by Source into the object referenced by Destination. + +Note: The types of some properties are also objects. If these properties have written methods that use Assign to set the value of the property, then in these cases the assignment operator does the same thing as the Assign method. + + + Returns the name of the object as it appears in the Object Inspector. +GetNamePath is for internal use only. It determines the text that the Object Inspector displays for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. Do not call GetNamePath directly. +For components, GetNamePath returns the component name. For TCollectionItem objects it returns the name of the hosting component, the name of the property, and the index into the collection surrounded by brackets. + + + + + TCollection is a container for TCollectionItem objects. +Each TCollection holds a group of TCollectionItem descendants. TCollection maintains an index of the collection items in its Items array. The Count property contains the number of items in the collection. Use the Add and Delete methods to add items to the collection and delete items from the collection. +Objects descended from TCollection can contain objects descended from TCollectionItem. Thus, for each TCollection descendant, there is a corresponding TCollectionItem descendant. +The following table lists some typical descendants of TCollection with the corresponding TCollectionItem descendant and the component that uses each pair: + + + +TCollection descendant + +TCollectionItem descendant + +Component + + + +TBitmapLinks + + + +TBitmapLink + + + +TCustomStyleObject + + + + +TAggregates + + + +TAggregate + + + +TClientDataSet + + + + +TCookieCollection + + + +TCookie + + + +TWebResponse + + + + +TCoolBands + + + +TCoolBand + + + +TCoolBar + + + + +TDBGridColumns + + + +TColumn + + + +TDBGrid + + + + +TDependencies + + + +TDependency + + + +TService + + + + +THeaderSections + + + +THeaderSection + + + +THeaderControl + + + + +TListColumns + + + +TListColumn + + + +TListView + + + + +TParams + + + +TParam + + + +many datasets + + + + +TStatusPanels + + + +TStatusPanel + + + +TStatusBar + + +The controls that use TCollection and TCollectionItem descendants have a published property that holds a collection. (For example, the Panels property of TStatusBar holds a TStatusPanels.) A standard property editor, referred to generically as the Collection editor, can be invoked from the Object Inspector to edit the items in the collection. + +Note: When writing a TCollection descendant that is used by another control, be sure to override the protected GetOwner method of the collection so that the descendant class instances can appear in the Object Inspector. +Note: TCollection has the TOwnedCollection descendant that maintains information about its owner. TOwnedCollection implements the GetOwner method. Therefore, classes derived from TOwnedCollection do not need to add anything in order to appear in the Object Inspector. + + + Warning: Added is deprecated. + + +Responds when items are added to the collection. +Applications cannot call the protected Added method. It is called automatically immediately after items are added to the collection. +Item is the item that was just added to the collection. +Added is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + + Warning: Deleting is deprecated. + + +Responds when items are deleted from the collection. +Applications cannot call the protected Deleting method. The Delete method calls Deleting immediately before it removes an item from the collection. +Item is the item that is about to be removed. +Deleting is a deprecated method. Descendent classes should override the Notify method instead when responding to changes in the list of items. + + + Specifies a unique ID that can be assigned to the next added collection item. +TCollection uses NextID internally to assign unique identifiers to collection items. When a new item is added to the collection, its ID property is given the value of NextID and NextID is incremented. + + + Responds when items are added to or removed from the collection. +Notify is called automatically when the items in the collection change. +Item is the item that was just added to or that is about to be removed from the collection. +Action indicates whether the item was added, is about to be extracted or is about to be deleted. +As implemented in TCollection, Notify calls Added when Action is cnAdded and calls Deleting when Action is cnDeleting. TCollection ignores the cnExtracting action. Descendant classes can override Notify to modify this behavior. + + + Returns the number of custom attributes associated with items in the collection. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. GetAttrCount returns the number of distinct attributes assigned to each item in the collection. +As implemented in TCollection, GetAttrCount always returns 0, because TCollection defines no custom attributes. + + + Returns the name of a custom attribute that can be retrieved using the GetItemAttr method. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and, for each item in the collection, a value that is a string. The GetAttr method returns the name of an attribute. +Index identifies the attribute whose name is requested. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +As implemented by TCollection, GetAttr always returns an empty string, because TCollection defines no custom attributes. + + + Returns the value of a custom attribute assigned to one of the collection's items. +TCollection descendants can associate user-defined attributes with the items in the collection. Each attribute has a name and -- for each item in the collection -- a value, which is a string. GetItemAttr returns the value of one of these attributes for a specified item in the collection. +Index identifies which of the attribute's values is desired. This is a value between 0 and n-1, where n is the value returned by GetAttrCount. +ItemIndex identifies the item whose attribute value is desired. This is an index into the Items property array. +As implemented in TCollection, GetItemAttr always returns an empty string, because TCollection defines no custom attributes. + + + Responds when the collection or any of its items changes. +Changed is called automatically when items in the collection change or when the EndUpdate method signals that an update is complete. It checks the value of UpdateCount, and if it is 0, calls the Update method, which performs any necessary updates. +When writing a TCollection descendant, there is no need to call Changed. Instead, bracket any changes by calls to BeginUpdate and EndUpdate. + + + Returns a specified item in the collection. +GetItem is the protected read implementation of the Items property. + + + Copies the properties of another item to a specified item in the collection. +SetItem is the protected write implementation of the Items property. It calls the Assign method of the item specified by Index, so that the properties of the item specified by Value are copied to that item. + + + Initializes the name of a newly inserted collection item. +The Insert method calls SetItemName to initialize the Name property of items when it inserts them into the collection. +As implemented in TCollection, SetItemName does nothing. Some TCollection descendants override this method to provide collection items with default names. + + + Updates the collection to reflect changes to its items. +Override Update in a descendent class to make any necessary changes when the items in the collection change. This method is called automatically when an update is complete. +Item identifies the item that changed. If the Item parameter is nil (Delphi) or NULL (C++), then the change affects more than one item in the collection. +As implemented in TCollection, Update does nothing. Descendent classes override this method to make any necessary adjustments. + + + Specifies the name of the property that the collection implements. +The GetNamePath method uses this protected property to assemble the name of the collection as it appears in the Object Inspector. It identifies the name of the property in the object returned by the protected GetOwner method that is implemented using this collection object. + + + Counts the number of times BeginUpdate was called without a corresponding call to EndUpdate. +UpdateCount keeps track of calls to BeginUpdate and EndUpdate so that they can be nested. Every call to BeginUpdate increments UpdateCount. Every call to EndUpdate decrements it. When UpdateCount returns to 0, the collection updates itself to reflect all changes that occurred since the first call to BeginUpdate. + + + Creates and initializes a collection. +Call Create to instantiate a TCollection object at run time. Typically, TCollection descendants are created by a component that uses the collection to implement a property. +ItemClass identifies the TCollectionItem descendants that must be used to represent the items in the collection. The Add method uses this class to create items of the appropriate type. + + + Destroys the collection and each item in it. +Destroy uses the Clear method to free each item referenced in the Items array, then destroys the collection itself. + + + Returns the Owner of the collection. +Call Owner to obtain a reference to the object that owns this collection. Typically, the owner uses the collection to implement one of its properties. + + + Creates a new TCollectionItem instance and adds it to the Items array. +Call Add to create an item in the collection. The new item is placed at the end of the Items array. +Add returns the new collection item. + + + Copies the contents of the Source collection to the current object. +Use Assign to copy the contents of one TCollection instance to another. The Assign method deletes all items from the destination collection (the object where it is executed), then adds a copy of each item in the source collection's Items array. +Source is another object (typically another collection) that contains the items that replace this collection's items. + + + Signals the start of an update operation. +Call BeginUpdate before starting an operation that performs changes to TCollection. After completing all the changes, call EndUpdate to signal the end of the operation. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, the method is used to suspend screen repainting until changes to a component that involves TCollection are completed. + + + Deletes all items from the collection. +Clear empties the Items array and destroys each TCollectionItem. + + + Embarcadero Technologies does not currently have any additional information. + + + Deletes a single item from the collection. +Delete removes the specified collection item, moving up any items that come after that item in the Items property array. +Index identifies the item to delete. This is the index of the item in the Items property array. 0 specifies the first item, 1 specifies the second item, and so on. + + + Signals the end of an update operation. +Call EndUpdate after completing an operation that was preceded by a call to the BeginUpdate method. Every call to BeginUpdate must be matched by a corresponding call to the EndUpdate method. +For example, use EndUpdate to re-enable screen repainting that was turned off with the BeginUpdate method for the components that involve TCollection. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the item with the specified ID. +The FindItemID method returns the item in the collection whose ID property is passed to it as a parameter. If no item has the specified ID, FindItemID returns nil (Delphi) or NULL (C++). + + + Returns a TCollection enumerator. +GetEnumerator returns a TCollectionEnumerator reference, which enumerates all items in the collection. +To do so, call the TCollectionEnumerator GetCurrent method within a While MoveNext do loop. + + + Returns a string used by the Object Inspector. +If the collection has no owner, GetNamePath returns the name of the collection's actual (runtime) type. If the collection is owned, GetNamePath returns the owner's name followed, if applicable, by a dot and the name of the owner's property that holds the collection. For example, GetNamePath might return "TreeView1.Items". + +Note: For a collection to have an owner, it must override the GetOwner method. + + + Creates a new TCollectionItem instance and adds it to the Items array. +Call Insert to add a new item at a specified position in the collection. Existing items (starting from the specified position) are moved up in the Items array. +Insert returns the new collection item. + + + Provides access to the internal TList.Capacity property. +The Capacity property specifies the allocated size of the array of pointers maintained by the TList object. This value is set to the number of pointers the list will need to contain. + + + Returns the number of items in the collection. +Count contains the number of items in the Items array. Since Items is indexed starting with 0, the value of Count is always one greater than the index of the last member of Items. + + + Indicates the class to which the collection's items belong. +ItemClass is the class (descended from TCollectionItem) to which the items in the collection belong. For example, in an instance of the TCollection descendant THeaderSections, the value of the ItemClass property is THeaderSection. + + + + + TStrings is the base class for objects that represent a list of strings. +Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated. +Descendants of TStrings can represent several individual strings, such as the individual lines that appear in a list box. Some objects use descendants of TStrings to represent one long body of text so that it can be manipulated in smaller chunks. +TStrings introduces many properties and methods to: + +Add or delete strings at specified positions in the list. +Rearrange the strings in the list. +Access the string at a particular location. +Read the strings from or write the strings to a file or stream. +Associate an object with each string in the list. +Store and retrieve strings as name-value pairs. +For an explanation of name-value pairs, refer to the NameValueSeparator property. + + + Reads and writes the Strings property as if it were published. +TStrings overrides DefineProperties so that the strings in the list can be loaded and saved with a form file as if the Strings property were published. + + + Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + Raises an EStringListError exception. +TStrings calls Error internally to raise an EStringListError exception when it encounters a problem. +Msg specifies the string with a single format specifier for an integer, that appears in the exception message box. It can be either a string, or a pointer to a record structure that indicates the module and resource identifier for a string. +Data is an integer value that is inserted into Msg. + + + Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + Returns the name portion of a string that is a name value pair. +TStrings calls ExtractName internally to parse strings that are name-value pairs and return the name portion. +S is the string to parse. If the string S: + +Is a name-value pair, ExtractName returns the name portion. +Is not a name-value pair, ExtractName returns: +The entire string S when AllNames is True. +An empty string when AllNames is False. +Note: If AllNames is not specified is False by default. + + + Returns a string given its index. +Get is the protected read implementation of the Strings property. +In TStrings Get is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the string with the specified index. + + + Returns the currently allocated size of the list of strings. +GetCapacity is the protected read implementation of the Capacity property. In TStrings, GetCapacity returns the value of the Count property. Descendants of TStrings can override this property to let a string list allocate memory for entries that have not been added to the list. + + + Returns the number of strings in the list +GetCount is the protected read implementation of the Count property. +In TStrings GetCount is abstract or, in C++ terminology, pure virtual, meaning it has no implementation. Descendant classes must override this method to return the number of strings that have been added to the list. + + + Returns the object associated with the string at a specified index. +GetObject is the protected read implementation of the Objects property. +Index is the index of the string with which the object is associated. +In TStrings, GetObject always returns nil (Delphi) or NULL (C++). This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override GetObject to return the specified object. + + + Returns the value of the Text property. +GetTextStr is the protected read implementation of the Text property. It returns a string that lists all the strings in the list, with individual strings separated by the string terminator characters LineBreak. By default, LineBreak is a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. + + + Changes the value of the string with a specified index. +Put is the protected write implementation of the Strings property. +Put changes the value of the string with the index specified by Index to S. Put does not change the object at the specified position. That is, any object associated with the previous string becomes associated with the new string. + + + Changes the object associated with the string at a specified index. +PutObject is the protected write implementation of the Objects property. +As implemented in TStrings, PutObject does nothing. This provides a default implementation for descendants that do not support associating objects with the strings in the list. Descendants that support this feature override PutObject to change the specified object. + + + Changes the amount of memory allocated to hold strings in the list. +SetCapacity is the protected write implementation of the Capacity property. +NewCapacity is the number of strings the list can hold after the capacity has changed. +In TStrings, the SetCapacity method does nothing. Descendent classes must override this method to change the number of strings that the list can hold. + +Note: For descendent classes that implement SetCapacity, assigning a value smaller than Count removes strings from the end of the list. Assigning a value greater than Count allocates space for more strings to be added. + + + Protected setter of the Encoding property. +If Value is one of standard encoding values, SetEncoding sets the Encoding property to Value. Otherwise, SetEncoding sets the Encoding property to default. +Internally, Assign and LoadFromStream call SetEncoding. + + + Sets the Text property. +GetTextStr is the protected write implementation of the Text property. It replaces the list with the strings specified by the Value parameter. SetTextStr adds strings one at a time to the list, using the carriage returns or linefeed characters in Value as delimiters indicating when to add a new string. + + + Performs internal adjustments before or after a series of updates. +SetUpdateState is called at the beginning or end of a series of updates. When the BeginUpdate method is first called and the TStrings object is not already in the middle of an update, TStrings calls SetUpdateState internally, with Updating set to true. When the EndUpdate method is called and it cancels out the last unmatched call to BeginUpdate, TStrings calls SetUpdateState internally, with Updating set to false. +As implemented in TStrings, SetUpdateState does nothing. Descendant classes can override this method to optimize the response to updates. + + + Compares two strings. +TStrings uses CompareStrings internally to compare the values of strings that appear in the list. For example, the IndexOf and IndexOfName methods use CompareStrings to compare a specified string with the strings in the list. +S1 and S2 are the strings to compare. +CompareStrings returns a value less than 0 if S1 < S2, 0 if S1 == S2, and a value greater than 0 if S1 > S2. +As implemented in TStrings, CompareStrings uses the global AnsiCompareText function, which compares strings case insensitively. Some descendant classes override this method to change the way strings are compared (for example, to introduce case sensitivity). + + + Indicates the number of calls to BeginUpdate that have not been matched by a call to EndUpdate. +TStrings uses UpdateCount to keep track of calls to the BeginUpdate and EndUpdate methods. Every time a call is made to BeginUpdate, TStrings increments the value of UpdateCount. Every call to EndUpdate causes TStrings to decrement UpdateCount. +When UpdateCount changes from 0 to 1, TStrings calls the SetUpdateState method with a parameter of true. When UpdateCount changes from 1 to 0, TStrings calls the SetUpdateState method with a parameter of false. This allows descendant classes to perform optimizations when handling multiple updates. + + + Creates an instance of a TStrings object. +Do not call the Create method for TStrings directly. TStrings is an abstract class and its constructor should only be called as an inherited method from the constructor of a derived class. + + + Destroys the TStrings instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + Adds a string at the end of the list. +Call Add to add a string to the end of the list. Add returns the index of the new string. + + + Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + Adds name-value pairs to the list of strings using fluent-style coding. +AddPair adds name-value pairs using the current NameValueSeparator. You can also use AddPair to add name-value pairs and the corresponding AObject. +TStrings returns a reference to the string list, allowing to populate the list using the fluent-style coding. + + + Adds a string to the list, and associates an object with the string. +Call AddObject to add a string and its associated object to the list. AddObject returns the index of the new string and object. + +Note: The TStrings object does not own the objects you add this way. Objects added to the TStrings object still exist even if the TStrings instance is destroyed. They must be explicitly destroyed by the application. + + + Adds a string to the list. +Append is the same as the Add method, except that it does not return a value. Use Append when there is no need to know the index of the string after it has been added, or with descendants of TStrings for which the index returned is not meaningful. +For example, the TStrings descendant used by memo objects uses an index to determine where to insert a string, but the inserted string does not necessarily end up as a single string in the list. Part of the inserted text may become part of the previous string, and part may be broken off into a subsequent string. The index returned by Add is not meaningful in this case. +Use Append rather than Add as a parameter for a function requiring a TGetStrProc. + + + Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + Adds the specified strings (and objects) to the current TStrings object. +AddStrings, with the Strings parameter of the TStrings type, appends strings and associated objects from the Strings object at the end of the string list in the current TStrings object. +AddStrings with the Strings parameter representing the array of strings, appends strings from Strings array at the end of the string list in the current TStrings object. +AddStrings, with two parameters, appends strings from Strings array at the end of the string list in the current TStrings object and associates references to objects from Objects with their strings (having the same numbers in Strings and Objects arrays). +If the number of strings in Strings is not equal to the number of objects in Objects, then an exception is raised. + + + Sets the strings in the Strings array, possibly associated Objects, and some other properties of the current TStrings object, from the Source object. +Use Assign to set the properties of the TStrings object from the Source object. If Source is of the TStrings type, Assign copies the following properties: + +Strings +Objects +DefaultEncoding +Encoding +LineBreak +Delimiter +QuoteChar +NameValueSeparator +Options +If Source is not of the TStrings type, the inherited Assign will set the value of the string array from any object that supports TStrings in its AssignTo method. + + + Sets the strings from another TStrings object to the list of strings. +Use SetStrings to assign the value of the TStrings object from another TStrings object (Source). + +Note: SetStrings is similar to Assign, but Assign also copies multiple additional properties. + + + Enables the TStrings object to track when the list of strings is changing. +BeginUpdate is called automatically by any property or method that changes the list of strings. Once the changes are complete, the property or method calls EndUpdate. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + Introduces an abstract (Delphi) or pure virtual (C++) method to empty the list and any associated objects. +Descendants of TStrings implement a Clear method to delete all the strings in the list, and to remove any references to associated objects. + + + Introduces an abstract (Delphi) or pure virtual (C++) method to delete a specified string from the list. +Descendants of TStrings implement a Delete method to remove a specified string from the list. If an object is associated with the string, the reference to the object is removed as well. Index gives the position of the string, where 0 is the first string, 1 is the second string, and so on. + + + Enables the TStrings object to keep track of when the list of strings has finished changing. +EndUpdate is called automatically by any property or method that changes the list of strings. Call BeginUpdate before directly modifying the strings in the list, and EndUpdate after. When implementing properties or methods that change the list in descendants of TStrings, call BeginUpdate before the changes are made, and EndUpdate when the changes are complete. +TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete. + + + Compares the list of strings to the list from another TStrings object and returns true if the two lists match. +Call Equals to compare the lists in two TStrings objects. Equals compares only the strings, not any references to associated objects. Equals returns true if the lists for both TStrings objects have the same number of strings and the strings in each list match. Equals returns false if the lists are different in length, if they contain different strings, or if the order of the strings in the two lists differ. + +Note: The Equals method uses an overridden Get method to perform the compare, thus it does not provide a context-insensitive option. + + + Swaps the position of two strings in the list. +Call Exchange to rearrange the strings in the list. The strings are specified by their index values in the Index1 and Index2 parameters. Indexes are zero-based, so the first string in the list has an index value of 0, the second has an index value of 1, and so on. +If either string has an associated object, Exchange changes the position of the object as well. + + + Returns a TStrings enumerator. +GetEnumerator returns a TStringsEnumerator reference, which enumerates the strings in a TStrings object. +To process all these strings, call the TStringsEnumerator GetCurrent method within a While MoveNext do loop. + + + Allocates a text buffer and fills it with the value of the Text property. +Call GetText to obtain a dynamically allocated character buffer containing all of the strings in the list. Individual strings are separated by a carriage return (#13) on the OS X operating system, or by a carriage return and a line feed (#13#10) on Windows operating systems. The caller is responsible for freeing the returned value using the StrDispose procedure. + + + Returns the position of a string in the list. +Call IndexOf to obtain the position of the first occurrence of the S string. IndexOf is not case-sensitive; this means that the given string may differ in case from the string in the list. For example: + +String1 := MyStrings.Items.IndexOf('My First String'); + +is equivalent to + +String1 := MyStrings.Items.IndexOf('My FIRST String'); + +IndexOf returns the 0-based index of the string. Thus, if S matches the first string in the list, IndexOf returns 0, if S is the second string, IndexOf returns 1, and so on. If the string is not in the string list, IndexOf returns -1. + +Note: If the string appears in the list more than once, IndexOf returns the position of the first occurrence. + + + Returns the position of the first name-value pair with the specified name. +Call IndexOfName to locate the first occurrence of a name-value pair where the name part is equal to the Name parameter or differs only in case. IndexOfName returns the 0-based index of the string. If no string in the list has the indicated name, IndexOfName returns -1. + +Note: If there is more than one name-value pair with a name portion matching the Name parameter, IndexOfName returns the position of the first such string. + + + Returns the index of the first string in the list associated with a given object. +Call IndexOfObject to locate the first string in the list associated with the object AObject. Specify the object you want to locate as the value of the AObject parameter. IndexOfObject returns the 0-based index of the string and object. If the object is not associated with any of the strings, IndexOfObject returns -1. + + + Introduces abstract (Delphi) or pure virtual (C++) method to insert a string at a specified position. +Descendants of TStrings implement an Insert method to add the string S to the list at the position specified by Index. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. +All methods that add strings to the list use the Insert method to add the string. +If the string has an associated object, use the InsertObject method instead. + + + Inserts a string into the list at the specified position, and associates it with an object. +Call InsertObject to insert the string S into the list at the position identified by Index, and associate it with the object AObject. If Index is 0, the string is inserted at the beginning of the list. If Index is 1, the string is put in the second position of the list, and so on. + + + Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + Fills the string list with the lines of text in a specified file. +LoadFromFile fills the string list of the TStrings object from the file specified by FileName. LoadFromFile first clears any strings already in the list. Lines in the file are separated by a carriage return and a line feed (#13#10) on Windows operating systems and a carriage return (#13) on the OS X operating system. Each line in the file is then appended in the list as a string. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromFile then saves the value of the encoding in the Encoding property, to be used if the file is saved. + +Note: LoadFromFile uses the Add method to add the strings that are read from the file. +If the specified file is not found, an EFOpenError is raised. + + + Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + Fills the list with lines of text read from a stream. +LoadFromStream fills the string list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by a carriage return and a line feed (#13#10) characters on Windows operating systems and a carriage return (#13) character on the macOS operating system. Thus, LoadFromStream reads the value of the Text property. +If the Encoding parameter is not given, then the strings are loaded using the appropriate encoding. The value of the encoding is obtained by calling the GetBufferEncoding routine of the TEncoding class. LoadFromStream then saves the value of the encoding in the Encoding property, to be used if the stream is saved. +If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except that LoadFromFile creates and destroys the file stream. + + + Changes the position of a string in the list. +Use Move to move the string at position CurIndex so that it occupies the position NewIndex. The positions are specified as 0-based indexes. For example, the following lines of code move the string in the first position to the last position: +For Delphi: + +MyStringsObject.Move(0, MyStringsObject.Count - 1); + +For C++: + +MyStringsObject->Move(0, MyStringsObject->Count - 1); + +If the string has an associated object, the object remains associated with the string in its new position. + + + Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + Saves the strings in the current object to the specified FileName file. +SaveToFile does the same thing as SaveToStream when it writes to a file stream, except that SaveToFile creates and destroys the file stream. +Each string from the list is written to a separate line in the file. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + + + Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + Writes the value of the Text property to the Stream stream. +SaveToStream gets all strings from the current TStrings object and combines them into the single string containing these strings delimited by LineBreak sequence. Then SaveToStream encodes this string using the specified Encoding. Then SaveToStream writes the encoded string into the specified Stream stream. +If WriteBOM is True then SaveToStream first gets the preamble of the specified Encoding or of the DefaultEncoding (if Encoding = nil) and writes the preamble bytes into the stream before the main string. +If the Encoding parameter is not given, then the strings are saved with the encoding specified in the Encoding property. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on macOS, it is just a line feed (#10). +Note: If TrailingLineBreak is True, then SaveToStream writes a finishing line break LineBreak after the last string. +If the stream is a file stream, SaveToStream does the same thing as SaveToFile, except that SaveToFile creates and destroys the file stream. + + + Sets the Text property. +Call SetText to replace the list with the strings specified by the Text parameter. SetText adds strings one at a time to the list, using the carriage returns or linefeed characters in Text as delimiters indicating when to add a new string. + + + Converts a TStrings descendant to a string array. + +Use ToStringArray to obtain an array of strings for each string in the list. + + + Returns the TObject array associated with Strings. + +Use ToObjectArray to obtain the array of TObject associated with Strings. + +Note: TStrings is an abstract class and this method has no effect. Descendent classes can associate objects with strings. +Note: The TStrings object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the TStrings object is destroyed. They must be explicitly destroyed by the application. + + + Indicates whether or not the list of strings is in the middle of an update. + + + Indicates the number of strings the TStrings object can hold. +Read Capacity to determine the currently allocated size of the string list. For the TStrings object, reading Capacity returns the Count property, and setting Capacity does nothing. Descendants of TStrings can override this property to allow a string list to allocate memory for entries that have not been added to the list. + + + Lists the strings in the TStrings object in a single comma-delimited string. +Use CommaText to get or set all the strings in the TStrings object in a single comma-delimited string. The single comma-delimited string format is also known as the system data format (SDF). +When retrieving CommaText, any string in the list that include spaces, commas or double quotes will be contained in double quotes, and any double quotes in a string will be repeated. For example, if the list contains the following strings: + +Stri,ng1 +Stri"ng2 +String 3 +String4 + +CommaText will return: + +"Stri,ng1","Stri""ng2","String 3",String4 + +When assigning CommaText, the value is parsed as SDF formatted text. For SDF format, strings are separated by commas or spaces, and optionally enclosed in double quotes. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored. For example, suppose CommaText is set to: + +"Stri,ng 1","Stri""ng 2",String 3,String4 + +The list will then contain: + +Stri,ng 1 +Stri"ng 2 +String +3 +String4 + +Note: CommaText is the same as the DelimitedText property with a delimiter of ',' and a quote character of '"'. +Including a trailing comma in the source string causes a blank item to be included in the string list. For example, if CommaText is set to + +"String1,String2,String3, " + +the string list will contain + +String1 +String2 +String3 +<Blank> + + + Introduces an abstract property to represent the number of strings in the list. +Descendants of TStrings implement a Count property to indicate the number of strings in the list. +Use the Count property when iterating over all the strings in the list, or when trying to locate the position of a string relative to the last string in the list. + + + The default encoding for the current object. +DefaultEncoding is used when the nil encoding is specified in a call to LoadFromStream or SaveToStream. +By default, DefaultEncoding is set to Default. The user can change DefaultEncoding if another default encoding is desired for LoadFromStream or SaveToStream. + + + Specifies the delimiter used by the DelimitedText property. +Use Delimiter to get or set the delimiter used by the DelimitedText property. DelimitedText represents all of the strings in the TStrings object as a single string, with individual strings separated by the character that is the value of Delimiter. +The default delimiter is represented by comma (,). + + + Represents all the strings in the TStrings object as a single delimited string. +Use DelimitedText to get or set all the strings in the TStrings object in a single string, separated by the character specified by the Delimiter property. +When retrieving DelimitedText, any string in the list that includes spaces or the delimiter and quotation marks characters specified in the Delimiter and QuoteChar properties will be surrounded (before and after) by the quotation mark character (QuoteChar). In addition, any QuoteChar character contained in an individual string will be repeated. +When retrieving DelimitedText, the resulting value delimits individual strings in two ways: each string is surrounded (before and after) by the quotation marks character specified by the QuoteChar property. In addition, individual strings are separated by the character specified by the Delimiter property. +When assigning DelimitedText, individual strings must be separated using Delimiter marks, and optionally enclosed in QuoteChar characters. +When assigning DelimitedText, the value is parsed as SDF formatted text. For SDF format, strings are separated by Delimiter characters or spaces, and optionally enclosed in QuoteChar characters. QuoteChar marks that are part of the string are repeated to distinguish them from the QuoteChar characters that surround the string. Spaces and Delimiter characters that are not contained within QuoteChar marks are delimiters. Two Delimiter characters next to each other will indicate an empty string, but spaces that appear next to another Delimiter character are ignored. +If StrictDelimiter is set to False, the space character is also interpreted as a delimiter, regardless of the value of Delimiter. This is not true when the space character occurs between quotation marks. + +Note: CommaText is the same as the DelimitedText property when Delimiter is ',' and QuoteChar is '"'. Including a trailing Delimiter in the source string causes a blank item to be included in the string list. + + + Character encoding determined during reading from a stream or file. +Encoding is a read-only property that contains the value of the character encoding detected when the LoadFromStream or LoadFromFile methods are called. If a file or stream does not contain a BOM (the encoding value cannot be detected) then Encoding is set to the value specified in the DefaultEncoding property. +Encoding is used in the SaveToStream and SaveToFile methods. + + + Defines line-break characters. +The LineBreak property is used internally in TStrings to set the string terminator characters. Set or read the LineBreak property to determine the string terminator characters in multistring output operations. +For example, the GetText method returns a long string containing all TStrings strings, each of which is terminated by the LineBreak value. + +Note: On Windows, the default LineBreak value is a carriage return and line feed combination (#13#10), whereas on Android, Linux, macOS and iOS it is just a line feed (#10). + + + When the list of strings includes strings that are name-value pairs or just names, + read Keys to access the name part of a string. If the string is not a name-value + pair, Keys returns full string. Assigning Keys will write new name for name-value + pair. This is in contrast to Names property. + + + Specifies the quote character used by the DelimitedText property. +Use QuoteChar to get or set the quote character that is used to enclose individual strings in the DelimitedText property. +When QuoteChar is set to the null character, then DelimitedText does the following: + +At reading, does not return quoted list items. +At assigning, does not check an assigning value for quote char. +That is, you can set QuoteChar to the null character to disable quoting in DelimitedText. To set the QuoteChar to the null character, do the following: + + +Delphi: + +MyStringList.QuoteChar := #0; + + + +C++: + +MyStringList->QuoteChar = '\0'; + + + Indicates the character used to separate names from values. +Strings that contain the NameValueSeparator character are considered name-value pairs. NameValueSeparator defaults to the equal sign (=). TStrings defines various methods for accessing names and values and for searching for specific names. +Strings that are name-value pairs consist of a name part, the separator character, and a value part. Any spaces around the separator character are part of the name or value. This convention corresponds to the format used in many initialization files. For example: + +DisplayGrid=1 +SnapToGrid=1 +GridSizeX=8 +GridSizeY=8 + + + Determines how the Delimiter property is used. +If StrictDelimiter is True, individual strings in DelimitedText are only separated by Delimiter or quoted between QuoteChar. If StrictDelimiter is False, spaces and non-printable character are also used as delimiters. + +Tip: You can set QuoteChar to the null character (#0 in Delphi, '\0' in C++) if you do not want quoted strings to be extracted as if they where surrounded by Delimiter. + + + Lists the strings in the TStrings object as a single string with the individual strings delimited by carriage returns and line feeds. +Use Text to get or set all the strings in the TStrings object in a single string delimited by carriage return, line feed pairs. +When setting Text, the value will be parsed and separated into substrings whenever the LineBreak value is encountered. For backward compatibility, on POSIX, if the LineBreak separator is LF, then LF, CR, or CRLF are treated as separators. On Windows if the LineBreak separator is CRLF, then LF, CR, or CRLF are treated as separators. +If the strings in the list contain carriage return or linefeed characters, a less ambiguous format for the strings is available through the CommaText or DelimitedText property. + + + Implements an IStringsAdapter interface for the TStrings object. + +StringsAdapter specifies the attached TStringsAdapter when it is used in OLE applications. + +Note: To create a StringsAdapter you can use GetOleStrings and SetOleStrings instead of creating an instance of TStringsAdapter. StringsAdapter is used internally with OLE applications. + + + Will cause SaveToStream and SaveToFile to write a BOM. +Set WriteBOM to True to cause SaveToStream to write a BOM (byte-order mark) to the stream and to cause SaveToFile to write a BOM to the file. + + + Determines whether to add a line Break after the last line of the Text property or not. +Use TrailingLineBreak to add a finishing line break to Text. Set TrailingLineBreak to True to add a line Break after the last line of Text. Set TrailingLineBreak to False to finish Text without a line Break. Default is True. + + + Determines the implementation that the list of strings must use for string comparison. +Set UseLocale to True to use AnsiCompareStr and AnsiCompareText to compare strings. +Set UseLocale to False to use CompareStr and CompareText. Default is True. + + + Controls a set of boolean properties of TStrings. +Use Options to specify the value of the following boolean properties of the list of strings: + + + +Option + +Property + + +soStrictDelimiter + +StrictDelimiter + + +soWriteBOM + +WriteBOM + + +soTrailingLineBreak + +TrailingLineBreak + + +soUseLocale + +UseLocale + + + + + + + + This constructor creates new string list with specified QuoteChar + and Delimiter property values. + + + This constructor creates new string list with specified QuoteChar, + Delimiter and Options property values. + + + This constructor creates new string list with specified Duplicates, + Sorted and CaseSensitive property values. + + + + + TStream is the base class type for stream objects that can read from or write to various kinds of storage media, such as disk files, dynamic memory, and so on. +Use specialized stream objects to read from, write to, or copy information stored in a particular medium. Each descendant of TStream implements methods for transferring information to and from a particular storage medium, such as a disk file, dynamic memory, and so on. In addition to methods for reading, writing, and copying bytes to and from the stream, stream objects permit applications to seek to an arbitrary position in the stream. Properties of TStream provide information about the stream, such as its size and the current position in the stream. +TStream also introduces methods that work in conjunction with components and filers for loading and saving components in simple and inherited forms. These methods are called automatically by global routines that initiate component streaming. They can also be called directly to initiate the streaming process. Note, however, that component streaming always involves two additional objects: + +A component object that is passed as a parameter to the stream's methods. +A filer object that is automatically created by the stream, and associated with the stream. +Descendant stream objects, such as memory and file streams used for component streaming, are created automatically by the global functions ReadComponentRes and WriteComponentRes. For streaming other kinds of information, choose a descendent class according to the specific data and storage needs. These include: + +TFileStream -- for working with files. +TStringStream -- for manipulating in-memory strings. +TMemoryStream -- for working with a memory buffer. +TWinSocketStream -- for reading and writing over a socket connection. +TOleStream -- for using a COM interface to read and write. + + + Methods responsible for reading up to Count bytes of data from the stream into Buffer. +Descendant stream classes can define its own Read methods that read data from its particular storage medium (such as memory or a disk file) into a Buffer buffer. +Read is used in cases where the number of bytes to read from the stream is not necessarily fixed. +Read attempts to read, into Buffer, up to Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. Read returns the number of bytes actually read, which may be less than Count. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +All the other data-reading methods of a stream (ReadBuffer, ReadData) call Read to do their actual reading. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +Write attempts to write up to Count bytes from the Buffer to the current position in the stream, and returns the number of bytes written. +After writing to the stream, Write advances the current position by the number of bytes written. +Offset specifies a zero-based position in Buffer of the first byte to write. +All other data-writing methods of a stream (WriteBuffer, WriteData) call Write to do their actual writing. +Each descendent stream object defines a Write method that writes data to its particular storage medium (such as memory or a disk file). + + + Methods responsible for reading up to Count bytes of data from the stream into Buffer. +Descendant stream classes can define its own Read methods that read data from its particular storage medium (such as memory or a disk file) into a Buffer buffer. +Read is used in cases where the number of bytes to read from the stream is not necessarily fixed. +Read attempts to read, into Buffer, up to Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. Read returns the number of bytes actually read, which may be less than Count. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +All the other data-reading methods of a stream (ReadBuffer, ReadData) call Read to do their actual reading. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +Write attempts to write up to Count bytes from the Buffer to the current position in the stream, and returns the number of bytes written. +After writing to the stream, Write advances the current position by the number of bytes written. +Offset specifies a zero-based position in Buffer of the first byte to write. +All other data-writing methods of a stream (WriteBuffer, WriteData) call Write to do their actual writing. +Each descendent stream object defines a Write method that writes data to its particular storage medium (such as memory or a disk file). + + + Methods responsible for reading up to Count bytes of data from the stream into Buffer. +Descendant stream classes can define its own Read methods that read data from its particular storage medium (such as memory or a disk file) into a Buffer buffer. +Read is used in cases where the number of bytes to read from the stream is not necessarily fixed. +Read attempts to read, into Buffer, up to Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. Read returns the number of bytes actually read, which may be less than Count. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +All the other data-reading methods of a stream (ReadBuffer, ReadData) call Read to do their actual reading. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +Write attempts to write up to Count bytes from the Buffer to the current position in the stream, and returns the number of bytes written. +After writing to the stream, Write advances the current position by the number of bytes written. +Offset specifies a zero-based position in Buffer of the first byte to write. +All other data-writing methods of a stream (WriteBuffer, WriteData) call Write to do their actual writing. +Each descendent stream object defines a Write method that writes data to its particular storage medium (such as memory or a disk file). + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for reading up to Count but not more than SizeOf(Buffer) bytes from the stream into Buffer. +ReadData is used in cases, where the number of bytes to read from the stream is not necessarily fixed. +ReadData works using the following algorithms: + +When ReadData does not have the Count parameter, then ReadData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +When ReadData has the Count parameter, then: +If Count > SizeOf(Buffer), then ReadData tries to read the SizeOf(Buffer) number of bytes. ReadData advances the current position in the stream by Count number of bytes. ReadData returns Count. +If Count <= SizeOf(Buffer), then ReadData tries to read up to the Count number of bytes from the stream. ReadData advances the current position in the stream by the number of bytes transferred. ReadData returns the number of bytes read. +ReadData methods call Read to do their actual reading. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Methods responsible for writing up to Count bytes from Buffer to the stream. +WriteData is used in cases, where the number of bytes to write to the stream is not necessarily fixed. +WriteData works using the following algorithms: + +When WriteData does not have the Count parameter, then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written. +When WriteData has the Count parameter, then: +If Count > SizeOf(Buffer), then WriteData tries to write the SizeOf(Buffer) number of bytes. WriteData advances the current position in the stream by the Count number of bytes. +If Count <= SizeOf(Buffer), then WriteData tries to write up to the Count number of bytes to the stream and then advances the current position in the stream by the number of bytes transferred. WriteData returns the number of bytes written, which may be less than Count. +WriteData methods call Write to do their actual writing. + + + Embarcadero Technologies does not currently have any additional information. + + + Moves to a specified position in the streamed resource. +Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file). +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + + +Seek returns the new value of the Position property. +Seek is called by the Position and Size properties. + +Note: As implemented in TStream, the two versions (the 32-bit or 64-bit syntax) call each other. Descendent stream classes must override at least one of these versions, and the override must not call the inherited default implementation. + + + Moves to a specified position in the streamed resource. +Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file). +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + + +Seek returns the new value of the Position property. +Seek is called by the Position and Size properties. + +Note: As implemented in TStream, the two versions (the 32-bit or 64-bit syntax) call each other. Descendent stream classes must override at least one of these versions, and the override must not call the inherited default implementation. + + + Moves to a specified position in the streamed resource. +Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file). +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + + +Seek returns the new value of the Position property. +Seek is called by the Position and Size properties. + +Note: As implemented in TStream, the two versions (the 32-bit or 64-bit syntax) call each other. Descendent stream classes must override at least one of these versions, and the override must not call the inherited default implementation. + + + Reads Count bytes from the stream into Buffer. +Use ReadBuffer to read Count bytes from the stream into a Buffer buffer in cases where the number of bytes to read is known and fixed, for example when reading in structures. ReadBuffer is used internally for loading from a stream and copying from a stream. +Read attempts to read exactly Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +ReadBuffer calls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadError exception is raised. + + + Reads Count bytes from the stream into Buffer. +Use ReadBuffer to read Count bytes from the stream into a Buffer buffer in cases where the number of bytes to read is known and fixed, for example when reading in structures. ReadBuffer is used internally for loading from a stream and copying from a stream. +Read attempts to read exactly Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +ReadBuffer calls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadError exception is raised. + + + Reads Count bytes from the stream into Buffer. +Use ReadBuffer to read Count bytes from the stream into a Buffer buffer in cases where the number of bytes to read is known and fixed, for example when reading in structures. ReadBuffer is used internally for loading from a stream and copying from a stream. +Read attempts to read exactly Count bytes from the stream, starting at the current position, and then advances the current position in the stream by the number of bytes actually transferred. +Offset specifies a zero-based position in Buffer from which to write the first byte into Buffer. +ReadBuffer calls Read to do the actual reading. If Count bytes cannot be read from the stream, an EReadError exception is raised. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Methods responsible for reading fixed Count or SizeOf(Buffer) number of bytes from the stream into Buffer. +Use ReadBufferData to read exactly the fixed Count or SizeOf(Buffer) number of bytes from the stream into a typed Buffer. ReadBufferData raises an EReadError exception if ReadBufferData cannot read exactly the specified number of bytes. +ReadBufferData works using the following algorithms: + +When ReadBufferData does not have the Count parameter, then ReadBufferData tries to read the SizeOf(Buffer) number of bytes, then advances the current position in the stream by the number of bytes transferred. If the number of bytes transferred is not = SizeOf(Buffer), then ReadBufferData raises an EReadError exception. +When ReadBufferData has the Count parameter, then ReadBufferData calls ReadData to read the Count bytes. If a reported number of transferred bytes is not equal to Count, then ReadBufferData raises an EReadError exception. +ReadBufferData calls ReadData to do the actual reading. + + + Writes Count bytes from Buffer onto the stream. +WriteBuffer attempts to write Count bytes from the Buffer to the current position in the stream, then WriteBuffer advances the current position by Count. If the stream fails to write all the requested bytes, an EWriteError exception is raised. +Offset specifies a zero-based position in Buffer of the first byte to write. +Use WriteBuffer to save data to a stream. WriteBuffer is used in cases, where the number of bytes to write is known and required, for example when writing in structures. Use WriteBuffer for standard file I/O streaming. +WriteBuffer is used internally for writing to a stream. It is used by other objects, such as strings and lists, for writing strings stored in a buffer. +WriteBuffer calls Write to handle the actual writing. + + + Writes Count bytes from Buffer onto the stream. +WriteBuffer attempts to write Count bytes from the Buffer to the current position in the stream, then WriteBuffer advances the current position by Count. If the stream fails to write all the requested bytes, an EWriteError exception is raised. +Offset specifies a zero-based position in Buffer of the first byte to write. +Use WriteBuffer to save data to a stream. WriteBuffer is used in cases, where the number of bytes to write is known and required, for example when writing in structures. Use WriteBuffer for standard file I/O streaming. +WriteBuffer is used internally for writing to a stream. It is used by other objects, such as strings and lists, for writing strings stored in a buffer. +WriteBuffer calls Write to handle the actual writing. + + + Writes Count bytes from Buffer onto the stream. +WriteBuffer attempts to write Count bytes from the Buffer to the current position in the stream, then WriteBuffer advances the current position by Count. If the stream fails to write all the requested bytes, an EWriteError exception is raised. +Offset specifies a zero-based position in Buffer of the first byte to write. +Use WriteBuffer to save data to a stream. WriteBuffer is used in cases, where the number of bytes to write is known and required, for example when writing in structures. Use WriteBuffer for standard file I/O streaming. +WriteBuffer is used internally for writing to a stream. It is used by other objects, such as strings and lists, for writing strings stored in a buffer. +WriteBuffer calls Write to handle the actual writing. + + + Writes up to 4 four or Count bytes from Buffer onto the stream. +WriteBufferData works using the following algorithms: + +If Count <= 4, then WriteBufferData tries to write up to Count bytes to the stream starting at the current position and advances the current position in the stream by the number of bytes transferred. +If Count > 4, then WriteBufferData tries to write up to 4 four bytes to the stream, starting at the current position, and then advances the current position in the stream until Count number of bytes from the initial position that was before the starting of WriteBufferData execution. + + + Copies a specified number of bytes from one stream to another. +Use CopyFrom to copy data from one stream to a different one. Using CopyFrom eliminates the need to create, read into, write from, and free a buffer when copying data. +CopyFrom copies Count bytes from the stream specified by Source into the stream. It then moves the current position by Count bytes and returns the number of bytes copied. +If Count is 0, CopyFrom sets Source position to 0 before reading and then copies the entire contents of Source into the stream. If Count is greater than or less than 0, CopyFrom reads from the current position in Source. +Because the CopyFrom method uses ReadBuffer and WriteBuffer to do the effective copying, if the Count is greater than the SourceStream size, ReadBuffer throws an exception stating that a stream read error has occured. + + + Initiates streaming of components and their properties. +ReadComponent is called indirectly by the global routine ReadComponentRes, by the ReadComponentRes method, or it can be called directly to initiate component streaming. +ReadComponent reads data values from the stream and assigns them to Instance's properties. It then constructs a reader object and calls the reader's ReadRootComponent method to read the Instance's property values and construct child objects defined in the stream as children of Instance. ReadComponent returns the component. +If Instance is nil (Delphi) or NULL (C++), ReadComponent constructs a component based on the type information in the stream and returns the newly-constructed component. + + + Reads components and their properties from a stream in a resource file format. +ReadComponentRes is called automatically by the global routine ReadComponentResFile. It can also be called directly if the current position of the stream points to a component written using the WriteComponentRes method. +ReadComponentResFile creates a file stream object, which then calls its ReadComponentRes method. +ReadComponentRes first calls the ReadResHeader method to read a resource header from the stream. If the stream does not contain a resource header at the current position, ReadResHeader will raise an EInvalidImage exception. ReadComponentRes then calls ReadComponent to read the properties that must be set on Instance. + + + Initiates the writing of components and their properties to a stream. +WriteComponent is used internally in the component streaming system, but can also be called directly when writing components to memory streams or database blobs. +WriteComponent constructs a writer object and calls its WriteRootComponent method to write the component specified by Instance, and its owned objects, to the stream. + + + Writes components and their properties to a stream from a resource file format. +WriteComponentRes is used internally in the streaming system, but can also be called directly when sending data to other applications on disk. WriteComponentRes is used for streaming components that need data, such as a bitmap or icon to be stored in a resource-file format. +WriteComponentRes calls WriteDescendentRes, passing in nil (Delphi) or NULL (C++) as the Ancestor. Therefore, WriteDescendentRes initiates the remainder of the streaming process for a component that, in this case, is not a descendant. +To read a component written with WriteComponentRes, call the ReadComponentRes method. + + + Streams components and their properties in inherited forms. +Do not call WriteDescendent directly. WriteDescendent is called automatically by WriteComponent. +WriteDescendent constructs a writer object, then calls the writer object's WriteDescendent method to write the component passed in Instance to the stream. Instance is either an inherited form descended from Ancestor or nil (Delphi) or NULL (C++). However, WriteDescendent is never used to write owned components, only to initiate streaming on the root component. + + + Streams components and their properties in inherited forms. +Do not call WriteDescendentRes directly. WriteDescendentRes is called automatically by WriteComponentRes. +WriteDescendentRes writes a resource-file header to the stream, using the resource name passed in ResName as the name of the resource. It then calls WriteDescendent to write Instance to the stream as a descendant of Ancestor. + + + Writes a resource-file header to the stream. +Do not call WriteResourceHeader; it is used internally. The WriteDescendentRes method calls WriteResourceHeader before writing a component to the stream. This method writes the resource-file header, using the value passed as ResName for the name of the resource. It returns a position in FixupInfo that must be used to adjust the header after the size of the resource is known. WriteDescendentRes calls FixupResourceHeader with the value returned as FixupInfo after streaming out the component. + + + Patches the resource header for a resource that has been written to the stream. +Do not call FixupResourceHeader� it is used internally. The WriteDescendentRes method calls FixupResourceHeader after writing a component to the stream. This method then uses the current position to determine the size of the resource just written and adjust the resource header accordingly. +The FixupInfo parameter is the value returned by WriteResourceHeader when it writes the resource header (before WriteDescendentRes streams out the component.) + + + Reads a resource-file header from the stream. +Do not call ReadResHeader directly. It is called automatically by ReadComponentRes before reading a component from a resource file. +After reading the resource-file header, ReadResHeader moves the current position of the stream to just beyond the header. If the stream does not contain a valid resource-file header, ReadResHeader raises an EInvalidImage exception. + + + Indicates the current offset into the stream for reading and writing. +Use Position to obtain the current position of the stream. This is the number of bytes from the beginning of the streamed data. + + + Indicates the size in bytes of the stream. +Use Size to find the size of the stream. Size is used internally in routines that read and write to and from the stream. Setting the Size property of TStream does nothing. However, descendants of TStream can override this property to allow applications to change the size of the resource accessed using the stream. +The Size property typically indicates the size of the stream in bytes. But a descendent of TStream can use -1 to indicate an unknown size. When the size is unknown, use the return value from TStream.Read to determine end of the stream. + +Example of Stream Size using DataSnap and DBX +When you are reading a DataSnap stream in blocks, the actual TStream descendant that is used to read the stream is TDBXStreamReaderStream. TDBXStreamReaderStream overrides methods of TStream such as the method System.Classes.TStream.GetSize, which is the reader for the property Size. +DBX connections support reading streams in block. The default block size is 32K. Streams can be passed from the client to the server, or from the server to the client. When the receiver is reading the stream (whether the receiver is the client or the server), the stream is passed from the sender to the receiver in blocks. When the stream is large enough to require multiple block readings, the Size property of the receiver's stream will be -1, which indicates that the size of the stream is unknown. As the receiver reads the stream, DataSnap makes a request to the sender for the next block, as needed. To read the stream, the client calls the Read() method until the return value is less than the value requested. +The following code shows how to read a stream to the end, by checking the return value from Read(): + +var + LBuffer: TArray<Byte>; + LReadCount: Integer; +begin + SetLength(LBuffer, 1024*10); // 10K buffer for this example. The buffer size can be larger or smaller. + repeat + LReadCount := AStream.Read(LBuffer[0], Length(LBuffer)); + if LReadCount > 0 then + begin + // Process buffer + end; + until LReadCount < Length(LBuffer); + + + + + THandleStream enables applications to read from and write to communications resources identified by a handle. +Use THandleStream to access files, sockets, named pipes, mailslots, or other communications resources that provide a handle when opened. For example, the FileOpen function provides a handle for a file on disk. THandleStream allows applications to use a uniform stream interface when performing I/O using a handle. +To avoid the overhead of managing file handles, use TFileStream to work with disk files. + + + Sets the end of the file marker to truncate the resource at the indicated position. +Call SetSize to set the size of the resource. SetSize calls Seek to go to the indicated position, and then writes an end of file marker. If the size of the resource cannot be changed, an exception is raised. For example, calling SetSize for a file handle that was opened in fmOpenRead mode will raise an exception. + + + Sets the end of the file marker to truncate the resource at the indicated position. +Call SetSize to set the size of the resource. SetSize calls Seek to go to the indicated position, and then writes an end of file marker. If the size of the resource cannot be changed, an exception is raised. For example, calling SetSize for a file handle that was opened in fmOpenRead mode will raise an exception. + + + Creates an instance of THandleStream. +Call Create to instantiate a THandleStream for a given handle. +The handle must be obtained by opening or creating the resource in the appropriate mode. For example, to create a handle stream for reading from a file, obtain the file handle by opening the file with an fmOpenRead or fmOpenReadWrite mode. To create a handle stream for writing to a file, obtain the file handle by opening the file with an fmOpenWrite or fmOpenReadWrite mode. + + + Reads up to Count bytes of data from the resource associated with the handle stream into Buffer. +Use Read to read data from the resource associated with the handle stream when the number of bytes in the file is not known. Read transfers up to Count bytes from the resource, starting at the current position, and then advances the current position in the resource by the number of bytes actually transferred. Read returns the number of bytes actually transferred, which may be less than Count if the end of file marker is encountered. +All other data-reading methods of a handle stream (ReadBuffer, ReadComponent) call Read to do the actual reading. + + + Writes Count bytes from the Buffer to the current position in the resource. +Use Write to write Count bytes to the resource associated with the handle stream, starting at the current position. After writing to the resource, Write advances the current position by the number bytes written, and returns the number of bytes written. +All other data-writing methods of a handle stream (WriteBuffer, WriteComponent) call Write to do the actual writing. + + + Resets the current position of the handle stream. +Use Seek to move the current position within the resource associated with the handle stream by the indicated offset. Seek allows an application to read from or write to a particular location within the resource. +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soFromBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soFromCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soFromEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + +Or you can also use TSeekOrigin and its values to indicate where to start a seek operation. +Seek returns the new value of the Position property, the new current position in the resource. + + + Specifies the handle for the communications resource the stream reads from and writes to. +Read Handle to get the handle for file management functions. To read from or write to the resource, use the methods of the THandleStream object. +Handle is a read-only property. The handle property cannot be changed to allow the handle stream to switch from reading to writing or vice versa. For example, to change from a file handle that is opened in read-only mode to one that is opened in write mode: + +Free the stream object. +Call FileClose to close the file. +Reopen the file in write mode and use the handle to create a new instance of a handle stream. Alternately, open a TFileStream object for the file, specifying a write mode for the stream. +Note: Do not call the FileClose function on the Handle until after the THandleStream object has been destroyed. + + + + + TFileStream enables applications to read from and write to a file on disk. +Use TFileStream to access the information in disk files. TFileStream will open a named file and provide methods to read from or write to it. If an application already has a handle to the file, opened in the appropriate mode, use THandleStream instead. + + + Creates an instance of TFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +If the file cannot be opened, Create raises an exception. + + + Creates an instance of TFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +If the file cannot be opened, Create raises an exception. + + + Destroys an instance of TFileStream. +Do not call Destroy directly in an application. Instead, call Free, which checks that the TFileStream reference is not nil and only then calls Destroy. +Destroy closes the Handle for the file stream before freeing the object. + + + Preserves the file name of the file associated with the file stream. +Use FileName to display the name of the file that TFileStream has accessed from disk. This is a read only property. + + + + + TBufferedFileStream adds buffering support to TFileStream. +TBufferedFileStream optimizes multiple consecutive small reads or writes. However, TBufferedFileStream can be used as a drop-in replacement for TFileStream, enabling applications to read from and write to a file on a disk. + +Note: TBufferedFileStream will not give performance gain for random position reads or writes, or large reads or writes. + + + Sets the end of the file marker to truncate the resource at the indicated position. +System.Classes.TBufferedFileStream.SetSize inherits from System.Classes.THandleStream.SetSize. All content below this line refers to System.Classes.THandleStream.SetSize. +Sets the end of the file marker to truncate the resource at the indicated position. +Call SetSize to set the size of the resource. SetSize calls Seek to go to the indicated position, and then writes an end of file marker. If the size of the resource cannot be changed, an exception is raised. For example, calling SetSize for a file handle that was opened in fmOpenRead mode will raise an exception. + + + Writes the buffered data that have not yet been written to the file. +When using a buffered file stream, call SyncBuffer to empty the buffer and write to the file the buffered data that are still not written. +The ReRead parameter specifies whether the buffer is repopulated or not before the call to SyncBuffer. The possible ReRead values are: + +True -- The buffer is refilled with the corresponding data from the file. +False -- The buffer will remain empty until the next read or write operation. + + + Creates an instance of TBufferedFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +The BufferSize parameter determines the size of the buffer used to read from or write to the file. +If the file cannot be opened, Create raises an exception. + + + Creates an instance of TBufferedFileStream. +Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters. +The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and (possibly) a share mode or'ed together. The open mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmCreate + + + +Create a file with the given name. If a file with the given name exists, override the existing file and open it in write mode. + + + +System.Classes + + + + +fmOpenRead + + + +Open the file for reading only. + + + +System.SysUtils + + + + +fmOpenWrite + + + +Open the file for writing only. Writing to the file completely replaces the current contents. + + + +System.SysUtils + + + + +fmOpenReadWrite + + + +Open the file to modify the current contents rather than replace them. + + + +System.SysUtils + + + +The share mode must be one of the following values: + + + +Value + +Meaning + +Declared In + + + +fmShareCompat + + + +Sharing is compatible with the way FCBs are opened. + + + +System.SysUtils + + + + +fmShareExclusive + + + +Other applications cannot open the file for any reason. + + + +System.SysUtils + + + + +fmShareDenyWrite + + + +Other applications can open the file for reading but not for writing. + + + +System.SysUtils + + + + +fmShareDenyRead + + + +Other applications can open the file for writing but not for reading. + + + +System.SysUtils + + + + +fmShareDenyNone + + + +No attempt is made to prevent other applications from reading from or writing to the file. + + + +System.SysUtils + + +Note: On Windows, the Rights parameter is ignored. +The BufferSize parameter determines the size of the buffer used to read from or write to the file. +If the file cannot be opened, Create raises an exception. + + + Destroys this instance of TBufferedFileStream. + + + Writes the buffered data that have not yet been written to the file. +When using a buffered file stream, call FlushBuffer to write to the file the data from the buffer that are still not written. +Once you call FlushBuffer, the buffer will remain empty until the next read or write operation. + + + Reads up to Count bytes of data from the resource associated with the handle stream into Buffer. +System.Classes.TBufferedFileStream.Read inherits from System.Classes.THandleStream.Read. All content below this line refers to System.Classes.THandleStream.Read. +Reads up to Count bytes of data from the resource associated with the handle stream into Buffer. +Use Read to read data from the resource associated with the handle stream when the number of bytes in the file is not known. Read transfers up to Count bytes from the resource, starting at the current position, and then advances the current position in the resource by the number of bytes actually transferred. Read returns the number of bytes actually transferred, which may be less than Count if the end of file marker is encountered. +All other data-reading methods of a handle stream (ReadBuffer, ReadComponent) call Read to do the actual reading. + + + Writes Count bytes from the Buffer to the current position in the resource. +System.Classes.TBufferedFileStream.Write inherits from System.Classes.THandleStream.Write. All content below this line refers to System.Classes.THandleStream.Write. +Writes Count bytes from the Buffer to the current position in the resource. +Use Write to write Count bytes to the resource associated with the handle stream, starting at the current position. After writing to the resource, Write advances the current position by the number bytes written, and returns the number of bytes written. +All other data-writing methods of a handle stream (WriteBuffer, WriteComponent) call Write to do the actual writing. + + + Resets the current position of the handle stream. +System.Classes.TBufferedFileStream.Seek inherits from System.Classes.THandleStream.Seek. All content below this line refers to System.Classes.THandleStream.Seek. +Resets the current position of the handle stream. +Use Seek to move the current position within the resource associated with the handle stream by the indicated offset. Seek allows an application to read from or write to a particular location within the resource. +The Origin parameter indicates how to interpret the Offset parameter. Origin should be one of the following values: + + + +Value + +Meaning + + + +soFromBeginning + + + +Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0. + + + + +soFromCurrent + + + +Offset is from the current position in the resource. Seek moves to Position + Offset. + + + + +soFromEnd + + + +Offset is from the end of the resource. Offset must be <= 0 to indicate a number of bytes before the end of the file. + + +Or you can also use TSeekOrigin and its values to indicate where to start a seek operation. +Seek returns the new value of the Position property, the new current position in the resource. + + + + + TCustomMemoryStream is an abstract base class used as the common ancestor for memory streams. +Use TCustomMemoryStream as a base class when defining a stream object that can transfer data that is stored in memory. Memory streams are useful for providing file-like access to data that is stored in a less accessible medium. Data can be moved to an internal memory buffer when the memory stream is created. After manipulating the data in a memory stream, the data can be written out to its actual storage medium when the memory stream is destroyed. +Do not instantiate an instance of TCustomMemoryStream. It is an abstract class that implements behavior common to all memory streams. To work with an instance of a memory stream, use one of the descendants of TCustomMemoryStream, such as TMemoryStream or TResourceStream. + + + Replaces the memory buffer associated with the memory stream. +Use SetPointer to set the internal memory buffer, Memory, to be the value passed in by Ptr. Size is the number of bytes Ptr points to. +Descendants of TCustomMemoryStream should use SetPointer to associate the memory stream with the memory buffer that holds the data for the memory stream. + +Note: SetPointer does not free the existing value of Memory, if any, when it replaces the memory buffer. Descendants of TCustomMemoryStream that use SetPointer to replace the stream's memory pool should free the memory pointed to by the Memory property before calling SetPointer to replace the memory buffer. + + + Reads up to Count bytes from the memory stream into Buffer and advances the current position of the stream by the number of bytes read. +Use Read to read the contents of the memory stream into a buffer, starting at the current position. Read will read up to Count bytes from the current position in Memory. If Count bytes extends beyond the end of the memory buffer, Read will only transfer the data up to the end of the associated memory buffer. Read returns the number of bytes actually transferred to Buffer, and advances the current position accordingly. If the return value is less than Count, it means that reading reached the end of the stream data. +All the other data-reading methods of the memory stream (ReadBuffer, ReadComponent) call Read to do the actual reading. + +Note: Read treats Count as an upper bound. The ReadBuffer method, by contrast, raises an exception if Count bytes cannot be read. + + + Moves the current position of the stream by Offset bytes, relative to the origin specified by Origin. +Use Seek to move the current position within the memory stream by the indicated offset. Seek allows an application to read from or write to a particular location within the Memory associated with the memory stream. +If Offset is a negative number, the seeking is backward from the specified origin. The following table shows the different values of Origin and their meanings for seeking: + + + +Value + +Meaning + + + +soBeginning + + + +Offset is from the beginning of Memory. Seek moves to the position Offset. Offset must be >= 0. + + + + +soCurrent + + + +Offset is from the current position. Seek moves to Position + Offset. + + + + +soEnd + + + +Offset is from the end of Memory. Offset must be <= 0 to indicate a number of bytes before the end of the memory buffer. + + +Seek returns the new value of the Position property. + +Note: Seek does no error checking on the value provided for Offset. Do not call Seek with an offset that would move the current position less than 0 (before the start of Memory) or greater than Size (beyond the end of the memory buffer). + + + Writes the entire contents of the memory stream to the stream object specified by Stream. +Use SaveToStream to copy data that is stored in memory into another storage medium. SaveToStream writes the entire contents of Memory into the indicated stream object, starting at the current position in the stream that was passed as a parameter. +When the Stream parameter is a TFileStream object, SaveToStream does much the same thing as the SaveToFile method. However, SaveToStream writes to the current position in the target stream. Thus, for example, SaveToStream can be used to append the contents of Memory to a file stream, rather than replace the contents of the file the way SaveToFile does. +If the entire contents of the memory stream cannot be written to the target stream, SaveToStream raises an EWriteError exception. + + + Writes the entire contents of the memory stream to the file with a given file name. +Use SaveToFile to write the contents of Memory to a file. SaveToFile allows an application to write out the contents of the memory stream without having to explicitly create and free a file stream object. In case the file already exists, the current file contents will be completely replaced with the new. If the named file cannot be created or opened, SaveToFile raises an EFCreateError exception. + + + Provides direct access to the memory pool allocated for the memory stream. +Use Memory to get access to the memory for the stream. The memory for the stream holds the data that is being transferred by means of the memory stream. Size is the number of bytes of Memory that were allocated, and Position is the current position within Memory. + +Note: Memory is a read-only property. Memory can be used to change the contents of the memory, but to set the actual memory the stream works with, descendants of TCustomMemoryStream must assign a pointer to a memory buffer by calling the SetPointer method. + + + + + TMemoryStream is a stream that stores its data in dynamic memory. +Use TMemoryStream to store data in a dynamic memory buffer that is enhanced with file-like access capabilities. TMemoryStream provides the general I/O capabilities of a stream object while introducing methods and properties to manage a dynamic memory buffer. +Memory streams are useful as intermediary objects that can hold information as well as read it from or write it to another storage medium. They provide a useful format for comparing the contents of streams, or for manipulating data that is stored in a less accessible medium. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the size of the internal buffer to the given capacity. +Realloc is used by the memory stream to resize the internal buffer to the new capacity. Realloc requires a parameter that specifies the new capacity of the internal buffer. A pointer to the start of the internal buffer is returned. If Realloc cannot resize the memory block, an EStreamError error is raised. + + + Specifies the buffer size allocated for the memory stream. +Use the Capacity property to read or change the capacity of the memory stream. +Capacity is different from the Size property, which is the size of the stream, in bytes. The value of Capacity is always greater than or equal to the value of Size. + + + Destroys an instance of TMemoryStream. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMemoryStream reference is not nil, and only then calls Destroy. +Destroy a TMemoryStream object when it is no longer needed to store or write data. Destroy calls Clear to free the memory buffer before calling the inherited destructor. + + + Frees the memory buffer, discarding all data associated with the memory stream. +Use Clear to empty the memory buffer for the memory stream and free all associated memory. In addition to freeing the memory associated with the memory buffer, Clear: + +Sets the Memory property to nil (Delphi) or NULL (C++). +Sets the Position property to 0. +Sets the Size property to 0. + + + Loads the entire contents of a stream into the memory buffer. +Use LoadFromStream to fill the memory stream with the contents of the stream specified by the Stream parameter. LoadFromStream always sets the Position of the source stream to 0, before streaming in the number of bytes indicated by the source stream's Size property. +LoadFromStream reallocates the memory buffer so that the contents of the source stream will exactly fit. It sets the Size property accordingly, and then reads the entire contents of the source stream into the memory buffer. Thus, LoadFromStream will discard any pre-existing data stored in the memory stream. +If the source stream is a TFileStream object, LoadFromStream does the same thing as LoadFromFile, except that the application must create and free the TFileStream object. LoadFromStream also allows applications to fill a memory stream object from other types of stream objects. + + + Loads the entire contents of a file into the memory buffer. +Use LoadFromFile to fill the memory stream with the contents of a file. Pass the name of the file as the FileName parameter. LoadFromFile allows an application to read the contents of a file into the memory stream without having to explicitly create and free a file stream object. +LoadFromFile reallocates the memory buffer so that the contents of the file will exactly fit. It sets the Size property accordingly, and then reads the entire contents of the file into the memory buffer. Thus, LoadFromFile will discard any pre-existing data stored in the memory stream. + + + Sets the Size property of the memory stream. +Use SetSize to set the Size of a memory stream before filling it with data. SetSize allocates the memory buffer to hold NewSize bytes, preserving as much of the existing data as possible. +Use SetSize before filling the memory buffer with data from various sources, or from a portion of another stream. If the intended contents of the memory stream is exactly the same as the contents of another stream or file, use LoadFromStream or LoadFromFile instead. + + + Sets the Size property of the memory stream. +Use SetSize to set the Size of a memory stream before filling it with data. SetSize allocates the memory buffer to hold NewSize bytes, preserving as much of the existing data as possible. +Use SetSize before filling the memory buffer with data from various sources, or from a portion of another stream. If the intended contents of the memory stream is exactly the same as the contents of another stream or file, use LoadFromStream or LoadFromFile instead. + + + Writes Count bytes from Buffer to the current position in the memory buffer and updates the current position by Count bytes. +Use Write to insert Count bytes into the memory buffer of the memory stream, starting at the current position. Write will increase the size of the memory buffer, if necessary, to accommodate the data being written in. If the current position is not the end of the memory buffer, Write will overwrite the data following the current position. +Write updates the Size property to Position + Count, and sets the Position property to the new value of Size. Thus, any data that was stored in the memory stream in the Count bytes after the current position is lost when calling Write. +Write always writes the Count bytes in the Buffer, unless there is a memory failure. Thus, for TMemoryStream, Write is equivalent to the WriteBuffer method. +All other data-writing methods of a memory stream (WriteBuffer, WriteComponent) call Write to do the actual writing. + + + + + TBytesStream is a stream that stores its data in bytes. +Use TBytesStream to store data as bytes in a memory buffer. +Memory streams are useful as intermediary objects that can hold information as well as read it from or write it to another storage medium. They provide a useful format for comparing the contents of streams, or for manipulating data that is stored in a less accessible medium. + + + Sets the size of the internal buffer to the given capacity. +Realloc is used by the memory stream to resize the internal buffer to the new capacity. Realloc requires a parameter that specifies the new capacity of the internal buffer. A pointer to the resized stream of bytes is returned. If Realloc cannot resize the memory block, an EStreamError error is raised. + + + Constructs an object and initializes its data before the object is first used. +System.Classes.TBytesStream.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + + Specifies the stored data. +The Bytes property returns the buffer in which the data is stored. Use the Size property to find the actual amount of data in the buffer. + + + + + TStringStream provides file-like access to information stored as a long string. +Use TStringStream to store data as a long string enhanced with I/O capabilities. TStringStream is useful as an intermediary object that can hold text as well as read it from or write it to another storage medium. TStringStream provides a mechanism for manipulating text that is obtained from a less accessible medium. + + + Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + Creates an instance of TStringStream. +Call Create to instantiate a TStringStream object. Create initializes the DataString property to the AString parameter. + + + Destroys an instance of TMemoryStream. +System.Classes.TStringStream.Destroy inherits from System.Classes.TMemoryStream.Destroy. All content below this line refers to System.Classes.TMemoryStream.Destroy. +Destroys an instance of TMemoryStream. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMemoryStream reference is not nil, and only then calls Destroy. +Destroy a TMemoryStream object when it is no longer needed to store or write data. Destroy calls Clear to free the memory buffer before calling the inherited destructor. + + + Returns a string that consists of up to Count bytes from the current position in the string stream, and advances the current position of the stream by the number of bytes read. +Use Read to read the contents of the string stream into a string, starting at the current position. If Count extends beyond the end of the DataString, the returned string will only contain the characters up to the end of DataString, and the current position is advanced accordingly. + +Note: ReadString does the same thing as Read, except that it returns a string rather than filling a buffer. + + + Concatenates a specified string to the current position in the string stream, and updates the current position accordingly. +Use WriteString to replace the end of the string from the current position on with the string specified by the AString parameter. WriteString changes the Size property to reflect the new length of the DataString. + + + Provides direct access to the string that stores the text represented by the TStringStream object. +Use DataString to get access to the text of the stream. The text represents the information that is being transferred by means of the string stream. Size is the number of bytes in the string, and Position is the current position within DataString. + +Note: DataString is a read-only property. DataString can be used to change the contents of the string, but applications can't change the DataString itself. + + + Represents the encoding used internally by the TStringStream instance to store the data. +Encoding represents the encoding that is used to get the corresponding array of bytes from a given string, or to obtain the corresponding string from the contained array of bytes. (A string stream contains an array of bytes.) +The encoding of a stream string is set in the constructor (you can specify what encoding to use). + + + + + TResourceStream is a memory stream that provides access to the compiled resources in an application. +Use TResourceStream to read the resources of an application. An instance of TResourceStream holds the value of a single resource in a memory buffer where it is accessible to the application. +The global ReadComponentRes function uses TResourceStream to access the compiled resources used by the application. + + + Creates an instance of TResourceStream associated with a particular resource name and type. +Call Create to instantiate a TResourceStream, passing in parameters that identify the resource in a specified instance. TResourceStream finds the resource data and loads it into the Memory buffer for the TResourceStream. +The Instance parameter is the instance handle associated with the executable or shared library that contains the resource. +In the first constructor syntax, the ResName is the string associated with the resource in the .rc file that was compiled with the application. If the resource is associated with an integer ID rather than a string, use the string representation of the integer after a pound sign. Thus, for example, a resource with an integer identifier of 128 be identified by a ResName of #128. + +Note: Specifying resources by ID requires less memory than specifying resources by name. +The ResType parameter is a string identifying the type of the resource. Applications can define their own resource types and identify them by name in the .rc file. In addition, there are a number of predefined resource types (which reflect Windows resource types). To identify a resource that is one of the predefined resource types, set ResType to the appropriate value from the following table: + + + + + +ResType + +Type of resource + + + +RT_ACCELERATOR + + + +Accelerator table + + + + +RT_BITMAP + + + +Bitmap resource + + + + +RT_DIALOG + + + +Dialog box + + + + +RT_FONT + + + +Font resource + + + + +RT_FONTDIR + + + +Font directory resource + + + + +RT_MENU + + + +Menu resource + + + + +RT_RCDATA + + + +Application-defined resource (raw data) + + + + +RT_STRING + + + +String-table entry + + + + +RT_MESSAGETABLE + + + +Message-table entry + + + + +RT_CURSOR + + + +Hardware-dependent cursor resource + + + + +RT_GROUP_CURSOR + + + +Hardware-independent cursor resource + + + + +RT_ICON + + + +Hardware-dependent icon resource + + + + +RT_GROUP_ICON + + + +Hardware-independent icon resource + + + + +RT_VERSION + + + +Version resource + + + Destroys an instance of TResourceStream. +Do not call Destroy directly in an application to destroy an instance of TResourceStream. Instead, call Free. Free verifies that the TResourceStream reference is not nil, and only then calls Destroy. +Destroy frees the memory buffer that stores the resource before calling the inherited destructor. + + + Overrides the inherited method to raise an exception when an attempt is made to write the resource back to the application. +Applications should not use a TResourceStream to write the resources of the running application. Write overrides the inherited method to raise an EStreamError exception when an application tries to write to the application's resources. +As all other data-writing methods of TResourceStream (WriteBuffer, WriteComponent) call Write to do the actual writing, calling any of the data-writing methods of TResourceStream will raise an exception. + + + + + + + + Queue the method to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + Queue the procedure to delay its synchronous execution. Unlike the Queue method, this will queue it even + if the caller is in the main thread. + + + Returns True if after AStartTime the specified ATimeout is passed. + When ATimeout <= 0, then timeout is inifinite and function always returns False. + + + The currently executing thread. This is the same as TThread.CurrentThread. + + + The currently executing thread. This is the same as TThread.Current. + Please use TThread.Current, which is more clear and less redundant. + + + The number of processor cores on which this application is running. This will include virtual + "Hyper-threading" cores on many modern Intel CPUs. It is ultimately based on what the underlying + operating system reports. + + + Simple Boolean property to quickly determine wether running on a single CPU based system. + + + Event handler, which is called before each Synchronize or Queue call. + + + + + Base class used for implementing all asynchronous procedure calls. Never pass this instance around as + an instance reference. The intent is that this object is only ever referenced through the IAsyncResult + interface. Failure to heed this warning will result in unpredictable behavior. See the information about the + Invoke method. + + + This field will hold the acquired exception instance raised from the execution of the async method call. + It will be re-raised in the context of the invoking thread when the corresponding EndXXXX method is called. + + + Override this method to dispatch the actual asynchronous procedure call. Descendants will use whatever context + or other state information contained in the instance to pass along to the procedure or function. + + + Override this method to perform any extra state or signaling required by the descendant. The descendant must + call this inherited method in order to properly set the completion and possibly signal the FAsyncHandle if + previously created. Failure to call this method can result in a dead lock or hang. + + + Calls the actual target asynchronous method within the context of however it is scheduled. This could be + in the context of the main or GUI thread, or within a background thread. This depends on the implementation + of a specific asynchronous BeginXXXX method call. + + + Override this method to schedule the asynchronous procedure call in the manner specific to + a given instance, component or class. By default, this will schedule the async procedure onto + the main thread or execute the procedure synchronously if already on the main thread. + Other classes may schedule the procedure call into a separate thread or thread pool. + + + This constructor must be called from a descendent protected constructor. + + + Opaque user-supplied context. This context is available via the IAsyncResult.GetAsyncContext and descendents + if this class. + + + Returns true if the operation can be cancelled. When cancelling the async operation, do any additional processing. + + + This constructor should never be called directly. Only descendents should be constructed using the + protected Create constructor above. Calling this constructor will raise an exception. + + + Cancels the async operation. Returns True when the asynchronous operation can be cancelled. + + + This method must be called prior in order to return itself as an IAsyncResult and actually schedule/invoke the + async call. + + + As long as the rules for only ever accessing this object through the IAsynsResult interface, this method + should only ever be called by a given "EndInvoke" method by casting the IAsyncResult interface instance + back to a specific descendant instance of this class. Never call this method directly outside the context + of an "EndInvoke" style method. + + + This method is called from VCL.TControl (and possibly other similar) descendants in order to call the + asynchronous procedure/function as a result of a posted Window message. + + + Set to True when the asynchronous call has been cancelled. + + + + + TComponent is the common ancestor of all component classes. +TComponent is the base class for all components. Components are persistent objects that have the following capabilities: + +IDE integration. The ability to appear on an IDE palette and be manipulated in a Form Designer. +Ownership. The ability to manage other components. If component A owns component B, then A is responsible for destroying B when A is destroyed. +Streaming and filing. Enhancements of the persistence features inherited from TPersistent. +COM support. Components can be converted into ActiveX controls or other COM objects using wizards provided with Windows products. Components can serve as wrappers for COM objects. +Note: COM features are present in all implementations of TComponent, including those provided for compatibility with OS X. However, COM features are Windows only and cannot be used in multi-device (cross-platform) applications. +TComponent does not provide any user interface or display features. These features are provided by two classes that directly descend from TComponent: + +TControl, in the FMX.Types unit, is the base class for visual components in applications built with the FireMonkey (FMX) framework. +TControl, in the Vcl.Controls unit, is the base class for visual components in Windows-only (VCL) applications. +Note: Only the FMX.Types unit and other FireMonkey-specific units can be used with OS X applications. That is, you cannot use VCL units in multi-device applications. +Components that can be visible at run time are sometimes called visual components. Other components, which are never visible at run time, are sometimes called non-visual components. However it is more common to refer to visual components as controls and non-visual components simply as components. +Do not create instances of TComponent. Use TComponent as a base class when declaring non-visual components that can appear on the component palette and be used in the Form Designer. Properties and methods of TComponent provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + + Sets the private, internal storage for the Name property to the string passed in NewName. +Do not use ChangeName directly in an application. Instead, use the Name property. + +Note: The property setter for Name -- SetName-- uses ChangeName to change the component's name. ChangeName is not virtual; do not override it. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Returns the owner of a child component being read from a stream. +GetChildOwner is used internally by the component streaming system. It is rarely necessary to call it directly. +In TComponent, GetChildOwner always returns nil (Delphi) or NULL (C++), indicating that the owner is the root component currently being read (usually a form or data module). The Owner of a component is responsible for destroying it. + + + Returns the parent or, if there is no parent, returns the owner of a child component being read from a stream. +GetChildParent is used internally in the component streaming system. It is not necessary to call it directly. +As implemented in TComponent, GetChildParent returns Self (Delphi) or this (C++). If GetChildParent returns nil (Delphi) or NULL (C++), the parent is assumed to be the root component currently being read (usually a form). + + + Returns the owner of a component. +GetOwner is called by GetNamePath to find the owner of a component. GetNamePath and GetOwner are introduced in TPersistent so descendants such as collections can appear in the Object Inspector. For TComponent, GetOwner returns the value of the Owner property. + + + Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Embarcadero Technologies does not currently have any additional information. + + + Reads the state of the component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Getter of Observers. + + + Clears or sets csAncestor state in the component's ComponentState property. +SetAncestor is used internally in the component streaming system. It is not necessary to call it directly. +If Value is set to True, the csAncestor flag is included into the component state; otherwise, it is excluded. + + + Ensures that components inserted at design time have their design-mode flag set. +SetDesigning is used internally by the Form designer. Do not call SetDesigning directly. +SetDesigning sets the csDesigning flag in the ComponentState property if Value is True; otherwise, it removes csDesigning. +If the SetChildren parameter is True, SetDesigning then calls the SetDesigning methods of any owned components, passing Value, so that the owned components' ComponentState properties are synchronized with the owner's. +The InsertComponent and RemoveComponent methods call SetDesigning for inserted or removed components to ensure that their design-mode flags are set properly. + + + Sets the csInline bit of the component's ComponentState property. +SetInline is used internally to indicate whether the component can act as a root component in the designer but also be embedded in a form. +SetInline sets the csInline flag in the ComponentState property if Value is True; otherwise, it removes csInline. + + + Ensures that components inserted at design time have their design-mode flag set. +SetDesignInstance is used internally by the Form designer to identify objects that act as a design surface. Do not call SetDesignInstance directly. +SetDesignInstance sets the csDesignInstance flag in the ComponentState property if Value is +True; otherwise, it removes csDesignInstance. + + + Sets the value of the Name property. +SetName is the virtual property setter for the Name property. It calls the ChangeName method, which performs the actual name change. +ChangeName is not virtual; override SetName instead when modifying the behavior of the Name property. + +Warning: Using SetName to change the name of a component at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Sets the visual ordering of a child control. +SetChildOrder is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to actually implement the ordering. TWinControl uses this ordering information to Z-align the controls. + + + Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + Sets the csUpdating state in the component's ComponentState property. +Do not call Updating directly. It is used internally to indicate that the component is about to be updated. A call to Updating, which sets the csUpdating flag, is always followed by a call to Updated, which clears the flag. + + + Clears the csUpdating state in the component's ComponentState property when the component finishes updating. +Do not call Updated directly. It is used internally to clear the csUpdating flag of the ComponentState property. A call to Updated always follows a call to Updating, which sets the flag. + + + Provides the interface for a method that adds type library and version information to the Registry on components that implement COM interfaces. +Do not call UpdateRegistry directly. It is for internal use only. + + + Ensures that renaming an owned component does not create a name conflict. +ValidateRename checks whether a component can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the Components list, ValidateRename raises an EComponentError exception. +ValidateRename is used internally when the Name property is modified. It is not necessary to call it directly. + + + Determines whether an object can be inserted into a container. +ValidateContainer is called by a component when it is about to be inserted into a container object. By default, ValidateContainer calls the ValidateInsert method of the component specified by the AComponent parameter. +Descendent components can override ValidateContainer to disallow a component from being inserted into specific containers. To disallow an insertion, raise an exception in the derived method. + + + Provides the interface for a method that validates a child component before it is inserted. +ValidateInsert does nothing in TComponent. Descendent classes can override it to disallow a component from accepting an object as a child. By default, ValidateInsert allows any object to be inserted into the component. +If a component needs to validate only certain objects, descendent classes can override ValidateInsert to filter out those objects. To disallow an insertion, raise an exception in the derived method. + + + Writes the state of the component. +WriteState is used internally in the component streaming system. It is not necessary to call it directly. +This method expects a TWriter object that is used for storing the state of the component. + + + Notifies all owned components of the owner component's imminent destruction. +The RemoveFreeNotifications method notifies all owned components of the owner component's imminent destruction. RemoveFreeNotifications is called automatically when the component is destroyed. + + + Returns a reference to a specified interface if the current component supports that interface. +QueryInterface checks whether the component supports the interface specified by IID and, if so, returns a reference to that interface as the Obj parameter. If the component does not support the interface, the Obj parameter returns nil (Delphi) or NULL (C++). +QueryInterface returns the S_OK execution code on success. HResult type +defines the following execution codes: S_OK, S_FALSE, E_NOINTERFACE, E_UNEXPECTED, and E_NOTIMPL. + +Note: For components that act as COM object wrappers, QueryInterface calls the QueryInterface method of the internal COM object. + + + Called when an application uses a component interface. +_AddRef is a basic implementation of the IInterface method, _AddRef. + +Note: If the component is a wrapper for a COM object, _AddRef calls the _AddRef method of that COM object, and returns the resulting reference count. +In all other cases, _AddRef simply returns �1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _AddRef to implement reference counting. + + + Called when an application releases a component interface. +_Release is a basic implementation of the IInterface method, _Release. +_Release returns the resulting value of the reference count for the component's interface. + +Note: In all other cases, _Release simply returns �1 and takes no action. This allows the component to implement interfaces where reference counting is not required. More sophisticated components should override _Release to implement reference counting. + + + Returns the number of type information interfaces that an object provides (either 0 or 1). +GetTypeInfoCount implements the IDispatch interface GetTypeInfoCount method. For components that support interfaces, GetTypeInfoCount calls this method for the interface supported by the component. The Count parameter points to a location that receives the number of type information interfaces provided by the object. If the object provides type information, this number is 1; otherwise the number is 0. + + + Retrieves the type information for an object. +GetTypeInfo implements the IDispatch interface GetTypeInfo method. For components that support interfaces, GetTypeInfo calls the GetTypeInfo method for the interface supported by the component, passing it the specified parameters. Use the returned value to get the type information for an interface implemented by the component. + + + Maps a single member and an optional set of argument names to a corresponding set of integer dispatch identifiers (dispIDs). +GetIDsOfNames implements the IDispatch interface GetIDsOfNames method. For components that support interfaces, GetIDsOfNames calls this method for the interface supported by the component, passing the specified parameters. The returned value can be used on subsequent calls to the Invoke method. + + + Provides access to Automation properties and methods when the component wraps an Automation object. +Invoke is the standard mechanism for accessing the exposed properties and methods of an Automation object. For components that wrap the IDispatch interface of an Automation object, Invoke calls the Invoke method for the interface supported by the component, passing it the parameters specified by the function. + + + Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Performs any necessary actions before the first destructor is called. +BeforeDestruction is called automatically immediately before the component's first destructor executes. Do not call it explicitly in your applications. +As implemented in TComponent, BeforeDestruction checks whether the Destroying method has been called, and if not, calls it. Descendants that override this method to perform other actions before a component is destroyed should call the inherited method first to ensure that this check takes place. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Performs an asynchronous call to the method specified by either AProc or AFunc. +The AContext parameter specifies the context where the method executes in. This context corresponds to the main thread. In case of a Tcontrol descendant, it executes in the context of the thread on which the closest window handle was created. +BeginInvoke returns the results of the asynchronous execution in an interface IAsyncResult used as a return type. + + + Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + Blocks the caller until the specified ASyncResult completes. +Returns the result from the method that BeginInvoke asynchronously executes. This result is immediately returned after the given IAsyncResult finishes. The result type corresponds to a TObject class type. +EndInvoke raises any exception that may occur while the asynchronous method executes. + + + Destroys all owned components. +DestroyComponents iterates through the components owned by the component, removing each from the list of owned components and destroying it. +It is not necessary to call DestroyComponents directly. DestroyComponents is automatically called when the component is destroyed. + + + Indicates that the component and its owned components are about to be destroyed. +Destroying sets the csDestroying flag in the ComponentState property. It then calls the Destroying method for each owned component so that its csDestroying flag is also set. If csDestroying is already set, Destroying does nothing. +It is not necessary to call Destroying directly. Destroying is automatically called when the component is destroyed. + + + Executes an action. +ExecuteAction executes an action for the component. Action is a TBasicAction or any descendant of TBasicAction. +ExecuteAction first checks whether the provided action is compatible with the component and then executes the action. The return value is a Boolean. A value of True is returned if the action was executed; otherwise, False is returned. +Derived classes can override this method to implement a distinct way of handling actions. + + + Indicates whether a given component is owned by the component. +FindComponent returns the component in the Components property array with the name that matches the string in the AName parameter. Use FindComponent to determine whether a given component is owned by another. +Component name matches are not case sensitive. + + + Ensures that AComponent is notified that the component is going to be destroyed. +Use FreeNotification to register AComponent as a component that should be notified when the component is about to be destroyed. It is only necessary to register components this way when they are in a different form or have a different owner. For example, if AComponent is in another form and uses the component to implement a property, it must call FreeNotification so that its Notification method is called when the component is destroyed. +For components with the same owner, the Notification method is called automatically when an application explicitly frees the component. This notification is not sent out when components are freed implicitly, because the Owner is already being freed. + + + Disables the destruction notification that was enabled by FreeNotification. +RemoveFreeNotification removes the component specified by the AComponent parameter from the internal list of objects to be notified that the component is about to be destroyed. AComponent is added to this list by a previous call to the FreeNotification method. +Most applications have no need to call RemoveFreeNotification. It is used by TComponent to detect loops where two components are notifying each other of their impending destruction. + + + Frees the interface reference for components that were created from COM classes. +FreeOnRelease is called when an interface implemented by the component is released. FreeOnRelease is used internally and calls the corresponding interface method. It should not be necessary to call FreeOnRelease directly. + + + Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. +For example, a button on a panel on a form returns the panel, the panel returns the form, and the form returns nil. + + + Returns a string used by the Object Inspector. +GetNamePath is used to determine the text to display in the Object Inspector for the name of the object being edited. GetNamePath is introduced in TPersistent so descendants such as collections can appear in the Object Inspector. TComponent overrides GetNamePath to return the component's name. Do not call GetNamePath directly. + + + Verifies whether the component has a parent. +Call HasParent to determine whether a specific component has a parent. +Derived classes override this method to implement proper handling for parenting. +Use GetParentComponent to retrieve the component reference. + + + Establishes the component as the owner of a specified component. +InsertComponent adds the component passed in the AComponent parameter to the end of the Components array property. The inserted component must have no name (no specified Name property value), or the name must be unique among all others in the Components list. +When the owning component is destroyed, AComponent is also destroyed. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use InsertComponent when manually adding components to another Owner component's Components list. + + + Removes a specified component specified from the component's Components list. +Components are automatically inserted and removed when visually manipulating them in the form designer. Use RemoveComponent to programmatically delete the component specified by AComponent from its Owner component. + + + Identifies whether the component is a subcomponent. +Call SetSubComponent to indicate whether this component is a subcomponent. A subcomponent is a component whose Owner is a component other than the form or data module in which it resides. Unless such a component calls SetSubComponent with IsSubComponent set to True, its published properties will not be saved to the form file. +IsSubComponent indicates whether the component is a subcomponent (True) or not (False). +SetSubComponent is called at design time: + +Either from the constructor of a component that always acts as a subcomponent. In this case, the component calls its own SetSubComponent method from the constructor with IsSubComponent set to True. +Or immediately after constructing an instance of the subcomponent. In this case, the Owner calls the SetSubComponent method of a component it has just instantiated, with IsSubComponent set to True. + + + Handles exceptions in methods declared using the safecall calling convention. +SafeCallException handles exceptions in methods that use the safecall calling convention. Some classes that implement interfaces override this method to handle errors that might occur. TComponent calls the implementation of this method for the interface supported by the component, if it exists. If the component does not support interfaces, this method calls the SafeCallException method inherited from TObject, which returns E_UNEXPECTED. This is a default return value that is appropriate for classes that do not support any interfaces. + + + Updates the state of an action. +UpdateAction is used to update the state of an action. Action is a TBasicAction or any descendant. +UpdateAction first checks whether the provided action is compatible with the component and then updates it. The return value is a Boolean. A value of True is returned if the action was updated, and a value of False, otherwise. +Derived classes can override this method to implement a distinct way of handling action updates. + + + Indicates whether the component implements a specified interface. +Call IsImplementorOf to determine whether the component (or, if the component aggregates its interface with other components, whether the controlling component) supports the interface specified by I. IsImplementorOf is similar to the QueryInterface method, but it can handle a request for a nil (Delphi) or NULL (C++) interface, and it does not return an interface pointer. +The streaming system that loads and saves components uses IsImplementorOf to resolve property values that are interfaces. + + + Establishes or removes internal links that cause this component to be notified when the implementer of a specified interface is destroyed. +Component writers use ReferenceInterface to ensure that properties whose values are interfaces are informed when the objects that implement those interfaces are destroyed. This notification must be in place for a property whose value is an interface to be saved with the component in a form file (that is, for such a property to persist as a published property). +I is an interface pointer that is the value of the published property of interest. +Operation indicates whether the notification link to the implementer of the interface should be established (opInsert) or removed (opRemove). +ReferenceInterface returns True if it is successful in establishing or removing the notification link. If ReferenceInterface returns False when called with Operation set to opInsert, the specified interface cannot be stored as the value of a published property. + +Note: A result of False does not necessarily indicate an error, merely that the interface cannot be stored by the property streaming system. For example, ReferenceInterface returns False when the specified interface employs true reference counting, independent of component lifetimes. + + + Specifies the interface reference implemented by the component. +Use ComObject to assign a COM interface implemented by a component to an interface reference. This property is used by components that support COM interfaces. +If the component is not a wrapper for a COM component, trying to read ComObject causes TComponent to raise an EComponentError exception. + + + Indicates the number of components owned by the component. +Use the ComponentCount property to determine the number of components owned by a component, for example, when iterating through the components list to perform an action on all owned components. The ComponentCount property equals the number of items in the components list. This value is one more than the highest Components index, because the first components index is 0. + + + Indicates the position of the component in its owner's Components property array. +Use ComponentIndex when iterating through the Components list of the component's owner to perform an action on owned components. It can be used in conjunction with ComponentCount. ComponentIndex is used internally for iterative assignment procedures. + +Note: The first component in the list has a ComponentIndex value of 0, the second has a value of 1, and so on. Therefore, when using ComponentIndex with ComponentCount, note that ComponentCount is always 1 more than the highest Components index. + + + Describes the current state of the component, indicating when a component needs to avoid certain actions. +ComponentState is a set of constants defined in the TComponentState type. +Components use the ComponentState property to detect states in which certain kinds of actions are allowed or disallowed. For example, if a component needs to avoid certain behaviors at design time that it performs at run time, it can check for the csDesigning flag. +ComponentState is read-only and its flags are set automatically when appropriate. + + + Governs the behavior of the component. +ComponentStyle governs how the component interacts with the streaming system and the Object Inspector. ComponentStyle is a read-only property. Typically, the value of the various component style flags are part of a component definition, specified in a component constructor. The one exception to this is the csSubComponent style, which can be set by calling the SetSubComponent method. + + + Contains information used by the Form designer. +DesignInfo is used internally. Do not use this property in applications. + + + Indicates the component that is responsible for streaming and freeing this component. +Use Owner to find the owner of a component. The Owner of a component is responsible for two things: +The memory for the owned component is freed when its owner's memory is freed. This means that when a form is destroyed, all the components on the form are also destroyed. +The Owner is responsible for loading and saving the published properties of its owned controls. +By default, a form owns all components that are on it. In turn, the form is owned by the application. Thus, when the application shuts down and its memory is freed, the memory for all forms (and all their owned components) is also freed. When a form is loaded into memory, it loads all of the components that are on it. +The owner of a component is determined by the parameter passed to the constructor when the component is created. For components created in the form designer, the form is automatically assigned as the Owner. + +Warning: If a component has an Owner other than a form or data module, it will not be saved or loaded with its Owner unless you identify it as a subcomponent. To identify a component as a subcomponent, call the SetSubComponent method. + + + Represents information used internally by components that support COM. +VCLComObject is for internal use only. + + + Indicates the TObservers object added to the TComponent. +Observers is a read-only property that returns the TObservers added to the TComponent, in order to use the notifications provided by the observers either with LiveBindings or for the developers' own purposes. + + + Specifies the name of the component as referenced in code. +Use Name to change the name of a component to reflect its purpose in the current application. By default, the IDE assigns sequential names based on the type of the component, such as 'Button1', 'Button2', and so on. +Use Name to refer to the component in code. + +Warning: Changing Name at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Stores a NativeInt integral value as a part of a component. +Tag has no predefined meaning. The Tag property can store any additional integer value for the convenience of developers. Often, Tag stores a pointer. A Tag value can be typecast to the appropriate pointer type. Notice that on 64-bit platforms, all pointer types are 8 bytes in size, while on 32-bit platforms, pointer types are 4 bytes. These pointer sizes correspond to sizes of NativeInt integral values on 64-bit and 32-bit platforms. + + + + + TBasicAction is the ancestor class for all action objects. +TBasicAction introduces the fundamental behavior for an action. Descendants of TBasicAction add functionality for containment in an action list, for being categorized, and for specializing their behavior tailored to particular clients such as controls or menu items. Use TBasicAction if you want to create an action for an object that is neither a menu item nor a control. + + + Generates an OnChange event. +Change is called automatically when the action's properties change. This method calls the OnChange event handler, if one is assigned. + + + Assigns an OnExecute event handler for the action and for all clients. +SetOnExecute is the property write method for the OnExecute event. +In addition to assigning the specified Value event handler to the OnExecute event, SetOnExecute propagates the assignment of this event handler to all clients linked to the action and generates an OnChange event. + + + Occurs when one of the action's properties changes. +Applications cannot use the protected OnChange event. It is used internally to manage the relationship between the properties of the action and the corresponding properties of the action's clients. +Component writers can use OnChange in descendent objects to respond when the action's properties change. + + + Responds when components are created or destroyed. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. +TBasicAction overrides the System.Classes.TComponent.Notification method. Notification checks whether the component specified by AComponent is the same as the component stored in the ActionComponent property and whether it is about to be freed. If so, Notification sets the ActionComponent property to nil (Delphi) or NULL (C++). + + + Stores the number of elements in the Clients list of action links associated with the action. + + + Associates the action with an action link. +RegisterChanges is called when the action and action link are connected, for example, when a new action link is set to an action. Value is the action link with which the action associates itself. The link is added to the action's client list. + + + Breaks the association between the action and the action link. +UnRegisterChanges is called when the action and the action link should no longer be associated. UnRegisterChanges is called, for example, in the action destructor or when the action link is unassociated from the action. Value is the action link with which the association is broken. + + + Instantiates and initializes a TBasicAction object. +Applications do not need to instantiate TBasicAction directly. Actions are created automatically when you choose New Action in the Action List editor. +If you want to create an action at run time, you should call the Create constructor of a FireMonkey action (FMX.ActnList.TAction) or VCL action (Vcl.ActnList.TAction), or any of their subclasses. The Create constructors assign a TActionList component to the ActionList property of the created action. +Create calls the inherited constructor and then creates a list of clients of the created action. + + + Disposes of an instance of a TBasicAction object. +You do not need to call the destructor for an action. An action is a component and is automatically destroyed by its owner, which was passed to the constructor when it is created. If you must destroy an action manually, call Free instead, which safely invokes the destructor. + + + Embarcadero Technologies does not currently have any additional information. + + + Introduces an interface for verifying that the type and state of a target component or control are appropriate for the action. +HandlesTarget does nothing in TBasicAction. HandlesTarget was introduced in TBasicAction so that descendants can override it to check the type and state of a target. HandlesTarget can verify any information about a target that is relevant for the action. HandlesTarget returns True if the target meets the specified criteria, False otherwise. + + + Introduces an interface for a method of notifying a client when the action updates itself. +UpdateTarget does nothing in TBasicAction. UpdateTarget was introduced in TBasicAction so that descendants can override it to correspondingly update a target when the action updates. + + + Introduces an interface for invoking an action on a target client component or control. +ExecuteTarget does nothing in TBasicAction. ExecuteTarget was introduced in TBasicAction so that descendants can override it to initiate the action on the target. For example, an edit action that performs copying might copy the contents of an edit control to the clipboard. + + + Generates an OnExecute event. +Execute calls the OnExecute event handler, if one is assigned. Execute returns True if an event handler is called, False otherwise. + + + Provides an opportunity to execute centralized code when an application is idle. +Update triggers the OnUpdate event handler. Update returns True if an event handler was found, False otherwise. When the application is idle, the OnUpdate event occurs for every action. This provides an opportunity for applications to execute centralized code for enabling and disabling, checking and unchecking, and so on. + + + Stores the client component that caused this action to execute. +Use ActionComponent to discern which client component caused this action to execute. For example, examine ActionComponent from an OnExecute event handler if you need to know what user action triggered this action. +When the user clicks a client control, that client sets ActionComponent before calling the action's Execute method. After the action executes, the action resets ActionComponent to nil (Delphi) or NULL (C++). + + + Occurs when the execute event, of a client linked to the action, fires. +Write an OnExecute event handler when you want to respond when the user triggers the client object's default event (typically an OnClick event). +For most target clients, OnExecute is associated with the OnClick event. The Click method triggers the associated Action if EnableExecuteAction is True and the OnClick event handler is not assigned (or is equal to Action.OnExecute). +OnExecute is called in the Execute method. +OnExecute also occurs when the user types the shortcut (or one of the secondary shortcuts) associated with the action or its client. + +Warning: If you assign an OnExecute event handler to a predefined action, the default behavior of that action will not occur. + + + Occurs when the application is idle or when the action list updates. +Write an OnUpdate event handler to execute centralized code while an application is idle. For example, actions may want to update enabling and disabling, or checking and unchecking of client targets. + + + + + Helper class for reading/writing a segment of another stream. + For example, it is used by TZipFile to provide access to a "stored" file. + + + TControl is the base class for all components that are visible at run time. +Controls are visual components, meaning the user can see them and possibly interact with them at run time. All controls have properties, methods, and events that describe aspects of their appearance, such as the position of the control, the cursor or hint associated with the control, methods to paint or move the control, and events that respond to user actions. +TControl has many protected properties and methods that are used or published by its descendants. + + + Indicates current PPI value for the control + + + Indicates current scale factor for the control + + + Obtains the design Dpi for the form where the control was designed. + + + Obtains the current Dpi for parent control, or the current control Dpi if there is no parent. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Schedules asynch method calls. +Vcl.Controls.TControl.AsyncSchedule inherits from System.Classes.TComponent.AsyncSchedule. All content below this line refers to System.Classes.TComponent.AsyncSchedule. +Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + See Also +System.Classes.TComponent.BeginInvoke +System.Classes.TBaseAsyncResult +System.Classes.TBaseAsyncResult.Schedule + + + Responds when the action associated with the control changes. +ActionChange is called automatically when the action object specified by the Action property, or any of its properties, changes. By default, the control action link's OnChange event handler calls ActionChange. +ActionChange updates the control properties that correspond to properties of the associated action. These properties include the Caption, Enabled, Hint, and Visible properties and the OnClick event handler. +The Sender parameter is the action object that changed. +The CheckDefaults parameter indicates whether the control's properties should all be updated or only those that have not been explicitly changed from their default values. When CheckDefaults is true, only those properties and event handlers that have not been changed from the default values are updated. + + + Sets the size of the control as determined by the AutoSize property. +If the AutoSize property is true, AdjustSize is called automatically when the control needs to automatically resize itself to its contents. As implemented in TControl, AdjustSize calls SetBounds with the values of its Left, Top, Width, and Height properties. This call can result in a change of size if these values are altered in the control's OnCanResize or OnConstrainedResize event handlers, or if the control's OnResize event handler makes any final adjustments. +Descendent classes override AdjustSize to change the size of the control to adjust to its contents. +Other controls can call AdjustSize after changing the control's contents. Do not call AdjustSize in application code. + + + Overrides the inherited AssignTo function to enable assignments to TAction objects. +Do not call the protected AssignTo method in application code. The Assign method of a persistent object calls AssignTo if it is passed the control as a Source and the persistent object does not know how to copy the properties of the control. The Dest parameter is the persistent object that should have its properties copied from the control. +As implemented in TControl, AssignTo checks whether the Dest parameter is a TCustomAction object, and if so, assigns values to its Enabled, Hint, Caption, and Visible properties and its OnExecute event. This allows arbitrary controls to assign these to an associated action object. + + + Begins automatic drag. +BeginAutoDrag is called automatically when a user drags a control whose DragMode is dmAutomatic. Do not call BeginAutoDrag in application code. +As implemented in TControl, BeginAutoDrag calls BeginDrag, passing in the global Mouse variable's DragImmediate and DragThreshold properties. + + + OnCanResize event dispatcher. +CanResize is called automatically when an attempt is made to resize the control, after any autosizing has occurred. The NewWidth and NewHeight arguments specify the attempted new values for the control's height and width. CanResize optionally adjusts the values of NewWidth and NewHeight, and returns true if the control can be resized to the returned values. CanResize returns false if the control cannot be resized. +CanResize generates an OnCanResize event. An OnCanResize event handler may change the values of NewHeight and NewWidth. + + + Indicates whether the control can resize itself automatically to accommodate its contents. +CanAutoSize is called automatically when the AutoSize property is true and an attempt is made to resize the control. It allows controls to implement the AutoSize property before the resize sequence that begins with the OnCanResize and OnConstrainedResize events and ends with the OnResize event. +When CanAutoSize is called, the NewWidth and NewHeight parameters indicate the proposed new dimensions of the control. CanAutoSize adjusts these values so that the control's size adjusts to its contents. If the adjustment results in values of NewWidth and NewHeight that differ from the control's current width and height, CanAutoSize returns true, indicating that the resize sequence should proceed. If, after adjustment, NewWidth and NewHeight equal Width and Height, CanAutoSize returns false, and the resize sequence is aborted. +As implemented in TControl, CanAutoSize always returns true without changing NewWidth or NewHeight. Override CanAutoSize to implement the AutoSize property for a particular control class's contents. + + + Sends a CM_CHANGED message to the control. +Call Changed after changing the properties of the control in a way that affects the properties of a parent object. Changed sends a CM_CHANGED message back to the control. If the control is a windowed control, this message is sent to the parent so that it can make any necessary adjustments. + + + Rescaling event dispatcher. +ChangeScale is called automatically when an event requires that the control resize itself. Most often, this event is a call to the ScaleBy method of the control itself or the control's parent. This allows the control to adjust its own special properties, such as font sizes and display regions. +ChangeScale parameters have the same meaning as for ScaleBy. + +Note: Because control sizes and coordinates are integers, scaling can result in round-off error. Repeated calls to ChangeScale can make the control gradually get smaller or slowly disappear from the form. Consider destroying and reloading the form after several rescalings. + + + Rescaling event dispatcher. +ChangeScale is called automatically when an event requires that the control resize itself. Most often, this event is a call to the ScaleBy method of the control itself or the control's parent. This allows the control to adjust its own special properties, such as font sizes and display regions. +ChangeScale parameters have the same meaning as for ScaleBy. + +Note: Because control sizes and coordinates are integers, scaling can result in round-off error. Repeated calls to ChangeScale can make the control gradually get smaller or slowly disappear from the form. Consider destroying and reloading the form after several rescalings. + + + Respond to user click. +Click is called automatically when the user left-clicks the control. Component or application code can call Click to simulate a user mouse click. This is often done in menu actions and hotkey handlers. +As implemented in TControl, Click queries whether the OnClick event handler exists and is different from the OnExecute handler for the control's Action. If this is true, the OnClick event handler is called. If this is false, and the Action OnExecute event handler exists, the Action's Execute method is called. Override Click to provide additional behavior. + + + Notify control of resize with constraints. +ConstrainedResize is called automatically when a control is resized and has nonzero Constraints. This allows the control to modify the constraints before they are applied. +As implemented in TControl, ConstrainedResize simply calls the OnConstrainedResize event handler. + + + Gives the coordinates of the cursor, with respect to the origin of the control. +Use CalcCursorPos to obtain the current coordinates of the mouse cursor, with respect to the origin of the control. + + + Instantiates a touch manager. +CreateTouchManager is called automatically in the constructor of the TControl class. By default, it instantiates a TTouchManager class. +CreateTouchManager can be overridden in descendent classes of TControl to use another touch manager, usually a user-defined one. + + + OnDblClick event dispatcher. +DblClick calls any event handler attached to the OnDblClick event. Override DblClick to provide other responses in addition to the inherited event-handler call when the user double-clicks the control. +The DblClick method is triggered by left mouse-button double-click message (WM_LBUTTONDBLCLK) from Windows. + + + Handles the painting and erasing of a dock image. +The DrawDragDockImage and EraseDragDockImage methods call DefaultDockImage to paint or erase the drag image of a control while the user drags it in a drag-and-dock operation. +DragDockObject contains the drag-and-dock information for the control. +Erase specifies whether to draw or erase the image. + + + Provides methods to read and write the IsControl property to a stream such as a form file. +DefineProperties is called automatically by the streaming system that loads and saves VCL components. It allows persistent objects to read and write properties that are not published. Published properties are loaded and stored automatically. +DefineProperties uses the methods of the filer passed as the Filer parameter to assign methods that can load and save the IsControl property. +Override DefineProperties to persist unpublished properties. Call the DefineBinaryProperty or DefineProperty method of the Filer parameter to assign methods that load or save property values. + +Note: When overriding this method, call the parent class's DefineProperties method first. + + + Handles dragging of the control over an invalid docking target. +DockTrackNoTarget is called automatically when the control is dragged over an invalid docking target. It updates the docking rectangle of the TDragDockObject specified by Source to reflect the current mouse coordinates, as given by X and Y. + + + Is an OnContextPopup event dispatcher. +OnContextPopup calls any event handler attached to the OnContextPopup event. When creating a component that descends from TControl override OnContextPopup to provide other responses in addition to the inherited event-handler call when the user invokes the control's context menu. +MousePos indicates the position where the user right-clicked the control. If the user invoked the context menu using the keyboard, MousePos is (-1,-1). +Handled returns a Boolean value indicating whether the control should continue with its default response to the user action. + + + Is an OnEndDock event dispatcher. +OnEndDock calls any event handler attached to the OnEndDock event. When creating a component that descends from TControl, override OnEndDock to provide other responses in addition to the inherited event-handler call when the user finishes a drag-and-dock operation. + + + Docking event dispatcher. +DoDock is called automatically as part of the docking process. It updates the control's dimensions and causes it to repaint. +NewDockSite is the control's new dock site. This value can be nil (Delphi) or NULL (C++) or NullDockSite (a constant that indicates no dock site). +ARect specifies the control's new dimensions once it is docked to NewDockSite. + + + Is an OnStartDockevent dispatcher. +DoStartDock calls any event handler attached to the OnStartDock event. When creating a component that descends from TControl, override DoStartDock to provide other responses in addition to the inherited event-handler call when the user starts a drag-and-dock operation. + + + Processes mouse wheel motion. +DoMouseWheel is called automatically when the user rotates the mouse wheel. +The Shift parameter indicates the current state of the SHIFT, ALT, and CTRL keys. +The WheelDelta parameter indicates the distance the wheel was rotated. WheelDelta is positive if the mouse was rotated upward, negative if the mouse was rotated downward. +The MousePos parameter indicates the current position of the mouse pointer. +DoMouseWheel returns true if an event handler was found and indicated that it handled the event. +As implemented in TControl, DoMouseWheel first attempts to call the OnMouseWheel event handler. If this routine exists and succesfully handles the event, DoMouseWheel returns true. Otherwise, DoMouseWheel repeatedly calls DoMouseWheelDown or DoMouseWheelUp, depending on the direction the user turned the mouse wheel. These routines, in turn, call the OnMouseWheelUp or OnMouseWheelDown event handler. +Before the first call to DoMouseWheelDown or DoMouseWheelUp, DoMouseWheel adds WheelDelta to the WheelAccumulator property. After each call, DoMouseWheel adjusts WheelAccumulator towards zero; each adjustment is by an internal constant that defines the minimum meaningful wheel motion. When the absolute value of of WheelAccumulator drops below the value of this constant, DoMouseWheel exits, returning the value returned by the final call to DoMouseWheelDown or DoMouseWheelUp. + + + Is an OnMouseWheelDown event dispatcher. +The DoMouseWheel method calls DoMouseWheelDown to generate an OnMouseWheelDown event. +The Shift parameter indicates the state of the SHIFT, ALT, and CTRL keys. +The MousePos parameter indicates the position of the mouse pointer. +DoMouseWheelDown returns true if an event handler indicates that it handled the message, and false otherwise. +Override DoMouseWheelDown to perform class-specific tasks in addition to calling the event handler when the mouse wheel is rotated downward. + + + Is an OnMouseWheelUp event dispatcher. +The DoMouseWheel method calls DoMouseWheelUp to generate an OnMouseWheelUp event. +The Shift parameter indicates the state of the SHIFT, ALT, and CTRL keys. +The MousePos parameter indicates the position of the mouse pointer. +DoMouseWheelUp returns true if an event handler indicates that it handled the message, and false otherwise. +Override DoMouseWheelUp to perform class-specific tasks in addition to calling the event handler when the mouse wheel is rotated upward. + + + Provides the interface for a method that responds to the cancellation of a drag. +DragCanceled is called automatically when a drag operation is canceled. As implemented in TControl, DragCanceled does nothing. When creating a component that descends from TControl, override DragCanceled to provide code that executes when a drag-and-drop or drag-and-dock operation is canceled. + + + Is an OnDragOver event dispatcher. +Override DragOver to add additional code that executes before the OnDragOver event handler is called. +DragOver sets the Accept parameter to true to indicate that the user can drop the dragged object on the control. It sets Accept to false to indicate that the user cannot drop the dragged object on the control. +The Source parameter is the object being dragged. +The State parameter indicates how the dragged object is moving in relation to the control. X and Y indicate the current position of the mouse. + + + Is an OnEndDrag event dispatcher. +DoEndDrag calls any event handler attached to the OnEndDrag event. When creating a component that descends from TControl, override DoEndDrag to provide other responses in addition to the inherited event-handler call when the user drops an object or cancels a drag-and-drop operation. + + + Is an OnStartDrag event dispatcher. +DoStartDrag calls any event handler attached to the OnStartDrag event. When creating a component that descends from TControl, override DoStartDrag to provide other responses in addition to the inherited event-handler call when the user starts a drag-and-drop operation. + + + Processes the unhandled gesturing events. +DoGesture is run automatically for all gesturing events that were not handled by the user. DoGesture is run only if OnGesture is not set or if it did not handle the gesture event. +Override DoGesture in descending classes to support default behavior for gesture events that were not handled by the user. In TControl, the DoGesture method simply returns and does no special processing. + + + Returns the interactive gestures and their options. +DoGetGestureOptions is used internally to access the interactive gestures and their options associated with a TControl. + + + Draws the dock image for the control. +DrawDragDockImage is called automatically to draw the control (or, more typically, the drag rectangle) when the control is manipulated in drag-and-dock operations. +DrawDragDockImage calls DefaultDockImage to render the image. + + + Erases the dock image for the control. +DrawDragDockImage is called automatically to erase the control (or, more typically, the drag rectangle) when the control is manipulated in drag-and-dock operations. + + + Returns the value of the Action property. +GetAction is a protected method in the TControl class and is used to obtain the current value of the Action property. + + + Returns the appropriate action link class that is associated with the control class. +GetActionLinkClass returns the appropriate class type for the action link used with a control. This class is used internally to create an action link object for the control when it has an associated action. The action link links the action to the control client. Each Action link class is designed to link specific properties and event handlers of the action to its client, based on the types of properties the client supports. +As implemented in TControl, GetActionLinkClass returns the TControlActionLink class type, which associates the ShowHint, Caption, Enabled, and Visible properties with the OnClick event handler. Descendants of TControl override this method to specify a descendant of TControlActionLink that handles their configuration of properties and events. + + + Returns the screen coordinates of the upper-left corner of the control's client area. +Override GetClientOrigin to change how the ClientOrigin is calculated. +The GetClientOrigin method is the protected method for reading the ClientOrigin property. GetClientOrigin calculates the ClientOrigin by adding the control's Left and Top values to the ClientOrigin coordinates of its parent. + + + Returns a rectangle defining the client area of the control. +Override GetClientRect to change how the client area is calculated. +The GetClientRect method is the protected method for reading the ClientRect property. GetClientRect returns a rectangle with the rectangle's Top and Left fields set to zero, and its Bottom and Right fields set to the control's ClientHeight and ClientWidth, respectively. + + + Returns a device context for the control. +Call GetDeviceContext to obtain a device context and window handle. Override GetDeviceContext to change how the device context is obtained. +The window handle used by the control is returned in the WindowHandle parameter. GetDeviceContext returns the device context of this, the parent control's window. + + + Returns the edge on which another control should be docked when it is dragged over the control. +Use GetDockEdge to get the edge on which another control should be docked when it is dragged over the control. +MousePos is the position of the mouse. +GetDockEdge is called automatically during drag-and-dock operations involving the control. + + + Returns the value of the Enabled property. +GetEnabled is the read implementation of the Enabled property. +Override GetEnabled and SetEnabled to change the implementation of the Enabled property. For example, a descendant of TControl might change the way the Enabled property interacts with an associated action. + + + Returns the value of the Floating property. +GetFloating is the implementation of the read-only Floating property. GetFloating returns true if the HostDockSite property is either nil (Delphi) or NULL (C++), or of type FloatingDockSiteClass. +Override this method to change the way a control determines if it is floating. + + + Returns the class used for the control when it is floating. +GetFloatingDockSiteClass is the read implementation of the FloatingDockSiteClass property. Override this method to change the implementation of FloatingDockSiteClass. + + + Returns the handle to a palette for use by the control. +As implemented in TControl, GetPalette returns a null handle, indicating that the control does not have a palette. Override GetPalette to implement derived objects that use a palette. Create a palette handle for the control by a call to the Windows API function CreatePalette. GetPalette should return the palette handle for the control. +Specifying the palette for a control tells the application that the control's palette needs to be realized and designates the palette to use for realization. +GetPalette is called only if the run-time video mode requires color palette support, for example, in 256-color mode. + + + Returns the pop-up menu associated with the control. +Call GetPopupMenu to find the pop-up menu associated with the control. Override GetPopupMenu to change which pop-up menu is associated with the control or to specify different pop-up menus depending on the state of the control. +GetPopupMenu returns the value of the Popup property. + + + Returns the value of the DragMode property. +GetDragMode is a protected method in the TControl class and is used to obtain the current value of the DragMode property. + + + Checks whether the associated touch manager stored any of the given options. +IsTouchPropertyStored is used internally by the VCL framework to check whether the associated touch manager component has stored the given options. Do not call IsTouchPropertyStored directly. IsTouchPropertyStored is used primarily to ensure that controls that do not require gesturing are not storing useless data in the DFMs or executables. + + + Initializes the control after it is loaded from a stream. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. +Loaded overrides the inherited method in order to initialize the control from its associated Action. To change the properties the control copies from its action, override the ActionChange method. + + + Triggers a TMouseActivateEvent event. +Use MouseActivate to trigger a TMouseActivateEvent event with the given parameters. +The following table explains the meaning of each parameter: + + + + + +Parameter + +Meaning + + + +Button + + + +The mouse button that is pressed. + + + + +Shift + + + +The shift state while the mouse button is pressed. + + + + +X | Y + + + +The current mouse coordinates. + + + + +HitTest + + + +The hit test value obtained from the WM_NCHITTEST message. + + + OnMouseDown event dispatcher. +Override the protected MouseDown method to provide other responses in addition to calling the OnMouseDown event handler when the user presses the mouse button down while the cursor's hotspot is over the control. +The Button parameter determines which mouse button the user pressed. Shift indicates which shift keys (Shift, Ctrl, or Alt) were down when the user pressed the mouse button. X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +A control calls MouseDown in response to any of the Windows mouse-down messages (WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was pressed down: left, right, or middle. + + + Responds to mouse moving over control area. +Override the protected MouseMove method to provide other responses in addition to calling the OnMouseMove event handler when the user moves the mouse. +A control calls MouseMove in response to any of the Windows mouse-move messages (WM_MOUSEMOVE), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called, it is with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation. + + + Is an OnMouseUp event dispatcher. +Override the protected MouseUp method to provide other responses in addition to calling the OnMouseUp event handler when the user releases a previously pressed mouse button while the cursor's hot spot is over the control. +A control calls MouseUp in response to any of the Windows mouse-up messages (WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was released: left, right, or middle. + + + Responds to notifications indicating that components are being created or destroyed. +Notification allows TControl to update its internal state if an associated component is removed. The internal state is updated if: + +The associated pop-up menu is destroyed. +The control docking site is destroyed. +The custom hint associated with the control is destroyed. +The associated gesture manager is destroyed. +Override the Notification method to respond to notifications indicating that other components are about to be destroyed or have just been created. Use the Notification method to update controls that rely on other objects. Data-aware objects override the Notification method to update themselves when their data source is removed. Some objects respond to notifications indicating that other objects of a specific type are being created. For example, the session component sets the Session property of new data-aware controls to itself when the AutoSessionName property is True. +By default, components pass along the notification to their owned components, if any. + + + Positions the docking rectangle according to the current drag-and-dock state. +Use PositionDockRect to adjust the docking rectangle of the drag-and-dock object specified by DragDockObject. DragDockObject's DockRect property is updated to reflect the current drag-and-dock state. This updating process makes use of the UndockWidth, UndockHeight, LRDockWidth, or TBDockHeight property, as appropriate. + + + Responds to changes in the system's palette by realizing the control's palette. +Override PaletteChanged to change how the control responds to Windows notifications that the system palette is changing. TControl responds to these notifications by trying to realize the control's palette, if any, into the current device context. If the change in the system palette causes the actual value of the control's palette to change, PaletteChanged invalidates the control so that it can repaint with the new palette. +Windows paints the active window with a foreground palette, while other windows are forced to use background palettes. Background palettes are approximate matches to the colors specified by the control's logical palette, given the limitations imposed by implementing the foreground palette. Windows only allows a single foreground palette. +PaletteChanged allows the control to obtain a new realization of its palette when the system palette changes. When Foreground is true, the form has been activated and the control is specifying the new foreground palette. When Foreground is false, another application or form has changed the foreground palette, and controls that are sensitive to the available palette should realize new background palettes to best match their logical palettes. +If the control does not have a logical palette to be realized into the current device context, GetPalette returns a handle of 0, and PaletteChanged returns false, indicating that no palette was realized. If GetPalette returns the handle to a logical palette, PaletteChanged realizes this palette into the current device context, and returns true. + +Note: PaletteChanged is called only when the run-time video mode requires palette support, such as for 256 color mode, but not 16 million color mode. + + + Prepares the control for having its properties assigned values read from a stream. +ReadState is part of a sequence of calls used by the streaming system that loads and saves component state. It reads the values of all the control's published properties, stored data, and owned components from the reader object passed in Reader. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Remember to include a call to the inherited class's method when overriding ReadState. +As implemented in TControl, ReadState assigns the Reader parameter's Parent property to the control's own Parent property before calling the inherited ReadState method of TComponent. Finally, ReadState synchronizes the Font, Color, and ShowHint properties with the parent control, as indicated by the ParentFont, ParentColor, and ParentShowHint properties, respectively. + + + Instructs the parent of a control to reposition the control, enforcing its Align property. +Controls call RequestAlign internally when changes are made to the size or position of the control, so that they remain properly aligned within the parent control. Do not call RequestAlign in application code. + + + Respond to control resize. +Resize is called automatically immediately after the control's dimensions change. As implemented in TControl, Resize calls the control's OnResize event handler if it is assigned. + + + Scales the values of the Constraints property to the given ratio. +Use ScaleConstraints to scale the values of the Constraints property to the given M/D ratio. + + + Scales the values of the Margins property to the given ratio. +Use ScaleMargins to scale the values of the Margins property to the given M/D ratio. + + + Embarcadero Technologies does not currently have any additional information. + + + Cancels the modal state of the control. +Call SendCancelMode to cancel the modal state of the control. Various controls implemented in the VCL support a model state where the user must respond to the control before interacting with any other object on the form. An example is the dropped-down state of a combo box when the drop-down list is showing. For these controls, specific user actions send a Windows message to the control to end the model state, such as a mouse click that closes up the drop-down list. +SendCancelMode allows an application to end the modal state of the control in the absence of a user action, or when implementing a new user interface response. + + + Sends a Windows message to the control's host dock site. +Use SendDockNotification to send a Windows message to the control's host dock site. +SendDockNotification is called automatically when the control's text or visibility changes. + + + Sets the value of the AutoSize property. +SetAutoSize is a protected method in the TControl class and is used to set the value of the AutoSize property. + + + Sets the drag mode for the control. +SetDragMode is the protected write implementation for the DragMode property. Override SetDragMode to execute additional code when the value of the DragMode property changes. + + + Sets the value of the Enabled property. +SetEnabled is the protected write implementation of the Enabled property. After changing the internal representation of the Enabled property, SetEnabled sends a Windows message back to the control so that it can respond to the change. When TControl receives this message, it invalidates the control so that its appearance reflects the change (for example, so that it appears grayed). Some descendants respond to this message in other ways (for example, windowed controls ensure that a disabled control does not have focus). +Override GetEnabled and SetEnabled to change the implementation of the Enabled property. For example, a descendant of TControl might change the way the Enabled property interacts with an associated action. When overriding SetEnabled, be sure to call the inherited method. + + + Sets the name of the control. +SetName is the protected write implementation of the Name property. TControl updates the Text or Caption property, if appropriate, after changing the value of Name. +Override SetName to execute additional code when the value of the Name property changes. + + + Sets the parent of the control. +SetParent is the protected implementation of the Parent property. Override SetParent to execute additional code when the value of the Parent property changes. +The AParent parameter specifies the new parent of the control. +If the control already has a parent, SetParent removes the control from that parent's list of controls by calling the parent's RemoveControl method. If AParent is not nil (Delphi) or NULL (C++), SetParent calls its InsertControl method to add the control to its list of controls. +The TControl destructor calls SetParent(nil (Delphi) or NULL (C++)) to remove the control from its parent's control list before destroying the component. + + + Specifies whether the control uses its parent's BiDiMode. +SetParentBiDiMode is the protected write implementation of the ParentBiDiMode property. + + + Sets the control's bidirectional mode. +SetBiDiMode is the write implementation of the control's BiDiMode property. Override this method to change the implementation of BiDiMode. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Repositions the control in its parent's control list, thereby changing position onscreen. +Call SetZOrder to change the z-order of the control. To make the control the topmost control, specify the TopMost value as true. To make the control the bottommost, set TopMost to false. +After changing the order, SetZOrder invalidates the control to ensure repainting to reflect the new order. +The stacking order of windowed and non-windowed controls cannot be mingled. For example, if you put a memo, a windowed control on a form, and then put a label, a non-windowed control on top of it, the label disappears behind the memo. Windowed controls always stack on top of non-windowed controls. In this example, calling the SetZOrder method of the label or the memo has no effect; the label always remains behind the memo. + + + Sets the value of the CustomHint property. +SetCustomHint is a protected method in the TControl class and is used to set the value of the CustomHint property. + + + Attempts to update the values of the control's explicit bounds to those of its current bounds. +Use UpdateExplicitBounds to update the values of the control's explicit bounds to those of its current bounds. +The update process succeeds as long as the options csAligning in ControlState and csReading in ComponentState are disabled. + + + Changes the Top, Left, Width, and Height properties of the control, but does not update its screen image and bypasses all resize events. +UpdateBoundsRect is used internally by controls to stay synchronized with changes made by the underlying Windows screen object. UpdateBoundsRect updates the properties to match those passed in the rectangle as the R parameter. + + + Provides the interface for a method that responds to changes in the control's visibility. +VisibleChanging is called before the value of a control's Visible property changes. As implemented in TControl, it does nothing. Override VisibleChanging to respond to changes in the control's visibility. For example, if a control should not change its visibility, override VisibleChanging to raise an exception when an attempt is made to alter the control's visibility. + + + Provides specific message responses for the control. +Override WndProc to change the initial Windows message handler for the control. The WindowProc property is initialized to WndProc. +WndProc implements the mouse behavior specified by the ControlStyle and DragMode properties, and updates the ControlState property. It passes any unhandled messages on to the Dispatch method. +When overriding WndProc to provide specialized responses to messages, be sure to call the inherited WndProc at the end to dispatch any unhandled messages. + + + Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + Processes the given message and returns some Boolean information based on the message's content. +DesignWndProc returns true if the csDesignInteractive option in ControlStyle is enabled and if either the right mouse button is pressed or the right mouse button is released. The true value is returned also when ControlStyle is enabled and when either the mouse has moved or the right mouse button is double-clicked. + + + Returns the control's image list containing the image to be displayed while dragging. +Override GetDragImages to provide a custom image list for the control. As implemented in TControl, GetDragImages returns nil (Delphi) or NULL (C++). + + + Embarcadero Technologies does not currently have any additional information. + + + Contains the action link object associated with the control. +ActionLink handles the association between the control and the action specified by the Action property. The action link specifies which properties and events of the action object determine the values of the control's corresponding properties and events. +Most applications do not use the ActionLink property. Component writers can change this property in TControl descendants to be a custom descendant of TControl ActionLink that handles a desired configuration of properties and events. + + + Specifies whether the control sizes itself automatically to accommodate its contents. +Use AutoSize to specify whether the control sizes itself automatically. When AutoSize is True, the control resizes automatically when its contents change. +By default, AutoSize is False. + + + Specifies a text string that identifies the control to the user. +Use Caption to specify the text string that labels the control. +To underline a character in a Caption that labels a component, include an ampersand (&) before the character. This type of character is called an accelerator character. The user can then select the component by pressing ALT while typing the underlined character. To display an ampersand character in the caption, use two ampersands (&&). + +Notes: +Controls that display text use either the Caption property or the Text property to specify the text value. The property that is used depends on the type of control. In general, Caption is used for text that appears as a window title or label, while Text is used for text that appears as the content of a control. +For some controls, such as TButton, it is not possible to change the color of the Caption. If you want to change the color of a button caption, you should use an alternate button type such as TSpeedButton or TBitBtn instead of TButton. With either TSpeedButton or TBitBtn, you can change the color of the Caption property by using the Font property. +For TLinkLabel, an HTML tag is declared inside the Caption property either at run time or at design time. + + + Specifies whether the control uses the Windows icon font when writing text. +Set DesktopFont to true to specify that the control should use the Windows icon font for its Font property. The Windows icon font is the value of the IconFont property of the global Screen variable. +When DesktopFont is true, the control's Font property updates every time the Windows icon font changes. This font can be changed by setting the IconFont property of the global Screen variable, or by the actions of other programs. Setting the Font property from the IconFont property of the Screen object does not allow controls to dynamically respond in this manner when the Windows icon font changes. + + + Specifies whether the control is being dragged normally or for docking. +Use DragKind to get or set whether the control participates in drag-and-drop operations or drag-and-dock operations. + + + Specifies the image used to represent the mouse pointer when the control is being dragged. +Use the DragCursor property to change the cursor image presented when the control is being dragged. + +Note: To make a custom cursor available for the DragCursor property, see the Cursor property. + + + Specifies how the control initiates drag-and-drop or drag-and-dock operations. +Use DragMode to control when the user can drag the control. Disable the drag-and-drop or drag-and-dock capability at run time by setting the DragMode property value to dmManual. Enable automatic dragging by setting DragMode to dmAutomatic. For more information about dmManual and dmAutomatic, see TDragMode. + + + Specifies whether a form stores its form-specific properties to a stream. +Use IsControl to use a form as a complex control, rather than as a desktop form. IsControl affects the way the form gets saved. When IsControl is true, form-specific properties do not get saved with the form. When IsControl is false, the form-specific properties get saved along with the other properties. +IsControl permits you to use the forms designer to create complex controls by creating those controls as forms, placing and naming their contained controls, and attaching code to events. After saving the form, edit the form as text, and in the text version set IsControl to true. The next time the form is loaded and saved, only those form properties appropriate to use as a control are stored, not the properties specific to TForm. Next, edit the form file as text, changing the type of the component from TForm to the desired control type, such as TPanel. + + + Specifies whether the control has "captured" mouse events. +Use MouseCapture to determine whether a control has captured the mouse. When a control captures the mouse, all subsequent mouse events go to that control until the user releases the mouse button. +A control captures the mouse when the user drags an item from it. In addition, if the control has the csCaptureMouse flag set in its ControlStyle property, it captures the mouse when the user presses the left mouse button over it, until the user releases the mouse button. + + + Specifies whether the control uses its parent's BiDiMode. +Use ParentBiDiMode to get or set whether the control uses its parent's BiDiMode. When ParentBiDiMode is true, the control's BiDiMode property is always equal to that of its parent. If ParentBiDiMode is false, the control uses its own BiDiMode property. +Set ParentBiDiMode to true for all controls in a form to ensure that the entire user interface adjusts to Middle Eastern locales in a uniform manner. +When the value of the control's BiDiMode property changes, ParentBiDiMode becomes false automatically. + + + Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + + Specifies where a control looks for its font information. +To have a control use the same font as its parent control, set ParentFont to true. If ParentFont is false, the control uses its own Font property. Many controls default ParentFont to true so that all the controls in a form or other container present a uniform appearance. When the value of a control's Font property changes, ParentFont becomes false automatically. +When ParentFont is true for a form, the form uses the default font. Currently, the default font is Tahoma 8 pt. + + + Specifies where a control looks to find out if its Help Hint should be shown. +Use ParentShowHint to ensure that all the controls on a form either uniformly show their Help Hints or uniformly do not show them. +If ParentShowHint is True, the control uses the ShowHint property value of its parent. If ParentShowHint is False, the control uses the value of its own ShowHint property. +To provide Help Hints only for selected controls on a form, set the ShowHint property for those controls that should have Help Hints to True, and ParentShowHint becomes False automatically. + +Note: Enable or disable all Help Hints for the entire application using the ShowHint property of the application object. + + + Specifies the pop-up menu associated with the control. +Assign a value to PopupMenu to make a pop-up menu appear when the user selects the control and clicks the right mouse button. If the TPopupMenu's AutoPopup property is True, the pop-up menu appears automatically. If the menu's AutoPopup property is False, display the menu with a call to its Popup method from the control's OnContextPopup event handler. + + + Reflects which attributes of the control have been scaled. +ScalingFlags is an internal set of flags used primarily in scaling inherited forms and their controls. Applications should not use this property without a serious need. +These are the flags and their meanings: + + + + + +Flag + +Meaning + + + +sfLeft + + + +Left side of control not yet scaled + + + + +sfTop + + + +Top of control not yet scaled + + + + +sfWidth + + + +Width of control not yet scaled + + + + +sfHeight + + + +Height of control not yet scaled + + + + +sfFont + + + +Font of control not yet scaled + + + + +sfDesignSize + + + +Design-time dimensions of control not yet scaled + + + Contains a text string associated with the control. +Use the Text property to read the Text of the control or to specify a new string for the Text value. By default, Text is the control name. For edit controls and memos, the Text appears within the control. For combo boxes, the Text is the content of the edit control portion of the combo box. + +Note: Controls that display text use either the Caption property or the Text property to specify the text value. Which property is used depends on the type of control. In general, Caption is used for text that appears as a window title or label, while Text is used for text that appears as the content of a control. + + + Accumulates mouse wheel rotations. +WheelAccumulator contains a value indicating the progress of event handlers in response to mouse wheel motion. See DoMouseWheel for more information. + + + Specifies the background color of the control. +Use Color to read or change the background color of the control. +If a control's Vcl.Controls.TControl.ParentColor property is True, then changing the Color property of the control's parent automatically changes the Color property of the control. When the value of the Color property is changed, the control's ParentColor property is automatically set to False. +The Color of a TLabel is always the color of the background unless you set TLabel.Transparent to False. + + + Specifies the attributes of text written on or in the control. +To change to a new font, specify a new TFont object. To modify a font, change the value of the Charset, Color, Height, Name , Pitch, Size, or Style of the TFont object. + +Note: Changing the font color of the Caption is not supported for some controls (such as TButton). In most cases, there is an alternate control you can use whose Font property will change the color of the caption or text (such as TBitBtn or TSpeedButton). + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the text string of the control. +Use WindowText to specify the text associated with the control. When setting WindowText, the control frees the memory associated with the previous value of WindowText before assigning a new value. Any memory associated with WindowText is freed when the control is destroyed. By default, WindowText is the same string as the Text property. Descendants of TControl can override the Text property to implement a different value. +For an edit box, the WindowText is the content of the control. For a combo box, the text string is the content of the edit box part of the combo box. For a button, the string is the button name. For all other controls, the string is the window title. + + + Occurs when an attempt is made to resize the control. +Use OnCanResize to adjust the way a control is resized. If necessary, change the new width and height of the control in the OnCanResize event handler. The OnCanResize event handler also allows applications to indicate that the entire resize should be aborted. +If there is no OnCanResize event handler, or if the OnCanResize event handler indicates that the resize attempt can proceed, the OnCanResize event is followed immediately by an OnConstrainedResize event. +OnCanResize is an event handler of type Vcl.Controls.TCanResizeEvent. + + + Occurs when the user clicks the control. +Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action's OnExecute method responds to click events unless it is superseded by an OnClick event handler. +Usually, OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when: + +The user selects an item in a grid, outline, list, or combo box by pressing an arrow key. +The user presses the SPACEBAR while a button or check box has focus. +The user presses ENTER when the active form has a default button (specified by the Default property). +The user presses ESC when the active form has a cancel button (specified by the Cancel property). +The user presses the accelerator key for a button or check box. For example, if the value of the Caption property of a check box is '&Bold', the B is underlined at run time and the OnClick event of the check box is triggered when the user presses Alt+B. However, focus does not move to the control in these instances. +The Checked property of a radio button is set to True. +The value of the Checked property of a check box is changed. +Note: When you change the value of the Checked property programmatically, the OnClick event of the check box control occurs. Do not modify the value of the Checked property in the event handler of the OnClick event, because that leads into a deadlock situation. +The Click method of a menu item is called. +For a form, an OnClick event occurs when the user clicks a disabled component or in a blank area of the form. +OnClick is an event handler of type TNotifyEvent. + + + Adjusts the resize constraints. +Use OnConstrainedResize to adjust a control's constraints when an attempt is made to resize it. Upon entry to the OnConstrainedResize event handler, the parameters of the event handler are set to the corresponding properties of the control's Constraints object. The event handler can adjust those values before they are applied to the new height and width that are being applied to the control. (The CanAutoSize method or an OnCanResize event handler may already have adjusted this new height and width). +On exit from the OnConstrainedResize event handler, the constraints are applied to the attempted new height and width. Once the constraints are applied, the control's height and width are changed. After the control's height and width change, an OnResize event occurs to allow any final adjustments or responses. + +Note: The OnConstrainedResize handler is called immediately after the OnCanResize handler. +OnConstrainedResize is an event handler of type Vcl.Controls.TConstrainedResizeEvent. + + + Occurs when the user right-clicks the control or otherwise invokes the pop-up menu (such as using the keyboard). +The OnContextPopup event handler is called when the user utilizes the mouse or keyboard to request a pop-up menu. The OnContextPopup event is generated by a WM_CONTEXTMENU message, which is itself generated by the user clicking the right mouse button or by pressing SHIFT+F10 or the Applications key. +This event is especially useful when the control does not have an associated pop-up menu (the PopupMenu property is not set) or if the AutoPopup property of the control's associated pop-up menu is False. However, the OnContextPopup can also be used to override the automatic context menu that appears when the control has an associated pop-up menu with an AutoPopup property of True. In this last case, if the event handler displays its own menu, it should set the Handled parameter to True to suppress the default context menu. +The handler's MousePos parameter indicates the position of the mouse, in client coordinates. If the event was not generated by a mouse click, MousePos is (-1,-1). + +Note: Parent controls receive an OnContextPopup event before their child controls. In addition, for many child controls, the default window procedure causes the parent control to receive an OnContextPopup event after the child control. As a result, when parent controls do not set Handled to True in an OnContextPopup event handler, the event handler may be called multiple times for each context menu invocation. +OnContextPopup is an event handler of type Vcl.Controls.TContextPopupEvent. + + + Occurs when the user double-clicks the left mouse button when the mouse pointer is over the control. +Use the OnDblClick event to respond to mouse double-clicks. +OnDblClick is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the user drops an object being dragged. +Use the OnDragDrop event handler to specify what happens when the user drops an object. The Source parameter of the OnDragDrop event is the object being dropped, and the Sender is the control on which the object is being dropped. The X and Y parameters are the coordinates of the mouse positioned over the control. +OnDragDrop is an event handler of type TDragDropEvent. + + + Occurs when the user drags an object over a control. +Use an OnDragOver event to signal that the control can accept a dragged object so the user can drop or dock it. +Within the OnDragOver event handler, change the Accept parameter to False to reject the dragged object. Leave Accept as True to allow the user to drop or dock the dragged object on the control. +To change the shape of the cursor, indicating that the control can accept the dragged object, change the value of the DragCursor property for the control before the OnDragOver event occurs. +The Source is the object being dragged, the Sender is the potential drop or dock site, and X and Y are screen coordinates in pixels. The State parameter specifies how the dragged object is moving over the control. + +Note: Within the OnDragOver event handler, the Accept parameter defaults to True. However, if an OnDragOver event handler is not supplied, the control rejects the dragged object, as if the Accept parameter were changed to False. +OnDragOver is an event handler of type TDragOverEvent. + + + Occurs when the dragging of an object ends, either by docking the object or by canceling the dragging. +Use OnEndDock to specify actions or special processing that happen when a drag-and-dock operation stops. + + + Occurs when the dragging of an object ends, either by dropping the object or by canceling the dragging. +Use the OnEndDrag event handler to specify any special processing that occurs when dragging stops. +OnEndDrag is an event handler of type Vcl.Controls.TEndDragEvent. + + + Occurs when the user presses a mouse button with the mouse pointer over a control and the parent form is not active. +Use the OnMouseActivate event handler to implement any special processing that should occur as a result of pressing a mouse button on a control when the parent top-level form is not active. +The event type is: + +TMouseActivateEvent = procedure (Sender: TObject; Button: TMouseButton; ShiftState: TShiftState; +X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object; + +When you click a control and the parent top-level form is not active, this event fires on the control that the mouse cursor is over. MouseActivate is a protected virtual function in TControl. MouseActivate can be overridden in custom control descendants to provide special built-in processing of the OnMouseActivate events. If you leave the default value of MouseActivate as maDefault, the parent control fires the OnMouseActivate event and repeats the process all the way up to the top-level form. If no control in the chain sets the value of MouseActivate, the behavior is the same as if a control set TMouseActivate to maActivate. At any point, a control can set the value of TMouseActivate and the parent processing stops. +Some controls set focus to themselves when they get a button down message so, in some cases, setting maNoActivate appears to have no effect. For instance, a TButton control sets focus to itself in the WM_LBUTTONDOWN message regardless of whether or not TMouseActivate is set to maNoActivate. In this case, setting maNoActivateAndEat will work because the top-level form is not activated and the WM_LBUTTONDOWN message is suppressed. +The HitTest parameter is the hit test value obtained from the WM_NCHITTEST message. See Windows.pas for valid values and their meanings. In most cases this value will be HTCLIENT, which means that the user clicked in the client area of a control. However, in the case of a top-level form, this can take other values such as HTCAPTION or HTBOTTOM. This allows the code to decide which value to set for MouseActivate, based on the HitTest code. For example, the following code in the OnMouseActivate event handler for a TForm forces the user to click into a non-client area to activate the form: + +if HitTest = HTCLIENT then +MouseActivate := maNoActivateAndEat; + +Even though this event is tied to how Windows processes WM_MOUSEACTIVATE, the actual handling of the message is done at the TControl level, which is the point in the VCL hierarchy where the control has no window handle. The OnMouseActivate event is then simulated because all the TControl descendants also have OnMouseDown, OnMouseMove, and OnMouseUp events. This information is applicable to both VCL Win32 and VCL.NET. + + + Occurs when the user presses a mouse button with the mouse pointer over a control. +Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button. +The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseDown is an event handler of type Vcl.Controls.TMouseEvent. + + + Occurs when the user moves the mouse into a control. +Use the OnMouseEnter event handler to implement any special processing that should occur as a result of moving the mouse into a control when the parent top-level form is not active. +OnMouseEnter is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the user moves the mouse outside of a control. +Use the OnMouseLeave event handler to implement any special processing that should occur as a result of moving the mouse outside of a control when the parent top-level form is not active. +OnMouseLeave is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the user moves the mouse pointer while the mouse pointer is over a control. +Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse. +Use the Shift parameter of the OnMouseMove event handler to determine the state of the shift keys and mouse buttons. Shift keys are the SHIFT, CTRL, and ALT keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender. +OnMouseMove is an event handler of type Vcl.Controls.TMouseMoveEvent. + + + Occurs when the user releases a mouse button that was pressed with the mouse pointer over a component. +Use an OnMouseUp event handler to implement special processing when the user releases a mouse button. +The OnMouseUp event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseUp is an event handler of type Vcl.Controls.TMouseEvent. + + + Occurs when the mouse wheel is rotated. +Write code in the OnMouseWheel event handler to respond to mouse wheel messages. If there is no OnMouseWheel event handler, or if the mouse wheel message is not handled in the OnMouseWheel event handler, then an OnMouseWheelUp or OnMouseWheelDown event occurs, depending on the direction the mouse wheel was rotated. +OnMouseWheel is an event handler of type Vcl.Controls.TMouseWheelEvent. + + + Occurs when the mouse wheel is rotated downward. +Write code in the OnMouseWheelDown event handler to perform actions when the mouse wheel is rotated downward. OnMouseWheelDown occurs only if the message is not already handled in an OnMouseWheel event handler. +OnMouseWheelDown is an event handler of type Vcl.Controls.TMouseWheelUpDownEvent. + + + Occurs when the mouse wheel is rotated upward. +Write code in the OnMouseWheelUp event handler to perform actions when the mouse wheel is rotated upward. OnMouseWheelUp occurs only if the message is not already handled in an OnMouseWheel event handler. +OnMouseWheelUp is an event handler of type Vcl.Controls.TMouseWheelUpDownEvent. + + + Occurs immediately after the control is resized. +Use OnResize to make any final adjustments after a control is resized. +To modify the way a control responds when an attempt is made to resize it, use OnCanResize or OnConstrainedResize. + +Note: Some controls call this event handler when the control is first created. +OnResize is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the user begins to drag a control with a DragKind of dkDock. +Use the OnStartDock event handler to implement special processing when the user starts a drag-and-dock operation by dragging the control. +The OnStartDock event handler can create a TDragDockObjectEx object for the DragObject parameter to specify the appearance of the dragging rectangle and how the dragged control interacts with potential docking sites. If you return TDragDockObjectEx as the drag object, there is no need to call the Free method for the DragObject when dragging is over. If you use TDragDockObject, your application is responsible for freeing the drag object. +If the OnStartDock event handler sets the DragObject parameter to nil (Delphi) or NULL (C++), a TDragDockObject object is automatically created. + +Note: This information applies to Win32 applications only. +OnStartDock is an event handler of type TStartDockEvent. + + + Occurs when the user begins to drag the control or an object it contains by left-clicking the control and holding the mouse button down. +Use the OnStartDrag event handler to implement special processing when the user starts to drag the control or an object it contains. OnStartDrag only occurs if DragKind is dkDrag. +Sender is the control that is about to be dragged, or that contains the object about to be dragged. +The OnStartDrag event handler can create a TDragControlObjectEx instance for the DragObject parameter to specify the drag cursor, or, optionally, a drag image list. If you create a TDragControlObjectEx instance, there is no need to call the Free method for the DragObject when dragging is over. If you create, instead, a TDragControlObject instance, your application is responsible for freeing the drag object instance. +If the OnStartDrag event handler sets the DragObject parameter to nil (Delphi) or NULL (C++), a TDragControlObject object is automatically created and dragging begins on the control itself. + +Note: On some controls, such as TRichEdit, the underlying Windows control handles internal drag operations. For these controls, there are no OnStartDrag or OnEndDrag events for drag operations within the control. +OnStartDrag is an event handler of type TStartDragEvent. + + + Creates an instance of TControl. +Calling Create constructs and initializes an instance of TControl. However, you should never attempt to instantiate a TControl. This class is intended solely as a base class from which other control classes descend and you should only call Create to instantiate one of these descendants. +Create calls the parent constructor and initializes the control. +When overriding Create, always call the inherited Create method first, then proceed with the control's initialization. Remember to specify the override directive when overriding the Create method. + +Note: If a control's constructor allocates resources or memory, also override the destructor to free those resources. + + + Destroys an instance of TControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it: + +Frees the TFont object in its Font property. +Calls its inherited destructor. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Starts the dragging of a control. +Call BeginDrag to start a drag operation. BeginDrag is called in application code only when the value of the control's DragMode is dmManual. If DragMode is dmAutomatic, BeginDrag is called automatically. +If the Immediate parameter is true, the mouse pointer changes to the value of the DragCursor property and dragging begins immediately. If Immediate is false, the mouse pointer does not change to the value of the DragCursor property and dragging does not begin until the user moves the mouse pointer the number of pixels specified by the Threshold parameter. If the caller passes a Threshold value less than 0 (such as the default value for this parameter), BeginDrag uses the DragThreshold property of the global Mouse variable. +Setting Immediate to false allows the control to accept mouse clicks without beginning a drag-and-drop or drag-and-dock operation. + + + Puts the control in front of all other controls in its parent control. +Call BringToFront to ensure that a form is visible or to reorder overlapping controls within a form. +Note that controls that wrap Windows screen objects (control classes descended from TWinControl) always "stack" above lightweight controls (control classes descended from TGraphicControl). BringToFront can force a lightweight control, such as a Shape, to stack above other lightweight controls, but wrapped controls, such as an Edit, will still stack above the Shape. +Without BringToFront, controls are stacked in the order they were placed on the form. + + + Translates a given point from client area coordinates to global screen coordinates. +Use ClientToScreen to convert a point whose coordinates are expressed locally to the control to the corresponding point in screen coordinates. In client area coordinates, (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates, (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + +P�:= TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + Translates a given point from client area coordinates to global screen coordinates. +Use ClientToScreen to convert a point whose coordinates are expressed locally to the control to the corresponding point in screen coordinates. In client area coordinates, (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates, (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + +P�:= TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + Translates client coordinates to parent coordinates. +ClientToParent translates Point from the current control's coordinate system to AParent's coordinate system. AParent must be a control that can be found by iterating up the chain of Parent properties. If AParent is nil (Delphi) or NULL (C++), the control's immediate parent is used. +An EInvalidOperation exception is thrown if AParent is not an ancestor control or the Parent property is nil (Delphi) or NULL (C++). + + + Used internally to dock the control. +Do not call Dock in applications. It is called automatically to implement many of the details of docking the control to a dock site. +To dock the control programmatically, use ManualDock instead. +The NewDockSite parameter specifies the docking site to which the control is being docked. The ARect parameter indicates the new dimensions of the control when it is docked to NewDockSite. + + + Indicates whether a control is being dragged. +Use Dragging to determine the drag state of the control. If Dragging returns true, the control is being dragged. If Dragging is false, the control is not being dragged. + + + Is an OnDragDrop event dispatcher. +When creating a component that descends from TControl, override DragDrop to add additional code that executes before the OnDragDrop event handler is called. +The Source parameter is the object that was dropped onto the control. The X and Y parameters are the mouse coordinates where the object was dropped. + + + Returns the text flags that reflect the current setting of the BiDiMode property. +Call DrawTextBiDiModeFlags to obtain a value for the TextFlags property of a canvas when drawing the control's text or caption. The return value can also be used with the Windows API DrawText function. +Flags are the current text flags, unaltered by any bidirectional mode considerations. +DrawTextBiDiModeFlags adds or removes the DT_RIGHT or DT_RTLREADING flags based on the values returned from the UseRightToLeftAlignment and UseRightToLeftReading methods. + + + Returns the text flag to add that indicates whether the control's text should read from right to left. +Call DrawTextBiDiModeFlagsReadingOnly to determine whether the DT_RTLREADING flag should be added when calling the Windows API DrawText or when assigning the TextFlags property of a canvas. +DrawTextBiDiModeFlagsReadingOnly returns the DT_RTLREADING flag or 0, depending on the value returned from the UseRightToLeftReading method. +To obtain the text flags that indicate the bidirectional alignment as well as text direction for the control, use DrawTextBiDiModeFlags instead. + + + Controls whether the control responds to mouse, keyboard, and timer events. +Use Enabled to change the availability of the control to the user. To disable a control, set Enabled to False. Some disabled controls appear dimmed (for example: buttons, check boxes, labels), while others (container controls) simply lose their functionality without changing their appearance. If Enabled is set to False, the control ignores mouse, keyboard, and timer events. +To re-enable a control, set Enabled to True. + +Note: This property applies to all TControl descendants. + + + Stops a control from being dragged any further. +Use EndDrag to stop a dragging operation that began with a call to the BeginDrag method. +If the Drop parameter is true, the control being dragged is dropped or docked. If the Drop parameter is false, the control is not dropped or docked and dragging is canceled. + + + Indicates how text is aligned within the control. +Use GetControlsAlignment to determine the alignment of the control. For controls that do not have an Alignment property, GetControlsAlignment returns taLeftJustify. + +Note: GetControlsAlignment returns the alignment of text before it is altered by the BiDiMode property. To check whether the alignment should be reversed to reflect the BiDiMode property, call UseRightToLeftAlignment. + + + Returns the parent of the control. +GetParentComponent is called by the streaming system that loads and saves VCL components. The component returned by GetParentComponent is responsible for loading and saving the control when it is streamed in or out. As implemented in TControl, GetParentComponent returns the value of the Parent property. + + + Indicates whether the control has a parent. +HasParent indicates whether the Parent property has been assigned a value. This method is used by the streaming system to determine whether the control has a parent that is responsible for writing it to a stream. As implemented in TControl, HasParent returns true if the Parent property is not nil (Delphi) or NULL (C++), and false otherwise. + + + Makes the control invisible. +Call Hide to hide a control. Hide sets the Visible property of the control to false. +Although a control that is hidden is not visible, its properties and methods are still available. + + + Calls the action link's Update method if the control is associated with an action link. +When the application is idle, the library makes a series of calls to allow controls to update their associated actions so that they reflect the current properties of the controls. The first of these is to the InitiateAction method of the each form, followed by the InitiateAction methods of its visible menus and controls. +InitiateAction calls the action's update method indirectly (through its action link), which leads to a number of events, any of which may update the action and stop the update process: + +First, the action list that contains the action receives an OnUpdate event. +If the action list does not handle the OnUpdate event, then the Application object receives an OnActionUpdate event. +If the OnActionUpdate event handler does not update the action, the action itself receives an OnUpdate event. +If that does not update the action, the active control's UpdateAction method is called. +Finally, if the action is still not updated, the active form's UpdateAction method is called. + + + Completely repaints the control. +Use Invalidate when the entire control needs to be repainted. When more than one region within the control needs repainting, Invalidate will cause the entire window to be repainted in a single pass, avoiding flicker caused by redundant repaints. There is no performance penalty for calling Invalidate multiple times before the control is actually repainted. + + + Dispatches messages received from a mouse wheel. +The WndProc method calls MouseWheelHandler when it receives a mouse wheel message. MouseWheelHandler checks whether the windowed control is embedded in a form, and if so, calls the form's MouseWheelHandler method. This allows the form to respond to mouse wheel messages before they are handled by individual controls. If the windowed control is not in a form, MouseWheelHandler passes the mouse wheel message to the Perform method, which generates an OnMouseWheel event, followed (if necessary) by an OnMouseWheelUp or OnMouseWheelDown event. + + + Indicates whether the control should be reversed right to left. +Use IsRightToLeft to determine whether the control should be reversed in any way because it is running on a system with a Middle Eastern locale. IsRightToLeft is intended for component writers to ease the process of implementing the BiDiMode property. +IsRightToLeft returns true if the application is running on a Middle East-enabled version of Windows and the BiDiMode property indicates that the control should make any adjustments. + + + Docks the control. +Use ManualDock to dock the control programmatically. ManualDock undocks the control from its current dock site, then docks the control to its new dock site. +NewDockSite is the control's new dock site. +DropControl is the control in the new dock site, if any, on which to drop the control. For example, when docking to a page control, DropControl would be a tab sheet. +ControlSide specifies on which side of DropControl or NewDockSite (if DropControl is nil (Delphi) or NULL (C++)) the control should be docked. This value can be obtained by calling the dock site's GetDockEdge method. + + + Undocks the control. +Use ManualFloat to undock the control programmatically. +ScreenPos is the rectangle in which the control is displayed when it starts floating. + + + Responds as if the control received a specified Windows message. +Call Perform to bypass the Windows message queue and send a message directly to the control's window procedure. +Perform fills a message record (of type TMessage) with the message ID passed in the Msg parameter, the message parameters passed in WParam and LParam, and a result field of zero. Perform then passes the message record to the WindowProc method for processing. + + + Repaints the control on the screen. +Call the Refresh method to repaint the control immediately. Refresh calls the Repaint method. Use the Refresh and Repaint methods interchangeably. + + + Forces the control to repaint its image on the screen. +Call Repaint to force the control to repaint its image immediately. If the ControlStyle property includes csOpaque, the control paints itself directly. Otherwise, the Repaint method calls the Invalidate method and then the Update method so that any visible portions of controls beneath the control will be repainted as well. + + + Docks the control in the place where another control is already docked. +Call ReplaceDockedControl to replace a control that is already docked while moving that control to another dock site. +Control is the control whose place this control is taking. +NewDockSite is the new dock site for the control that is replaced. +DropControl is a control in the new dock site on which to drop the control that is replaced. For example, if NewDockSite were a page control, DropControl would be a tab sheet. +ControlSide specifies on which side of DropControl or NewDockSite (if DropControl is nil (Delphi) or NULL (C++)) the replaced control should be docked. This value can be obtained by calling the dock site's GetDockEdge method. +ReplaceDockedControl does the same thing as calling the ManualDock method of the control specified by the Control parameter (using the values of NewDockSite, DropControl, and ControlSide) in addition to calling ManualDock for the control whose method this is, docking it in the current position of the Control parameter. However, calling ReplaceDockedControl is more efficient, and prevents unnecessary flicker. + + + Converts the screen coordinates of a specified point on the screen to client coordinates. +Use ScreenToClient to convert a point in screen coordinates to local, or client area, coordinates. In client area coordinates (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + + + +P := TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + + + + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + + + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + Converts the screen coordinates of a specified point on the screen to client coordinates. +Use ScreenToClient to convert a point in screen coordinates to local, or client area, coordinates. In client area coordinates (0, 0) corresponds to the upper-left corner of the control's client area. In screen coordinates (0, 0) corresponds to the upper-left corner of the screen. +Use ScreenToClient along with ClientToScreen to convert from one control's coordinate system to another control's coordinate system. For example, + + + +P := TargetControl.ScreenToClient(SourceControl.ClientToScreen(P)); + + + + +P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P)); + + + +converts P from coordinates in SourceControl to coordinates in TargetControl. + + + Translate parent coordinates to client coordinates. +ParentToClient translates Point from the AParent's coordinate system to the current control's coordinate system. AParent must be a control that can be found by iterating up the chain of Parent properties. If AParent is nil (Delphi) or NULL (C++), the control's immediate parent is used. +An EInvalidOperation exception is thrown if AParent is not an ancestor control or the Parent property is nil (Delphi) or NULL (C++). + + + Puts a windowed control behind all other windowed controls, or puts a non-windowed control behind all other non-windowed controls. +Use SendToBack to change the order of overlapping controls or forms. +The order in which controls stack on top of each other (also called the Z order) depends on the order the controls are placed on the form. For example, if you put a label and an image on a form so that one is on top of the other, the one that was placed first on the form becomes the one on the bottom. Because both the label and the image are non-windowed controls, they "stack" as you would expect them to. Call the SendToBack method for the top object to move it below the other object. +The stacking order of two windowed controls is the same as the stacking of two non-windowed controls. For example, if you put a memo on a form, then put a check box on top of it, the check box remains on top. Calling SendToBack for the check box makes the memo appear on top. +The stacking order of windowed and non-windowed controls cannot be mingled. For example, if you put a memo, a windowed control on a form, and then put a label, a non-windowed control on top of it, the label disappears behind the memo. Windowed controls always stack on top of non-windowed controls. In this example, calling the SendToBack method of the memo does nothing, the label remains behind the memo. +If the control has the input focus when the SendToBack method executes, it loses the input focus. + + + Sets the Left, Top, Width, and Height properties all at once. +Use SetBounds to change all of the component's boundary properties at one time. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately, but SetBounds changes all four properties at once ensuring that the control will not repaint between changes. +Specify the values for the Left, Top, Width, and Height properties as the value of the ALeft, ATop, AWidth, and AHeight parameters, respectively. +Calling SetBounds does not necessarily result in the Left, Top, Width, and Height properties changing to the specified values. Before the properties are changed, the AutoSize or Constraints property may limit the changes, and an OnCanResize (or OnConstrainedResize) event handler may change the new values. After the control's Left, Top, Width, and Height properties are changed, SetBounds generates an OnResize event. + +Note: Component writers can change the Left, Top, Width, and Height properties while bypassing all resize events and constraint or autosize logic by using the UpdateBoundsRect method instead. + + + Makes a control visible at design time. +SetDesignVisible is used internally by Delphi during form design. + + + Sets the parent for the control. +Do not call the SetParentComponent method. It is used by the streaming system that loads and saves VCL components. SetParentComponent makes the component specified by the Value parameter the parent of the control. +SetParentComponent calls the SetParent method only if the component specified as the parent is a windowed control. + + + Makes a control visible. +Use the Show method to make visible a control that was previously hidden. +The Show method sets the control's Visible property to true and ensures that the parent control is also visible. + + + Processes any pending paint messages immediately. +Call Update to force the control to be repainted before any more, possibly time-consuming, processing takes place. Use Update to provide immediate feedback to the user that cannot wait for the Windows paint message to arrive. +Update does not invalidate the control, but simply forces a repaint of any regions that have already been invalidated. Call Repaint instead to invalidate the control as well. + + + Specifies whether the control's alignment should be reversed right-to-left. +Controls call UseRightToLeftAlignment when implementing the BiDiMode property. UseRightToLeftAlignment indicates whether the control's alignment should be reversed right-to-left. This information can be used when painting the control or when responding to mouse events. +UseRightToLeftAlignment returns True if the application is running on a system with a Middle Eastern locale and the BiDiMode property is bdRightToLeft. Otherwise, it returns False. Descendants override UseRightToLeftAlignment if alignment in Middle Eastern locales depends on other factors. + + + Specifies whether the control is using a right-to-left reading order. +Controls call UseRightToLeftReading when implementing the BiDiMode property. UseRightToLeftReading indicates whether the control's text should read from right to left. This information can be used to determine which style flags to set for the control when it is created and which flags to set for drawing text. +UseRightToLeftReading returns true if the application is running on a system with a Middle Eastern locale and the BiDiMode property is not bdLeftToRight. UseRightToLeftReading returns false otherwise. + + + Specifies whether the vertical scroll bar appears on the left side of the control. +Controls call UseRightToLeftScrollBar when implementing the BiDiMode property. UseRightToLeftScrollBar returns true when the vertical scroll bar appears on the left side of the control, and false when it appears on the right side. +UseRightToLeftScrollBar returns true if the application is running on a system with a Middle Eastern locale and the BiDiMode property is bdRightToLeft or bdRightToLeftNoAlign. + + + Provides message handling for all messages that do not have specific handlers. +Override DefaultHandler to extend the default handling of messages. DefaultHandler is the final opportunity for component writers to handle messages to controls. The method referenced by WindowProc provides the first opportunity. Individual message methods such as Click provide additional opportunities. +DefaultHandler handles the messages Windows sends to manage the control's text: WM_GETTEXT, WM_SETTEXT, and WM_GETTEXTLENGTH. + + + Retrieves the control's text, copies it into a buffer, and returns the number of characters copied. +Call GetTextBuf to retrieve the text of a control into a fixed size buffer. The text copied is the value of the Text property. GetTextBuf returns the number of characters that were actually copied, which is either the length of the Text property, or BufSize - 1, whichever is smaller. +To find out how many characters the buffer needs to hold the entire text, call the GetTextLen method before allocating a buffer for GetTextBuf. + +Note: GetTextBuf is available for compatibility with 16-bit code. Where backward compatibility is not an issue, use the Text property. +Note: To obtain the control's text as an AnsiString, use the Text property instead. + + + Returns the length of the control's text. +Call GetTextLen to find the length of the control's text. This is the size needed for a text buffer to be used by the GetTextBuf method. + + + Responds as if the control received a specified Windows message. +Call Perform to bypass the Windows message queue and send a message directly to the control's window procedure. +Perform fills a message record (of type TMessage) with the message ID passed in the Msg parameter, the message parameters passed in WParam and LParam, and a result field of zero. Perform then passes the message record to the WindowProc method for processing. + + + Responds as if the control received a specified Windows message. +Call Perform to bypass the Windows message queue and send a message directly to the control's window procedure. +Perform fills a message record (of type TMessage) with the message ID passed in the Msg parameter, the message parameters passed in WParam and LParam, and a result field of zero. Perform then passes the message record to the WindowProc method for processing. + + + Sets the text of the control. +Call the SetTextBuf method to set the text of the control to the text in the specified buffer. +The text is set to the text in the buffer pointed to by the Buffer parameter. Buffer must point to a null-terminated string. The SetTextBuf method sends the WM_SETTEXT and CM_TEXTCHANGED messages. Doing this in the tight execution of a function can result in the change not being seen until messages from the Windows message queue are processed after the function finishes executing. To interrupt a function's execution and process messages, use the ProcessMessages method of the Application object. + +Note: The SetTextBuf method is provided for backwards compatibility only. To set the text of a control now, assign a string value to the Text property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + The overloaded ScaleValue methods return a measure passed as parameter scaled by the current scale factor for the control (the value of the ScaleFactor read-only property). + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the action associated with the control. +Action is the action object that is associated with the control. Actions allow an application to centralize the response to user commands. When a control is associated with an action, the action determines the appropriate properties and events of the control (such as whether the control is enabled or how it responds to an OnClick event). +To create actions at design time, place an action list component on a form or data module. Double-click the action list to bring up the action list editor. Add actions in the editor using its context menu. Once the actions have been added using the Action List editor, they appear in the drop-down list for the Action property in the Object Inspector. + + + Determines how the control aligns within its container (parent control). +Use Align to align a control to the top, bottom, left, or right of a form or panel and have it remain there even if the size of the form, panel, or component that contains the control changes. When the parent is resized, an aligned control also resizes so that it continues to span the top, bottom, left, or right edge of the parent. +For example, to use a panel component with various controls on it as a tool palette, change the panel's Align value to alLeft. The value of alLeft for the Align property of the panel guarantees that the tool palette remains on the left side of the form and always equals the client height of the form. +The default value of Align is alNone, which means a control remains where it is positioned on a form or panel. + +Tip: If Align is set to alClient, the control fills the entire client area so that it is impossible to select the parent form by clicking it. In this case, select the parent by selecting the control on the form and pressing ESC, or by using the Object Inspector. +Any number of child components within a single parent can have the same Align value, in which case they stack up along the edge of the parent. The child controls stack up in z-order. To adjust the order in which the controls stack up, drag the controls into their desired positions. + +Note: To cause a control to maintain a specified relationship with an edge of its parent, but not necessarily lie along one edge of the parent, use the Anchors property instead. + + + Specifies how the control is anchored to its parent. +Use Anchors to ensure that a control maintains its current position relative to an edge of its parent, even if the parent is resized. When its parent is resized, the control holds its position relative to the edges to which it is anchored. +If a control is anchored to opposite edges of its parent, the control stretches when its parent is resized. For example, if a control has its Anchors property set to [akLeft, akRight], the control stretches when the width of its parent changes. +Anchors is enforced only when the parent is resized. Thus, for example, if a control is anchored to opposite edges of a form at design time and the form is created in a maximized state, the control is not stretched because the form is not resized after the control is created. + +Note: If a control should maintain contact with three edges of its parent (hugging one side of the parent and stretching the length of that side), use the Align property instead. Unlike Anchors, Align allows controls to adjust to changes in the size of other aligned sibling controls as well as changes to the parent's size. + + + Specifies the bidirectional mode for the control. +Use BiDiMode to enable the control to adjust its appearance and behavior automatically when the application runs in a locale that reads from right to left instead of left to right. The bidirectional mode controls the reading order for the text, the placement of the vertical scroll bar, and whether the alignment is changed. +Alignment does not change for controls that are known to contain number, date, time, or currency values. For example, with data-aware controls, the alignment does not change for the following field types: ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftAutoInc. + + + Specifies the bounding rectangle of the control, expressed in the coordinate system of the parent control. +Use BoundsRect as a quick way to obtain the pixel locations of all corners of the control all at once. +For example, the statement + + + +R := Control.BoundsRect; + + + + +R = Control->BoundsRect; + + + +corresponds to + + + +R.Left := Control.Left; +R.Top := Control.Top; +R.Right := Control.Left + Control.Width; +R.Bottom := Control.Top + Control.Height; + + + + +R.Left = Control->Left; +R.Top = Control->Top; +R.Right = Control->Left + Control->Width; +R.Bottom = Control->Top + Control->Height; + + + +The origin of the pixel coordinate system is in the upper-left corner of the parent window. + +Note: A point is considered within the control's bounds rectangle if it lies on the left or top side but not if it lies on the right or bottom side. That is, to be inside the bounds rectangle, the x-coordinate must be greater than or equal to BoundsRect.Left and less than BoundsRect.Right, and the y-coordinate must be greater than or equal to BoundsRect.Top and less than BoundsRect.Bottom. + + + Specifies the height of the control's client area in pixels. +Use ClientHeight to read or change the height of the control's client area. +For TControl, ClientHeight is the same as Height. Derived classes may implement a ClientHeight property that differs from Height. For example, the ClientHeight of a form is the value of the Height property minus the height of the title bar, resize border, and scroll bars. + + + Specifies the screen coordinates (in pixels) of the upper-left corner of a control's client area. +Read ClientOrigin to locate the upper-left corner of the control's client area. ClientOrigin returns X and Y coordinates as a TPoint type, where X specifies the horizontal coordinate of the point and Y specifies the vertical coordinate. +The screen coordinates of a control that is descended from TControl and not TWinControl are the screen coordinates of the control's parent added to its Left and Top properties. If the control doesn't have a parent, an EInvalidOperation exception is raised when ClientOrigin is read. + + + Specifies the size of a control's client area in pixels. +Read ClientRect to find out the size of the client area of a control. ClientRect returns a rectangle with its Top and Left fields set to zero, and its Bottom and Right fields set to the control's Height and Width, respectively. ClientRect is equivalent to Rect(0, 0, ClientWidth, ClientHeight). +A point is considered within the control's client rectangle if it lies on the left or top side but not if it lies on the right or bottom side. That is, to be inside the client rectangle, the X-coordinate must be greater than or equal to ClientRect.Left and less than ClientRect.Right, and the Y-coordinate must be greater than or equal to ClientRect.Top and less than ClientRect.Bottom. + +Note: ClientRect is the size of the physical client area of the control, not its logical client area. If the control supports scrolling, the ClientRect is not the entire scrolling range, but only the region that is available at any given time. + + + Specifies the horizontal size of the control's client area in pixels. +Use ClientWidth to read or change the width of the control's client area. ClientWidth is equivalent to ClientRect.Right. +For TControl, ClientWidth is the same as Width. Derived classes may implement a ClientWidth property that differs from Width. For example, the ClientWidth of a form is the value of the Width property minus the width of the resize border and scroll bars. + + + Specifies the size constraints for the control. +Use Constraints to specify the minimum and maximum width and height of the control. When Constraints contains maximum or minimum values, the control cannot be resized to violate those constraints. + +Note: Constraints apply to the height of the form. However, the height of the form depends on how large Windows makes the title bar. For example, Windows XP uses much larger title bars than other windowing systems. To work around this, note the ClientHeight when you design your form and set the constraints in the FormCreate event. In the following example, ClientHeight is represented by x: Constraints.MinHeight�:= x + Height - ClientHeight. +Warning: Do not set up constraints that conflict with the value of the Align or Anchors property. When these properties conflict, the response of the control to resize attempts is not well-defined. + + + Specifies the current state of a control at run time. +Read ControlState to find out various conditions that affect the control such as whether it has been clicked or needs alignment. ControlState reflects transient conditions of an instance of the control, as opposed to attributes of the control class as a whole. ControlState consists of a set of flags drawn from the following values: + + + + + +Flag + +Meaning + + + +csLButtonDown + + + +The left mouse button was clicked and not yet released. This is set for all mouse-down events. + + + + +csClicked + + + +The same as csLButtonDown, but only set if ControlStyle contains csClickEvents, meaning that mouse-down events are interpreted as clicks. + + + + +csPalette + + + +The system palette has changed and the control or one of its descendants has not finished adjusting by realizing its palette. + + + + +csReadingState + + + +The control is reading its state from a stream. + + + + +csAlignmentNeeded + + + +The control needs to realign itself when alignment is re-enabled. + + + + +csFocusing + + + +The application is processing messages intended to give the control focus. This does not guarantee the control will receive focus, but prevents recursive calls. + + + + +csCreating + + + +The control and/or its owner and subcontrols are being created. This flag clears when all have finished creating. + + + + +csPaintCopy + + + +The control is being replicated, meaning a copy of the control is being painted. The ControlStyle flag csReplicatable must be set for this state to occur. + + + + +csCustomPaint + + + +The control is processing custom paint messages. + + + + +csDestroyingHandle + + + +The control's window is being destroyed. + + + + +csDocking + + + +The control is being docked. + + + + +The flags in ControlState are specific to controls, and augment the state flags in the ComponentState property. +ControlState is primarily used by component writers in the implementation of components derived from TControl. + + + Determines style characteristics of the control. +Use ControlStyle to determine various attributes of the control, such as whether the control can capture the mouse or has a fixed size. The ControlStyle property contains a set of style flags indicating these attributes. The following table lists the flags and their meanings: + + + + + +Flag + +Meaning + + + +csAcceptsControls + + + +The control becomes the parent of any controls dropped on it at design time. + + + + +csCaptureMouse + + + +The control captures mouse events when it is clicked. + + + + +csDesignInteractive + + + +The control maps right mouse button clicks at design time into left mouse button clicks to manipulate the control. + + + + +csClickEvents + + + +The control can receive and respond to mouse clicks. Some controls may not inherit this attribute, for example, TButton. + + + + +csFramed + + + +The control has a 3D frame. + + + + +csSetCaption + + + +The control's Caption should match the Name if it has not been explicitly set to something else. + + + + +csOpaque + + + +The control completely fills its client rectangle. + + + + +csDoubleClicks + + + +The control can receive and respond to double-click messages. Otherwise, map double-clicks into clicks. + + + + +csFixedWidth + + + +The width of the control does not vary or scale. + + + + +csFixedHeight + + + +The height of the control does not vary or scale. + + + + +csNoDesignVisible + + + +The control is not visible at design time. + + + + +csReplicatable + + + +The control can be copied using the PaintTo method to draw its image to an arbitrary canvas. + + + + +csNoStdEvents + + + +Standard events such as mouse, key, and click events are ignored. This flag allows an application to run faster when there is no need to respond to these events. + + + + +csDisplayDragImage + + + +If a control that has an associated drag image list is dragged across a control with this setting, then the image list is used to enhance the drag cursor while the cursor is over it. Otherwise, the drag cursor is used on its own. + + + + +csReflector + + + +The control responds to Windows dialog messages, focus messages, or size change messages. Use this setting if the control can be used as an ActiveX control, so that it receives notification of these events. + + + + +csActionClient + + + +The control is linked to an action object. This flag is set when the Action property is set, and cleared if the Action property is cleared. + + + + +csMenuEvents + + + +The control responds to system menu commands. + + + + +ControlStyle describes all controls instantiated from a given class. ControlStyle should not be modified at run time, except in the constructor. The ControlState property records transient conditions. +The TControl constructor initializes ControlStyle to the set of csCaptureMouse, csClickEvents, csSetCaption, and csDoubleClicks. +ControlStyle is primarily used by component writers when implementing components derived from TControl. + + + Embarcadero Technologies does not currently have any additional information. + + + DockOrientation specifies how the control is docked relative to other controls docked in the same parent. +Use DockOrientation to determine the position of the control relative to other controls docked to the same parent. Docking zones can be arranged from left to right or from top to bottom. + + + Specifies the explicit horizontal pixel coordinate of the left edge of a component relative to its parent. +ExplicitLeft is a read-only property used internally by Delphi. Use Left in applications to allow read and write access. + + + Specifies the explicit vertical pixel coordinate of the top edge of a component relative to its parent. +ExplicitTop is a read-only property used internally by Delphi. Use Top in applications to allow read and write access. + + + Specifies the explicit horizontal size of the control in pixels. +ExplicitWidth is a read-only property used internally by Delphi. Use Width in applications to allow read and write access. + + + Specifies the explicit vertical size of the control in pixels. +ExplicitHeight is a read-only property used internally by Delphi. Use Height in applications to allow read and write access. + + + Specifies whether the control is floating. +Read Floating to determine whether a dockable control appears in a floating window, rather than docked to a parent control. + +Note: Use Floating rather than the Parent property to determine whether a control is free-floating. Floating controls may have a non-nil (Delphi) or NULL (C++) parent if the FloatingDockSiteClass property specifies a floating window type. + + + Specifies the class of the temporary control that hosts the control when it is floating. +Use FloatingDockSiteClass to specify the class that houses the control when it is floating. This class must be a descendant of TWinControl. By default, it is TCustomDockForm. When the control is undocked, a temporary control of this type is created and the control is docked to that control. When the control is docked to another control, the temporary floating dock site is freed. +If the control can float as a stand-alone window, FloatingDockSiteClass is nil (Delphi) or NULL (C++). + + + Specifies the control in which the control is docked. +Read HostDockSite to access the windowed control to which the control is docked. If the control is floating, HostDockSite is a temporary control of type FloatingDockSiteClass, or (if there is no floating dock site class) nil (Delphi) or NULL (C++). +Most applications should use the ManualDock method rather than setting HostDockSite. Setting HostDockSite automatically undocks the control from its previous host (if any) and docks it to the specified control, but does not adjust the control's position and alignment and bypasses the standard docking events. +For dock clients, the value of HostDockSite is the same as the value of Parent. For controls that are not docking clients, HostDockSite is nil (Delphi) or NULL (C++), while Parent specifies the containing control. + + + Specifies the width of the control when it is docked horizontally. +Read LRDockWidth to get the width of the control from the last time it was docked horizontally. Set LRDockWidth to indicate the width the control should have the next time it is docked horizontally. +LRDockWidth allows a control to "remember" its docked size even when its width changes because it is undocked or docked with a vertical orientation. + + + Embarcadero Technologies does not currently have any additional information. + + + ShowHint specifies whether to show the Help Hint when the mouse pointer moves over the control. +ShowHint determines whether the Help Hint appears for the control. The Help Hint is the value of the TControl.Hint property. The Help Hint appears in a box just beneath the control when the mouse pointer moves over the control. +To enable Help Hints for a particular control, two conditions must be satisfied: + +The application's ShowHint property must be True. +Either the control's own ShowHint property must be True, or the control's ParentShowHint property must be True and its parent's ShowHint property must be True. +For example, imagine a check box within a group box. If the ShowHint property of the group box is True and the ParentShowHint property of the check box is True, but the ShowHint property of the check box is False, the check box still displays its Help Hint. +Changing the ShowHint value automatically sets the ParentShowHint property to False. + + + Specifies the height of the control when it is docked vertically. +Read TBDockHeight to get the height of the control from the last time it was docked vertically. Set TBDockHeight to indicate the height the control should have the next time it is docked vertically. +TBDockHeight allows a control to "remember" its docked size even when its height changes because it is undocked or docked with a horizontal orientation. + + + Specifies the touch manager component associated with the control. +Use the Touch property to access gesturing options associated with a control. Touch specifies a class of type TTouchManager. +Touch is used to: + +Associate a TGestureManager. +(TGestureManager manages all the gestures that can be used by the control.) +Select the standard, interactive, or custom gestures to associate with the control. +(You can also connect each gesture to an action; see Assigning Actions to Gestures.) +Specify a set of options for interactive or tablet gestures. + + + Specifies the height of the control when it is floating. +Read UndockHeight to get the height of the control from the last time it was floating. Set UndockHeight to indicate the height the control should have the next time it is undocked. +UndockHeight allows a control to "remember" its floating size even when its height changes because it is docked. + + + Specifies the width of the control when it is floating. +Read UndockWidth to get the width of the control from the last time it was floating. Set UndockWidth to indicate the width the control should have the next time it is undocked. +UndockWidth allows a control to "remember" its floating size even when its width changes because it is docked. + + + Specifies whether the component appears onscreen. +Use the Visible property to control the visibility of the control at run time. If Visible is True, the control appears. If Visible is False, the control is not visible. +Calling the Show method sets the control's Visible property to True. Calling the Hide method sets it to False. +For TCustomForm descendants, the Show and ShowModal methods set Visible to True and bring the form to the front of all open windows. +For TTabSheet descendants, Visible does not control the visibility of the control at run time. For more information, see the description of the TabVisible property. + + + Points to the window procedure that responds to messages sent to the control. +Use the WindowProc property to temporarily replace or subclass the window procedure of the control. Component writers that are customizing the window procedure for a descendent class should override the WndProc method instead. +Before assigning a new value to WindowProc, store the original value. WindowProc is initially set to the WndProc method, so if the value has not been changed since then, the original value need not be stored. Within the procedure that is used as the new value for WindowProc, pass any unhandled messages to the original procedure that was the value of WindowProc. After completing any specialized message handling, restore the value of WindowProc to the original procedure. + + + Specifies the parent of the control. +Use the Parent property to get or set the parent of the control. The parent of a control is the control that contains it. For example, if an application includes three radio buttons in a group box, the group box is the parent of the three radio buttons, and the radio buttons are the child controls of the group box. +To serve as a parent, a control must be an instance of a TWinControl descendant. +When creating a new control at run time, assign a Parent property value for the new control. Usually, this is a form, panel, group box, or a control that is designed to contain another. Changing the parent of a control moves the control onscreen so that it is displayed within the new parent. When the parent control moves, the child moves with the parent. +Some controls (such as ActiveX controls) are contained in native windows rather than in a parent VCL control. For these controls, the value of Parent is nil (Delphi) or NULL (C++) and the ParentWindow property specifies the window. + +Note: The Parent property declared in TControl is similar to the Owner property declared in TComponent, in that the Parent of a control frees the control just as the Owner of a component frees that component. However, the Parent of a control is always a windowed control that visually contains the control, and is responsible for writing the control to a stream when the form is saved. The Owner of a component is the component that was passed as a parameter in the constructor and, if assigned, initiates the process of saving all objects (including the control and its parent) when the form is saved. + + + Specifies the style elements that are used by the control. +Use StyleElements to customize the style of the control. If a custom style is enabled, you can enable or disable style elements in the control. +StyleElements is a set of values that specify which elements of the current style are to be applied to this control. By default, all the elements of the style are enabled. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs when you perform a gesture associated with this control. +Write an event handler for OnGesture to perform custom processing for gesture events. OnGesture is fired on controls that subscribed for specific gestures using the TTouchManager class. If your code did process the gesture event, do not forget to set the Handled parameter to True so that the event is not propagated further. +If no event handler is associated with the control, the default DoGesture method is executed performing its own processing for the event. +OnGesture is an event handler of type Vcl.Controls.TGestureEvent. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether a control should be constrained by margins. +If AlignWithMargins is true, use the Margins property of the control to govern the spacing relative to other controls that are aligned with this one. The controls are not allowed to be any closer than the spacing specified in Margins. This spacing is maintained as controls are moved when the parent control resizes. +AlignWithMargins is true if the style csAlignWithMargins, a TControlStyle type, is in the control's ControlStyle property, and false otherwise. + + + Specifies the horizontal coordinate of the left edge of a component relative to its parent. +Use the Left property to determine where the left side of the control begins or to reposition the left side of the control. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Left property is relative to the screen in pixels. + + + Specifies the Y coordinate of the upper-left corner of a control, relative to its parent or containing control in pixels. +Use Top to locate the top of the control or reposition the control to a different Y coordinate. The Top property, like the Left property, is the position of the control relative to its container. Thus, if a control is contained in a TPanel, the Left and Top properties are relative to the panel. If the control is contained directly by the form, it is relative to the form. For forms, the value of the Top property is relative to the screen in pixels. + + + Specifies the horizontal size of the control or form in pixels. +Use the Width property to read or change the width of the control. + +Note: For tab sheet controls, changing this property at run time has no effect. + + + Specifies the vertical size of the control in pixels. +Use the Height property to read or change the height of the control. + + + Specifies the image used to represent the mouse pointer when it passes into the region covered by the control. +Change the value of Cursor to provide feedback to the user when the mouse pointer enters the control. The value of Cursor is the index of the cursor in the list of cursors maintained by the global variable, Screen. In addition to the built-in cursors provided by TScreen, applications can add custom cursors to the list. + + + Hint contains the text string that appears when the user moves the mouse over the control. +Use the Hint property to provide a string of Help text either as a Help Hint or as Help text on a particular location, such as a status bar. +A Help Hint is a box containing Help text that appears for a control when the user moves the mouse pointer over the control and pauses momentarily. +To set up Help Hints + +Specify the Hint property of each control for which a Help Hint should appear. +Set the ShowHint property of each appropriate control to True, or set the ParentShowHint property of all controls to True and set the ShowHint property of the form to True. +At run time, set the value of the application's ShowHint property to True. +To show the Hint on a status bar or another location, use the OnHint event handler of the application. The application's OnHint event occurs when the mouse pointer moves over the control. +Specify a hint to be used for both a Help Hint box and by an OnHint event handler by specifying values separated by a | (pipe) character. +For example, + +Edit1.Hint := 'Name|Enter Name in the edit box|1'; + +Edit1->Hint = "Name|Enter Name in the edit box|1"; + +Here: + +The Name part is the short hint and appears at the top of the Help Hint box. +Enter full name in the edit box is the long hint and appears below the short hint. It can be extracted using the GetLongHint function for use in an OnHint event handler. +1 is an optional image index in an image list in the Images property of the control and specifies the index of the image to appear in the hint. +If Hint contains only one value, the entire string is used as a Help Hint and returned by the GetLongHint and GetShortHint functions. If a control has no Hint value specified, but its parent control does, the control uses the value of the parent control (as long as the control's ShowHint property is True). + +Note: If the application's ShowHint property is False, the Help Hint does not appear, but the OnHint event handler is still called. + + + Specifies whether the control's context-sensitive Help topic is identified by a context ID or by keyword. +Set HelpType to specify whether the control identifies its context-sensitive Help topic by a context ID or by keyword: + +When HelpType is htContext, the HelpContext property value identifies the control's Help topic. +When HelpType is htKeyword, the HelpKeyword property value identifies the control's Help topic. +To use the Help, insert in the uses clause of your application the Vcl.HtmlHelpViewer or another unit that provides an interface to the external Help viewer to use. For C++, you need to include the HTMLHelpViewer.hpp header file. + + + The HelpKeyword property contains the keyword string that identifies the Help topic for the control. +To enable the keyword-based context-sensitive Help for a control, set Vcl.Controls.TControl.HelpType to htKeyword and set HelpKeyword to a keyword string. +No keyword (zero-length string, the default) means that no Help topic is provided for the control. +To use the Help, insert in the uses clause of your application the Vcl.HtmlHelpViewer or other unit that provides an interface to the external Help viewer to use. For C++, you need to include the HTMLHelpViewer.hpp header file. + + + The HelpContext property contains the numeric context ID that identifies the Help topic for the control. +In case of a .chm help file, you must map symbolic Context IDs of Help topics to numeric topic ID values in the [MAP] section of your project (.hhp) file. +To enable Context ID-based context-sensitive Help for a control, set Vcl.Controls.TControl.HelpType to htContext and set HelpContext to a numeric topic ID. +A topic ID of 0 (default) means that no Help topic is provided for the control. +To use the Help, insert in the uses clause of your application the Vcl.HtmlHelpViewer or another unit that provides an interface to the external Help viewer to use. For C++, you need to include the HTMLHelpViewer.hpp header file. + + + Specifies the margins of the control. +Use the Margins property to set the margins of the control. +If AlignWithMargins is true, then the Margins property of the control governs the spacing relative to other controls that are aligned with this one. The controls are not allowed to be closer than the spacing specified in Margins. + +Note: The Margins you set for the control have effect only when AlignWithMargins is set to true and Align is not set to alNone. + + + CustomHint is a custom hint for the control. +CustomHint is a TCustomHint instance for a control to specify the appearance of the control's hint. + + + Specifies where a control looks for its custom hint. +To have a control use the same hint customization information as its parent control, set ParentCustomHint to true. +If ParentCustomHint is false, the control uses its own CustomHint property. +Set ParentCustomHint to true for all controls to ensure that all the controls on a form display their hint messages alike. +When the value of a control's CustomHint property changes, ParentCustomHint becomes false automatically. + + + + + TWinControl is the base class for all controls that are wrappers for Microsoft Windows screen objects. +TWinControl provides the common functionality for all controls that act as wrappers for Microsoft Windows screen objects ("windows"). Controls that are wrap underlying windows have the following features: + +The control can incorporate the functionality of an underlying window. For example, if the underlying screen object is a text editor, the control can incorporate the editor ability to manage and display a text buffer. +The control can receive user input focus. The focused control can handle keyboard input events. Some controls change their appearance when they have the focus. For example, button controls typically indicate the focus by drawing a rectangle around the caption. +The control can serve as a container for other controls, referred to as child controls. This relationship is signified by the child's Parent property. Container controls provide important services to their children, including display services for controls that do not implement their own canvases. Examples of container controls include forms, panels, and toolbars. +Controls based on TWinControl can display standard screen objects provided by Microsoft Windows, or customized screen objects developed by the VCL programmer. +Descendants of TWinControl include abstract base classes that support most kinds of user interface objects. The most significant descendant is TCustomControl, which provides code to implement a canvas and handle paint messages. Other important abstract descendants include TScrollingWinControl, TButtonControl, TCustomComboBox, TCustomEdit, and TCustomListBox. When defining new control classes, consider these descendants before deriving directly from TWinControl. +Every TWinControl object has a Handle property which provides the window handle for the underlying Microsoft Windows screen object. Use the Handle property to bypass the VCL API and directly access the underlying window. + + + Internal list of pending Asynchronous method calls for this Win control and child TControl instances. + + + Processes pending asynchronous method calls listed in FAsyncList. +The Handle of the control calls InvokeAsyncCalls as a result of a specific message that the Handle retrieves. + +Note: InvokeAsyncCalls synchronizes the access to FAsyncList. It prohibits other threads from accessing it until the calling one calls Exit. + + + Called when the StyleElements property changes. +Vcl.Controls.TWinControl.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + Schedules asynch method calls. +Vcl.Controls.TWinControl.AsyncSchedule inherits from System.Classes.TComponent.AsyncSchedule. All content below this line refers to System.Classes.TComponent.AsyncSchedule. +Schedules asynch method calls. +By default, AsyncSchedule uses Queue in order to queue the asynch method call with the main thread. +Override AsyncSchedule in descendant components in order to modify the management of the asynchronous scheduling. + + See Also +System.Classes.TComponent.BeginInvoke +System.Classes.TBaseAsyncResult +System.Classes.TBaseAsyncResult.Schedule + + + Updates the control to reflect changes in its associated action. +ActionChange is called automatically when the associated action changes. It updates the control to reflect the action's current Caption, Enabled, Hint, Visible, and HelpContext properties and its OnClick event handler. +The Sender parameter is the associated action. The CheckDefaults parameter specifies whether properties and event handlers should be changed if they differ from the default values. When CheckDefaults is true, properties and event handlers are only changed when the current values are the default values (that is, when the values have not been previously changed). When CheckDefaults is false, properties and event handlers are changed, regardless of their current values. + + + Sets control's window style according to its bi-directional support. +The CreateParams method calls AddBiDiModeExStyle to update the control's style flags (passed as the ExStyle parameter) according the control's bi-directional support. AddBiDiModeExStyle uses the UseRightToLeftReading, UseRightToLeftScrollBar, UseRightToLeftAlignment, and GetControlsAlignment methods to determine the current bi-directional support. + + + Copies the properties of the windowed control to another object. +Do not call the protected AssignTo method. Instead, applications call the Assign method to copy the properties of another object. If the object's Assign method does not include the ability to copy from the source object, the Assign method calls the source object's protected AssignTo method, to copy the source objects properties to the object specified by the Dest parameter. This allows objects to expand the abilities of another object's Assign method to copy from additional sources. +The AssignTo method implemented in TWinControl copies the Caption, Enabled, Hint, Visible, and HelpContext properties and the OnClick event handler to a TCustomAction object. + + + Provides the interface that adjusts the ClientRect property for idiosyncrasies of the window. +AdjustClientRect is called internally when the control needs accurate information on where to place child controls within the client area. As implemented in TWinControl, AdjustClientRect does nothing. Override this method in descendants such as TTabControl where the ClientRect property is not the same as the region in which child objects can appear. + + + Adjusts the control's size according to its contents and constraints. +If the AutoSize property is true, AdjustSize is called automatically when the control needs to automatically resize itself to its contents. As implemented in TWinControl, AdjustSize calls SetBounds with the values of its Left, Top, Width, and Height properties. This call can result in a change of size if these values are altered in the control's OnCanResize or OnConstrainedResize event handlers, or if the control's OnResize event handler makes any final adjustments. +Descendant classes override AdjustSize to change the size of the control to adjust to its contents. +Component writers may call AdjustSize when making changes to a control's contents. + + + Aligns any controls for which the control is the parent within a specified area of the control. +Use AlignControls to align all controls within an area of a form, panel, group box, scroll box, or any container control. Specify the area in which to align the controls as the value of the Rect parameter. +AlignControls uses the Align property value for each child control to determine how to align it. The AControl parameter can be nil (Delphi) or NULL (C++). If you specify a control in AControl, that control takes precedence in alignment over other, similarly-aligned controls. + + + Aligns the given control with the specified alignment options. +ArrangeControl is a protected method used internally by AlignControls to align each control, with the specified alignment options. +To be more specific, ArrangeControl aligns the control given by AControl, with the alignment options specified through the parameters ParentSize, AAlign, AAlignInfo, Rect, and UpdateAnchorOrigin. The meaning of these parameters is summarized in the following table. + + + + + +Parameter + +Meaning + + + +ParentSize + + + +The size of the parent control within which AControl is aligned. + + + + +AAlign + + + +Determines how AControl aligns within its parent control. + + + + +AAlignInfo + + + +Describes the alignment details of AControl within its parent. + + + + +Rect + + + +The rectangular area inside the parent control in which to align AControl. + + + + +UpdateAnchorOrigin + + + +Specifies whether to update the anchor origin of AControl, following the alignment. + + + Indicates how the control can be resized. +CanAutoSize is called automatically when the AutoSize property is true and an attempt is made to resize the control. It allows controls to implement the AutoSize property before the resize sequence that begins with the OnCanResize and OnConstrainedResize events and ends with the OnResize event. +When CanAutoSize is called, the NewWidth and NewHeight parameters indicate the proposed new dimensions of the control. CanAutoSize adjusts these values so that the control's size adjusts to its contents. If the adjustment results in values of NewWidth and NewHeight that differ from the control's current width and height, CanAutoSize returns true, indicating that the resize sequence should proceed. If, after adjustment, NewWidth and NewHeight equal Width and Height, CanAutoSize returns false, and the resize sequence is aborted. +As implemented in TWinControl, CanAutoSize returns true, adjusting NewWidth and NewHeight so that all the control's children fit. + + + Indicates how the control can respond to a resize attempt. +CanResize is called automatically when an attempt is made to resize the control. The NewWidth and NewHeight parameters specify the attempted new values for the control's height and width. CanResize returns true if the control can be resized to the returned values of NewWidth and NewHeight. CanResize returns false if the control can't be resized. +CanResize generates an OnCanResize event. An OnCanResize event handler may change the values of NewHeight and NewWidth. + + + Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Generates an OnConstrainedResize event. +ConstrainedResize is called automatically as part of a control's resize sequence. It generates an OnConstrainedResize event, passing in the MinWidth, MinHeight, MaxWidth, and MaxHeight parameters, which can be altered by the event handler before they are applied to the attempted resize. + + + ControlsAligned automatically executes after a call to AlignControls. +Implement ControlsAligned in descendant classes to display a notification, after aligning the controls by a call to AlignControls. + +Note: As a member of the TWinControl class, ControlsAligned has no effect. + + + Creates the dock manager for the control. +CreateDockManager is called automatically during drag-and-dock operations when the UseDockManager property is true. CreateDockManager creates the object that implements the DockManager property. +Override CreateDockManager to create a custom dock manager for the control. + + + Creates underlying screen object. +CreateHandle creates the Microsoft Windows screen object that underlies the control. if it does not already exist. The new window handle becomes the value of the Handle property. +CreateHandle creates or locates the parent control's window before it creates a window for the control itself. + +Note: If the Parent property is nil (Delphi) or NULL (C++), CreateHandle raises an exception. + + + Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + Creates a Windows control to represent the control. +The CreateWnd method calls CreateWindowHandle to create the window for a control. CreateWindowHandle creates the window by calling the CreateWindowEx API function, passing parameters from the record passed in the Params parameter. Once the window is created, its handle is available as the Handle property. + + + Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + Returns placement order of custom-aligned child control. +CustomAlignInsertBefore determines the order in which custom-aligned child controls are placed. The control calls CustomAlignInsertBefore once for each pair of child controls with an Align property of alCustom. CustomAlignInsertBefore returns true if C2 should be presented before C1, and false otherwise. +Once the custom-aligned child controls are sorted, their specific positions are determined by calls to CustomAlignPosition. +CustomAlignInsertBefore triggers the OnAlignInsertBefore event. If this event is defined, CustomAlignInsertBefore returns the value returned by OnAlignInsertBefore. Defining this event allows users to define the order of control alignment without overriding CustomAlignInsertBefore. +As implemented in TWinControl, CustomAlignInsertBefore returns false if OnAlignInsertBefore is not implemented, so the controls are placed in the order they appear in the Controls property. + + + Returns aligned position of custom-aligned child control. +CustomAlignPosition determines the specific position of custom-aligned child controls. CustomAlignPosition is called once for each child control with an Align property of alCustom, in an order previously determined by calls to CustomAlignInsertBefore. +CustomAlignPosition triggers the OnAlignPosition event. If this event is defined, CustomAlignPosition uses the alignment parameters it obtains from OnAlignPosition. Defining this event allows users to set the alignment parameters without overriding CustomAlignPosition. +These are the parameters: + + + + + +Control + +The child control being placed. + + + +NewLeft | NewTop | NewWidth | NewHeight + + + +Location and size of child control, as determined by container's size and the Anchors TControl_Anchors constraints for the control. CustomAlignPosition can modify these values to reposition the control. + + + + +AlignRect + + + +The client area in which the control is aligned. CustomAlignPosition can modify this value. + + + + +AlignInfo + + + +Alignment information in a TAlignInfo. + + + + +As implemented in TWinControl, CustomAlignPosition does nothing. + + + Provides methods to read and write the IsControl property to a stream such as a form file. +Vcl.Controls.TWinControl.DefineProperties inherits from Vcl.Controls.TControl.DefineProperties. All content below this line refers to Vcl.Controls.TControl.DefineProperties. +Provides methods to read and write the IsControl property to a stream such as a form file. +DefineProperties is called automatically by the streaming system that loads and saves VCL components. It allows persistent objects to read and write properties that are not published. Published properties are loaded and stored automatically. +DefineProperties uses the methods of the filer passed as the Filer parameter to assign methods that can load and save the IsControl property. +Override DefineProperties to persist unpublished properties. Call the DefineBinaryProperty or DefineProperty method of the Filer parameter to assign methods that load or save property values. + +Note: When overriding this method, call the parent class's DefineProperties method first. + + + Destroys the control's window without destroying the control. +Call DestroyHandle to dispose of the window, but leave the control intact. The control can later recreate the window if needed. DestroyHandle is the converse operation to CreateHandle. Applications should call the high-level CreateHandle and DestroyHandle methods, rather than the lower-level methods of CreateWnd and DestroyWnd, whenever possible. +If the control has TWinControl objects as child controls, DestroyHandle calls each of their DestroyHandle methods before calling DestroyWnd to destroy its own handle. + + + Destroys the window created in the CreateWindowHandle method. +Call DestroyWindowHandle to dispose of the window for the control. +TWinControl's Destroy method calls DestroyWindowHandle to destroy any window associated with a windowed control before destroying the object. The DestroyWnd method also calls DestroyWindowHandle. + + + Destroys the control's window. +DestroyWnd is called when the control needs to replace its window. For example, changing properties that are implemented by window parameter settings require the control to be destroyed and then recreated using the CreateWnd method. +Before the window is destroyed, DestroyWnd saves a copy of the control's text in memory, frees any device contexts, and finally calls DestroyWindowHandle. When the window is recreated, the stored copy of the control's text is assigned to the new window. + + + Performs actions when a control is docked to the windowed control. +DoAddDockClient is called automatically when a client control is docked to the windowed control. As implemented in TWinControl, DoAddDockClient sets the client's Parent property to the control. +Client is the control that has been docked. +ARect describes the boundaries of the region where Client has been docked. +Override DoAddDockClient to perform actions when a control is docked to the windowed control. + +Note: DoAddDockClient is called in response to a message sent by the DockDrop method, before the OnDockDrop event. + + + Responds when a docking client is dragged over the windowed control. +DockOver is called automatically for dock sites when a dockable object is dragged over them. As implemented in TWinControl, DockOver positions the docking rectangle and then calls DoDockOver to generate an OnDockOver event. +Override DockOver to perform additional actions when another control is dragged over the control. +DockOver is called only if DockSite is true. + + + Invalidates the first dock site in the list of child controls. +Currently, DockReplaceDockClient always returns False and has no effect as a member of the TWinControl class. +Implement DockReplaceDockClient in descendant classes in order to manually replace Client with ReplacementClient. Also, manually dock Client to NewDockSite on the control specified by DropControl and using the alignment options given in ControlSide. + + + Generates an OnDockOver event. +DoDockOver is called by the DockOver method to generate an OnDockOver event when the user drags a dockable control over the windowed control. Override this method to perform some other action or to suppress the event. + + + Respond to receiving input focus. +DoEnter is called automatically when the control receives the input focus. As implemented in TWinControl, DoEnter calls the OnEnter event handler, if defined. +Descendant classes that override DoEnter should always call the inherited method. + + + Responds to losing input focus. +DoExit is called automatically when the control loses the input focus. As implemented in TWinControl, DoExit calls the OnExit event handler, if defined. +Descendant classes that override DoExit should always call the inherited method. + + + Flips the control's children. +The FlipChildren method calls DoFlipChildren to reverse the positions of child controls. DoFlipChildren moves the control's children to opposite positions on the control; that is, children on the left side of the control are moved to the right side of the control and vice versa. +Override FlipChildren to control how the control's children are flipped. + +Note: DoFlipChildren is a protected helper method for the public FlipChildren method. Unlike FlipChildren, DoFlipChildren does not adjust the alignment of controls that are aligned to one of the edges of the windowed control. + + + Embarcadero Technologies does not currently have any additional information. + + + Performs some preprocessing before generating an OnKeyDown event. +The return value from DoKeyDown determines if the control should continue processing key-down messages passed in the Message parameter. A return value of true indicates that the key-down occurrence has been handled completely, and no further processing is needed. A return value of false indicates that the application should continue passing the key-down message through the inherited processing. +DoKeyDown checks whether the KeyPreview property of the parent form is true; if so, it allows the form to preemptively process key-down messages before they are handled by the windowed control. If the form does not handle the message, DoKeyDown translates the message parameters into the appropriate types and calls KeyDown, which in turn calls the OnKeyDown event handler, if any. + + + Performs some preprocessing before generating an OnKeyPress event. +The return value from DoKeyPress determines whether the control should continue processing the key-press message passed in the Message parameter. A return value of true indicates that the key-press occurrence has been handled completely, and no further processing is needed. A return value of false indicates that the application should continue passing the key-press message through the inherited processing. +DoKeyPress checks whether the KeyPreview property of the parent form is true, and if so, allows the form to preemptively process key-press messages before they are handled by the windowed control. If the form does not handle the message, DoKeyPress translates the message parameters into the appropriate types and calls KeyPress, which in turn calls the OnKeyPress event handler, if any. + + + Performs some preprocessing before generating an OnKeyUp event. +The return value from DoKeyUp determines whether the control should continue processing the key-up message passed in the Message parameter. A return value of true indicates that the key-up occurrence has been handled completely, and no further processing is needed. A return value of false indicates that the application should continue passing the key-up message through the inherited processing. +DoKeyUp checks whether the KeyPreview property of the parent form is true, and if so, allows the form to preemptively process key-up messages before they are handled by the windowed control. If the form does not handle the message, DoKeyUp translates the message parameters into the appropriate types and calls KeyUp, which in turn calls the OnKeyUp event handler, if any. + + + Embarcadero Technologies does not currently have any additional information. + + + Responds when a control is undocked from the windowed control. +DoRemoveDockClient is called automatically when a client control is undocked from the windowed control. As implemented in TWinControl, DoRemoveDockClient does nothing. +Client is the control that has been undocked. +Override DoRemoveDockClient to perform any necessary adjustments when a control is undocked from the windowed control. + +Note: DoRemoveDockClient occurs at the end of the undocking process. To make changes when undocking starts, override the DoUnDock method instead. + + + Undocks a control that is currently docked to the windowed control. +DoUnDock is called automatically when a control is undocked from the windowed control. It handles all necessary changes to the windowed control to accomplish the undocking. These are +1.Generates an OnUnDock event. +2.If there is no OnUnDock event handler, or if the event handler indicates that the client can be undocked, it removes the client from the DockClients property list. +The NewTarget parameter indicates the new host to which the undocked control is moving. +The Client parameter indicates the control to be undocked from the windowed control. +DoUnDock returns true if the client is successfully undocked, false if the undocking attempt was blocked by an OnUnDock event handler. +Override DoUnDock to change the way controls are undocked from the windowed control. + +Note: DoUnDock occurs at the start of the undocking process. To handle changes when undocking is complete, override the DoRemoveDockClient method instead. + + + Returns the control's next child in the tab order after the specified control. +Call FindNextControl to find the next child control in the tab order after CurControl. If CurControl is not a child of the control, FindNextControl returns the first child control in the tab order. +The GoForward parameter controls the direction of the search. If GoForward is true, FindNextControl searches forward through the child controls in tab order. If Go Forward is false, FindNextControl searches backward through the controls. +The CheckTabStop and CheckParent parameters control whether FindNextControl performs certain checks on the controls it finds. If CheckTabStop is true, the returned control must have its TabStop property set to true. If CheckParent is true, the returned control's Parent property must indicate the parent control. +FindNextControl calls the GetTabOrderList method to build its list of possible "next" controls. + + + Sorts the child controls by their tab order. +Applications should not call FixupTabList directly. The ReadState method calls FixupTabList to initialize the tab order list based on the TabOrder properties of the child controls being read from a stream. + + + Returns the associated action link class. +GetActionLinkClass returns the appropriate class type for the action link used with a control. This class is used internally to create an action link object for the control when it has an associated action. The action link links the action to the control client. Each Action link class is designed to link specific properties and event handlers of the action to its client, based on the types of properties the client supports. +As implemented in TWinControl, GetActionLinkClass returns the TWinControlActionLink class type, which associates the HelpContext, ShowHint, Caption, Enabled and Visible properties and the OnClick event handler. Descendants of TWinControl override this method to specify a descendant of TControlActionLink that handles their configuration of properties and events. + + + Returns the value of the ClientOrigin property. +GetClientOrigin is the protected implementation of the ClientOrigin property. +GetClientOrigin returns a point indicating the position of the top-left corner of the control in screen coordinates. + + + Returns the value of the ClientRect property. +GetClientRect is the protected implementation of the ClientRect property. GetClientRect returns a rectangle with the rectangle's Top and Left fields set to zero, and its Bottom and Right fields set to the control's ClientHeight and ClientWidth, respectively. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the smallest rectangle in which all the control's children fit. +Call GetControlExtents to determine the smallest rectangle in which all the control's children fit. Windowed controls call GetControlExtents when implementing the AutoSize property. + + + Provides access to a device context for the control. +Call GetDeviceContext to obtain a handle to a device context for the control. +GetDeviceContext calls the Windows API function GetDC, passing the windowed control's Handle property. It returns the window's handle in the WindowHandle parameter and the HDC as the return value. If the call is unsuccessful, the EOutOfResources exception is raised. + + + Returns the window handle for the window of the control's parent. +Use the handle returned by GetParentHandle as a parameter to Windows API function calls that need the window handle for the parent window of the control. If the Parent property is not nil (Delphi) or NULL (C++), GetParentHandle returns the Handle property of the parent control. If the Parent property is nil (Delphi) or NULL (C++), GetParentHandle returns the value of ParentWindow. + + + Generates an OnGetSiteInfo event. +GetSiteInfo is called automatically during drag-and-dock operations to initialize a TDragDockObject with information about where a dragged object can be docked, if at all. +Client is a potential docking client. +InfluenceRect returns the area in which the client would be docked. +MousePos is the current mouse position. +CanDock returns whether the client can dock to the windowed control. +As implemented in TWinControl, GetSiteInfo generates an influence rectangle equal to BoundsRect expanded by 10 pixels on every side, and then calls the OnGetSiteInfo event handler. + + + Returns the window handle of the first window not associated with a VCL control that contains the windowed control. +Use GetTopParentHandle to access the handle of the window that is hosting the windowed control. GetTopParentHandle walks up the containers of the windowed control until it finds a control whose Parent property is nil (Delphi) or NULL (C++). If that topmost parent is contained in a non-VCL window (its ParentWindow is nonzero), GetTopParentHandle returns the non-VCL window. If the windowed control is not contained in a non-VCL window, GetTopParentHandle returns the windowed control's own window handle. + + + Invalidates the first dock site that appears in the list of child controls. +Call InvalidateDockHostSite to invalidate the first dock site that appears in the list of child controls. + + + Indicates whether a specified mouse message is directed to one of the windowed control's child controls. +Call IsControlMouseMsg to find out if a mouse message is directed to one of the control's child controls. Specify the mouse message as the value of the Message parameter. +Windows takes care of sending messages to windowed child controls, but for nonwindowed child controls, Windows sends the messages to the parent control, which must then determine which, if any, of its child controls should receive the message. +The WndProc method of a windowed control calls IsControlMouseMsg to process all mouse message sent to the windowed control. + + + Indicates whether a specified mouse activation message is directed to the given child control. +Call IsControlActivateMsg to find out whether a mouse activation message is directed to the child control given by the Control parameter. Specify the mouse activation message as the value of the Message parameter. +The WndProc method of a windowed control calls IsControlActivateMsg to process all mouse activation messages sent to the windowed control. + + + Checks whether the control is docked inside another control or has at least two docked controls. +IsQualifyingSite is a protected method that returns true if either the given Client control is docked inside another control, or there are at least two controls docked inside Client. + + + Responds to key press events. +When a windowed control receives a key-down message (WM_KEYDOWN) from Windows, its message handler calls the DoKeyDown method. If DoKeyDown determines that the control should, in fact, process the character, it calls KeyDown, passing the key code and shift-key state in the Key and Shift parameters, respectively. +KeyDown calls any event handler attached to the OnKeyDown event. Override KeyDown to provide other responses in addition to the event handler call. +The Key parameter is the key on the keyboard. For nonalphanumeric keys, you must use WinAPI virtual key codes to determine the key pressed. For more information see Representing Keys and Shortcuts. +The Shift parameter indicates whether the SHIFT, ALT, or CTRL keys are combined with the keystroke. +Either KeyDown or the OnKeyDown event handler it calls can suppress further processing of a key by setting the Key parameter to zero. + + + Respond to released key. +When a windowed control receives a key-up message (WM_KEYUP) from Windows, its message handler calls the DoKeyUp method. If DoKeyUp determines that the control should, in fact, process the character, it calls KeyUp, passing the key code and shift-key state to KeyUp in the Key and Shift parameters, respectively. +KeyUp calls any event handler attached to the OnKeyUp event. Override KeyUp to provide other responses in addition to the event-handler call. +Either KeyUp or the OnKeyUp event handler it calls can suppress further processing of a key by setting the Key parameter to zero. +The Key parameter is the key on the keyboard. For non-alphanumeric keys, use WinAPI virtual key codes to determine the key pressed. For more information, see Representing Keys and Shortcuts. +The Shift parameter indicates whether the Shift, Alt, or Ctrl keys are combined with the keystroke. + + + Responds to keyboard input. +When a windowed control receives a key-press message (WM_CHAR) from Windows, its message handler calls the DoKeyPress method. If DoKeyPress determines that the control should, in fact, process the character, it calls KeyPress, passing the key code in the Key parameter. +KeyPress calls any event handler attached to the OnKeyPress event. Override KeyPress to provide other responses in addition to the event handler call. +Either KeyPress or the OnKeyPress event handler it calls can suppress further processing of a character by setting the Key parameter to zero. + +Note: The Key parameter is the character represented by the key that is pressed, not a Windows virtual key code. + + + Receives Windows messages for the control. +MainWndProc is the window procedure for the control that is associated with the control's window when it is created. When Windows sends a message to the control's window, MainWndProc receives it. +MainWndProc does not process or dispatch the messages itself, but rather calls the method specified by WindowProc to do that. MainWndProc provides an exception-handling block around WindowProc, ensuring that if any unhandled exceptions occur during the processing of a message, the application's HandleException method will handle them. + + + Responds to notifications indicating that components are being created or destroyed. +Vcl.Controls.TWinControl.Notification inherits from Vcl.Controls.TControl.Notification. All content below this line refers to Vcl.Controls.TControl.Notification. +Responds to notifications indicating that components are being created or destroyed. +Notification allows TControl to update its internal state if an associated component is removed. The internal state is updated if: + +The associated pop-up menu is destroyed. +The control docking site is destroyed. +The custom hint associated with the control is destroyed. +The associated gesture manager is destroyed. +Override the Notification method to respond to notifications indicating that other components are about to be destroyed or have just been created. Use the Notification method to update controls that rely on other objects. Data-aware objects override the Notification method to update themselves when their data source is removed. Some objects respond to notifications indicating that other objects of a specific type are being created. For example, the session component sets the Session property of new data-aware controls to itself when the AutoSessionName property is True. +By default, components pass along the notification to their owned components, if any. + + + Sends a message to all the child controls. +NotifyControls sends a message with the message ID passed in the Msg parameter to all the controls in the windowed control's Controls array property. NotifyControls is used to update all the controls in a form of such occurrences as changes in the parent color or font. +NotifyControls constructs a generic message record, filling its message ID field with the value of Msg and setting its parameter and result fields to zeros, then calls the Broadcast method to send the message to all the child controls. + + + Paints each of the child controls in a windowed control using the specified device context. +Call PaintControls to paint all the child controls of this control. Pass the device context as the value of the DC parameter. The First parameter indicates the starting point in the windowed control's child-control list to paint. If First is nil (Delphi) or NULL (C++) or does not indicate one of the child controls, PaintControls paints all the child controls. +The Repaint method calls PaintControls for the control's parent, passing the control in First to repaint the control and any controls it might intersect. PaintHandler also calls PaintControls after calling PaintWindow. + + + Responds to WM_PAINT messages. +PaintHandler is called automatically when the control receives a WM_PAINT message. It calls the BeginPaint and EndPaint API functions, and between them paints the control's background by calling PaintWindow and any child controls by calling PaintControls. + + + Renders the image of a windowed control. +Call PaintWindow to repaint the control. PaintWindow sends a WM_PAINT message to the windowed control's DefaultHandler method, setting the message record's WParam field to the value passed in DC and the other parameter and result fields to zeros. + + + Responds to changes in the system's palette by realizing the control's palette and the palette for each child control. +PaletteChanged is called automatically when the Windows system palette changes. TWinControl responds to these notifications by trying to realize the windowed control's palette, if any, into the current device context, and then passing on the PaletteChanged notification to each of the child controls in turn. If the change in the system palette causes the actual value of the control's palette to change, PaletteChanged will invalidate the control so that it can repaint with the new palette. +Windows paints the active window with a foreground palette, while other windows are forced to use background palettes. Background palettes are approximate matches to the colors specified by the control's logical palette, given the limitations imposed by implementing the foreground palette. Windows only allows a single foreground palette. +PaletteChanged allows the control to obtain a new realization of its palette when the system palette changes. When Foreground is true, the form has been activated and the control is specifying the new foreground palette. When Foreground is false, another application or form has changed the foreground palette, and controls that are sensitive to the available palette should realize new background palettes to best match their logical palettes. +If the control does not have a logical palette to be realized into the current device context, GetPalette will return a handle of 0, and PaletteChanged will not try to realize a palette for the windowed control. Instead, it simply passes the notification on to the child controls. If the windowed control or any of its child controls realize a palette into the current device context in response to PaletteChanged, this method returns true. +Override PaletteChanged to change the way in which controls are given an opportunity to realize a new palette when the Windows system palette changes. For example, override PaletteChanged to change the order in which child controls realize their palettes, giving a particular control the foreground palette when the form is activated, or to pass palette change notification to custom controls implemented outside of the VCL, such as in DLLs. +Override GetPalette instead to affect whether the windowed control actually has a palette to realize, or to change the value of the control's logical palette. + +Note: PaletteChanged is called only when the run-time video mode requires palette support, such as for 256 color mode, but not 16 million color mode. + + + Prepares the control for having its properties assigned values from a stream. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Be sure to include a call to the inherited method when overriding ReadState. +As implemented in TWinControl, ReadState disables control alignment until all the child controls have been read from the stream, calls the inherited ReadState method, and re-enables the alignment of all the controls. The method then builds the tab order list of controls and synchronizes its visibility with that of its parent control. + + + Recreate underlying Windows screen object. +Call RecreateWnd to recreate the control from scratch. RecreateWnd destroys the underlying Windows screen object. The next time the Handle property is referenced (when the object is repainted, for example), a new Windows screen object is created. Some changes in control properties are not implemented until this re-creation occurs. + + + Reloads a docked control. +Use ReloadDockedControl to obtain a reference to control given its name. The AControlName parameter is the name of the child control. The corresponding control is returned as the AControl parameter. ReloadDockedControl can only locate a control if it has the same Owner as the windowed control. +The dock manager calls ReloadDockedControl to obtain a control reference that it then docks to the windowed control. + + + Restores the input method editor (IME) that was active when the application started. +For controls that specify the ImeName property, call ResetIme to revert to the IME that was active when the application started. If the IME was deactivated by setting the ImeMode property to imDisable, ResetIme restarts the default IME. +Applications cannot call ResetIme. ResetIme is called automatically when the control loses input focus. It is exposed as a protected method so descendant objects can restore the default IME at other times. + + + Restores the input method editor (IME) that was active when the application started. +For controls that specify the ImeName property, call ResetIme to revert to the IME that was active when the application started. If the IME was deactivated by setting the ImeMode property to imDisable, ResetIme restarts the default IME. +Applications cannot call ResetIme. ResetIme is called automatically when the control loses input focus. It is exposed as a protected method so descendant objects can restore the default IME at other times. + + + Directs the composition window of the input method editor (IME) to perform a specific action. +Call ResetImeComposition to direct what the composition window does with the input typed by the user. The composition window is the window displayed by the IME that provides feedback to the user about what keystrokes have been typed, and how they are converted into asian characters. +The Action parameter indicates what the composition window should do with its current contents. Action can have one of the following values: + + + + + +Value + +Meaning + + + +CPS_CANCEL + + + +Clear the composition string and set the status to no composition string. + + + + +CPS_COMPLETE + + + +Set the composition string as the result string. + + + + +CPS_CONVERT + + + +Convert the composition string. + + + + +CPS_REVERT + + + +Cancel the current composition string and revert to the unconverted string. + + + + +ResetImeComposition returns true if the composition window performs the requested action. + + + Instructs the parent of a control to reposition the control, enforcing its Align property. +Vcl.Controls.TWinControl.RequestAlign inherits from Vcl.Controls.TControl.RequestAlign. All content below this line refers to Vcl.Controls.TControl.RequestAlign. +Instructs the parent of a control to reposition the control, enforcing its Align property. +Controls call RequestAlign internally when changes are made to the size or position of the control, so that they remain properly aligned within the parent control. Do not call RequestAlign in application code. + + + Scales all the contained controls to the NewPPI value. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Rescale child controls only. +Call ScaleControls to rescale only the children of the control, while leaving the control itself the same size. The parameters have the same meaning as in the ScaleBy method. + + + Scales the control padding to the given ratio. +Call ScalePadding to scale the padding coordinates of the control to the given M/D ratio. + + + Locates first selectable child control. +Call SelectFirst to find the first child that can be selected within the control's tab order. SelectFirst calls the FindNextControl method, passing nil (Delphi) or NULL (C++) as the current control. Once the first selectable control is found, SelectFirst makes the control the active control on the form. + + + Moves the input focus from the current child control to the next one in the tab order. +Call SelectNext to move the child control focus. SelectNext selects the first child that follows or precedes CurControl in the tab order and that meets the criteria specified in the other parameters. +The GoForward parameter controls the direction of the search. If GoForward is true, FindNextControl searches forward through the child controls in tab order. If GoForward is false, SelectNext searches backward through the controls. The search wraps past the end of the collection back to CurControl. +The CheckTabStop parameter controls whether the control SelectNext finds must be a tab stop. If CheckTabStop is true, the returned control must have its TabStop property set to true, or the search for the next control continues. +If a child control matches the search criteria, that control obtains the focus. If no such child control is found, the focus remains unchanged. + + + Changes the order in which the child component appears in the list of child components returned by the GetChildren method. +Use SetChildOrder when you want to change the order in which child objects are streamed in. Specify the child component whose order you want to change as the value of the Child parameter. Indicate the position you want the component to be in as the value of the Order parameter. +When SetChildOrder is called, items previously below the child's old position move up, and those below the new position move down. + + + Activates an input method editor (IME) using the values specified by the ImeMode and ImeName properties. +Applications cannot call SetIme. SetIme is called automatically when the control receives input focus. It is exposed as a protected method so that descendant objects can cause the ImeMode and ImeName properties to take effect at other times. + + + Activates an input method editor (IME) using the values specified by the ImeMode and ImeName properties. +Applications cannot call SetIme. SetIme is called automatically when the control receives input focus. It is exposed as a protected method so that descendant objects can cause the ImeMode and ImeName properties to take effect at other times. + + + Sets the position and font of the composition window. +Call SetImeComposition to change the position or font of the composition window. The composition window is the window displayed by the input method editor (IME) that provides feedback to the user about what keystrokes have been typed, and how they are converted into asian characters. +The Font parameter describes the font that the composition window should use. Setting the Font parameter to nil (Delphi) or NULL (C++) repositions the composition window without changing the font. XPos and YPos specify the desired global coordinates for the composition window. +SetImeCompositionWindow returns true if the font and position are successfully assigned. + + + Sets the parent of the control. +Vcl.Controls.TWinControl.SetParent inherits from Vcl.Controls.TControl.SetParent. All content below this line refers to Vcl.Controls.TControl.SetParent. +Sets the parent of the control. +SetParent is the protected implementation of the Parent property. Override SetParent to execute additional code when the value of the Parent property changes. +The AParent parameter specifies the new parent of the control. +If the control already has a parent, SetParent removes the control from that parent's list of controls by calling the parent's RemoveControl method. If AParent is not nil (Delphi) or NULL (C++), SetParent calls its InsertControl method to add the control to its list of controls. +The TControl destructor calls SetParent(nil (Delphi) or NULL (C++)) to remove the control from its parent's control list before destroying the component. + + + Sets the ParentBackground property. +SetParentBackground is a protected method that sets the value of ParentBackground. + + + Sets the ParentBackground property. +SetParentDoubleBuffered is a protected method that sets the value of ParentDoubleBuffered. + + + Moves the control to the top or bottom of the parent control's (or screen's) list of TWinControl controls. +Use SetZOrder to rearrange overlapping controls within a parent control or (if the control has no parent) overlapping windows on the screen. If the TopMost parameter is true, the control becomes the top control; otherwise, it becomes the bottom control. +TWinControl controls always stack on top of other controls, regardless of the Z order. +After changing the order, SetZOrder invalidates the control to ensure repainting to reflect the new order. + + + Ensures that a specified child control is visible. +Call ShowControl to display a child control. Specify the control you want to ensure will be visible as the value of the AControl parameter. +As implemented in TWinControl, ShowControl simply calls the ShowControl method of the control's parent. Derived objects override ShowControl to perform whatever actions are necessary to allow the indicated child object to be visible. Possible actions include scrolling the particular child object into view, or changing to the appropriate notebook page. + + + Updates the bounds of the control. +UpdateBounds is a protected method that updates the bounds of the control. + + + Updates the original size of the parent control. +UpdateControlOriginalParentSize is a protected method that updates the original size of the parent control. It is used internally to update the anchor rules of the control. + + + Toggles the csRecreating flag in the ControlState property. +Switches on or off the csRecreating flag in the ControlState property, if the Recreating parameter is True or False, correspondingly. +If the control has any children, then the UpdateRecreatingFlag method is applied to all the children, using the same Recreating parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Updates form User Interface State as needed +UpdateUIState is called in component code to ensure that the User Interface State is consistently updated. User Interface State determinates whether keyboard accelerators and focus indicators are hidden or shown. A control should call UpdateUIState whenever it receives a keyboard event that might invalidate the User Interface State. CharCode is the virtual key code of the keyboard event. + + + Provides specific message responses for the control. +Override WndProc to change the initial Windows message handler for the control. The WindowProc property is initialized to point to the WndProc method. +WndProc for TWinControl overrides the inherited method to define responses for focus, mouse, and keyboard messages. It sends all others to its inherited WndProc. +When overriding WndProc to provide specialized responses to messages, call the inherited WndProc at the end to dispatch any unhandled messages. + + + Creates a windowed control derived from an existing Windows window class. +Call CreateSubClass in the CreateParams method of a subclassed control, after calling the inherited CreateParams. Specify the parameter record as the value of the Params parameter. CreateSubClass allows VCL controls to create registered Windows controls. + + + Removes the ControlAtom and WindowAtom properties of the control. +Call RemoveWindowProps to remove the ControlAtom and WindowAtom properties of the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies which edges of the control are beveled. +Use BevelEdges to get or set which edges of the control are beveled. The BevelInner, BevelOuter, and BevelKind properties determine the appearance of the specified edges. + + + Specifies the cut of the inner bevel. +Use BevelInner to specify whether the inner bevel has a raised, lowered, or flat look. +The inner bevel appears immediately inside the outer bevel. If there is no outer bevel (BevelOuter is bvNone), the inner bevel appears immediately inside the border. + + + Specifies the cut of the outer bevel. +Use BevelOuter to specify whether the outer bevel has a raised, lowered, or flat look. +The outer bevel appears immediately inside the border and outside the inner bevel. + + + Specifies the control's bevel style. +Use BevelKind to modify the appearance of a bevel. BevelKind influences how sharply the bevel stands out. +BevelKind, in combination with BevelWidth and the cut of the bevel specified by BevelInner or BevelOuter, can create a variety of effects. Experiment with various combinations to get the look you want. + + + Specifies the width of the inner and outer bevels. +Use BevelWidth to specify the width, in pixels, of the inner and outer bevels. + + + Specifies the width of the control's border. +Use BorderWidth to get or set the width of the control's border. Graphics or text drawn by the control is clipped to the area within the border. + + + Determines whether a control has a three-dimensional (3-D) or two-dimensional look. +Ctl3D is provided for backward compatibility. It is not used by 32-bit versions of Windows or NT4.0 and later, with the exception of Windows XP Home, where it is used on occasion. +On earlier platforms, Ctl3D controlled whether the control had a flat or beveled appearance. + + +Note RAD Studio no longer supports Windows Vista or earlier. + + + Determines the behavior of the input method editor (IME). +Set ImeMode to configure the way an IME processes user keystrokes. An IME is a front-end input processor for Asian language characters. The IME hooks all keyboard input, converts it to Asian characters in a conversion window, and sends the converted characters or strings on to the application. +ImeMode allows a control to influence the type of conversion performed by the IME so that it is appropriate for the input expected by the control. For example, a control that only accepts numeric input might specify an ImeMode of imClose, as no conversion is necessary for numeric input. + +Note: The value of ImeMode only takes effect when the control receives focus. To change the value of ImeMode when the control already has input focus, call the SetIme method. + + + Specifies the input method editor (IME) to use for converting keyboard input to Asian language characters. +Set ImeName to specify which IME to use for converting keystrokes. An IME is a front-end input processor for Asian language characters. The IME hooks all keyboard input, converts it to Asian characters in a conversion window, and sends the converted characters or strings on to the application. +ImeName must specify one of the IMEs that has been installed through the Windows control panel. The property inspector provides a drop-down list of all currently installed IMEs on the system. At runtime, applications can obtain a list of currently installed IMEs from the global Screen variable. +If ImeName specifies an unavailable IME, the IME that was active when the application started is used instead. No exception is generated. + +Note: The value of ImeName only takes effect when the control receives focus. To change the value of ImeName after the control has input focus, call the SetIme method. + + + Determines whether the control uses its parent's theme background. +If ParentBackground is True, the control uses the parent's theme background to draw its own background. +If ParentBackground is False, the control uses its own properties, such as Color, to draw its background. +ParentBackground has no effect unless XP themes are enabled. + + + Determines where a component looks to determine whether it should have a three-dimensional look. +ParentCtl3D is provided for backwards compatibility. It has no effect on 32-bit versions of Windows or NT 4.0 and later. +ParentCtl3D determines whether the control uses its parent's Ctl3D property. + + + TipMode indicates whether TabTip (onscreen keyboard equivalent) opens or closes when the control receives focus or if it receives a gesture. +For example, in controls derived from TButtonControl the default mode is tipClose, so TabTip is instructed to disappear when the control receives focus or a gesture. The default for controls derived from TCustomEdit is tipOpen. + +Note: The above applies only to devices that have touch screen support + + + Specifies the default window procedure for the windowed control. +Windowed controls use the Windows API function CallWindowProc with DefWndProc to invoke the standard Windows message handling for a window message. Using DefWndProc instead of the WndProc method bypasses any message processing introduced by the WndProc method. +DefWndProc fills the role for windowed controls that DefaultHandler fills for all objects. The DefaultHandler for TWinControl uses DefWndProc to pass messages to Windows for processing. +For windowed controls, DefWndProc is initially set to the window procedure of the window class specified in the Params parameter in the CreateParams method. Change DefWndProc to subclass the window class of a windowed control. + + + Provides access to a window handle for the control. +The WindowHandle property provides access to the same window handle as the Handle property, but WindowHandle is protected, and therefore only accessible to code inside the control. +The advantage to using WindowHandle is that it can be written to, while the Handle property is read-only. Use WindowHandle when implementing methods that need to change the value of the control's window handle. Unlike the Handle property, reading the value of WindowHandle doesn't automatically create a valid handle. Reading WindowHandle can return a zero value. + + + Occurs when an object with custom alignment is aligned. +OnAlignInsertBefore occurs for each pair of child controls with an Align property of alCustom. +It can determine the order in which custom-aligned child controls are placed. OnAlignInsertBefore returns true if C2 should be presented before C1, and false otherwise. It holds a TAlignInsertBeforeEvent type. +CustomAlignInsertBefore triggers the OnAlignInsertBefore event. If this event is defined, CustomAlignInsertBefore returns the value returned by OnAlignInsertBefore. Defining this event allows users to define the order of control alignment without overriding CustomAlignInsertBefore. + + + Occurs when an object with custom alignment is aligned. +OnAlignPosition occurs when child controls with an Align property of alCustom are aligned. +CustomAlignPosition triggers the OnAlignPosition event. If this event is defined, CustomAlignPosition uses the alignment parameters it obtains from OnAlignPosition. Defining this event allows users to set the alignment parameters without overriding CustomAlignPosition. It holds a TAlignPositionEvent type. +These are the parameters: + + + + + +Parameter + +Meaning + + + +NewLeft | NewTop | NewWidth | NewHeight + + + +Location and size of child control, as determined by container's size and the Anchors TControl_Anchors constraints for the control. OnAlignPosition can modify these values to reposition the control. + + + + +AlignRect + + + +The client area in which the control is aligned. OnAlignPosition can modify this value. + + + + +AlignInfo + + + +Alignment information in a TAlignInfo. + + + + +As implemented in TWinControl, OnAlignPosition does nothing. + + + Occurs when another control is docked to the control. +Write code in the OnDockDrop event to perform actions when another control is docked on the control. +OnDockDrop can only occur if DockSite is true. +OnDockDrop is an event handler of type Vcl.Controls.TDockDropEvent. + + + Occurs when another control is dragged over the control. +Write code in the OnDockOver event to indicate whether a dockable control that is dragged over the windowed control can be accepted as a dock client. OnDockOver occurs after the TDragDockObject has been initialized by an OnGetSiteInfo event. +OnDockOver occurs only if DockSite is true. + + + Occurs when a control receives the input focus. +Use the OnEnter event handler to cause any special processing to occur when a control becomes active. +The OnEnter event does not occur when switching between forms or between another application and the application that includes the control. +When switching between controls in separate container controls such as the TPanel and the TGroupBox controls, an OnEnter event occurs for the container before the OnEnter event of the contained control. +Similarly, an OnExit event of the container occurs after the OnExit event of the control in a container when focus moves to another control outside the container. +For example, consider a form with an OK button and a group box that contains three radio buttons, where focus is currently on the OK button. When the user clicks one of the radio buttons, an OnExit event of the button occurs, followed by an OnEnter event on the group box, and finally an OnEnter event on the radio button that was clicked. If the user then clicks on the OK button, an OnExit event for the radio button occurs followed by an OnExit event for the group box, and then the button's OnEnter event occurs. +OnEnter is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the input focus shifts away from one control to another. +Use the OnExit event handler to provide special processing when the control ceases to be active. +The OnExit event does not occur when switching between forms or between another application and your application. +When switching between controls in separate container controls such as the TPanel and the TGroupBox controls, an OnExit event occurs for the control inside the container before the OnExit event of the container. +Similarly, an OnEnter event of the container occurs before the OnEnter event of the control in a container when the focus moves to a control inside a container. +For example, consider a form with an OK button and a group box that contains three radio buttons, where the focus is currently on the OK button. When the user clicks one of the radio buttons, an OnExit event on the button occurs, followed by an OnEnter event on the group box, and finally an OnEnter event on the radio button that was clicked. If the user then clicks the OK button, an OnExit event for the radio button occurs followed by an OnExit event for the group box, and then the button's OnEnter event occurs. + +Note: In some control classes, the ActiveControl property updates before the OnExit event occurs. +OnExit is an event handler of type TNotifyEvent. + + + Returns the control's docking information. +Write code in the OnGetSiteInfo event handler to initialize a TDragDockObject with information about where a dragged object can be docked, if at all. OnGetSiteInfo occurs before the OnDockOver event. +OnGetSiteInfo occurs only if DockSite is true. +OnGetSiteInfo is an event handler of type Vcl.Controls.TGetSiteInfoEvent. See TGetSiteInfoEvent for a description of the parameters. + + + Occurs when a user presses any key while the control has focus. +Use the OnKeyDown event handler to specify special processing to occur when a key is pressed. The OnKeyDown handler can respond to keyboard keys, including function keys and keys combined with the SHIFT, ALT, and CTRL keys, and pressed mouse buttons. + +Note: TCheckBox does not fire OnKeyDown events for arrow keys. +OnKeyDown is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTRL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. + + + Occurs when a key is pressed. +Use the OnKeyPress event handler to make something happen as a result of a single character key press. +The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that do not correspond to an ASCII Char value (SHIFT or F1, for example) do not generate an OnKeyPress event. Key combinations (such as SHIFT+A) generate only one OnKeyPress event (for this example, SHIFT+A results in a Key value of "A" if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the OnKeyDown or OnKeyUp event handler. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTROL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. +OnKeyPress is an event handler of type Vcl.Controls.TKeyPressEvent. + + + Occurs when the user releases a key that was pressed. +Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, keys that represent characters, function keys, and keys combined with the SHIFT, ALT, and CTRL keys. +If Key is set to #0, any further processing of the OnKeyUp event will be prevented. +OnKeyUp is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. + + + Occurs when the application tries to undock a control that is docked to the windowed control. +Write an OnUnDock event handler to adjust the windowed control when a dock client is undocked. The OnUnDock event handler can make any necessary adjustments, or it can block the undock attempt by setting the Allow parameter to false. +OnUnDock is an event handler of type Vcl.Controls.TUnDockEvent. + + + Creates an instance of TWinControl. +Call Create to construct and initialize a new control and insert the newly-constructed control into its owner, as specified by the AOwner parameter. Create inserts the control in the owner by calling the owner's InsertComponent method. +Most controls override Create to initialize their unique properties. Objects that override the Create method must always call the inherited Create method first, and then proceed with the component-specific initialization. Specify the override directive when overriding the Create method. +If a component's Create method allocates resources or memory, override the Destroy method to free those resources. + + + Creates and initializes a control as the child of a specified non-VCL window. +Call CreateParentedControl to embed a new control in a non-VCL parent. +CreateParentedControl allocates memory for a new instance of the same class as the control (Delphi) or is the class specified by the vmt parameter (C++), sets its ParentWindow property to ParentWindow, and calls the constructor, passing in nil (Delphi) or NULL (C++) for the Owner parameter. CreateParentedControl returns the newly created control. +CreateParentedControl has the same purpose as CreateParented, but is a simple class function instead of a constructor. Unlike CreateParented, CreateParentedControl can be called from C++ code. + + + Destroys an instance of TWinControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TWinControl reference is not nil, and only then calls Destroy. + + + Embarcadero Technologies does not currently have any additional information. + + + Sends a message to each of the child controls. +Use Broadcast when you want to send the same message to each of the child controls contained within the windowed control. Specify the message to be passed as the value of the Message parameter. + + + Indicates whether a control can receive focus. +Call CanFocus to find out if the control can receive input from the user. +CanFocus returns true if both the control and its parent(s) have their Visible and Enabled properties set to true. If any of the Visible and Enabled properties of the control or the controls in which it is contained are not true, then CanFocus returns false. + + + Indicates whether a specified control exists within the control. +Use ContainsControl to find out if a particular control exists within this control. ContainsControl returns true if the specified value of the Control parameter is a child control of this control. The Control parameter need not be an immediate child (in the Controls property), but may be contained in a child of the control, or in a child of a child of the control, for indefinitely many levels deep. +If the method returns false, the specified control is not within the control. + + + Returns the child control located at a specified position within the control. +Use ControlAtPos to determine which child control is at the specified location within the control. ControlAtPos returns an immediate child of the control; that is, one of the entries of the Controls property, that has this control for its Parent property. +Specify the position in client coordinates as the value of the Pos parameter. Pos can be anywhere within the boundaries of the child control, not just the upper left corner. +The AllowDisabled parameter determines whether the search for controls includes disabled controls. +The AllowWinControls parameter determines whether descendants of TWinControl are considered when looking for the child control. +If there is no control that matches the AllowDisabled and AllowWinControls parameters at the specified position, ControlAtPos returns nil (Delphi) or NULL (C++). + + + Provides message handling for all messages that the control does not fully process by itself. +Override DefaultHandler to change the default message handling for the control. The Message parameter can be cast to a TMessage type, to obtain the WParam, LParam, and Result of the message. If the Result of the message is non-zero, the message has already been handled. Set the Result field to a non-zero value to prevent further processing of the message by the inherited method. + +Note: In Delphi code, calling inherited in a message-handling method results in a call to the ancestor's DefaultHandler method unless that ancestor specifies an explicit handler for the message. +TWinControl overrides the TControl DefaultHandler method to handle messages for all its descendant types. DefaultHandler passes any otherwise-unhandled messages to the control's window procedure using the CallWindowProc API function. + + + Disables the realignment of child controls. +Call DisableAlign to temporarily prevent child controls from realigning. For example, while performing multiple manipulations of controls, such as reading from a form file or scaling, performance improves if child controls are not realigned until all manipulations are complete. The EnableAlign method restores normal child realignment. +Every call to DisableAlign must be followed by a matching call to EnableAlign. If an exception could be raised after the call to DisableAlign, use an exception block to ensure that EnableAlign will always be called. +DisableAlign/EnableAlign call sequences can be nested. An internal counter records the level of nesting. As long as the counter is positive, realignment is disabled and the AlignDisabled property returns true. Once the counter returns to zero, realignment is enabled and AlignDisabled returns false. + + + Specifies the number of controls that are docked on the windowed control. +Use DockClientCount to get the number of controls that are docked to the windowed control. This value can be used as an upper bound when iterating through the DockClients property. + +Note: The DockClients property can contain controls that are not visible. To get the number of docked clients that are visible, use the VisibleDockClientCount property instead. + + + Generates an OnDockDrop event. +DockDrop is called automatically when a control is docked to the windowed control. It instructs the control that is being dropped to prepare for the dock operation and then generates an OnDockDrop event. +Although you can override DockDrop to perform actions in addition to the generated OnDockDrop event, typically descendant classes override the DoAddDockClient method instead. This is because DoAddDockClient is called by the client after it has performed its own preparations, but before the OnDockDrop event. +DockDrop is called only if DockSite is True. + + + Specifies whether the control can be the target of drag-and-dock operations. +Set DockSite to true to allow other controls to be docked to this windowed control. + +Code Examples +Docking (Delphi) +Docking (C++) + + + Specifies the control's docking manager interface. +Use DockManager to specify the control's docking manager. The docking manager handles the layout of docking zones (where controls are docked) and any painting associated with docking zones. +If you set DockSite and UseDockManager to true, but do not assign a value to DockManager, the windowed control generates a default docking manager, using the global DefaultDockTreeClass variable. + + + Determines whether the control's image is rendered directly to the window or painted to an in-memory bitmap first. +When DoubleBuffered is false, the windowed control paints itself directly to the window. When DoubleBuffered is true, the windowed control paints itself to an in-memory bitmap that is then used to paint the window. Double buffering reduces the amount of flicker when the control repaints, but is more memory intensive. +When a windowed control is a dock site and has an associated dock manager, it must be double-buffered. + +Note: Some controls, such as TRichEdit, can't paint themselves into a bitmap. For such controls, DoubleBuffered must be set to false. + + + Decrements the reference count incremented by the DisableAlign method, eventually realigning the child controls. +Call EnableAlign to allow child controls within the control to realign again after they were prevented from realigning by a call to DisableAlign. +Each time the DisableAlign method is called, it increments a reference count. Each time EnableAlign is called, it decrements the same reference count. When the reference count reaches zero, EnableAlign calls the Realign method to perform any pending realignments. +Be sure to pair each call to DisableAlign with a call to EnableAlign. If an exception could be raised after the call to DisableAlign, use an exception block to ensure that the corresponding call to EnableAlign is executed. + + + Returns a child control given its name. +Call FindChildControl to locate a specified child control. FindChildControl searches the control's children and returns the control with the specified name. If no child controls match the specified name, FindChildControl returns nil (Delphi) or NULL (C++). + +Note: FindChildControl only locates immediate children of the control. It can't find a control that is a child of one of the control's children. + + + Reverses the positions of child controls. +Call FlipChildren to flip the control's children; that is, to move children on the left side of the control to the right side and vice versa. FlipChildren reverses the position of all child controls and adjusts their Align properties, if necessary, to enforce the new position. +AllLevels specifies whether FlipChildren should be called recursively on the control's children. +FlipChildren can be used to reverse the layout of an application when it is running in Middle Eastern locales where users read from right to left instead of left to right: Call UseRightToLeftAlignment to determine whether the BiDiMode property dictates a reversal of alignment based on the system locale. + +Note: FlipChildren does the same thing as the Flip Children command on the control's context menu in the IDE. + + + Determines whether the control has input focus. +Use the Focused method to see if the control is the active control. When Focused returns true, the control has the input focus. If Focused returns false, the user cannot interact with the control. + + + Calls a specified method for each child of the control. +GetChildren is called by the streaming system that loads and saves components. Applications seldom need to call this routine. +GetChildren executes the callback specified by the Proc parameter for every child control listed by the Controls property that lists the Root parameter as its Owner. +Override GetChildren to limit or augment which child controls are saved with the control. When overriding GetChildren, call the procedure passed as the Proc parameter for every child control that should be saved. The Root parameter indicates the component (usually a form) that owns the control. + + + Builds a list of owned controls. +Call GetTabControlList to construct a list of child controls. +GetTabControlList iterates through the control's internal tab order list, adding each of the child controls to List. The result is a list of all the owned controls in TabOrder. + + + Builds a list of controls in tab order. +Call GetTabOrderList to construct a list of child controls in tab order. +GetTabOrderList iterates through the control's internal tab order list, adding each of the child controls to List, including any controls contained in those controls. The result is a list of all the controls and their owned controls, in tab order. +The FindNextControl method calls GetTabOrderList to build a complete list of the controls that FindNextControl uses to locate the next control in the tab order. + + + Reports whether a screen object handle exists for the control. +Query HandleAllocated to find out if the control's underlying screen object has been generated. +If the screen object exists, HandleAllocated returns true. If the screen object does not exist, HandleAllocated returns false. Testing the Handle property of a control directly causes the window to be created if it does not already exist. Call the HandleAllocated method to determine whether a window exists without creating one as a side effect. + + + Creates a screen object for the control if it doesn't already exist. +Call HandleNeeded to create a screen object for the control. +If the screen object does not exist, HandleNeeded calls the CreateHandle method for the parent of the control before it creates a screen object for this control. + + + Inserts a control into the Controls array property. +Applications should not need to call InsertControl directly. Child controls are automatically inserted and removed when added or deleted at design time. At run time, use the Parent property of the child control to insert it in the Controls array. If the child control is already the child of another control, setting the Parent property ensures that the child is removed from the Controls of the original parent. +InsertControl makes the inserted control a child, and the containing control the parent. The AControl parameter is the child control that is inserted into the Controls array. + + + Schedules a control repaint. +Invalidate informs a control that its entire surface needs to be repainted. Calling Invalidate can prevent flicker caused by a series of partial repaints. There is no performance penalty for calling Invalidate multiple times before the control is actually repainted. +The actual repaint does not occur until the control is updated. To force an immediate repaint, call Repaint instead. + + + Draws the windowed control to a device context. +Call PaintTo to draw the control on a device context. Specify the device context as the value of the DC parameter and specify the X and Y coordinates on the device context where the top-left corner of the windowed control is to be drawn. PaintTo first erases the background of the device context and then paints the control. +PaintTo is useful for drawing an image of the control into a bitmap DC. + +Warning: When using PaintTo to draw on a canvas, you must lock the canvas first (and unlock it after the call to PaintTo. If you do not lock the canvas, Windows calls that occur while the control is painting can cause the canvas to lose its handle. + + + Draws the windowed control to a device context. +Call PaintTo to draw the control on a device context. Specify the device context as the value of the DC parameter and specify the X and Y coordinates on the device context where the top-left corner of the windowed control is to be drawn. PaintTo first erases the background of the device context and then paints the control. +PaintTo is useful for drawing an image of the control into a bitmap DC. + +Warning: When using PaintTo to draw on a canvas, you must lock the canvas first (and unlock it after the call to PaintTo. If you do not lock the canvas, Windows calls that occur while the control is painting can cause the canvas to lose its handle. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns False, no matter the value of Msg. +As a member of the TWinControl class, PreProcessMessage always returns False, no matter the value of Msg. + +Note: When overriding PreProcessMessage in descendant classes, we recommend to implement it such that it returns True if Msg is a preprocess message, and False otherwise. + + + Removes a specified control from the Controls array. +RemoveControl removes a child control from the Controls property. After calling RemoveControl, the control is no longer the parent of the child specified by the AControl parameter. +Applications should not call RemoveControl directly. Child controls are automatically inserted and removed when added or deleted at design time. At runtime, use the Parent property of the child control to remove it from the Controls array. + + + Forces the control to realign children. +The EnableAlign method calls Realign when the reference count reaches zero. It adjusts the size and position of any child controls according to their Align properties. +If all of the child controls have their Align properties set to alNone, Realign has no effect. + + + Repaints the entire control. +Call Repaint to repaint the control. +As implemented in TWinControl, Repaint calls the Invalidate method and then the Update method to repaint the control. + + + Rescale control and its children. +ScaleBy resizes a control without moving its upper left corner. This is similar to changing the Height and Width properties, but the control also attempts to rescale and rearrange any child controls to maintain their relative size and placement. +The M and D parameters define a multiplier and divisor by which to scale the control. For example, to make a control 75% of its original size, specify the value of M as 75, and the value of D as 100. Any pair of values that has the same ratio has the same effect. Thus M = 3 and D = 4 also makes the control 75% of its previous size. +To rescale the control's children without rescaling the control itself, use ScaleControls. + + + Scroll control contents. +Call ScrollBy to scroll the contents within the control. While ScrollBy can be used for any TWinControl, it makes the most sense to use it for descendants of TScrollingWinControl. +Applications seldom need to call the ScrollBy method unless they implement their own scrolling interface rather than relying on a scroll bar. +The DeltaX parameter is the change in pixels along the X axis. A positive DeltaX value scrolls the contents to the right; a negative value scrolls the contents to the left. The DeltaY parameter is the change in pixels along the Y axis. A positive DeltaY value scrolls the contents down; a negative value scrolls the contents up. + + + Sets the windowed control's boundary properties all at once. +Use SetBounds to change all of the control's boundary properties at once. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately. By setting all four properties at once, SetBounds ensures that the control will not repaint between changes +Specify the values for the Left, Top, Width, and Height properties as the value of the ALeft, ATop, AWidth, and AHeight parameters, respectively. + + + Makes a control visible at design time. +Vcl.Controls.TWinControl.SetDesignVisible inherits from Vcl.Controls.TControl.SetDesignVisible. All content below this line refers to Vcl.Controls.TControl.SetDesignVisible. +Makes a control visible at design time. +SetDesignVisible is used internally by Delphi during form design. + + + Gives the input focus to the control. +Use SetFocus to change input focus to the control. When a control has focus, it receives keyboard events. + + + Forces the control to update. +Update repaints any part of the control surface that is out of date. Normally, updates occur automatically, but an Update call may be necessary before lengthy processing that might interfere with automatic updates. Calling Update unnecessarily can increase overhead and cause screen flicker. +Update only repaints areas of the control the have been determined to be out of date. To force immediate repainting of the entire control, call the Repaint method. To notify a control that it is out of date (without forcing an immediate repaint), call the Invalidate method. + + + Respond to state change. +UpdateControlState is called automatically when any display change occurs that might affect the internal state of the control. +As implemented in TWinControl, UpdateControlState climbs the chain of parent controls to verify that each control in the chain has Showing equal to true. If this is the case, UpdateControlState makes sure that the Showing property is accurate for this control and for all its descendants. Descendant classes can extend this behavior. + + + Call LockDrawing method to prevent changes in that control from being redrawn. To resume redrawing call UnlockDrawing method. If to recreate a window handle after a LockDrawing call, the control will remain locked until the corresponding UnlockDrawing call. +LockDrawing / UnlockDrawing calls may be nested. + + + Call UnlockDrawing method to allow changes in that control to be redrawn. +LockDrawing / UnlockDrawing calls may be nested. + + + Indicates child control realignment disabled. +AlignDisabled returns true if child control realignment has been temporarily disabled by a call to DisableAlign. + + + Indicates whether the mouse pointer is currently in the client area of the control. +Use MouseInClient to check whether the mouse pointer is currently located in the client area of the control. MouseInClient is also used internally to fire the OnMouseEnter and OnMouseLeave events. + + + Specifies the number of visible controls that are docked on the windowed control. +Use VisibleDockClientCount to determine the number of controls in the DockClients list that have a Visible property value of true. This value is less than or equal to the value of DockClientCount. + + + Determines the color and pattern used for painting the background of the control. +The Brush property accesses the TBrush object that determines pattern and color for the control background. Brush is a read-only property, but an application can manipulate the TBrush object by setting its properties or by using its Assign method. + + + Returns the number of child controls. +Read ControlCount when iterating over all the children of this control. The children of the control are listed in the Controls property array. +ControlCount is a read-only property. + +Note: The value of ControlCount is always 1 greater than the highest Controls index, because the first Controls index is 0. + + + Provides access to the underlying Windows screen object for the control. +The Handle property returns the window handle for the underlying Microsoft Windows screen object. Use the Handle property to bypass the VCL API and directly access the underlying window. +Do not refer to the Handle property during component creation or streaming. The underlying window does not exist until the first time the Handle property is referenced. When this occurs, the HandleNeeded method is called automatically. +Handle is a read-only property. + +Note: On Win64, the size of HANDLE types has changed to 64-bits --except for OLE_HANDLE, which is now a 32bit Long even in Win64. This means that you need to change any code that assumed OLE_HANDLE and other HANDLE types are interchangeable. See also http://stackoverflow.com/questions/401812/what-is-the-proper-way-to-cast-from-an-ole-handle-to-an-hicon. + + + Specifies the padding of a control. +Use Padding to specify the padding of a control. This value is an instance of the class TPadding. + + + ParentDoubleBuffered defers the DoubleBuffered property of this component to the value of the parent's DoubleBuffered property. +ParentDoubleBuffered is a boolean indicating that the DoubleBuffered property of this component is overridden by the value of the parent's DoubleBuffered property. + + + Reference to parent's underlying control. +ParentWindow refers to the window handle that underlies the parent control. To designate a non-VCL control as a parent, assign that control's handle to ParentWindow. This assignment causes the control to be moved into the parent's screen area. Setting ParentWindow has no effect if Parent is not nil (Delphi) or NULL (C++). +TActiveXControl objects use ParentWindow to insert a control in an ActiveX container window. ParentWindow is set automatically when a control is constructed with a call to CreateParented (Delphi) or the appropriate overloaded constructor (C++). +Use ParentWindow with windowed controls that are packaged in a DLL. This allows references to the control by applications based on other applications. + + + Indicates whether the control is showing on the screen. +Showing is used internally to optimize the allocation of Windows resources. Use Showing to determine when you must allocate resources that are required when the control is visible. When Showing is false, the control is not visible and you can delay the allocation of resources. +If the Visible properties of a component and all the parents in its parent hierarchy are true, Showing is guaranteed to be true. If one of the parents containing the control has a Visible property value of false, Showing may be either true or false. +Showing is a read-only property. + + + IsDrawingLocked property returns True when redrawing for this control is locked. It is True when the number of LockDrawing calls is less than UnlockDrawing calls for this control. + + + RedrawDisabled property returns True when redrawing for this control is locked. It is similar to IsDrawingLocked, but uses Win32 API to determine when a Win32 window redrawing is disabled. +For example, when a parent control redrawing is locked using LockDrawing, then IsDrawingLocked returns True for parent control and False for child control. RedrawDisabled returns True for both parent and child controls. + + + Indicates the position of the control in its parent's tab order. +TabOrder is the order in which child windows are visited when the user presses the Tab key. The control with the TabOrder value of 0 is the control that has the focus when the form first appears. +Initially, the tab order is always the order in which the controls were added to the form. The first control added to the form has a TabOrder value of 0, the second is 1, the third is 2, and so on. Change this by changing the TabOrder property. +Each control has a unique tab-order value within its parent. If you change the TabOrder property value of one control to be the same as the value of a second control, the TabOrder value for all the other controls changes. For example, suppose a control is sixth in the tab order. If you change the control's TabOrder property value to 3 (making the control fourth in the tab order), the control that was originally fourth in the tab order now becomes fifth, and the control that was fifth becomes sixth. +Assigning TabOrder a value greater than the number of controls contained in the parent control moves the control to the end of the tab order. The control does not take on the assigned value of TabOrder, but instead is given the number that assures the control is the last in the tab order. + +Note: TabOrder is meaningful only if the TabStop property is True and if the control has a parent. (The TabOrder property of a form is not used unless the form is the child of another form.) A control with a TabOrder of -1 has no parent, and therefore cannot be reached by pressing the Tab key. To remove a parented control from the Tab order, set its TabStop property to False. + + + Determines whether the user can tab to a control. +Use the TabStop to allow or disallow access to the control using the Tab key. +If TabStop is True, the control is in the tab order. If TabStop is False, the control is not in the tab order and the user cannot press the TAB key to move to the control. + +Note: TabStop is not meaningful for a form unless the form assigns another form to be its parent. + + + Specifies whether the docking manager is used in drag-and-dock operations. +Use UseDockManager to get or set whether a docking manager is used in drag-and-dock operations. +The docking manager handles the positioning of docked controls and any painting of docking zones around those controls. If you do not use a docking manager, docked controls are aligned to the windowed control based on the closest edge to where they are released. When you do not use a docking manager, there is no region for a user to grab to automatically undock a docked control. + + + + + Base class for controls that wrap Windows screen objects but perform their own rendering. +In most descendants of TWinControl, the job of drawing the control's surface belongs to the underlying Windows screen object. If a control has visible features that cannot be rendered by a Windows screen object, it requires access to a canvas object so it can do its own drawing. +TCustomControl is one of two base classes for controls that draw their own surfaces. Because TCustomControl is descended from TWinControl, instances of its descendants can receive focus and serve as containers. +Classes of controls that perform their own screen rendering and do not need the features of TWinControl should be descendants of TGraphicControl instead of TCustomControl. TGraphicControl objects can render themselves with less overhead, because they do not have underlying Windows screen objects. +TCustomControl objects have a Paint method, which is called whenever the control needs to render its image. Custom controls paint themselves using the Canvas property. + + + Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + Renders the image of the control on a specified device context. +PaintWindow is called automatically when a custom control receives a WM_PAINT message. PaintWindow assigns the device context specified by the DC parameter to the custom control's canvas, calls the Paint method, and finally removes the device context. Override PaintWindow to provide additional responses to the WM_PAINT message. To draw the image of the control, override the Paint method instead. + + + Specifies the TCanvas object that presents a drawing surface for the control. +Use the properties of the TCanvas object to draw or paint on the surface of the control. Canvas encapsulates a Windows device context, providing all the tools and methods needed for drawing and painting. +Canvas is a protected property that is usually redeclared as public in descendants of TCustomControl. + + + Creates an instance of TCustomControl. +Calling Create constructs and initializes an instance of TCustomControl. However, you should never attempt to instantiate a TCustomControl. This class is intended solely as a base class from which other control classes descend and you should only call Create to instantiate one of these descendants. Controls placed on forms at design time are created automatically. +After calling the inherited constructor, Create initializes the control and also a TCanvas object for its Canvas property. +When overriding Create, always call the inherited Create method first, then proceed with the control's initialization. Remember to specify the override directive when overriding the Create method. + +Note: If a component's constructor allocates resources or memory, also override the destructor to free those resources. + + + Destroys an instance of TCustomControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the control is not nil, and only then calls Destroy. +Applications should only free controls explicitly when the constructor was called without assigning an owner to the control. +As the control is destroyed, it destroys the TCanvas object in its Canvas property. +Override Destroy to free any memory or resources allocated in the Create method. When declaring a Destroy method in a descendent control type, always add the override directive to the declaration and call the inherited Destroy as the last statement in the redeclared method. +When a control is created, Delphi automatically provides exception handling around the constructor call. The destructor is called if an exception escapes from the constructor. This means that the destructor code must be prepared to clean up a partially constructed instance. Check all data fields for zero before disposing of their contents. + + + + + Base class for all common binding components descending from it. +TContainedBindComponent is an abstract class that is the base class for TCommonBindComponent. + + + Protected getter method for the BindingsList property. + + + Reads the state of this component. +ReadState is used internally in the component streaming system. It is not necessary to call it directly. +ReadState expects a TReader object, which is used for reading the state of the component. + + + Protected getter method for the ControlComponent property. + + + Protected setter method for the ControlComponent property. + + + Verifies whether the control component is assigned. +If the ControlComponent is nil, then CheckControlComponent raises an exception. + + + Protected getter implementation for the DisplayName property. + + + Returns whether this component is in design mode. + + + Returns whether this component is in loading mode. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. + + + Returns whether the control component can be set a given value. +As implemented in TContainedBindComponent, CanSetControlComponent always returns True, but in descendants it actually returns whether the given Value (that is itself a TComponent) can be assigned to the control component. + + + Returns the containing component. +GetParentComponent returns a reference to the component that contains the current component, or nil if there is no container. Use HasParent to determine whether a component has a containing component. + + + Verifies whether the contained binding component has a parent. +HasParent returns True if the contained binding component has a parent, False otherwise. + + + Sets the parent component of this component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. + + + Specifies a list that holds the binding expressions. + + + Returns the index of this component in the bindings list. + + + Specifies the component that will be bound to the source component, by means of LiveBindings. + + + Returns a string containing the name of this component. + + + Specifies a category for this component. +For example, for a binding expression called BindExpressionForm121, of type TBindExpression, the following code: + + ShowMessage(BindExpressionForm121.Category); + +shows the following message: Binding Expressions. + + + + + Represents the base class for the binding list. +The TCustomBindingsList class implements a list of binding expressions, output converters, method scopes, and other binding list-related functionality. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TCustomBindingsList.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TCustomBindingsList.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Data.Bind.Components.TCustomBindingsList.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Enumerates all child components. +Data.Bind.Components.TCustomBindingsList.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Specifies a list of available methods. For more information about these methods, read the LiveBindings Methods topic. + + + Specifies a list of available output converters. For more information about output converters, read the LiveBindings Output Converters help topic. + + + Returns a TComponent enumerator. +Data.Bind.Components.TCustomBindingsList.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the bindings list uses the global application manager for managed bindings. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + List of dependencies on components and properties + + + Describe the component/property that a binding component depends upon + + + Implements the bindings list component. TBindingsList is built on the TCustomBindingsList component and publishes additional properties that can be accessed from within the Object Inspector. + + + Update component properties with a control is modified by user input + + + Update component properties with a control is modified by user input + + + Evaluate an assignment from a data source to an editor. May use a shortcut or expression engine. + + + Enumerator of data source records, such as records in a dataset. + + + Data source member name, such as a FieldName. + + + Editor for a list, such as a FMX TListView. + + + Member name for a list, such as "Text". + + + Indicate whether the assignment can be evaluated without expression engine. + + + Expression engine description of assignment. + + + Event to execute when the expression engine raises an exception + + + Indicate whether the expression has been customized. A customized expression must + be evaluated with expression engine, rather than by shortcut. + + + + + Evaluate an value from a data source. May use a shortcut or expression engine. + + + Enumerator of data source records, such as records in a dataset. + + + Data source member name, such as a FieldName. + + + Indicate whether the assignment can be evaluated without expression engine. + + + Expression engine description of expression to evaluate. + + + Event to call when the expression engine raises an exception + + + Indicate whether the expression has been customized. A customized + expression must be evaluated with expression engine, rather than as a shortcut + + + + + + + + Evaluate expressions to fill a break header + + + + + Is a binding component that wraps one or more other binding components. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Informs the wrapper binding component that a delegate (or contained) binding component has been activated. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Used internally for observing purposes. + + + Returns an array of scopes for the source component. + + + Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + Returns True if this binding component delegate supports evaluation shortcuts or False otherwise. +Subclasses of TBindComponentDelegate that support evaluation shortcuts must reimplement GetUseEvalShortcuts to return True. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Event that occurs as an expression is evaluated and is assigning to a value of an object member. Event handlers can intercede in the assignment operation. + + + Event that occurs after an expression has been evaluated and has assigned a value to an object member. + + + Event that occurs when an exception is raised while evaluating an expression, such as a conversion error. Event handlers can intercede and raise a different exception. + + + Event that occurs when activating the binding expressions of this delegate wrapper. + + + Event that occurs when the binding expressions of this delegate wrapper have been activated. + + + + + Is a binding component that wraps another binding component and references a control. +The TLinkControlDelegate class implements a binding component that wraps another binding component and references a control. +For more information regarding the delegates, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Protected getter method for the ControlComponent property. + + + Protected setter method for the ControlComponent property. + + + Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + Activates or deactivates the bind control value of this link delegate wrapper. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns whether the given parameter can be used as the control component of this binding component. +CanSetControlComponent returns whether the given Value (that is itself a TComponent) can be used as the control component of this binding component. + + + + + Is a binding component that wraps another binding component and references a control, data source, and field. +The TLinkControlToFieldDelegate class implements a binding component that wraps another binding component and references a control, a data source, and a field. +For more information regarding the delegates, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Protected setter implementation for the DataSource property. + + + Protected getter implementation for the DataSource property. + + + Protected setter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use SetSourceMember as the setter implementation. + + + Protected getter implementation for the FieldName property defined in subclasses. +Both TCustomLinkControlToField and TCustomLinkListControlToField use GetSourceMember as the getter implementation. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a TBaseLinkingBindSource object to which this delegate component links. +Use DataSource to determine or set the TBaseLinkingBindSource object that connects to a specific dataset. + + + + + Represents the base class for linking a control to a field. +The TCustomLinkControlToField class implements the functionality for linking a control to a field in a data source. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TCustomLinkControlToField.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Returns an array of scopes for the source component. +Data.Bind.Components.TCustomLinkControlToField.GetSourceScopes inherits from Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. +Returns an array of scopes for the source component. + + + Used for renaming a member of this binding component. +Data.Bind.Components.TCustomLinkControlToField.MemberRenaming inherits from Data.Bind.Components.TBindComponentDelegate.MemberRenaming. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.MemberRenaming. +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + Embarcadero Technologies does not currently have any additional information. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Used internally for observing purposes. +Data.Bind.Components.TCustomLinkControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Setter of UseEvalShortcuts. + + + Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + Embarcadero Technologies does not currently have any additional information. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + Links a list control to a field. +The TLinkListControlToField class extends TCustomLinkListControlToField with published properties. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + Link a control to a field, fill the control with possible values + + + Represents the base class for linking a list control to a field. +The TCustomLinkListControlToField class implements the functionality for linking a list control, such as TListBox, to a field. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Activates or deactivates the bind control value of this link delegate wrapper. +Data.Bind.Components.TCustomLinkListControlToField.SetActive inherits from Data.Bind.Components.TLinkControlDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.SetActive. +Activates or deactivates the bind control value of this link delegate wrapper. + + + Returns a string containing the name of the control component member. +Data.Bind.Components.TCustomLinkListControlToField.GetControlComponentMemberName inherits from Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. All content below this line refers to Data.Bind.Components.TLinkControlDelegate.GetControlComponentMemberName. +Returns a string containing the name of the control component member. When a control member is specified, expressions execute against the member rather than against the control component. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkListControlToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Used internally for observing purposes. +Data.Bind.Components.TCustomLinkListControlToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkListControlToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +Data.Bind.Components.TCustomLinkListControlToField.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Setter of UseEvalShortcuts. + + + Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkListControlToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkListControlToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkListControlToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies additional optional expressions to use when filling the list control. Use this collection when multiple expressions are needed to fill an item in the list. +For instance, you can use FillExpressions in order to populate a FireMonkey list box item Text and Detail properties. Use the FillDisplayCustomFormat and FillDisplayCustomFormat properties in order to fill the Text property and add an item to the FillExpressions collection, for the Detail property. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a collection of expressions to fill a list header. This property is optional. + + + Specifies the field used to determine a break. This property is optional. + + + Specifies a custom expression that is used with the field defined by the FillBreakFieldName property. For instance, the expression StrCopy(%s, 0, 1); causes a break when the first character of the field is different. This property is optional. + + + Specifies the field to display in the list header. If FillBreakFieldName and FillBreakCustomFormat are blank, then the value determined using FillHeaderFieldName and FillBreakCustomFormat controls breaks. This is the only required field to cause breaking. + + + Specifies a custom expression that is used with the field defined by the FillHeaderFieldName property. For instance, the expression StrCopy(%s, 0, 1); displays the first character of the field in the header. This property is optional. + + + Specifies a collection of break value ranges. The break value falls within an item in this collection. The display value associated with the item is displayed in the header. This property is optional. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether this binding component delegate uses evaluation shortcuts (True) or not (False). + + + + + Links a list control to a field. +The TLinkListControlToField class extends TCustomLinkListControlToField with published properties. + +Tip: If the direction is bidirectional, then the control must support the IEditLinkObserver interface. + + + Is a binding component that wraps another binding component and references a component property, data source, and field name. +The TLinkPropertyToFieldDelegate class implements a binding component that wraps another binding component and references a component property, a data source, and a field name. +For more information regarding the delegates, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Protected setter implementation for the DataSource property. + + + Protected getter implementation for the DataSource property. + + + Protected setter implementation for the FieldName property. + + + Protected getter implementation for the FieldName property. + + + Protected getter implementation for the Component property. + + + Protected setter implementation for the Component property. + + + Protected setter implementation for the ComponentProperty property. + + + Protected setter implementation for the Active property. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies a TDataSource object to which this delegate component links. +Use DataSource to determine or set the TDataSource object that connects to a specific dataset. + + + Specifies the component that this wrapping binding component references. + + + Specifies the name of the property of the component that this wrapping binding component references. + + + Specifies the field name that this wrapping binding component references. + + + + + Represents the base class for linking a property of a component to a field. +The TCustomLinkPropertyToField class implements the functionality for linking a property of a component to a field. + +Tip: The user input to this component is not monitored using an observer. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Protected setter implementation for the Active property. +Data.Bind.Components.TCustomLinkPropertyToField.SetActive inherits from Data.Bind.Components.TLinkPropertyToFieldDelegate.SetActive. All content below this line refers to Data.Bind.Components.TLinkPropertyToFieldDelegate.SetActive. +Protected setter implementation for the Active property. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TCustomLinkPropertyToField.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Returns an array of scopes for the source component. +Data.Bind.Components.TCustomLinkPropertyToField.GetSourceScopes inherits from Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetSourceScopes. +Returns an array of scopes for the source component. + + + Used for renaming a member of this binding component. +Data.Bind.Components.TCustomLinkPropertyToField.MemberRenaming inherits from Data.Bind.Components.TBindComponentDelegate.MemberRenaming. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.MemberRenaming. +Used for renaming a member of this binding component. +MemberRenaming is used for renaming component members. The old member name is given through the ACurMemberName parameter, while the new member name is given through the ANewMemberName parameter. + + + Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. +Data.Bind.Components.TCustomLinkPropertyToField.GetDelegates inherits from Data.Bind.Components.TBindComponentDelegate.GetDelegates. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GetDelegates. +Gets the delegate (or contained) binding components that this wrapper binding component uses to execute expressions and respond to user input. + + + Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +Data.Bind.Components.TCustomLinkPropertyToField.CanActivate inherits from Data.Bind.Components.TBindComponentDelegate.CanActivate. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.CanActivate. +Lets the wrapper binding component indicate whether a delegate (or contained) binding component may be activated. +The CanActivate method returns True if the delegate (or contained) binding component can be activated, False otherwise. + + + Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkPropertyToField.ClearGeneratedExpressions inherits from Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.ClearGeneratedExpressions. +Clears all the generated bindings expressions, at once, for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Used internally for observing purposes. +Data.Bind.Components.TCustomLinkPropertyToField.RequiresControlHandler inherits from Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.RequiresControlHandler. +Used internally for observing purposes. + + + Initializes the component after the form file has been read into memory. +Data.Bind.Components.TCustomLinkPropertyToField.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Creates an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkPropertyToField.Create inherits from Data.Bind.Components.TContainedBindComponent.Create. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Create. +Creates an instance of the TContainedBindComponent class. + + + Destroys an instance of the TContainedBindComponent class. +Data.Bind.Components.TCustomLinkPropertyToField.Destroy inherits from Data.Bind.Components.TContainedBindComponent.Destroy. All content below this line refers to Data.Bind.Components.TContainedBindComponent.Destroy. +Destroys an instance of the TContainedBindComponent class. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. +Data.Bind.Components.TCustomLinkPropertyToField.GenerateExpressions inherits from Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. All content below this line refers to Data.Bind.Components.TBindComponentDelegate.GenerateExpressions. +Automatically generates the bindings expressions for the quick binding component this delegate wraps onto. For more information regarding the quick binding components, please refer to the New LiveBinding topic, the Quick Binding Components Reference section. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Links the property of a component to a field. +The TLinkPropertyToField class extends TCustomLinkPropertyToField with published properties. + +Tip: The user input to this component is not monitored using an observer. + + + Binds a value of a control to a component property + + + Binds a value of a control to a component property + + + Binds a value of a control to a component property + + + Binds a value of a control to a component property, fill the control with possible values + + + Base class for the binding scope component. TBaseBindScopeComponent is the ancestor for the TCustomBindScope component. TBaseBindScopeComponent provides functionality for adding scope mappings, getting scope members and values, returning the scope itself or the scope of a member. It also provides properties for accessing the binding expressions in this scope and the scope mappings. + + + Protected setter implementation for the ScopeMappings property. + + + Adds the given scope mapping to the ScopeMappings list. The scope mapping to be added is given through the AScope parameter. + + + Returns the member for the given member name. +The GetMember method returns the scope member, as a TObject, for the member name given through the AMemberName parameter. This member is later used in the generated bindings expressions. + +Tip: This member object or its properties may be referenced by bindings expressions. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the binding scope for this source component. +The GetScope method returns the binding scope for this source component. This binding scope allows expressions to access properties and methods of the source component, as opposed to GetMemberScope, which allows expressions to access properties and methods of a member of the source component, such as a field. + + + Returns the binding scope for the given member name. +The GetMemberScope method returns the binding scope for the member name given through the AMemberName parameter. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Adds the given bind component to the Expressions list. The binding component is given through the AExpression parameter. + + + Removes the given binding component from the Expressions list. The binding component to be removed is given through the AExpression parameter. + + + Forwards notification messages to all owned components. +Data.Bind.Components.TBaseBindScopeComponent.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Activates or deactivates all the binding expressions of this binding scope component at once. +The ActivateExpressions method activates or deactivates, depending on the value of the AValue parameter, all the binding expressions contained by this binding scope component at once. + +Tip: If one or more of the binding expressions does not support one of the IBindLink, IBindPosition, or IBindActivate interfaces, then ActivateExpressions does nothing for that particular binding expression. + + + Specifies a list of binding components that are using this source component. + + + Specifies an owned collection of scope mappings. +The ScopeMappings property specifies an owned collection whose elements are scope mappings. ScopeMappings are used to add name/value pairs that can be referenced by expressions that reference this source component. + + + Allocates memory and constructs a safely initialized instance of a component. +Data.Bind.Components.TBaseBindScopeComponent.Create inherits from System.Classes.TComponent.Create. All content below this line refers to System.Classes.TComponent.Create. +Allocates memory and constructs a safely initialized instance of a component. +All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also: + +Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter. +Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type. +It is not necessary to explicitly create components added in the Form Designer. These components are created automatically when the application is run, and they are destroyed when the application is closed. +For components created programmatically, that is, not created in the Form Designer, call Create and pass in an owner component as the AOwner parameter. The owner disposes of the component when it is destroyed. If the component is not owned, then use Free when it needs to be destroyed. + +Tip: When passing in Self as the Owner parameter, consider what Self references. If a component creates another component in one of its methods, then Self refers to the first component and not the component being created, which is then owned by the first component. +Note: The TComponent constructor is virtual in part to allow polymorphic instantiation of class references. This is critical to the streaming system and to the Form Designer. Do not forget to use the override directive when declaring a new component's Create constructor. + + + Disposes of the component and its owned components. +Data.Bind.Components.TBaseBindScopeComponent.Destroy inherits from System.Classes.TComponent.Destroy. All content below this line refers to System.Classes.TComponent.Destroy. +Disposes of the component and its owned components. +Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. +Never explicitly free a component in one of its own event handlers, nor free a component from the event handler of a component that it owns or contains. +To destroy a form, call its Release method. Release waits for all the form's event handlers and the event handlers of the form's components to finish executing before destroying the form. + +Note: A form owns all the controls and nonvisual components that are placed on it in design mode. When it is freed, all of these components are automatically freed as well. By default, all forms are owned by the global Application object. When an application terminates, it frees the global Application object, which frees all forms. For objects that are not components, and for components created with a nil owner, be sure to call Free after finishing with the object; otherwise the memory allocated for the object will be lost until the application terminates. + + + + + Base class for scope with supports linking + + + Base class for evaluator shortcuts, that assign a value from data source to an editor + + + Evaluate expression to assign a value from a data source to an editor + + + + + Base class for evaluator shortcuts that retrieve a value from a data source + + + Evaluate an expression to retrieve a value from a data source + + + + + Base class for a factory of shortcut evaluators + + + Provide an evaluator for assigning from data source to editor + + + Indicate whether this factory can provide an evaluator for assigning from data source to editor + + + Provide an evaluator for retrieving a value from a data source + + + Indicate whether this factory can provide an evaluator for retrieving a value from a data source to editor + + + + + Singleton class for registering factories of shortcut evaluators, and instantiating shortcut evaluators + + + Provide an evaluator for assigning from data source to editor + + + Indicate whether a factory can provide an evaluator for assigning from data source to editor + + + Provide an evaluator for retrieving a value from a data source + + + Indicate whether a factory can provide an evaluator for assigning from a data source to editor + + + Register an evaluator shortcut factory + + + Unregister an evaluator shortcut factory + + + Singleton instance property. Use this property to access instance methods. + + + + + TOpenDialog displays a file-selection dialog. +TOpenDialog displays a modal Windows dialog box for selecting and opening files. The dialog does not appear at runtime until it is activated by a call to the Execute method. When the user clicks Open, the dialog closes and the selected file or files are stored in the Files property. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +Vcl.Dialogs.TOpenDialog.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the value for the inherited Handle property. +The GetHandle protected function gets the value for the Handle property. + + + Returns the coordinates of the reserved area of the dialog box. +GetStaticRect is provided for components that descend from TOpenDialog and require the placement of new controls alongside the standard ones inherited from the parent class. For Explorer-style dialogs, GetStaticRect returns the size and location of the standard controls within the dialog. For older versions of Windows, or if ofOldStyleDialog is enabled in Options, GetStaticRect returns the client dimensions of the entire dialog box. + + + Responds to Windows messages sent to the dialog. +Vcl.Dialogs.TOpenDialog.WndProc inherits from Vcl.Dialogs.TCommonDialog.WndProc. All content below this line refers to Vcl.Dialogs.TCommonDialog.WndProc. +Responds to Windows messages sent to the dialog. +WndProc is the main window procedure for the dialog. As implemented in TCommonDialog, it simply calls the Dispatch method, where any message handlers respond to messages before the DefaultHandler method sends them on to the Windows message handler. +Override WndProc to subclass the dialog's window procedure. To add additional message processing without interfering with the existing message handling of the dialog, override MessageHook instead. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates and initializes a TOpenDialog instance. +Create generates a TOpenDialog instance, but the new dialog does not appear on the form at runtime until the Execute method is called. +AOwner is the component that is responsible for freeing the TOpenDialog instance. It becomes the value of the Owner property. + + + Destroys the TOpenDialog and frees its memory. +Do not call Destroy directly in an application. Call Free instead. Free verifies that the TOpenDialog reference is not nil before calling Destroy. + + + Displays the file-selection dialog. +Execute opens the file-selection dialog, returning true when the user selects a file and clicks Open. If the user clicks Cancel, Execute returns false. +The code signatures of Execute that appear above are actually overrides of the Execute overloads in the base class Vcl.Dialogs.TCommonDialog.Execute. There is one more overload of Execute for Delphi that appears in the inherited members from TCommonDialog, and this overload takes no input parameters. +The ParentWnd parameter is a window handle of type HWND MSDN. If none is provided, the current form handle is used, accessed from Vcl.Forms.TApplication.ActiveFormHandle in the global variable Vcl.Forms.Application. + + // Delphi: + if OpenDialog1.Execute then + Memo1.Lines.LoadFromFile(OpenDialog1.FileName) + else + Memo1.Lines.Clear; + + // C++: + if (OpenDialog1->Execute()) + Memo1->Lines->LoadFromFile(OpenDialog1->FileName); + else + Memo1->Lines->Clear(); + + + Determines the style of the file-selection dialog. (Obsolete.) +FileEditStyle is maintained for compatibility with older versions of the VCL. It has no effect. + + + List of selected file names. +Files is a string list that contains each selected file name with its full directory path. (To let users select multiple file names, set the ofAllowMultiSelect flag in Options.) Use properties and methods for string lists to traverse this list of files and read individual items. +The example below assigns the list of files in Files to the Items property of a TListBox component. + + + +ListBox1.Items.Assign(OpenDialog1.Files); + + + + +ListBox1->Items->Assign(OpenDialog1->Files); + + + Maintains a list of previously selected files. (Obsolete.) +HistoryList is maintained for compatibility with older versions of TOpenDialog. It is not used. + + + Specifies a default file extension. +DefaultExt specifies a file extension that is appended automatically to the selected file name, unless the selected file name already includes a registered extension. If the user selects a file name with an extension that is unregistered, DefaultExt is appended to the unregistered extension. +Extensions longer than three characters are not supported. Do not include the period (.) that divides the file name and its extension. + +Code Examples +SavePictureDialog (Delphi) +TApplicationIcon (Delphi) +SavePictureDialog (C++) +TApplicationIcon (C++) + + + Indicates the name and directory path of the last file selected. +The FileName property returns the name and complete directory path of the most recently selected file. The value of FileName is the same as the first item in the Files property. +To make a file name appear by default in the dialog's edit box, assign a value to FileName in the Object Inspector or in program code. Programmatic changes to FileName have no effect while the dialog is active. + +if OpenDialog1.Execute then + Memo1.Lines.LoadFromFile(OpenDialog1.FileName) +else + Memo1.Lines.Clear; + +if (OpenDialog1->Execute()) + Memo1->Lines->LoadFromFile(OpenDialog1->FileName); +else + Memo1->Clear(); + + + Determines the file masks (filters) available in the dialog. +The file-selection dialog includes a drop-down list of file types under the edit box. When the user picks a file type from the list, only files of the selected type are displayed in the dialog. +To configure file masks at design time, click on the ellipsis marks (...) to the right of the Filter property in the Object Inspector. This opens the Filter editor. In the left column of the Filter editor, under Filter Name, type a brief description of each file type that will be available at runtime. In the right column, under Filter, type the file mask corresponding to each description. For example, the description "Text files" might appear to the left of the mask "*.txt", and the description "Pascal source files" might appear to the left of the mask "*.pas". Since the description appears in the drop-down list at runtime, it is often helpful to show the mask explicitly in the description (for example, "Text files (*.txt)"). +To create file masks in program code, assign a value to the Filter property that consists of a description and a mask separated by a vertical bar (pipe) character. Do not include spaces around the vertical bar. For example, + + + +OpenDialog1.Filter := 'Text files (*.txt)|*.TXT'; + + + + +OpenDialog1->Filter = "Text files (*.txt)|*.TXT"; + + + +Multiple filters should be separated by vertical bars. For example, + + + +OpenDialog1.Filter := 'Text files (*.txt)|*.TXT|Pascal files (*.pas)|*.PAS'; + + + + +OpenDialog1->Filter = "Text files (*.txt)|*.TXT|Pascal files (*.pas)|*.PAS"; + + + +To include multiple masks in a single filter, separate the masks with semicolons. This works both in the Object Inspector and in program code. For example, + + + +OpenDialog1.Filter := 'Pascal files|*.PAS;*.DPK;*.DPR'; + + + + +OpenDialog1->Filter = "Pascal files|*.PAS;*.DPK;*.DPR"; + + + +If no value is assigned to Filter, the dialog displays all file types. + + + Determines which filter is selected by default when the dialog opens. +FilterIndex determines which of the file types in Filter is selected by default when the dialog opens. Set FilterIndex to 1 to choose the first file type in the list as the default, or set FilterIndex to 2 to choose the second file type as the default, and so forth. If the value of FilterIndex is out or range, the first file type listed in Filter is the default. + + + Determines the current directory when the dialog opens. +InitialDir determines the default directory displayed in the file-selection dialog when it opens. For example, to point the dialog at the WINDOWS\SYSTEM directory, set the value of InitialDir to C:\WINDOWS\SYSTEM. +If no value is assigned to InitialDir, or if the specified directory does not exist, the initial directory is controlled by the global ForceCurrentDirectory variable. If ForceCurrentDirectory is true, the dialog opens with the current working directory displayed. Otherwise, the dialog opens with either the current working directory or the My Documents directory, depending on the version of Windows. + + + Determines the appearance and behavior of the file-selection dialog. +Use the Options property to customize the appearance and functionality of the dialog. + + + Augments the Options property with additional flags that determine the appearance and behavior of the file-selection dialog. +Use the OptionsEx property to further customize the file open dialog beyond the options covered by the Options property. + + + Specifies the text in the dialog's title bar. +Use Title to specify the text that appears in the file-selection dialog's title bar. If no value is assigned to Title, the dialog has the title "Open". + +Code Examples +TOpenDialogTitle (Delphi) +TOpenDialogTitle (C++) + + + Occurs when the user tries to close the dialog without canceling. +Write an OnCanClose event handler to provide custom validation of the value of FileName. File selection dialogs provide a number of built-in validations, such as checking for invalid characters, prompting for confirmation before overwriting, checking whether a file or path exists, and so on. These validations can be specified using the Options property. However, applications can provide additional validation of file names in an OnCanClose event handler. +Set the CanClose parameter to false to prevent the dialog from closing. The OnCanClose event handler is responsible for telling the user why the dialog doesn't close. + +Note: OnCanClose does not occur under Windows NT 3.51 unless the new shell is installed. + + + Occurs when a directory is opened or closed from the dialog. +The OnFolderChange event occurs when the user changes the directory whose contents are displayed in the dialog. This can happen when the user double-clicks a directory, clicks the Up arrow, or uses the list box at the top of the dialog to navigate through the directory structure. +To obtain the path of the currently selected directory, use the ExtractFilePath routine on the FileName property of the Sender. + + + Occurs when file names displayed in the dialog are changed. +The OnSelectionChange event occurs when the user does something to change the list displayed in the dialog. This can include opening the file-selection dialog box, highlighting a file or directory, selecting a new filter, selecting a new directory, or creating a new folder. +The newly selected files can be obtained by reading the value of the FileName or Files properties. The latter property should be consulted if the ofMultiSelect option is included in the dialog's Options. + + + Occurs when the file types displayed in the dialog are changed. +The OnTypeChange event occurs when the user selects a new filter from the Files of Type list box at the bottom of the dialog. + + + Occurs before the dialog adds a file to the file list box. +Write an OnIncludeItem event handler to programmatically filter the items that appear in the shell folder's item list. +This event does not occur unless the Options property includes ofEnableIncludeNotify. + + + + + TSaveDialog displays a "Save As" dialog for saving files. +TSaveDialog displays a modal Windows dialog box for selecting file names and saving files. The dialog does not appear at runtime until it is activated by a call to the Execute method. When the user clicks Save, the dialog closes and the selected file name is stored in the FileName property. + + + Displays the Save As dialog box. +Execute opens the Save As dialog, returning true when the user selects a file name and clicks Save. If the user cancels the save operation, Execute returns a false value. +The code signatures of Execute that appear above are actually overrides of the Execute overloads in the base class Vcl.Dialogs.TCommonDialog.Execute. There is one more overload of Execute for Delphi that appears in the inherited members from TCommonDialog, and this overload takes no input parameters. +The ParentWnd parameter is a window handle of type HWND MSDN. If none is provided, the current form handle is used, accessed from +Vcl.Forms.TApplication.ActiveFormHandle in the global variable Vcl.Forms.Application. + + // Delphi: + if SaveDialog1.Execute then + Memo1.Lines.SaveToFile(SaveDialog1.FileName); + + // C++: + if (SaveDialog1->Execute()) + Memo1->Lines->SaveToFile(SaveDialog1->FileName); + + + + + Class for Vista and newer Windows operating systems style file open dialogs. +This class extends TCustomFileOpenDialog. It allows creating Microsoft Windows Vista (or newer Windows operating systems) style file open dialogs CLSID_FileOpenDialog and implements the IFileOpenDialog interface. + + + TMenuItem describes the properties of an item in a menu. +Use TMenuItem to specify the appearance and behavior of an item in a menu. Each TMainMenu or TPopupMenu component can contain multiple menu items. When a menu is defined at design time, the Menu Designer automatically creates menu item objects for each command on the menu. +The Caption property can be used to define an accelerator key to the menu item of a TMainMenu. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Copies the properties of an object to a destination object. +Vcl.Menus.TMenuItem.AssignTo inherits from System.Classes.TPersistent.AssignTo. All content below this line refers to System.Classes.TPersistent.AssignTo. +Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + Designates methods for storing an object's unpublished data on a stream such as a form file. +Vcl.Menus.TMenuItem.DefineProperties inherits from System.Classes.TComponent.DefineProperties. All content below this line refers to System.Classes.TComponent.DefineProperties. +Designates methods for storing an object's unpublished data on a stream such as a form file. +TComponent overrides the DefineProperties method defined in TPersistent to define "fake" Top and Left properties. These are defined so that components that are not controls can be manipulated at design time. However, the Top and Left properties are hidden, that is, they are not published, because only controls appear at run time. +DefineProperties is virtual; descendent classes can override it. When overriding DefineProperties, be aware that the Ancestor property of Filer might be set, and that this property can determine whether or not it is appropriate to write properties. +DefineProperties is called automatically as part of the component streaming system; do not call it directly. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Initializes the component after the form file has been read into memory. +Vcl.Menus.TMenuItem.Loaded inherits from System.Classes.TComponent.Loaded. All content below this line refers to System.Classes.TComponent.Loaded. +Initializes the component after the form file has been read into memory. +Do not call the protected Loaded method. The streaming system calls this method after it loads the component's form from a stream. +When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself. + +Note: All references to sibling components are resolved by the time Loaded is called. Loaded is the first place that sibling pointers can be used after being streamed in. +As implemented in TComponent, Loaded clears the csLoading flag in the ComponentState property, indicating that the component is no longer loading. + +Warning: Loaded may be called multiple times on inherited forms. It is called every time a level of inheritance is streamed in. Do not allocate memory in an overridden Loaded method without first checking that the memory has not been allocated in a previous call. + + + Forwards notification messages to all owned components. +Vcl.Menus.TMenuItem.Notification inherits from System.Classes.TComponent.Notification. All content below this line refers to System.Classes.TComponent.Notification. +Forwards notification messages to all owned components. +Do not call the Notification method in an application. Notification is called automatically when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, components pass along the notification to their owned components, if any. +A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed. + +Note: Notification is not called for components that are freed implicitly (because their Owner is freed). + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the visual ordering of a child control. +Vcl.Menus.TMenuItem.SetChildOrder inherits from System.Classes.TComponent.SetChildOrder. All content below this line refers to System.Classes.TComponent.SetChildOrder. +Sets the visual ordering of a child control. +SetChildOrder is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to actually implement the ordering. TWinControl uses this ordering information to Z-align the controls. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Iterates through all the menu items of this menu item and updates them. +UpdateItems is called whenever the image list attached to the menu is changed or when OwnerDraw is changed. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates an instance of TMenuItem. +Use Create to create a menu item at runtime. Menu items defined at design time using the Menu designer are created automatically. +AOwner is the component that is responsible for freeing the menu item. It becomes the value of the Owner property. + + + Destroys an instance of TMenuItem. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMenuItem reference is not nil, and only then calls Destroy. + + + Calls the action link's Update method if the menu item is associated with an action link. +InitiateAction calls the action link, if there is one for the menu item, to update the association between the action and the menu item. + + + Inserts a menu item into a specified position in the Items array. +Use Insert to insert a new menu item to the dropdown menu for this menu item. If this menu item is the value of the Items property of a main menu or pop-up menu, Insert inserts an item into that menu. Specify the new menu item to add as the value of the Item parameter, and the position in the Items array as the value of the Index parameter. + + + Removes a menu item from the Items property array. +Call Delete to remove a menu item and all its submenus from a menu. The Index parameter is the index of the item to be deleted, where 0 specifies the first item in the menu, 1 specifies the second item, and so on. +Delete does not free the removed item's memory. To remove an item from the menu and free its memory, call the Free method in the item you want to remove. +To temporarily hide a menu item, without deleting it, use the Visible property. + + + Removes and frees all menu items listed in the Items property. +Use Clear to free all the items listed in the Items property array. + + + Simulates a mouse click. +Click generates an OnClick event, as if the user had clicked the menu item. Unlike a real mouse click, Click does not generate a WM_COMMAND message to the window associated with the menu. +Component writers can override click to provide a different response when the user selects the menu item. + + + Locates a menu item in the Items property array given its caption. +Use Find to locate the menu item in the Items property array with the caption specified by the ACaption parameter. Find ignores accelerator characters when comparing item captions to the ACaption parameter. +Find returns the first menu item in the Items property array with the specified caption. If no item is found, Find returns nil (Delphi) or NULL (C++). + + + Returns the position of a menu item within the Items array. +Call IndexOf to locate a menu item in the submenu headed by this menu item. IndexOf returns 0 for the first menu item, 1 for the second menu item, and so on. If the menu item is not in the submenu, IndexOf returns -1. + +Note: IndexOf may not correspond to the position of the item in the menu the user sees if the menu includes some items that are not visible. + + + Indicates whether the menu item represents a separator bar. +Call IsLine to determine whether the menu item is a separator bar. IsLine checks the Caption of the menu item and returns true if the value of Caption is '-'. Menu items with this Caption appear as separator bars. + + + Enumerates all child components. +Vcl.Menus.TMenuItem.GetChildren inherits from System.Classes.TComponent.GetChildren. All content below this line refers to System.Classes.TComponent.GetChildren. +Enumerates all child components. +GetChildren is used internally in the component streaming system. It is not necessary to call it directly. +GetChildren expects a TGetChildProc routine that receives all enumerated components. +Root represents the owner of the components that will be enumerated. +This method does nothing in TComponent and is expected to be overridden in descendants. + + + Returns a TComponent enumerator. +Vcl.Menus.TMenuItem.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Returns the Image list that supplies an image for the menu item. +Use GetImageList to access the list of images that contains the image for this menu item. The ImageIndex property identifies a specific image from the list that GetImageList returns. +GetImageList first checks the Parent of this menu item for a SubMenuImages property. If the parent menu item does not maintain a list of images, it checks that menu item's parent, and so on until reaching a top-level menu item (a menu item where Parent is not set). If none of the parent menu items has a SubMenuImages property, GetImageList checks the top-level menu for an Images property. +GetImageList returns the first image list it finds. If it doesn't find an image list, GetImageList returns nil (Delphi) or NULL (C++). + + + Returns the parent component of the menu item. +GetParentComponent is called by the streaming system that loads and saves components. It ensures that objects are loaded and saved with their parent objects. GetParentComponent is overridden in descendant classes to return the appropriate parent for their particular type of component. TMenuItem overrides it to identify its associated menu, if it has one, as its parent. + + + Returns the main menu of which the menu item is part. +GetParentMenu returns the menu that contains the menu item. + + + Indicates that the menu item has a parent that is responsible for loading and saving its data. +TMenuItem overrides HasParent to return true, indicating that menu items have a parent. Applications seldom call the HasParent method. It is used by the streaming system that loads and saves forms to determine when another object is responsible for writing a component to a stream. + + + Inserts a separator bar at the beginning of the Items property array. +Use NewTopLine to insert a separator bar at the beginning of the items property array. This is useful when building up submenus dynamically at runtime. +NewTopLine returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + Inserts a separator bar at the end of the Items property array. +Use NewBottomLine to insert a separator bar at the end of the items property array. This is useful when building up submenus dynamically at runtime. +NewBottomLine returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + Inserts a separator bar before a specified item from the Items property array. +Use InsertNewLineBefore to insert a separator bar before the menu item specified by AItem. If AItem is not an item in the Items property array, InsertNewLineBefore raises an exception. +InsertNewLineBefore returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + Inserts a separator bar after a specified item from the Items property array. +Use InsertNewLineAfter to insert a separator bar after the menu item specified by AItem. If AItem is not an item in the Items property array, InsertNewLineAfter raises an exception. +InsertNewLineAfter returns the index of the newly inserted separator item in the Items property array. + +Tip: When inserting separator bars at runtime, it is a good idea to set AutoLineReduction to true so that superfluous separators can be automatically removed. + + + Adds one or more menu items to the end of the Items property array. +Use Add to add new menu items to the dropdown menu for this menu item. If this menu item is the value of the Items property of a main menu or pop-up menu, Add adds the items to the end of the menu. +Specify a single new menu item to add as the value of the Item parameter, or an array of new menu items as the value of the AItems parameter. AItems_Size is the index of the last item in the AItems array (one less than the number of items). + + + Adds one or more menu items to the end of the Items property array. +Use Add to add new menu items to the dropdown menu for this menu item. If this menu item is the value of the Items property of a main menu or pop-up menu, Add adds the items to the end of the menu. +Specify a single new menu item to add as the value of the Item parameter, or an array of new menu items as the value of the AItems parameter. AItems_Size is the index of the last item in the AItems array (one less than the number of items). + + + Removes a menu item from the Items property array +Call Remove to remove a menu item and all its submenus from a menu. The Item parameter is the item to be removed. If Item is not a menu item in the Items array, Remove raises an exception. +Remove does not free the item's memory. To remove an item from the menu and free its memory, call the Free method in the item you want to remove. +To temporarily hide a menu item, without deleting it, use the Visible property. + + + Adjusts the captions of subitems so that every item has an accelerator and there are no duplicate accelerator keys. +Call RethinkHotkeys to adjust the accelerator keys for the items in the Items property and in any submenu of those items. RethinkHotkeys checks for items that do not have an accelerator key or that have duplicate accelerator keys. It then replaces any duplicate accelerators with unique characters and adds accelerator keys to items that don't have them. RethinkHotkeys gives first priority to existing accelerator key mappings, but may change them if necessary to ensure uniqueness. +RethinkHotkeys lets a menu adjust the accelerator keys when the AutoHotkeys property is false. For any menu or submenu that has AutoHotkeys set to true, this adjustment occurs automatically. +RethinkHotkeys returns true if RethinkHotkeys changed the Caption property of any menu items, false otherwise. + + + Removes superfluous separator lines from the Items property array. +Call RethinkLines to remove superfluous separators from the items in the Items property and in any submenu of those items. RethinkLines removes separators that appear at the very beginning or end of a submenu and separators that immediately follow another separator. +RethinkLines lets a menu remove superfluous separators when the AutoLineReduction property is false. For any menu or submenu that has AutoLineReduction set to true, this adjustment occurs automatically. +RethinkLines returns true if RethinkLines removed any menu items, false otherwise. + + + Sets the parent component. +Vcl.Menus.TMenuItem.SetParentComponent inherits from System.Classes.TComponent.SetParentComponent. All content below this line refers to System.Classes.TComponent.SetParentComponent. +Sets the parent component. +SetParentComponent is used internally in the component streaming system. It is not necessary to call it directly. +Derived classes override this method to implement proper handling for parenting. + + + Specifies the Windows Command ID associated with the menu item. +Use Command in an application that directly handles WM_COMMAND messages. When the user selects the menu item, Windows sends a WM_COMMAND to the window associated with the menu. The ItemID of the message contains the value of the Command property of the menu item that was selected. + + + Indicates the Windows menu handle of the drop-down menu associated with the menu item. +Use Handle when calling a Windows API function that requires a menu handle. Handle is only valid if the Count property is greater than 0. + + + Indicates the number of subitems of the menu item. +Read Count to determine the number of subitems listed in the Items property array. When the user clicks on a menu item that has subitems, a dropdown menu appears which displays those subitems. Each subitem can, in turn, contain additional subitems. The Count property counts only the immediate subitems of the menu item. + + + Indicates the index of the menu item within its parent menu. +Use MenuIndex to locate the menu item in the Items property of its parent menu item. Changing this value moves the menu item within its menu. + +Note: MenuIndex may not correspond to the position of the item in the menu the user sees. The menu can include items that are not visible. + + + Identifies the parent menu item of this menu item. +Read Parent to determine the menu item that represents the dropdown menu that contains this menu item. If the menu item is a top level menu item in a main menu or pop-up menu, Parent is the value of that menu's Items property. + + + Designates the action associated with the menu item. +Action designates the action object that is associated with the menu item. Actions can be associated with a menu item by using the action list editor at design-time. Actions are a way of centralizing user responses to commands. + + + Indicates whether the menu item's checked state toggles automatically when the item is clicked. +When AutoCheck is true, then every time the menu item is clicked, the value of the Checked property toggles automatically before the OnClick event occurs. When AutoCheck is false, the application must explicitly set the value of the Checked property (for example, in an OnClick event handler). + + + Determines whether the accelerator keys for submenu items can be reset automatically. +Set AutoHotkeys to indicate whether the accelerator keys for the items in the Items property can be reset if necessary to ensure that every menu item has an accelerator key and no two items have the same accelerator key. This ensures that menu items added dynamically at runtime can have accelerator keys that do not introduce conflicts. TMenuItem tries to preserve all existing accelerator key mappings when adjusting the accelerator keys, but may be forced to change some in order to ensure that every item has a unique accelerator. +Before the menu is displayed, it checks and adjusts the accelerator key mappings if AutoHotkeys is maAutomatic or if AutoHotkeys is maParent and the parent menu item adjusts accelerator key mappings. Otherwise, the menu does not alter the items listed in the Items property, but may adjust the accelerator keys for submenus, depending on the AutoHotkeys property of the menu item that is the parent of the submenu. + +Note: When AutoHotkeys disallows automatic adjustment of accelerator keys, an application can still adjust the menu items by calling the RethinkHotkeys method. AutoHotkeys merely controls whether this adjustment occurs automatically. + + + Determines whether redundant separator bars are automatically removed from the submenu. +Set AutoLineReduction to indicate whether the menu item should automatically ensure that the submenu defined by its Items property does not start or end with a separator bar and that two separator bars do not appear next to each other. This ensures that menus built dynamically at run time do not have separator bars in undesired positions. +Before the menu is displayed, the menu item removes superfluous separator bars if AutoLineReduction is maAutomatic or AutoLineReduction is maParent and the parent menu item removes superfluous separator bars. Otherwise, the menu item does not remove separators from the Items property, but may remove superfluous separators from submenus, depending on the AutoLineReduction property of the menu item that is the parent of the submenu. + +Note: When AutoLineReduction disallows automatic removal of separator bars, an application can still remove superfluous separators by calling the RethinkLines method. AutoLineReduction merely controls whether this adjustment occurs automatically. + + + Designates a bitmap that is drawn for the menu item. +Use Bitmap to provide a custom image that appears next to the caption in the menu item. On owner-draw menus, Bitmap can be used from an OnDrawItem event handler to represent the entire menu item or a portion of the menu item. + +Note: If the ImageIndex property is set and the parent menu has a non-nil (Delphi) or NULL (C++) Images property, the image identified by ImageIndex is used instead of Bitmap. + + + Determines whether the menu item starts a new column in the menu. +Set Break to break a long menu into columns at the item described by this menu item. The value of Break indicates whether the menu is broken into columns, and if so, whether a bar appears between the columns of the parent menu. +The default is mbNone (no breaking into columns). + + + Specifies the text of the menu item. +Set Caption to the string the user sees for this item in the menu. To underline a character in a string, include an ampersand (&) before the character. This type of character is called an accelerator character. If Caption includes an accelerator character, the user can select the menu item by pressing Alt while typing the underlined character. + +Tip: To automatically assign or adjust the accelerator characters in menu item captions, use the RethinkHotkeys method. +Use the Caption property to identify the menu item as a line that separates the menu into parts. Specify a hyphen character (-) as the value of Caption for the menu item to indicate that the menu item is a separator. To separate the menu into multiple columns, use the Break property instead. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Specifies whether a check mark should appear beside the Caption. +Use Checked to allow a menu item to work like a check box. If Checked is true, the menu item appears checked. If Checked is false, the menu item remains unchecked. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Lists the images that can appear beside individual items in a submenu of this menu item. +Use SubMenuImages to supply a set of images that can appear beside items listed in the Items property. Individual menu items set their ImageIndex property to indicate which image in the list appears to the left of the menu item caption. + +Tip: If the application uses action lists, this property can be the value of the command list's Images property. This way, menu items and buttons that do the same thing can display the same image. + + + Specifies whether the menu item is invoked when the parent item is double clicked. +Set Default to specify whether a menu item is the default item in a submenu. Default menu items are executed when the parent item is double-clicked, allowing users to avoid navigating the submenus that contain them. +The default item appears in boldface. A submenu can have only one default item. If the Items list of the parent menu item already contains a default menu item, setting the Default property to true sets the Default property of the previous default item to false. + + + Specifies whether the menu item is enabled. +Use Enabled to enable or disable a menu item. If Enabled is true, the Click method is called when the user selects the item with the mouse. If Enabled is false, the menu item appears dimmed and the user cannot select it. However, calling the Click method works even when Enabled is false. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Identifies the logical group to which the menu item belongs. +Use GroupIndex to control how menus are merged. In applications that contain multiple forms, items from the menus of secondary forms can be merged into the application's main menu as those forms become active. MDI applications always merge the menus of child windows with the main menu of the parent window. +By default, all menu items in a menu bar (main menu) have the same GroupIndex value. To use GroupIndex to merge menus, set the GroupIndex value of each successive menu item to a value equal to or greater than that of the previous menu item. +When a menu item in a menu bar that is merged into the application's main menu has the same GroupIndex value as a menu item in the main menu, the menu item in the application's main menu is replaced by the corresponding menu item. If multiple menu items in the application's main menu have the same GroupIndex value, they can be replaced only by separate menu items from the other form's menu that also have repeated GroupIndex values. Thus, the first main menu item with a given value is replaced by the first item in the second form with that value, the second item in the main form is replaced by the second item in the second form, and so on. +When a menu item in a menu bar that is merged into the application's main menu has a GroupIndex that falls between the GroupIndex values of two adjacent items on the application's main menu, that menu item is inserted between the two adjacent items. If the item's GroupIndex value is greater than all other GroupIndex values in the application's main menu, the item appears at the end of the main menu. If the GroupIndex value is less than all other GroupIndex values in the application's main menu, the menu item appears at the beginning of the main menu bar. +When an object created by an OLE 2.0 server application is activated, the server can try to merge its menus with the menus of the container application. The GroupIndex property is used to replace up to three main menu items with items from the server, in the manner described above. The server application uses the following predefined GroupIndex values to locate menu items to replace: + + + + + +Group + +Index + +Description + + + +Edit + + + +1 + + + +Server menu items for editing the active OLE object + + + + +View + + + +3 + + + +Server menu items for modifying the view of the OLE object. + + + + +Help + + + +5 + + + +Server menu items for accessing the server's online Help. + + + + + +Note: See the documentation for the OLE server for information about whether it attempts menu merge during in-place activation. +GroupIndex can also be used to define groups of menu items that act like radio buttons. To allow menu items to behave like radio buttons, set the RadioItem property to all menu items in the group to true, and assign each menu item the same value of GroupIndex. Checking any menu item in the group will then uncheck the others. + + + Specifies the help context ID associated with the menu item. +Use HelpContext to associate the menu item with a screen in the Help system of the application. Each screen in the Help system should have a unique context ID. When a menu item is selected using the keyboard, pressing F1 displays a Help screen. Which Help screen appears depends on the value of the HelpContext property. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Specifies the text string that can appear when the user moves the mouse pointer over a menu item. +Set Hint to a string that provides more information about the meaning of the menu item than the Caption. The hint text appears in the Status Bar when the user pauses with the mouse over the menu item if Help Hints are enabled (that is, if the Form's and the Application's ShowHint properties are True). It is also available for the code in the application's OnHint event handler. +The value of Hint can specify both a short value for the Help Hint window and a longer string to be used by the OnHint event handler. To provide both a short and a long hint, set Hint to the short string, followed by a vertical bar (|), followed by the long string. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Indicates which image maintained by the parent menu appears next to the menu item. +Set ImageIndex to designate an image that should appear next to the caption when the menu item is drawn. On top-level menu items, ImageIndex specifies a zero-offset index into the Images property of the parent menu (TMenu or TPopupMenu). On submenu items, ImageIndex is the zero-offset index into the parent item's SubMenuImages property. +If the parent menu or item does not maintain a list of images, use the Bitmap property to provide an image for a single menu item. However, any image specified by ImageIndex takes precedence over the Bitmap property. Bitmap is only used when ImageIndex has a negative value or the parent's Images or SubMenuImages property is nil (Delphi) or NULL (C++). + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Displays the name of linked items from the Image Collection. + + + Specifies whether the menu item is mutually exclusive with other menu items in its group. +Use RadioItem to make the menu item behave like a radio button with a group of other menu items. The group of menu items is the set of all menu items in a pop-up or drop-down menu that have the same value of GroupIndex. When RadioItem is true, only one menu item in the group that contains the menu item can be checked at a time. The single selected menu item in the group is indicated by a round dot next to the Caption. + +Note: RadioItem does not automatically select the item when the user clicks it at runtime: you must still explicitly set the Checked property to true in response to the OnClick event. RadioItem simply changes the appearance of the Checked state (from a check mark to a round dot) and automatically unchecks other menu items in the same group when you set the Checked property to true. +RadioItem does not work for the top-level items in a main menu. + +Note: Under Windows NT 3.51, the round dot indicator only appears if the "new shell" has been installed. + + + Shortcut that opens the menu item. +The string representation of this shortcut appears to the right of the menu item in the menu. + +Note: ShortCut is not stored with the menu item if it is supplied by an action. + + + Specifies whether the menu item appears in the menu. +Use Visible to prevent the user from seeing an item in the menu. For example, remove menu items that do not apply to the current component of a pop-up menu in an OnPopup event handler. +If Visible is true, the menu item appears. If Visible is false, the menu item is hidden. + +Note: This property is not stored with the menu item if it is supplied by a TAction object. + + + Occurs when the user clicks menu item. +Write an OnClick event handler to implement the desired behavior for when the user selects the menu item. An advantage of using the OnClick event handler over directly handling WM_COMMAND messages sent when the user selects the menu item, is that only the OnClick event occurs when the Click method is called. + +Note: This event handler is not stored with the menu item if it is supplied by a TAction object. + + + Occurs when an owner-draw menu needs to be drawn. +Write an OnDrawItem event handler to render the image of a menu item in an owner-draw menu. In the event handler, use the Bitmap property or the ImageIndex property to access a bitmap that represents the menu item. + +Note: OnDrawItem will only occur if the parent menu's OwnerDraw property is true or the parent menu's Images property has been set. +Tip: For more precise information about the menu item's state, use the OnAdvancedDrawItem event instead. + + + Occurs when an owner-draw menu needs to be drawn. +Write an OnAdvancedDrawItem event handler to render the image of a menu item in an owner-draw menu. +In the event handler, use the Bitmap property or the ImageIndex property to access a bitmap that represents the menu item. + +Note: OnAdvancedDrawItem will only occur if the parent menu's OwnerDraw property is true or the parent menu's Images property has been set. + + + Occurs on owner-draw menu items to determine menu item size before the menu is drawn. +Write an OnMeasureItem event handler to indicate the size of owner-draw menu items. If the menu item is using a bitmap image, the event handler can use the Bitmap property or the ImageIndex property to access the bitmap to determine its size. + +Note: OnMeasureItem will only occur if the parent menu's OwnerDraw property is true or the parent menu's Images property has been set. + + + + + TMenu is the base type for menu components such as TMainMenu and TPopupMenu. +Use TMenu as a base class when defining a component that represents a collection of menu items. TMenu introduces properties and methods to create a Windows menu that represents a set of menu items, dispatch commands associated with those menu items, and locate the help context id for any of those menu items. + + + Applies the BiDiMode property to the menu when the Windows control is created. +AdjustBiDiBehavior is called automatically when the Windows control for the menu is created. It ensures that the BiDiMode property is properly reflected in the menu if the application is running in a Middle Eastern locale. + + + Generates an OnChange event. +DoChange is called automatically when the properties of any menu items change. The Source parameter specifies the menu item (if any) that changed. The Rebuild parameter indicates whether the change requires the menu to regenerate its items. + + + Updates the menu when the BiDiMode property changes. +Do not call DoBiDiModeChanged. It is called automatically when the menu's BiDiMode property changes to update the menu to reflect the current setting. + + + Returns the value of the Handle property. +GetHandle is the protected implementation of the Handle property. Override this method to change the implementation of the handle property. For example, TMainMenu overrides GetHandle to adjust for menus added by embedded OLE objects. + + + Indicates whether menu items can contain more than simple captions. +IsOwnerDraw returns true when the OwnerDraw property is true or the Images property is not nil (Delphi) or NULL (C++). This is used internally to determine how the menu should be painted. + + + Calls the DoChange method when the menu is first loaded into memory. +Loaded is called automatically immediately after the menu is loaded into memory. It calls the DoChange method to allow any necessary fixup. + + + Responds when the menu changes. +MenuChanged is called automatically when changes occur that affect the structure of the menu. The Sender parameter indicates the object that originates the change. Its value can be nil (Delphi) or NULL (C++). Source indicates which menu item is affected. Rebuild indicates whether the menu must be rebuilt to reflect the change (for example when items are added or deleted). +MenuChanged calls the DoChange method, which generates an OnChange event. + +Note: Changes that affect individual items rather than the menu as a whole trigger the UpdateItems method instead of MenuChanged. For example, when the Images property changes, UpdateItems is called rather than MenuChanged. + + + Responds when components are added or deleted. +TMenu overrides the inherited method to set the Images property to nil (Delphi) or NULL (C++) if the ImageList is deleted. + + + Ensures that the menu item indexes reflect the order in which they are loaded and saved. +SetChildOrder is called automatically when menus are loaded into memory. The Child parameter specifies the child object that was just loaded. The Order parameter specifies the order in which it was loaded. SetChildOrder assigns the MenuIndex for each child to match the order in which the items are loaded. + + + Causes all menu items to update themselves. +UpdateItems is called automatically when changes occur that must be reflected by individual menu items. Changes that affect the menu as a whole trigger the MenuChanged method instead. + + + Returns the caption for an item in the menu. +DoGetMenuString is used internally to obtain menu item captions, given the Windows menu handle. The Menu parameter indicates the menu's handle. The ItemID parameter specifies the menu item whose caption is desired. If the Flag parameter is MF_BYCOMMAND, ItemID is the Command property of the menu item. If Flag is MF_BYPOSITION, ItemID is the 0-based index of the menu item. The caption is returned in a buffer pointed to by the Str parameter. MaxCount indicates the size of that buffer. +Unlike the Windows API function GetMenuString, DoGetMenuString returns the correct caption for owner-draw menu items. + + + Occurs when the menu changes. +Write an OnChange event handler to respond to changes in the menu's structure. OnChange occurs when the menu is loaded into memory, and in response to property changes that affect the menu's structure. + + + Creates an instance of TMenu. +Call Create to create a menu at runtime. Menus placed on forms at design time are created automatically. Create calls the inherited Create method, then sets the initial values for the menu component, including creating an Items property. +The AOwner parameter indicates the component (usually a form) that is responsible for managing the memory associated with the menu. + + + Embarcadero Technologies does not currently have any additional information. + + + Destroys the menu component. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TMenu reference is not nil, and only then calls Destroy. Destroy frees the Items property, and then calls the inherited Destroy method. + + + Calls the Click method of the menu item with the specified value as its Command property. +Call DispatchCommand to simulate a click on the menu item associated with a command ID. If DispatchCommand locates a menu item that matches the command ID, it calls the Click method for that menu item and returns true. If there is no such item, DispatchCommand returns false. + + + Dispatches a pop-up menu command. +Call DispatchPopup to simulate a click on the menu item associated with the pop-up menu handle. If DispatchPopup locates a menu item that matches the pop-up menu handle, it calls the Click method for that menu item and returns true. If there is no such item, DispatchPopup returns false. + + + Locates and returns a menu item. +Call FindItem to locate a menu item in the menu or one of its submenus. The menu item is identified by either a pop-up menu handle, command ID, or menu shortcut value. The Kind parameter specifies how the menu item is to be identified. + + + Executes a callback for child menu items. +GetChildren is called automatically by the streaming system so that child menu items are saved and read with their parent menu. + + + Returns the help context ID associated with a menu item. +Call GetHelpContext to obtain the ID for context-sensitive help on a particular menu item. Identify the menu item as the item that matches the Value property. If ByCommand is true, Value is the Command property of the TMenuItem. If ByCommand is false, Value is the Handle property. + + + Lists the images that can appear beside individual menu items. +Use Images to hold the set of images that can appear beside menu items in the menu. Individual menu items set their ImageIndex property to indicate which image in the list appears to the left of the menu item caption. +Images in the list should be 16x16. + +Tip: If the application uses action lists, this property should be the value of the action list's Images property. This way, menu items and buttons that do the same thing can display the same image. + + + Indicates whether menu items read from right to left. +Call IsRightToLeft to determine the layout of main menu items. IsRightToLeft returns true if the application is running on a system with a Middle Eastern locale and the BiDiMode property is not bdLeftToRight. + + + Dispatches a key message if it represents a shortcut key for an item in the menu. +Call IsShortCut when processing a KeyDown message to identify shortcut keys and trigger the appropriate menu action. IsShortCut decodes the key message passed in the Message parameter. It then encodes the state of the Shift, Control, and Alt keys with the value of the character that was typed to obtain the ShortCut property of a menu item. If IsShortCut locates a menu item associated with the shortcut key combination, it calls the item's Click method and returns true. If no item in the menu has a shortcut corresponding to the message, IsShortCut returns false. + + + Ensures that the menu's layout follows the current settings of the BiDiMode and ParentBiDiMode properties. +ParentBiDiMode changed is called when the menu's BiDiMode property must be updated to reflect the bi-directional mode of its associated control. + + + Ensures that the menu's layout follows the current settings of the BiDiMode and ParentBiDiMode properties. +ParentBiDiMode changed is called when the menu's BiDiMode property must be updated to reflect the bi-directional mode of its associated control. + + + Responds to keyboard input for the menu. +ProcessMenuChar handles keyboard messages from Windows. It checks whether the character typed is an accelerator character from one of the menu's items. If so, ProcessMenuChar executes the menu item (or, if the item is disabled, selects it). If the key is not an accelerator, ProcessMenuChar checks for captions that begin with the character. If there is only one, it is treated like an accelerator. Otherwise, the first item beginning with that character is selected. +When calling ProcessMenuChar programmatically, the User, MenuFlag, and Menu fields of Message parameter must be supplied. + + + Determines whether the accelerator keys for menu items can be reset automatically. +Set AutoHotkeys to indicate whether the menu should automatically ensure that accelerator keys for its items are reset if necessary so that every menu item has an accelerator key and no two items have the same accelerator key. This ensures that menu items added dynamically at runtime can have accelerator keys that do not introduce conflicts. TMenu tries to preserve all existing accelerator key mappings when adjusting the accelerator keys, but may be forced to change some in order to ensure that every item has a unique accelerator. +Before the menu is displayed, the menu checks and adjusts the accelerator key mappings if AutoHotkeys is maAutomatic. When AutoHotkeys is maManual, the menu does not alter the top-level menu items, but may adjust the accelerator keys for submenus, depending on the AutoHotkeys property of the menu item that is the parent of the submenu. +When AutoHotkeys is maManual, an application can still adjust the menu items by calling the Items property's RethinkHotkeys method. AutoHotkeys merely controls whether this adjustment occurs automatically. + +Note: The AutoHotkeys property of a menu is linked to the AutoHotkeys property of the TMenuItems object that implements its Items property. Setting one sets the other. + + + Determines whether redundant separator bars are automatically removed from the menu. +Set AutoLineReduction to indicate whether the menu should automatically ensure that the menu does not start or end with a separator bar and that two separator bars do not appear next to each other. This ensures that menus built dynamically at runtime do not have separator bars in undesired positions. +Before the menu is displayed, it removes superfluous separator bars when AutoLineReduction is maAutomatic. When AutoLineReduction is maManual, the menu does not remove separators from the top-level menu items, but may remove superfluous separators from submenus, depending on the AutoLineReduction property of the menu item that is the parent of the submenu. +When AutoLineReduction is maManual, an application can still remove superfluous separators by calling the Items property's RethinkLines method. AutoLineReduction merely determines whether this adjustment occurs automatically. + +Note: The AutoLineReduction property of a menu is linked to the AutoLineReduction property of the TMenuItems object that implements its Items property. Setting one sets the other. + + + Determines the layout of the menu in Middle East locales. +Set BiDiMode to control the layout of menu items. BiDiMode controls whether the menu items read from left to right or right to left. + + + Provides access to the Windows menu handle for the menu. +Use Handle to call a Windows API function that requires a menu handle. Handle is the handle for the menu that contains only the items described by the Items property. + + + Specifies whether the menu items are drawn by the application. +Set OwnerDraw to true to indicate that the application will draw menu items in an OnDrawItem event handler. When OwnerDraw is true, menu items receive an OnMeasureItem and an OnDrawItem event when they need to be rendered on screen. +Set OwnerDraw to false to accept the default drawing. When OwnerDraw is false, menu items display the caption with an optional image to the left (If the Images and ImageIndex properties are set). +Owner-draw menus are useful for displaying the value that appears when selecting a menu item. For example, in a menu that allows users to choose a color, an owner-draw menu could display rectangles drawn in the designated color, rather than color names. + + + Indicates whether the BiDiMode property is inherited from the control that uses the menu. +By default, ParentBiDiMode is true, indicating that the layout of menu items follows the BiDiMode setting of the associated form or control. Change ParentBiDiMode to false to override the default BiDiMode setting and control the menu's layout independently. + + + Provides access to the handle of the window that uses the menu. +Read WindowHandle to get the window handle of the control that receives WM_COMMAND messages when the user clicks on an item in the menu. When menu items are selected, use this handle in an OnClick event handler to send messages to the control that uses the menu or to make Windows API calls that affect the control. +Set WindowHandle to associate the menu with a control. + + + Describes the elements of the menu. +Use Items to access information about the elements in the menu. Items is a single TMenuItem object that describes the elements of the menu in its own Items property. + +Note: Because Items is the default property of TMenuItem, the Items property of TMenu can be treated as an indexed array of menu items that describe the individual items in the menu. That is, instead of writing +Note: FirstItem�:= Menu1.Items.Items[0]; +Note: you can use +Note: FirstItem�:= Menu1.Items[0]; +Set the Items property at design time by clicking on the Items property in the Property Inspector. The Menu Designer automatically inserts a menu item. As each menu item is entered, outlined regions appear at the possible locations of additional menu items. Click in those regions to specify additional menu items. At runtime, create a TMenuItem that describes the elements of the menu programmatically, and set the Items property of the menu. + + + + + TMainMenu encapsulates a menu bar and its accompanying drop-down menus for a form. +Use TMainMenu to provide the main menu for a form. To begin designing a menu, add a main menu to a form, and double-click the component. +TMainMenu introduces properties and methods for merging the drop-down menus of the main menu with the main menu of another form. +TMainMenu introduces properties and methods for assisting in the menu negotiation process of an OLE container. + +Tip: To create a menu that users can configure at runtime, use the TActionMainMenuBar component with an action manager instead. + + + Responds when the menu changes. +Vcl.Menus.TMainMenu.MenuChanged inherits from Vcl.Menus.TMenu.MenuChanged. All content below this line refers to Vcl.Menus.TMenu.MenuChanged. +Responds when the menu changes. +MenuChanged is called automatically when changes occur that affect the structure of the menu. The Sender parameter indicates the object that originates the change. Its value can be nil (Delphi) or NULL (C++). Source indicates which menu item is affected. Rebuild indicates whether the menu must be rebuilt to reflect the change (for example when items are added or deleted). +MenuChanged calls the DoChange method, which generates an OnChange event. + +Note: Changes that affect individual items rather than the menu as a whole trigger the UpdateItems method instead of MenuChanged. For example, when the Images property changes, UpdateItems is called rather than MenuChanged. + + + Returns the value of the Handle property. +Vcl.Menus.TMainMenu.GetHandle inherits from Vcl.Menus.TMenu.GetHandle. All content below this line refers to Vcl.Menus.TMenu.GetHandle. +Returns the value of the Handle property. +GetHandle is the protected implementation of the Handle property. Override this method to change the implementation of the handle property. For example, TMainMenu overrides GetHandle to adjust for menus added by embedded OLE objects. + + + Combines the main menu of one form with the main menu of another in non-MDI applications. +Call Merge to merge another main menu with this one. Specify the menu you want merged with this menu as the Menu parameter. +For example, to use the main menu of the first form in an application as the main menu for the application, call Merge to merge the main menu of any additional forms in the application with the main menu of the first form. +Depending on the value of the GroupIndex property of menu items on the main menu, the merged menu items can replace menu items on the menu bar, or insert menu items into the menu bar. See GroupIndex for information on how to do these things. +To merge and unmerge main menus automatically when other forms are displayed, change the value of the AutoMerge property to true on all forms whose menus should be merged in. + + + Reverses the merging of two menus in a non-MDI application. +Call Unmerge to remove items from another main menu that were added using the Merge method. The Menu parameter is the merged menu whose items should be removed from the main menu. + + + Populates an OLE menu with items from the main menu. +Call PopulateOle2Menu to merge the menu items with GroupIndex values specified by the Groups parameter into the menu that uses the SharedMenu handle. PopulateOle2Menu appends all menu items in the specified groups to the menu, and increments the corresponding entries in the Widths array for every menu item appended. PopulateOle2Menu is used by OLE containers when merging menus. + +Note: PopulateOle2Menu populates the menu specified by the SharedMenu parameter but does not set this as the OLE menu associated with the menu. + + + Returns the main menu's accelerator table. +Call GetOle2AcceleratorTable to obtain a handle to an accelerator table for all menu items with a GroupIndex value that appears in the Groups parameter. The AccelTable parameter is set to the accelerator table handle, and the AccelCount is set to the number of entries in the table. GetOle2AcceleratorTable is used by OLE containers when merging menus. + + + Associates the handle for an OLE menu with the main menu. +Call SetOle2MenuHandle to temporarily replace the menu of a form with the menu represented by the Handle parameter. To restore the original menu, call SetOle2MenuHandle with the Handle parameter set to 0. SetOle2MenuHandle allows an OLE container to use menu items provided by an OLE server. + + + Determines if the main menus of secondary forms merge with the main menu of the main form in non-MDI applications at runtime. +To merge a form's menus with the main menu in the main form, set the AutoMerge property of each main menu you want merged to true. Make sure that the AutoMerge property of the main menu of the main form (the one other menus are merged into) remains false. How menus merge depends on the value of the GroupIndex property for each menu item. +If the application is an MDI application (the FormStyle properties are set so the main form is a parent form and subsequent forms are child forms), menu merging occurs automatically without using the AutoMerge property. + + + + + TPopupMenu encapsulates the properties, methods, and events of a pop-up menu. +Use TPopupMenu to define the pop-up menu that appears when the user clicks on a control with the right mouse button. To make a pop-up menu available, assign the TPopupMenu object to the control's PopupMenu property. + +Tip: To create a popup menu that users can configure at runtime, use the TStandardMenuPopup component with an action manager instead. +Note: If the popup menu's ParentBiDiMode is true, the popup menu's BiDiMode is set to the BiDiMode of the control that activates it. If a control cannot be found, the BiDiMode is set to the value of the Application object's BiDiMode. The popup menu's BiDiMode affects all of its menu items. + + + Specifies whether the control's alignment is in a right-to-left mode. +Call UseRightToLeftAlignment to determine whether the control's alignment is in a right-to-left mode. This information can be used when painting the control or when responding to mouse events. +UseRightToLeftAlignment returns the setting from the control that activated the popup. If the popup was not activated by a control, UseRightToLeftAlignment returns the setting used in the global Application object. + + + Embarcadero Technologies does not currently have any additional information. + + + Generates an OnPopup event. +DoPopup is called automatically just before the pop-up menu appears to generate an OnPopup event. Override DoPopup in a descendant class to change the event. + + + Used to set starting point coordinates. +SetPopupPoint is used internally to set the coordinates of the point where the pop-up menu will appear. + + + Creates an instance of TPopupMenu. +Call Create to create to create a pop-up menu at runtime. Pop-up menus placed in forms or data modules at design time are created automatically. + + + Destroys an instance of TPopupMenu. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TPopupMenu reference is not nil, and only then calls Destroy. + + + Closes the pop-up menu onscreen. +Call CloseMenu to close the pop-up menu. + + + Displays the pop-up menu onscreen. +Call Popup to bring up the pop-up menu. The menu appears at the screen coordinates indicated by the values (in pixels) of X and Y. + + + Indicates the component that last displayed the popup menu in response to a right mouse click. +Read PopupComponent to determine which control is currently using the popup menu. In applications where multiple controls share the same pop-up menu, use PopupComponent to determine which of them displayed the menu. +Set PopupComponent to associate a control with the menu before calling the Popup method programmatically to bring up the pop-up menu. + + + Indicates the location where the pop-up menu appears. +This public property is used internally to locate the popup menu. Its value is set by the Popup method. + + + Determines where the pop-up menu appears when the user clicks the right mouse button. +Set Alignment to control the placement of the popup menu. Alignment controls whether the menu appears to the left of the mouse, to the right of the mouse, or centered over the mouse. +By default, the menu appears with its top left corner under the mouse (paLeft). + + + Determines whether the pop-up menu appears automatically when the user clicks the right mouse button. +Set AutoPopup to true to cause the pop-up menu to appear automatically when the user clicks the right mouse button on a control that has the pop-up menu specified as its PopupMenu property. The application key present on keyboards specifically designed for 32-bit Windows will also show this menu when pressed. +Set AutoPopup to false if the appearance of the pop-up menu should be controlled programmatically. To display a pop-up menu when AutoPopup is false, use the Popup method. + + + Specifies a context ID for the entire pop-up menu. +Use HelpContext to associate a help screen with the entire pop-up menu. Each screen in the Help system should have a unique context ID. When a component is selected in the application, pressing F1 displays the Help screen associated with the value of HelpContext. +To associate a help screen with the individual items in the pop-up menu, use the HelpContext property of the associated TMenuItem objects. + + + Specifies how the menu appears when it is first displayed. +Use MenuAnimation to specify how the popup menu appears on the screen. The menu can simply appear as a whole, or can slide into view like a window shade being drawn from any edge. + +Note: MenuAnimation only has an effect when running on Windows 98, NT 5.0, or later. + + + Specifies which mouse button activates the popup menu when it is associated with a toolbar button. +Use TrackButton to specify which mouse button activates the popup menu when it is associated with a toolbar button. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs just before the pop-up menu appears. +Write an OnPopup event handler to take specific action just before the pop-up menu appears. For example, use an OnPopup event handler to set the Checked, Enabled, or Visible property of individual items in the menu so that they are appropriate to the PopupComponent. + + + + + TCustomStyleServices is a class that provides access to style functionality. +Use the methods and properties of TCustomStyleServices to get information about a style or to perform painting of custom controls. +Do not instantiate TCustomStyleServices; instead, call the StyleServices function to access the methods and properties of TCustomStyleServices. + + + Triggers the OnThemeChange event. +DoOnThemeChange calls the user-supplied OnThemeChange event, if it exists; otherwise nothing happens. + + + Returns the flags set for the current style. +Call GetFlags to obtain the flags that are set for the current style. +GetFlags is the read implementation for the Flags property. + + + Constructs an object and initializes its data before the object is first used. +Vcl.Themes.TCustomStyleServices.Create inherits from System.TObject.Create. All content below this line refers to System.TObject.Create. +Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + + Resets the application theme. +ApplyThemeChange is called automatically by the TApplication object whenever the operating system theme is changed. + +Note: ApplyThemeChange is used internally by the VCL and should not be called manually by applications. + + + Gets the color reference for a specified TColor. +Use ColorToRGB to convert the Color parameter to its RGB representation. +If Details is not nil, the function returns the system color that is defined for Color under the current style. For example, if Color is clBtnFace, the function returns the system color defined for the button face in the current style, as a TColorRef value. + + + Gets the color reference for a specified TColor. +Use ColorToRGB to convert the Color parameter to its RGB representation. +If Details is not nil, the function returns the system color that is defined for Color under the current style. For example, if Color is clBtnFace, the function returns the system color defined for the button face in the current style, as a TColorRef value. + + + Draws the edge or edges of the rectangle that contains the element in the current style. +Call DrawEdge to draw one or more edges of the given element. +Edge indicates the types of inner and outer edges and Flags specifies the types of borders. + +Note: The first overload of this method is deprecated; use the second overload instead. + + + Draws the edge or edges of the rectangle that contains the element in the current style. +Call DrawEdge to draw one or more edges of the given element. +Edge indicates the types of inner and outer edges and Flags specifies the types of borders. + +Note: The first overload of this method is deprecated; use the second overload instead. + + + Draws the specified element. +Call DrawElement to draw the element specified by Details, using the current style. +R is the rectangle where the element is drawn and ClipRect is a clipping rectangle. + + + Draws the specified element. +Call DrawElement to draw the element specified by Details, using the current style. +R is the rectangle where the element is drawn and ClipRect is a clipping rectangle. + + + Draws an icon over the given element. +Call DrawIcon to draw the image that resides at the Index index in the image list specified by Images. The icon is drawn in the rectangle specified by R, over the element indicated by Details. + + + Draws the background of the given user interface element's parent. +Call DrawParentBackground to draw the background of a user interface element's parent, using the current style. +If OnlyIfTransparent is True, the drawing is performed only if the element is transparent in the current style. Bounds represents the area to be drawn. + + + Draws the background of the given user interface element's parent. +Call DrawParentBackground to draw the background of a user interface element's parent, using the current style. +If OnlyIfTransparent is True, the drawing is performed only if the element is transparent in the current style. Bounds represents the area to be drawn. + + + Draws the background of the given user interface element's parent. +Call DrawParentBackground to draw the background of a user interface element's parent, using the current style. +If OnlyIfTransparent is True, the drawing is performed only if the element is transparent in the current style. Bounds represents the area to be drawn. + + + Draws text over an element, using the current style. +Call DrawText to draw the S string in the rectangle specified by R. The S string has the format and additional options indicated by the Flags and Options parameters. The drawing is performed with the settings of the current style. + +Note: The first overload of this function is deprecated. Use the following two overloads that use TTextFormat to specify the text formatting. + + + Draws text over an element, using the current style. +Call DrawText to draw the S string in the rectangle specified by R. The S string has the format and additional options indicated by the Flags and Options parameters. The drawing is performed with the settings of the current style. + +Note: The first overload of this function is deprecated. Use the following two overloads that use TTextFormat to specify the text formatting. + + + Draws text over an element, using the current style. +Call DrawText to draw the S string in the rectangle specified by R. The S string has the format and additional options indicated by the Flags and Options parameters. The drawing is performed with the settings of the current style. + +Note: The first overload of this function is deprecated. Use the following two overloads that use TTextFormat to specify the text formatting. + + + Gets the background rectangle of the content area of the element. +Call GetElementContentRect to retrieve the rectangle that contains the background area of a control, when styles are enabled. +Details represents the user interface element from which the information is being retrieved. + + + Determines the color of the element specified by Details. +GetElementColor determines the color value used for the property determined by ElementColor. + + + Determines the margins of the element in the current style. +Call GetElementMargins to retrieve the margins of the control specified by Details. + + + Determines the margins of the element in the current style. +Call GetElementMargins to retrieve the margins of the control specified by Details. + + + Determines the region of the element in the current style. +Call GetElementRegion to obtain the region of the element, bounded by the given rectangle. + + + Determines the region of the element in the current style. +Call GetElementRegion to obtain the region of the element, bounded by the given rectangle. + + + Determines the size for the specified part of a control. +Call GetElementSize to obtain the size of the rectangle that contains the part of the control specified by Details. +ElementSize represents the type of size to be returned: minimum, actual, or stretch. + + + Determines the size for the specified part of a control. +Call GetElementSize to obtain the size of the rectangle that contains the part of the control specified by Details. +ElementSize represents the type of size to be returned: minimum, actual, or stretch. + + + Returns the color defined in the style for the element specified by Color. +Use GetStyleColor to obtain the color defined for a certain control. +For example, if Color is scButtonPressed, GetStyleColor returns the color assigned for the button when it is pressed. +The style colors give you access to the colors used for controls in the current style. There are two categories of style colors. The first category includes colors used for control parts that are rendered directly from an image. In this case, the style color offers you a way to access the color of that image and is purely informational. The second category includes the colors used for controls that are rendered from code at run time (Panel, ListBox, Grid, and so on). + + + Returns the font color for the element specified by Font. +Call GetStyleFontColor to obtain the font color defined in the current style for a specific part and state of a control. +For example, if Font is sfEditBoxDisabled, GetStyleFontColor returns the color of the text in an edit box, when the edit box is disabled. + + + Returns the system color defined in the current style. +The current style has a set of colors defined for system color constants that resemble the style colors. For instance, you can call GetSystemColor with clBtnFace to obtain the styled color of a button face. + + + Returns the rectangle that contains the given text, drawn in the current style. +Call GetTextExtent to obtain the rectangle required to draw the given text with the specified formatting in the current style. + + + Returns the rectangle that contains the given text, drawn in the current style. +Call GetTextExtent to obtain the rectangle required to draw the given text with the specified formatting in the current style. + + + Embarcadero Technologies does not currently have any additional information. + + + Determines whether the given element has transparent parts. +Call HasTransparentParts to check whether the element specified by Details has transparent parts in the current style. + + + Loads a style from the specified file. +Call LoadFromFile to load a style from the specified file. + + + Draws the border of a control. +Call PaintBorder to draw the border of a control using the current style. + + + Saves the current style settings to the specified file. +Call SaveToFile to save the current style in the specified filename. + + + Checks whether the provided style is a valid style. +Call IsValidStyle to verify whether the style specified by Stream is a valid style. + + + Checks whether the provided style is a valid style. +Call IsValidStyle to verify whether the style specified by Stream is a valid style. + + + Determines whether the operating system supports styles. +Use Available to check whether the operating system supports styles. + + + Determines whether styles are enabled for the current application. +Use Enabled to check whether the current application has styles enabled. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the flags set for the current style. +Use Flags to obtain the flags that are set for the current style. + + + Determines whether the current style is a system style. +IsSystemStyle returns True if the current style is a default operating system style, and False if it is a custom style. + + + Returns the name of the current style. +Use Name to obtain a string that represents the name of the current style. This is the same name you can use with StyleManager.SetStyle to activate the style. + + + Occurs when the operating system theme changes. +Use the OnThemeChange event to implement custom processing that should occur whenever the operating system theme changes. + + + + + + + + Get client height of the system control + + + Get client width of the system control + + + + + + + + special property to use CallDefaultProc method + + + + + Handles styles-related operations. +Use TStyleManager to: + +Register and unregister style classes. +Set the active style. +Load styles from files or resources. +Retrieve styles and their descriptors. +Replace and retrieve the style engine. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Handles a message from a control. +HandleMessage sends the message received from a control to the style engine. + + + +Parameter + +Meaning + + +Control + +The component that passes the message. + + +Message + +The message that is passed to the engine. + + +DefWndProc + +The default window procedure to be called for the message. + + + Initializes data about styles and style engines. + +Note: This function is reserved for internal use only. Do not call it directly. + + + Checks whether a file represents a valid style. +IsValidStyle returns True if the file specified by FileName is recognized as a valid style. +The second overload of IsValidStyle returns, in addition, information about the style. + + + +Parameter + +Meaning + + +FileName + +The file name to be verified whether it represents a valid style. + + +StyleInfo + +A record that contains the information about the style. + + + Checks whether a file represents a valid style. +IsValidStyle returns True if the file specified by FileName is recognized as a valid style. +The second overload of IsValidStyle returns, in addition, information about the style. + + + +Parameter + +Meaning + + +FileName + +The file name to be verified whether it represents a valid style. + + +StyleInfo + +A record that contains the information about the style. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Loads a style from the specified file. +Note that LoadFromFile does not automatically switch to the loaded style. To do that, call the SetStyle method. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Loads a style from the specified resource. +Note that LoadFromResource does not automatically switch to the loaded style. To do that, call the SetStyle method. + + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResType + +A string that identifies the type of resource. + + + Loads a style from the specified resource. +Note that LoadFromResource does not automatically switch to the loaded style. To do that, call the SetStyle method. + + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResType + +A string that identifies the type of resource. + + + Notifies the style engine of an event that occured. + + + +Parameter + +Meaning + + +Operation + +The action that is performed. + + +Data + +The data on which the operation is executed. + + + Registers the instance of a style specified by the Style parameter. + + + Registers a style class with extension, description, and resource type. + + + +Parameter + +Meaning + + +Extension + +A string that specifies the extension used with the style files. + + +Description + +A string that specifies a description of the style. + + +ResourceType + +A string associated with the resource type. + + +StyleClass + +Specifies the style class to be registered. + + + Registers a style class with extension, description, and resource type. + + + +Parameter + +Meaning + + +Extension + +A string that specifies the extension used with the style files. + + +Description + +A string that specifies a description of the style. + + +ResourceType + +A string associated with the resource type. + + +StyleClass + +Specifies the style class to be registered. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the active style by name, instance, or handle. + + + +Parameter + +Meaning + + +Name + +The name of the style to be set as the active style. + + +Style + +A style instance to be set as the active style. + + +Handle + +The handle of the style to be set as the active style, as returned by the LoadFromFile or LoadFromResource method. + + + Sets the active style by name, instance, or handle. + + + +Parameter + +Meaning + + +Name + +The name of the style to be set as the active style. + + +Style + +A style instance to be set as the active style. + + +Handle + +The handle of the style to be set as the active style, as returned by the LoadFromFile or LoadFromResource method. + + + Sets the active style by name, instance, or handle. + + + +Parameter + +Meaning + + +Name + +The name of the style to be set as the active style. + + +Style + +A style instance to be set as the active style. + + +Handle + +The handle of the style to be set as the active style, as returned by the LoadFromFile or LoadFromResource method. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Loads a style from a resource without raising an exception. +TryLoadFromResource returns True if the style was successfully loaded, or False otherwise. + + + +Parameter + +Meaning + + +Instance + +The instance handle of the loaded resource. + + +ResourceName + +The string associated with the resource. + + +ResType + +A string that identifies the type of resource. + + +Handle + +The handle of the loaded style. + + + Sets the style specified by name as the active style, without raising an exception. +TrySetStyle returns True if the style was successfully set as the active style, and False otherwise. + + + +Parameter + +Meaning + + +Name + +A string that specifies the name of the style to be set as active. + + +ShowErrorDialog + +Specifies whether an error dialog box is shown if the style cannot be set as the active style. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Uninitializes data about styles and style engines. + +Note: This function is reserved for internal use only. Do not call it directly. + + + Embarcadero Technologies does not currently have any additional information. + + + Unregisters a style class specified by the StyleClass parameter. + + + Unregisters the style engine specified by the AEngineClass parameter. + + + Specifies whether the style manager should automatically load all styles of registered types or not. By default, AutoDiscoverStyleResources is set to True. Set it to False if you want to turn off automatic discovery. + + + Returns the current style that is set for the application. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the style engine is enabled. Enabled returns True if the style engine is active, and False otherwise. + + + Returns an instance of the current style engine. + + + Use it to get or set the reference to the style engine class. + + + Returns the flags of the active style. + + + Indicates whether the active style is a custom style. IsCustomStyleActive returns True if the active style is a custom style, and False if the active style is a system style. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns an array with the descriptors of all the registered style classes. + + + Returns an array with the names of all the registered style classes. + + + Returns the native system style, for example, the Windows theme. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the type of border to use for the forms in the application. +Use the FormBorderStyle property to specify whether to use the system's border or the current style's border for the forms in the current application. +By default, the border of the current style is used. + + + Enables the animation effect in controls when custom styles are used. +Set the AnimationOnControls property to True to enable the fade effect in controls when the mouse enters or leaves the area of the control. +By default, the value of AnimationOnControls is set to False. + + + Embarcadero Technologies does not currently have any additional information. + + + The SystemHooks property allows displaying styled menus, common dialogs and tooltips. +When a style is applied to the VCL application using the TStyleManager, the following values show styled menus, common dialogs and tooltips, according to the set style. +The property includes these values by default: + +shMenus shows styled menus. +shDialogs shows styled common dialogs. (Only for Seattle version and superior). +shToolTips shows tool tips. (Only for Seattle version and superior). +To enable / disable a system hook, just add or remove the value from the enumerated property. +For example: + +Use a TCheckBox to show a styled dialog. +Use the OnClick event from a Button to execute a TOpenDialog component. +Note: Find the Common Dialog components under the Dialogs category of the Tool Palette. + +For Delphi: + +procedure TForm1.CheckBox1Click(Sender: TObject); +begin + if CheckBox1.Checked then + //When checking the checkbox, the value is added to the property and common dialog ares styled. + TStyleManager.SystemHooks := TStyleManager.SystemHooks + [shDialogs] + else + //When unchecking the checkbox, the value is removed from the property and the style does not apply to common dialogs. + TStyleManager.SystemHooks := TStyleManager.SystemHooks - [shDialogs] +end; + +procedure TForm2.Button2Click(Sender: TObject); +begin + OpenDialog1.Execute; //Opens the dialog. +end; + + + +For C++: + +void __fastcall TForm1::CheckBox1Click(TObject *Sender) +{ +if (CheckBox1->Checked) { + //One possible way to add the value. + TStyleManager::SystemHooks = TStyleManager::SystemHooks + (TStyleManager::TSystemHooks() << TStyleManager::TSystemHook::shDialogs); + //Another possible way to add the value. + StyleManager::SystemHooks = TStyleManager::SystemHooks << TStyleManager::TSystemHook::shDialogs; } +else { + //One possible way to remove the value. + TStyleManager::SystemHooks = TStyleManager::SystemHooks - (TStyleManager::TSystemHooks() << TStyleManager::TSystemHook::shDialogs); + //Another possible way to add the value. + TStyleManager::SystemHooks = TStyleManager::SystemHooks >> TStyleManager::TSystemHook::shDialogs; } +} + +void __fastcall TForm1::Button1Click(TObject *Sender) +{ + OpenDialog1->Execute(); //Opens the dialog. +} + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Eliminates flickering in VCL Style Forms. +Set it to TRUE in project sources for the following scenarios: + +TPanel bevel and caption. +TGraphicControl subtypes, such as TSplitter, TLabel or TImage, on TPanels. +TListBox when you move the horizontal splitter above. +PageControl for the horizontal scroll buttons. +Note: The TListBox does not flicker when resizing the window. + + + Embarcadero Technologies does not currently have any additional information. + + + + + Defines spin button properties and behavior + + + Defines width of arrow + if value is 0 then arrow has width, which adjusts automatically + + + Defines width of button + + + Defines placement of spin button + + + Defines arrow color for normal state + + + Defines arrow color for hot state + + + Defines arrow color for pressed state + + + Defines arrow color for disabled state + + + Defines timer inerval to repeat click of the button + + + Defines visiblity of dividers if Placement is nbspInline + + + + + TCustomEdit is the base class from which all edit-box and memo controls are derived. +Vcl.NumberBox.TCustomNumberBox inherits from Vcl.StdCtrls.TCustomEdit. All content below this line refers to Vcl.StdCtrls.TCustomEdit. +TCustomEdit is the base class from which all edit-box and memo controls are derived. +TCustomEdit encapsulates the behavior common to all components for editing text by introducing methods and properties that provide: +Basic text editing functions such as selecting text, modifying selected text, and case conversions. +Ability to respond to changes in the contents of the text. +Access control of the text for making it read-only or introducing a password character to hide the actual value. +Do not create instances of TCustomEdit. Use TCustomEdit as a base class when declaring control objects that permit the user to enter or modify text. Properties and methods of TCustomEdit provide basic behavior that descendant classes inherit as well as behavior that components can override to customize their behavior. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Resize and reposition children and self. +Vcl.NumberBox.TCustomNumberBox.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Responds to key press events. +Vcl.NumberBox.TCustomNumberBox.KeyDown inherits from Vcl.Controls.TWinControl.KeyDown. All content below this line refers to Vcl.Controls.TWinControl.KeyDown. +Responds to key press events. +When a windowed control receives a key-down message (WM_KEYDOWN) from Windows, its message handler calls the DoKeyDown method. If DoKeyDown determines that the control should, in fact, process the character, it calls KeyDown, passing the key code and shift-key state in the Key and Shift parameters, respectively. +KeyDown calls any event handler attached to the OnKeyDown event. Override KeyDown to provide other responses in addition to the event handler call. +The Key parameter is the key on the keyboard. For nonalphanumeric keys, you must use WinAPI virtual key codes to determine the key pressed. For more information see Representing Keys and Shortcuts. +The Shift parameter indicates whether the SHIFT, ALT, or CTRL keys are combined with the keystroke. +Either KeyDown or the OnKeyDown event handler it calls can suppress further processing of a key by setting the Key parameter to zero. + + + Responds to keyboard input. +Vcl.NumberBox.TCustomNumberBox.KeyPress inherits from Vcl.Controls.TWinControl.KeyPress. All content below this line refers to Vcl.Controls.TWinControl.KeyPress. +Responds to keyboard input. +When a windowed control receives a key-press message (WM_CHAR) from Windows, its message handler calls the DoKeyPress method. If DoKeyPress determines that the control should, in fact, process the character, it calls KeyPress, passing the key code in the Key parameter. +KeyPress calls any event handler attached to the OnKeyPress event. Override KeyPress to provide other responses in addition to the event handler call. +Either KeyPress or the OnKeyPress event handler it calls can suppress further processing of a character by setting the Key parameter to zero. + +Note: The Key parameter is the character represented by the key that is pressed, not a Windows virtual key code. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Generates an OnChange event. +Vcl.NumberBox.TCustomNumberBox.Change inherits from Vcl.StdCtrls.TCustomEdit.Change. All content below this line refers to Vcl.StdCtrls.TCustomEdit.Change. +Generates an OnChange event. +Applications do not call the Change method directly. It is triggered automatically by Windows events. Change is exposed as a protected method so that derived classes can make additional responses when the text changes beyond invoking the OnChange event handler. If Derived classes that override the Change method do not call the inherited method, the OnChange event handler will not be called. + + + Initializes the control after it is loaded from a stream. +Vcl.NumberBox.TCustomNumberBox.Loaded inherits from Vcl.Controls.TControl.Loaded. All content below this line refers to Vcl.Controls.TControl.Loaded. +Initializes the control after it is loaded from a stream. +Do not call Loaded. The VCL streaming system calls Loaded automatically after the control's form is loaded into memory so that the control can complete any initializations that depend on other objects in the form. +Loaded overrides the inherited method in order to initialize the control from its associated Action. To change the properties the control copies from its action, override the ActionChange method. + + + Creates an instance of TCustomEdit. +Vcl.NumberBox.TCustomNumberBox.Create inherits from Vcl.StdCtrls.TCustomEdit.Create. All content below this line refers to Vcl.StdCtrls.TCustomEdit.Create. +Creates an instance of TCustomEdit. +Call Create to create and initialize an instance of TCustomEdit. +AOwner is another component, typically the form, that is responsible for freeing the edit control. It becomes the value of the Owner property. +Derived objects that override the Create method should call the inherited Create before performing any additional initialization. + + + Destroys an instance of TWinControl. +Vcl.NumberBox.TCustomNumberBox.Destroy inherits from Vcl.Controls.TWinControl.Destroy. All content below this line refers to Vcl.Controls.TWinControl.Destroy. +Destroys an instance of TWinControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TWinControl reference is not nil, and only then calls Destroy. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TNumberBox is a numeric input control that supports the input of integer numbers, floating point numbers with a given set of decimal digits and proper formatting, and currency values. + + + TCanvas provides an abstract drawing space for objects that must render their own images. +Use TCanvas as a drawing surface for objects that draw an image of themselves. Standard window controls such as edit controls or list boxes do not require a canvas, as they are drawn by the system. +TCanvas provides properties, events, and methods that assist in creating an image by: + +Specifying the type of brush, pen, and font to use. +Drawing and filling a variety of shapes and lines. +Writing text. +Rendering graphic images. +Enabling a response to changes in the current image. +TCanvas has two descendants, TControlCanvas and TMetafileCanvas, which assist in drawing images of controls and in creating metafile images for objects. + + + Represents the getter method for the CanvasOrientation property. +GetCanvasOrientation is called each time the value of the CanvasOrientation is read. + + + Represents the getter method for the ClipRect property. +GetClipRect is called each time the value of ClipRect is read. + + + Represents the getter method for the PenPos property. +GetPenPos is called each time the value of PenPos is read. + + + Represents the getter method for the Pixels property. +GetPixel is called each time the color of a pixel in the Pixels property is read. + + + Represents the getter method for the Handle property. +GetHandle is called each time the value of the Handle property is read. GetHandle uses the RequiredState method to make sure that the canvas has a valid handle allocated. + + + Represents the setter method for the Brush property. +SetBrush is called each time the value of the Brush property is changed. + + + Represents the setter method for the Font property. +SetFont is called each time the value of the Font property is changed. + + + Represents the setter method for the Handle property. +SetHandle is called each time the value of the Handle property is changed. SetHandle makes sure to deallocate all associated graphical objects before changing the handle. + + + Represents the setter method for the Pen property. +SetPen is called each time the value of the Pen property is changed. + + + Represents the setter method for the PenPos property. +SetPenPos is called each time the value of the PenPos property is changed. + + + Represents the setter method for the Pixels property. +SetPixel is called each time the color of a pixel in the Pixels property is changed. + + + Allocates a new handle for the canvas. +CreateHandle is called automatically by the canvas when a handle is required. In TCanvas, CreateHandle simply returns without allocating a handle. CreateHandle is supposed to be overridden in descending classes, which, in certain conditions, allocate handles. +For example, TControlCanvas returns the HDC (Windows Device Context handle) for the control the canvas is associated to. + + + Changes the current state of the canvas to meet the given requirements. +RequiredState ensures that a canvas meets a set of given requirements. If the requirements are not met, the canvas initializes its internal structures so that the requirements are met after the call to RequiredState is completed. +RequiredState verifies that the Pen, Brush and Font objects are created and initialized. RequiredState also makes sure that the canvas has a handle allocated. + + + Creates an instance of TCanvas. +Call Create to instantiate a TCanvas object at runtime. Create allocates memory for the instance of TCanvas and creates the TFont, TBrush and TPen objects for the Font, Brush, and Pen properties. Create also initializes the CopyMode to cmSrcCopy. + + + Destroys an instance of TCanvas. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TCanvas object is not nil and only then calls Destroy. + + + Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle. +Use Arc to draw an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4). + +Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. +On NT or Windows 2000, the drawing direction can be changed to clockwise using the Windows API call SetArcDirection. + + + Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle. +Vcl.Graphics.TCanvas.ArcTo inherits from Vcl.Graphics.TCustomCanvas.ArcTo. All content below this line refers to Vcl.Graphics.TCustomCanvas.ArcTo. +Draws an arc on the image along the perimeter of the ellipse bounded by the specified rectangle. +Override the ArcTo method (or just use Arcto from descendant classes) to implement drawing of an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4). +This procedure draws lines by using the current pen and updates the value of PenPos to the value of the last endpoint. + + + Draws an arc on the image along the perimeter of the circle defined by the parameters. +The AngleArc method draws a line from the current position to the starting point of the arc and then a counterclockwise circular arc to the arc endpoint. The arc traverses the perimeter of a circle whose center lies at (X,Y) and whose radius is Radius. The arc is drawn following the perimeter of the circle, counterclockwise, from the StartAngle with a sweep angle of SweepAngle. +If the sweep angle is greater than 360 degrees, the entire circle is drawn and part of the arc is drawn multiple times. +The current position is updated to the arc endpoint. + + + Copies a portion of a bitmap onto a rectangle on the canvas, replacing one of the colors of the bitmap with the brush of the canvas. +Use BrushCopy to achieve special effects such as making the copied image partially transparent. BrushCopy is provided mainly for backward compatibility. Use a TImageList instead of BrushCopy. +Dest specifies the rectangular portion of the canvas that will receive the copy of the bitmap. Bitmap specifies the graphic to copy from. Source specifies the rectangular area of Bitmap to copy. Color specifies the color in Bitmap to replace with the Brush of the canvas. +To use BrushCopy to make the copied image partially transparent, specify the color of the surface of the canvas (clBackground for example) as the Color of the Brush property, then call BrushCopy. + + + Draws a closed figure represented by the intersection of a line and an ellipse. +Use Chord to create a shape that is defined by an arc and a line that joins the endpoints of the arc. The chord consists of a portion of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The ellipse is bisected by a line that runs between the points (X3,Y3) and (X4,Y4). +The perimeter of the chord runs counter clockwise from (X3, Y3), counterclockwise along the ellipse to (X4,Y4), and straight back to (X3,Y3). If (X3,Y3) and (X4,Y4) are not on the surface of the ellipse, the corresponding corners on the chord are the closest points on the perimeter that intersect the line. The outline of the chord is drawn using the value of Pen, and the shape is filled using the value of Brush. + +Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. +On NT, the drawing direction can be changed to clockwise using the Windows API call SetArcDirection. + + + Copies part of an image from another canvas into the canvas. +Use CopyRect to transfer part of the image on another canvas to the image of the TCanvas object. Dest specifies the rectangle on the canvas where the source image will be copied. The Canvas parameter specifies the canvas with the source image. Source specifies a rectangle bounding the portion of the source canvas that will be copied. +The portion of the source canvas is copied using the mode specified by CopyMode. + + + Renders the graphic specified by the Graphic parameter on the canvas at the location given by the coordinates (X, Y). +Call Draw to draw a graphic on the canvas. Draw calls the Draw method of the graphic. The image is rendered into a rectangle determined by the size of the graphic, with the upper left corner at the point (X, Y). +Graphics can be bitmaps, icons, or metafiles. If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. + + + Renders the graphic specified by the Graphic parameter on the canvas at the location given by the coordinates (X, Y). +Call Draw to draw a graphic on the canvas. Draw calls the Draw method of the graphic. The image is rendered into a rectangle determined by the size of the graphic, with the upper left corner at the point (X, Y). +Graphics can be bitmaps, icons, or metafiles. If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. + + + Draws a rectangle in the style used to indicate that the object inside the rectangle has focus. +Call DrawFocusRect for the perimeter of the image of a control when the control gets or loses input focus. Because DrawFocusRect uses an XOR function, calling it a second time while specifying the same rectangle removes the rectangle from the screen. +The rectangle this function draws cannot be scrolled. To scroll an area containing a rectangle drawn by DrawFocusRect, call DrawFocusRect to remove the rectangle from the screen, scroll the area, and then call DrawFocusRect to draw the rectangle in the new position. + + + Draws the ellipse defined by a bounding rectangle on the canvas. +Call Ellipse to draw a circle or ellipse on the canvas. Specify the bounding rectangle either by giving: + +The top left point at pixel coordinates (X1, Y1) and the bottom right point at (X2, Y2). +A TRect value.If the bounding rectangle is a square, a circle is drawn.The ellipse is outlined using the value of Pen, and filled using the value of Brush.Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. + + + Fills the specified rectangle on the canvas using the current brush. +Use FillRect to fill a rectangular region using the current brush. The region is filled including the top and left sides of the rectangle, but excluding the bottom and right edges. + + + Fills an area of the canvas using the current brush. +Use FloodFill to fill a possibly non-rectangular region of the image with the value of Brush. The boundaries of the region to be filled are determined by moving outward from the point (X,Y) until a color boundary involving the Color parameter is encountered. +X and X are the coordinates on the canvas where filling starts. +Color is the color that defines the boundary of the region to fill. Its interpretation depends on the value of FillStyle. +FillStyle specifies whether the region is defined by all pixels with the same value as Color, or all points with a different value. + +Tip: Use the Pixels property to get the exact value of the color at the point (X,Y) when using a FillStyle of fsSurface. Similarly, when FillStyle is fsBorder, use Pixels to get the exact value of the boundary color if a point on the boundary is known. + + + Draws a rectangle using the Brush of the canvas to draw the border. +Use FrameRect to draw a 1 pixel wide border around a rectangular region. FrameRect does not fill the interior of the rectangle with the Brush pattern. +To draw a boundary using the Pen instead, use the Polygon method. + + + Indicates whether the TCanvas object has acquired a handle to a device context. +Use HandleAllocated to determine whether the Handle property is set to an HDC value. HandleAllocated indicates whether the canvas has acquired a device context. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, TCanvas automatically allocates a new device context and returns its handle if the property had not been previously set. + + + Draws a line on the canvas from PenPos to the point specified by X and Y, and sets the pen position to (X, Y). +Use LineTo to draw a line from PenPos up to, but not including the point (X,Y). LineTo changes the value of PenPos to (X,Y). +The line is drawn using Pen. + +Note: If the current Pen does not have a style of psSolid, the line is drawn with a background specified by the current brush. + + + Changes the current drawing position to the point (X,Y). +Use MoveTo to set the value of PenPos before calling LineTo. Calling MoveTo is equivalent to setting the PenPos property. + + + Draws a pie-shaped section of the ellipse bounded by the rectangle (X1, Y1) and (X2, Y2) on the canvas. +Use Pie to draw a pie-shaped wedge on the image. The wedge is defined by the ellipse bounded by the rectangle determined by the points (X1, Y1) and (X2, Y2). The section drawn is determined by two lines radiating from the center of the ellipse through the points (X3, Y3) and (X4, Y4). +The wedge is outlined using Pen, and filled using Brush. + +Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768. + + + Draws a series of lines on the canvas connecting the points passed in and closing the shape by drawing a line from the last point to the first point. +Use Polygon to draw a closed, many-sided shape on the canvas, using the value of Pen. After drawing the complete shape, Polygon fills the shape using the value of Brush. +The Points parameter is an array of points that give the vertices of the polygon. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +The first point is always connected to the last point. + +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the Polygon method. For example, to form a polygon using the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.Polygon(Slice(PointArray, 10)); + +To draw a polygon on the canvas, without filling it, use the Polyline method, specifying the first point a second time at the end. + + + Draws a series of lines on the canvas with the current pen, connecting each of the points passed to it in Points. +Use Polyline to connect a set of points on the canvas. If you specify only two points, Polyline draws a single line. +The Points parameter is an array of points to be connected. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the Polyline method. For example, to form a line connecting the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.Polyline(Slice(PointArray, 10)); + +Calling the MoveTo function with the value of the first point, and then repeatedly calling LineTo with all subsequent points will draw the same image on the canvas. However, unlike LineTo, Polyline does not change the value of PenPos. + + + Draws a set of Bezier curves. +Use PolyBezier to draw cubic Bezier curves using the endpoints and control points specified by the Points parameter. The first curve is drawn from the first point to the fourth point, using the second and third points as control points. Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point. +The Points parameter gives the endpoints to use when generating the Bezier curves. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +This procedure draws lines by using the current pen. + +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the PolyBezier method. For example, to form a Bezier curve using the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.PolyBezier(Slice(PointArray, 10)); + +Control points after a[Index+3] are ignored. Nothing happens if there aren't enough control points. + + + Draws a set of Bezier curves and updates the value of PenPos. +Use PolyBezierTo to draw cubic Bezier curves using the endpoints and control points specified by the Points parameter. The first curve is drawn from the first point to the fourth point, using the second and third points as control points. Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point. +The Points parameter gives the endpoints to use when generating the Bezier curves. + +Note: The Points_Size parameter is the index of the last point in the array (one less than the total number of points). +This procedure draws lines by using the current pen and updates the value of PenPos to the value of the last endpoint. + +Note: In Delphi, you can use the Slice function to pass a portion of an array of points to the PolyBezierTo method. For example, to form a Bezier curve using the first ten points from an array of 100 points, use the Slice function as follows: +Canvas.PolyBezierTo(Slice(PointArray, 10)); + + + Draws a rectangle on the canvas. +Use Rectangle to draw a rectangle using Pen and fill it with Brush. Specify the rectangle's coordinates in one of two ways: +Giving four coordinates that define the upper left corner at the point (X1, Y1) and the lower right corner at the point (X2, Y2). +Using a TRect type. +To fill a rectangular region without drawing the boundary in the current pen, use FillRect. To outline a rectangular region without filling it, use FrameRect or Polygon. To draw a rectangle with rounded corners, use RoundRect. + + + Deselects the Pen, Brush, and Font from the device context. +Call Refresh to return the HDC used by the canvas to a default state. Refresh does not change the values of the Font, Brush, or Pen properties. Calling any of the drawing methods of the canvas after calling Refresh will reselect the Font, Brush, or Pen into the HDC if it is used by the drawing method. + + + Draws a rectangle with rounded corners on the canvas. +Use RoundRect to draw a rounded rectangle using Pen and fill it with Brush. The rectangle will have edges defined by the points (X1,Y1), (X2,Y1), (X2,Y2), (X1,Y2), but the corners will be shaved to create a rounded appearance. The curve of the rounded corners matches the curvature of an ellipse with width X3 and height Y3. +To draw an ellipse instead, use Ellipse. To draw a true rectangle, use Rectangle. + + + Draws the graphic specified by the Graphic parameter in the rectangle specified by the Rect parameter. +Call StretchDraw to draw a graphic on the canvas so that the image fits in the specified rectangle. StretchDraw calls the Draw method of the graphic. The graphic object determines how to fit into the rectangle. This may involve changing magnification and/or aspect ratio. +To render the graphic in its natural size, use the Draw method, instead. +If the graphic is a TBitmap object, the bitmap is rendered using the value of CopyMode. + +Note: If the graphic is an icon, it is not stretched. + + + Returns the width and height, in pixels, of a string rendered in the current font. +Use TextExtent to determine the space a string will occupy in the image. Other elements in the image such as lines, boxes, or additional lines of text can be positioned to accommodate the size of the text. TextExtent returns the width and height of the rectangle that bounds the text on the canvas. +To check only the height, call TextHeight. To check only the width, call TextWidth. + + + Writes a string on the canvas, starting at the point (X,Y), and then updates the PenPos to the end of the string. +Use TextOut to write a string onto the canvas. The string will be written using the current value of Font. Use the TextExtent method to determine the space occupied by the text in the image. To write only the text that fits within a clipping rectangle, use TextRect instead. +After a call to TextOut, the PenPos property indicates the point at the top right of the text on the canvas. + + + Writes a string inside a clipping rectangle. +Use TextRect to write a string within a limited rectangular region. Any portions of the string that fall outside the rectangle passed in the Rect parameter are clipped and don't appear. The upper left corner of the text is placed at the point (X, Y). + + + Writes a string inside a clipping rectangle. +Use TextRect to write a string within a limited rectangular region. Any portions of the string that fall outside the rectangle passed in the Rect parameter are clipped and don't appear. The upper left corner of the text is placed at the point (X, Y). + + + Specifies the handle for this canvas. +The Handle property specifies the Windows GDI handle to the device context for this canvas. +Set Handle to the HDC for the device context the canvas must draw into. When a windowed control responds to a Windows paint message, the HDC for drawing is passed in to the PaintWindow method. In other cases, an HDC can be obtained for a window by calling the GetDeviceContext method of a control. Additionally, Windows provides API calls to obtain an HDC for a printer or for a memory image. +Read the Handle property to supplement the drawing services provided by the TCanvas object with API calls that require a handle to a device context. Most of the Windows GDI calls require an HDC. +TCanvas does not own the HDC. Applications must create an HDC and set the Handle property. Applications must release the HDC when the canvas no longer needs it. Setting the Handle property of a canvas that already has a valid HDC will not automatically release the initial HDC. + +Note: Some descendants of TCanvas, such as TControlCanvas, do own the HDC. Do not set the Handle property for these objects. They fetch and free their own Handle. + + + Determines the color and pattern for filling graphical shapes and backgrounds. +Set the Brush property to specify the color and pattern to use when drawing the background or filling in graphical shapes. The value of Brush is a TBrush object. Set the properties of the TBrush object to specify the color and pattern or bitmap to use when filling in spaces on the canvas. + +Note: Setting the Brush property assigns the specified TBrush object, rather than replacing the current TBrush object. + + + Specifies how a graphical image is copied onto the canvas. +Set CopyMode to affect the way graphical images are drawn onto the canvas. The CopyMode is used when copying an image from another canvas using the CopyRect method. CopyMode is also used by TBitmap objects when they draw themselves to a canvas. +Use CopyMode to achieve a variety of affects when rendering an image. Achieve special effects like merged images and making parts of a bitmap transparent by combining multiple images with different CopyModes. + + + Specifies the font to use when writing text on the image. +Set Font to specify the font to use for writing text on the image. The value of Font is a T Font object. Set the properties of the T Font object to specify the font face, color, size, style, and any other aspects of the font. +The Canvas.Font property is only guaranteed to equal the Font property if you have an owner-drawn listbox (where you are expected to use the canvas). Even in that case, it is only guaranteed to equal the Font property once the first paint message is underway. If you use a canvas inside an ownerdraw event, everything should work as expected. Using the canvas for a reason outside the scope of its intended usage may give unpredictable results. + +Note: Setting the Font property assigns the specified T Font object, rather than replacing the current T Font object. + + + Specifies the kind of pen the canvas uses for drawing lines and outlining shapes. +Set Pen to specify the pen to use for drawing lines and outlining shapes in the image. The value of Pen is a TPen object. Set the properties of the TPen object to specify the color, style, width, and mode of the pen. + +Note: Setting the Pen property assigns the specified TPen object, rather than replacing the current TPen object. + + + + + TGraphic is the abstract base class type for objects such as icons, bitmaps, and metafiles that can store and display visual images. +TGraphic is an abstract class that cannot be instantiated. Descendant graphics objects override many of the methods of TGraphic to address the needs of their particular file format and graphical characteristics. TGraphic also introduces methods that work with TPicture objects and the Clipboard. Properties of TGraphic provide information about the state and size of the graphic image. +When the type of graphic is known, store the graphic in its specific type object. Otherwise, use a TPicture object that can hold any type of TGraphic. + + + Called when graphic has changed. +Changed is called automatically whenever the TGraphic object is modified. It sets the Modified property to True and triggers the OnChange event. + + + Set virtual property for reading and writing graphic data stream. +DefineProperties overrides TPersistent.DefineProperties for the ReadData and WriteData methods for reading and writing graphic data from and to a TStream object. It creates a virtual property Data that can be treated as a property to read or write graphic data to the TGraphic object. + + + Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + Render graphic onto canvas at rectangle, blending with canvas's background. +DrawTransparent renders the graphic onto a canvas at the coordinates specified by the Rect parameter, blending it with the canvas's background. + + + Compare graphic to another TGraphic object and return true if objects contain same graphic. +Equals compares the contents of two TGraphic objects. Equals returns false if the TGraphic are different classes or if they contain different graphical data. + +Code Examples +TGraphic (Delphi) +TGraphic (C++) + + + Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + Get color palette of graphical image. +GetPalette gets the color palette of the graphical image. You can also use the Palette property to get the color palette of a graphical image. If the graphic does not need or use a palette, the Palette property is zero. + + + Specifies if graphic is drawn transparently. +GetTransparent specifies whether a graphic should be drawn transparently. +Use the Transparent property to specify that the graphic be drawn transparently. + + + Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Generate OnProgress event when graphic is changing. +Progress generates an OnProgress event when the graphic is in the process of changing. +For certain descendants of TGraphic, OnProgress occurs during slow processes such as loading, storing, or transforming image data. OnProgress allows applications to provide feedback to the user about the progress of the process. +Component writers can generate OnProgress events for new descendants of TGraphic by calling the protected Progress method. These events are propagated to the TPicture and TImage objects. + + + Read graphic data from TStream. +ReadData is used to read the binary graphic from the virtual property Data (created by DefineProperties) when streaming in a TGraphic from the TStream Stream. + + + Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + Set color palette of graphical image. +SetPalette sets the color palette of the graphical image. +Use the Palette property to get the color palette of a graphical image. If the graphic does not need or does not use a palette, the Palette property is zero. + + + Specify if graphic should be drawn transparently. +SetTransparent specifies if a graphic should be drawn transparently. + + + Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Write graphic data to TStream. +WriteData is used to write the binary graphic to the virtual property Data (created by DefineProperties) when streaming a TGraphic out to the TStream Stream. + + + Indicate whether graphic supports partial transparency. +GetSupportsPartialTransparency indicates whether the graphic supports partial transparency. +TGraphic descendants should override GetSupportsPartialTransparency if they are capable of having partially transparent pixels. + + + Create TGraphic object. +This method creates and intializes a TGraphic object. + + + Destroys the TPersistent instance and frees its memory. +Vcl.Graphics.TGraphic.Destroy inherits from System.Classes.TPersistent.Destroy. All content below this line refers to System.Classes.TPersistent.Destroy. +Destroys the TPersistent instance and frees its memory. +Do not call Destroy directly. Call Free instead. Free checks that the object reference is not nil before calling Destroy. + + + Compare graphic to another TGraphic object and return true if objects contain same graphic. +Equals compares the contents of two TGraphic objects. Equals returns false if the TGraphic are different classes or if they contain different graphical data. + +Code Examples +TGraphic (Delphi) +TGraphic (C++) + + + Loads a graphic image stored in a file. +LoadFromFile reads the file specified in FileName and loads the data into the graphics object. + + + Saves a graphics image to a file. +SaveToFile writes the graphic to a file, specified by Filename. + +Code Examples +TJPEGImageAssign (Delphi) +TJPEGImageAssign (C++) +ImageProc Sample + + + CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + Introduces an abstract method that loads the image from a stream. +Each descendant graphic object defines a LoadFromStream method that loads a graphics object from Stream. + + + Introduces an abstract method that saves the graphic image to a stream. +Each descendant graphic object defines a SaveToStream method that saves the object to a Stream. + + + Introduces an abstract method that loads the image from a variable in Clipboard format. +Each descendant graphic object defines a LoadFromClipboardFormat method that replaces the current graphic image with the graphic indicated by AData, which it loads from the Clipboard. +The format for the new graphic object must be registered with the Clipboard in the RegisterClipboardFormat method, or an exception is raised. + + + Introduces an abstract method that assigns the graphic to a variable in clipboard format. +Each descendant graphic object defines a SaveToClipboardFormat method that saves that particular graphic image type to a Clipboard format. An application must have registered the format with the TGraphic object using the RegisterClipboardFormat method. + + + Specifies the size of the graphic. +Use the SetSize method to set both the height and width of the graphic. This results in better performance than setting the height and width separately. + + + EnableScaledDrawer Enables scaled drawer for a graphic, which is used to scale the graphic. +AGraphicScalerClass specifies the scaled drawer class, for example TWICScaledGraphicDrawer. + +See also +ScaledDrawer +DisableScaledDrawer + + + DisableScaledDrawer Disables scaled drawer for a graphic. + +See also +ScaledDrawer +EnableScaledDrawer + + + Embarcadero Technologies does not currently have any additional information. + + + Indicates whether the graphics object contains a graphic. +Use Empty to determine whether the graphic is bound to an image. Each descendant graphic object defines its own Get method to access the Empty property. + + + Specifies the vertical size of the graphic in pixels. +Use Height to determine the height of the graphic image. Each descendant graphic object defines its own Get and Set methods to access the Height property. + +Code Examples +SaveToFile (Delphi) +ScanLine (Delphi) +SaveToFile (C++) +ScanLine (C++) + + + Indicates whether the graphics object has been changed or edited. +If Modified is true, the graphic object has changed. If Modified is false, the graphics object is in the same state as when the object was loaded. +The Modified property indicates only if bitmap objects have been modified. Modified is not true if the graphics object contains an icon or metafile graphic, even if they have been modified. +If the graphics object was modified, save the changes to a file with the SaveToFile method. The next time the application runs, it can load the graphic from the file with the LoadFromFile method. + + + Indicates the color palette of the graphical image. +Use Palette to get the color palette of a graphical image. If the graphic does not need or does not use a palette, the Palette property is zero. + +Code Examples +GetDeviceContext (Delphi) +GetDeviceContext (C++) + + + Indicates whether the palette has changed. +Use PaletteModified to determine if the palette used for a graphical image has changed. PaletteModified is used in the OnChange event. PaletteModified remains true until whoever is responsible for realizing this new palette (for example, TImage) sets it to false. + + + Indicates whether the image covers its rectangular area. +Use Transparent to specify that the graphic be drawn transparently. Some descendants of TGraphic such as TIcon and TMetafile are always transparent, so setting the property for those objects does not change their behavior. However, the TBitmap graphic's drawing is affected by this property. The TImage component sets this property to be the same as its Transparent property to achieve transparent painting. +When the Transparent property is set to True, you can either specify a color as the transparent color or you can use the default color, which is the pixel in the lower left. The specified color is not displayed in the graphic, which lets the background show through. This can be useful in layering and for non-rectangular graphics. + +Code Examples +FileSelectBtnEdit (Delphi) +TransparentColor (Delphi) +FileSelectBtnEdit (C++) +TransparentColor (C++) + + + Determines the maximum width of the graphics object in pixels. +Each descendant graphic object defines its own Get and Set methods to access the Width property. + +Code Examples +SaveToFile (Delphi) +ScanLine (Delphi) +SaveToFile (C++) +ScanLine (C++) + + + Returns the reference to the scaled drawer. +When the scaled drawer is enabled for graphic, then the ScaledDrawer property returns the reference to it. + +See also +EnableScaledDrawer + + + Occurs whenever a graphical image changes. +Use OnChange to write a handler to perform an action then the graphical image changes. + + + Occurs when a graphical image is in the process of changing. +For certain descendants of TGraphic, OnProgress occurs during slow processes such as loading, storing, or transforming image data. OnProgress allows applications to provide feedback to the user about the progress of the slow process. +Component writers can generate OnProgress events for new descendants of TGraphic by calling the protected Progress method. These events are propagated to the TPicture and TImage objects. +OnProgress is an event handler of type Vcl.Graphics.TProgressEvent. + + + Indicate whether graphic supports partial transparency or an alpha channel. +SupportsPartialTransparency indicates whether the graphic supports partial transparency or an alpha channel. +Some TGraphic descendants, such as TBitmap and TPngImage, can support partial transparency or an alpha channel. When a graphic that supports partial transparency is drawn on a canvas using DrawTransparent, it should be blended with the pixels on the canvas based on the value of the alpha channel. + + + + + TPicture contains a bitmap, icon, metafile graphic, or user-defined graphic. +TPicture is a TGraphic container, used to hold a graphic, the type of which is specified in the Graphic property. It is used in place of a TGraphic if the graphic can be of any TGraphic class. LoadFromFile and SaveToFile are polymorphic. For example, if the TPicture is holding an Icon, it is valid to LoadFromFile a bitmap file, where the class TIcon can only read .ICO files. +If the TPicture contains a bitmap graphic, the Bitmap property specifies the graphic. If the TPicture contains an icon graphic, the Icon property specifies the graphic. If the TPicture contains a metafile graphic, the Metafile property specifies the graphic. +The properties of TPicture indicate the type of graphic that the picture object contains, and its size. The methods of TPicture are used to load, save, and manipulate graphics. +To load or save a picture to the Clipboard, use the Assign method of a TClipboard object. +To draw a picture on a canvas, call the Draw or StretchDraw methods of a TCanvas object, passing the Graphic property of a TPicture as a parameter. + + + Copies the properties of an object to a destination object. +Vcl.Graphics.TPicture.AssignTo inherits from System.Classes.TPersistent.AssignTo. All content below this line refers to System.Classes.TPersistent.AssignTo. +Copies the properties of an object to a destination object. +Override the AssignTo method to extend the functionality of the Assign method of destination objects so that they handle newly created object classes. When defining a new object class, override the Assign method for every existing object class that should be able to copy its properties to the new class. Override the AssignTo method for every existing class to which the new class can copy. +The Assign method of TPersistent calls AssignTo if the descendant object does not succeed in copying the properties of a source object. The AssignTo method defined by TPersistent raises an EConvertError exception. +For example, given the following code in which A and B are instance variables: + +A.Assign(B); {Delphi} + +A->Assign(B); // C++ + +if A knows how to handle B, then it does so and returns. If A doesn't know how to handle B's type, execution will trickle to the TPersistent version of Assign, which calls: + +B.AssignTo(A); {Delphi} + +B->AssignTo(A); // C++ + +If B knows how to copy to A, the assignment succeeds. Otherwise, TPersistent raises an exception. + + + Embarcadero Technologies does not currently have any additional information. + + + Provides an interface for a method that reads and writes otherwise unpublished data. +Vcl.Graphics.TPicture.DefineProperties inherits from System.Classes.TPersistent.DefineProperties. All content below this line refers to System.Classes.TPersistent.DefineProperties. +Provides an interface for a method that reads and writes otherwise unpublished data. +Descendants of TPersistent override DefineProperties to designate a method for storing the object's unpublished data to a stream such as a form file. By default, writing an object to a stream writes the values of all its published properties, and reading the object in reads those values and assigns them to the properties. Objects can also specify methods that read and write data other than published properties by overriding the DefineProperties method. +When overriding DefineProperties, consider including some or all of the following: + +A call to the inherited method +Calls to the filer object's DefineProperty method +Calls to the filer object's DefineBinaryProperty method +DefineProperties is virtual, so descendant classes can override it as necessary but are not required to do so. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates a TPicture object. +Call Create to create an instance of TPicture at runtime. Create allocates the memory for the picture object and initializes its internal formats. After creating the TPicture object, use the LoadFromClipboardFormat or LoadFromFile method to assign a graphical image to the picture, so that it is available to the application. + + + Destroys an instance of a picture object. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TPicture reference is not nil before it calls Destroy. +Destroy frees the graphic image it contains before calling the inherited Destroy. + + + Reads the file specified in Filename and loads the data into the TPicture object. +Use LoadFromFile to read a picture from disk. The TGraphic class created is determined by the file extension of the file. If the file extension is not recognized an EInvalidGraphic exception is raised. + + + Writes the picture to disk. +Use SaveToFile to save a TPicture object to the file specified in Filename. +The saved picture can be loaded to another TPicture or to an appropriate TGraphic descendant by calling its LoadFromFile method. + + + Reads the picture from a Stream. +Use LoadFromStream to read a picture from a TStream object. The TGraphic class created is determined by the type of data contained in the stream. +The data in the stream should be previously written by a call to the SaveToStream method of another TPicture or of a TGraphic descendant. + + + Saves the picture to a stream. +Use SaveToStream to save a picture to the TStream object specified by the Stream parameter. +The saved picture can be loaded to another TPicture or to an appropriate TGraphic descendant by calling its LoadFromStream method. + + + Reads the picture from the handle provided in the given Clipboard format. +Use LoadFromClipboardFormat to read in a graphic from the Clipboard. If the format is not supported, an EInvalidGraphic exception is raised. +The following code snippet shows how to load a picture from the clipboard into a TImage control. + +Note: To load a picture into the clipboard, you can use the code snippet for the SaveToClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + Picture: TPicture; +begin + Picture := TPicture.Create; + try + Picture.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0); + Image1.Picture := Picture; + finally + Picture.Free; + Clipboard.Clear; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TPicture* Picture; + TClipboard* cb = Clipboard(); + + Picture = new TPicture(); + try{ + Picture->LoadFromClipboardFormat(CF_BITMAP, cb->GetAsHandle(CF_BITMAP), 0); + Image1->Picture = Picture; + } + __finally{ + delete Picture; + cb->Clear(); + } +} + + + Allocates a global handle and writes the picture in its native Clipboard format (CF_BITMAP for bitmaps, CF_METAFILE for metafiles, and so on). +Use SaveToClipboardFormat to copy the picture to a Clipboard format. The resulting values can then be copied to the Windows clipboard using the clipboard's SetAsHandle method. +The palette of the picture is returned in the APalette parameter, the format in the AFormat parameter, and a handle to the data in the AData parameter. Before the picture can be saved, an application must have registered the format using the RegisterClipboardFormat method. +The following code snippet shows how to save a bitmap to the clipboard. + +Note: To load a bitmap from the clipboard, you can use the code snippet for the LoadFromClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + MyFormat : Word; + Picture : TPicture; + AData : THandle; + APalette : HPALETTE; +begin + Picture := TPicture.Create; + try + Picture.LoadFromFile('C:\Users\Public\Pictures\Sample Pictures\desert.bmp'); + Picture.SaveToClipBoardFormat(MyFormat, AData, APalette); + ClipBoard.SetAsHandle(MyFormat,AData); + finally + Picture.Free; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TClipboard* cb = Clipboard(); + unsigned short MyFormat; + TPicture* Picture; + unsigned int AData; + HPALETTE APalette; + + Picture = new TPicture(); + try{ + Picture->LoadFromFile("C:\\Users\\Public\\Pictures\\Sample Pictures\\desert.bmp"); + Picture->SaveToClipboardFormat(MyFormat, AData, APalette); + cb->SetAsHandle(MyFormat, AData); + } + __finally{ + delete Picture; + } +} + + + Indicates if the given Clipboard format is supported by the LoadFromClipboardFormat method. +If the LoadFromClipboardFormat method supports the Clipboard format specified as the value of AFormat, SupportsClipboardFormat returns true. If the format is not supported, the method returns false. + + + Copies one object to another by copying the contents of that object to the other. +When Source is a object type that is valid for the Graphic property, Assign makes that graphic the value of the Graphic property. +The actions performed by Assign depend on the actual types of the TPicture Graphic property and Source. For example, if the Graphic property and Source are bitmaps (TBitmap), the bitmap contained in Source is copied into the Graphic property. Similar conversions are valid, for example, for TIcon or TMetafile. +If the Source parameter is not a valid object for the Graphic property, Assign calls the inherited method so that the picture can be copied from any object with which it is compatible. + + + Registers a new TGraphic class for use in LoadFromFile. +Use RegisterFileFormat to register a graphic file format with TPicture so that it can be used with a Open or Save dialog box. +The AExtension parameter specifies the three-character system file extension to associate with the graphic class (for example, "bmp" is associated with TBitmap). The ADescription parameter specifies the description of the graphic to appear in the drop down list of the dialog box (for example, "Bitmaps" is the description of TBitmap). The AGraphicClass parameter registers the new graphic class to associate with the file format. + + + Registers a new TGraphic class for use in the LoadFromClipboardFormat method. +Use RegisterClipboardFormat register a new graphic format with TPicture so that it can be used with the LoadFromClipboardFormat method. + + + Removes all references to the specified TGraphic class and all its descendants from the internal lists of file formats and clipboard formats. +Call UnregisterGraphicClass to make a graphic class unavailable to all picture objects. UnregisterGraphicClass reverses the registration accomplished by the RegisterFileFormat, or RegisterFileFormatRes, or RegisterClipboardFormat method. When a graphic class is registered, the global GraphicFilter, GraphicExtension, and GraphicFileMask functions can return dialog filter strings, default file extensions or file filters for the graphic class. Call UnregisterGraphicClass when these values should not be available. For example, component writers who implement custom graphic classes unregister those classes according to the language used. In Delphi, the classes are unregistered in the finalization block of the unit that implements them and, in C++, the classes are unregistered using the #pragma exit directive (C++). +File formats and clipboard formats for the custom class are registered in the initialization block (Delphi) or using #pragma startup (C++). + + + Registers a new TGraphic class for use in the LoadFromFile method. +Use RegisterFileFormatRes by specifying a string resource. +The AExtension parameter specifies the three-character system file extension to associate with the graphic class (for example, "bmp" is associated with TBitmap). +The ADescriptionResID parameter specifies the resource ID for a description of the graphic, which then appears in the drop down list of the dialog box (for example, "Bitmaps" is the description of TBitmap). +The AGraphicClass parameter registers the new graphic class to associate with the file format. + + + Specifies the contents of the picture object as a bitmap graphic (.BMP file format). +Use Bitmap to reference the picture object when it contains a bitmap. If Bitmap is referenced when the picture contains a Metafile or Icon graphic, the graphic won't be converted (Types of Graphic Objects). Instead, the original contents of the picture are discarded and Bitmap returns a new, blank bitmap. + +Note: When assigning the Bitmap property, TPicture assigns the properties of a another TBitmap object. It does not take ownership of the specified value. + + + Specifies the graphic that the picture contains. +Use Graphic to specify what graphic the TPicture object contains. The graphic can be a bitmap, icon, metafile, or user-defined graphic class (Types of Graphic Objects). + +Note: When assigning the Graphic property, TPicture assigns the properties of a another TGraphic object. It does not take ownership of the specified object. + + + Represents an OLE interface for the picture. +PictureAdapter is for internal use only. + + + Specifies the vertical size (in pixels) of the graphic. +Use Height to find the height of the graphic image contained in the picture object. Height is the native, unstretched, height of the picture. + + + Specifies the contents of the TPicture object as an icon graphic (.ICO file format). +If Icon is referenced when the TPicture contains a Bitmap or Metafile graphic, the graphic won't be converted. Instead, the original contents of the TPicture are discarded and Icon returns a new, blank icon. + +Note: When assigning the Icon property, TPicture assigns the properties of a another Icon object. It does not take ownership of the specified value. + + + Specifies the contents of the picture object as an Enhanced Windows metafile graphic (.EMF file format). +If Metafile is referenced when the TPicture contains a Bitmap or Icon graphic, the graphic won't be converted. Instead, the original contents of the TPicture are discarded and Metafile returns a new, blank metafile (Types of Graphic Objects +). + +Note: When assigning the Metafile property, TPicture assigns the properties of a another TMetafile object. It does not take ownership of the specified value. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the horizontal size (in pixels) of the picture. +Use Width to find the width of a graphic image. Width contains the native, unstretched, width of the picture. + + + Occurs when the specific graphics item encapsulated by the picture object changes. +Use OnChange to write an event handler to process an action when the graphic is modified. + + + Occurs periodically during slow operations that affect the graphic. +OnProgress is generated by the particular graphic that the picture object contains. Whether OnProgress occurs depends upon the type of graphic in the Graphic property. Some graphics generate this event, others do not. Jpeg images, for example, generate an OnProgress event. +Write an OnProgress event handler to provide the user with feedback during slow operations such as loading large compressed images. TImage, for example, hooks the OnProgress event of TPicture. + +Note: The PercentDone parameter on the event handler is only an approximation. With some image formats, the value of PercentDone may actually decrease from the value in previous events, as the graphic object discovers there is more work to do. +OnProgress is an event handler of type Vcl.Graphics.TProgressEvent. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TMetafile is an encapsulation of the Win32 Enhanced metafile. +TMetafile contains a metafile graphic (EMF file format). +Properties of TMetafile indicate the size and characteristics of the metafile. +To draw a metafile on a canvas, call the Draw or StretchDraw methods of a TCanvas object, passing a TMetafile as a parameter. The Enhanced property determines how the metafile will be stored on disk. If Enhanced is true, the metafile is stored as an .EMF (Win32 Enhanced Metafile) file. If Enhanced is false, the metafile is stored as a .WMF (Windows 3.1 Metafile, with Aldus header). + + + Indicates whether graphics object contains graphic. +Vcl.Graphics.TMetafile.GetEmpty inherits from Vcl.Graphics.TGraphic.GetEmpty. All content below this line refers to Vcl.Graphics.TGraphic.GetEmpty. +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + Get vertical size of graphic in pixels. +Vcl.Graphics.TMetafile.GetHeight inherits from Vcl.Graphics.TGraphic.GetHeight. All content below this line refers to Vcl.Graphics.TGraphic.GetHeight. +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + Get color palette of graphical image. +Vcl.Graphics.TMetafile.GetPalette inherits from Vcl.Graphics.TGraphic.GetPalette. All content below this line refers to Vcl.Graphics.TGraphic.GetPalette. +Get color palette of graphical image. +GetPalette gets the color palette of the graphical image. You can also use the Palette property to get the color palette of a graphical image. If the graphic does not need or use a palette, the Palette property is zero. + + + Get horizontal size of graphic in pixels. +Vcl.Graphics.TMetafile.GetWidth inherits from Vcl.Graphics.TGraphic.GetWidth. All content below this line refers to Vcl.Graphics.TGraphic.GetWidth. +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Render graphic onto canvas at rectangle. +Vcl.Graphics.TMetafile.Draw inherits from Vcl.Graphics.TGraphic.Draw. All content below this line refers to Vcl.Graphics.TGraphic.Draw. +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + Read graphic data from TStream. +Vcl.Graphics.TMetafile.ReadData inherits from Vcl.Graphics.TGraphic.ReadData. All content below this line refers to Vcl.Graphics.TGraphic.ReadData. +Read graphic data from TStream. +ReadData is used to read the binary graphic from the virtual property Data (created by DefineProperties) when streaming in a TGraphic from the TStream Stream. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Set vertical size of graphic in pixels. +Vcl.Graphics.TMetafile.SetHeight inherits from Vcl.Graphics.TGraphic.SetHeight. All content below this line refers to Vcl.Graphics.TGraphic.SetHeight. +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + Specify if graphic should be drawn transparently. +Vcl.Graphics.TMetafile.SetTransparent inherits from Vcl.Graphics.TGraphic.SetTransparent. All content below this line refers to Vcl.Graphics.TGraphic.SetTransparent. +Specify if graphic should be drawn transparently. +SetTransparent specifies if a graphic should be drawn transparently. + + + Set horizontal size of graphic in pixels. +Vcl.Graphics.TMetafile.SetWidth inherits from Vcl.Graphics.TGraphic.SetWidth. All content below this line refers to Vcl.Graphics.TGraphic.SetWidth. +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Embarcadero Technologies does not currently have any additional information. + + + Write graphic data to TStream. +Vcl.Graphics.TMetafile.WriteData inherits from Vcl.Graphics.TGraphic.WriteData. All content below this line refers to Vcl.Graphics.TGraphic.WriteData. +Write graphic data to TStream. +WriteData is used to write the binary graphic to the virtual property Data (created by DefineProperties) when streaming a TGraphic out to the TStream Stream. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Instantiates a metafile object. +Call Create to instantiate a metafile at runtime. +Create allocates memory for a metafile object, and calls the inherited Create. Then sets the Enhanced and Transparent properties to true. +To create a metafile image from scratch, draw the image in a metafile canvas. When the metafile canvas is destroyed, it transfers the image into the metafile object provided to the metafile canvas constructor. After the image is drawn on the canvas and the canvas is destroyed, the image is 'playable' in the metafile object. + + + Destroys an instance of a metafile object. +Do not call Destroy directly in an application. Instead, an application should call Free. Free verifies that the TMetafile reference is not nil before it calls Destroy. +Destroy releases the image, which frees the image and the handle when the reference count on the metafile image is zero. Then Destroy calls the inherited Destroy. + + + Deletes the metafile image. +Use Clear to release the old metafile image, create a new image, and increment a reference count on it. + + + Indicates whether the TMetafile object has acquired a handle to the underlying GDI object. +Use HandleAllocated to determine whether the Handle property is set to an HMETAFILE value. HandleAllocated indicates whether the underlying GDI object has already been created. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, it automatically creates a metafile and returns its handle if the underlying GDI object does not already exist. + + + Vcl.Graphics.TMetafile.CanLoadFromStream inherits from Vcl.Graphics.TGraphic.CanLoadFromStream. All content below this line refers to Vcl.Graphics.TGraphic.CanLoadFromStream. +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + Loads the metafile from a stream. +Use LoadFromStream by specifying the stream from which the metafile is loaded as the value of Stream. LoadFromStream reads a metafile from a stream and replaces the current image with it. + + + Writes the metafile to disk. +Use SaveToFile to save the metafile to a file provided by the Filename parameter. To load a metafile from a file, call the LoadFromFile method. + + Note: If the Filename parameter has an extension of ".wmf", the metafile is saved as a WMF file. It is not necessary to set the Enhanced property. + + + Writes the metafile to a stream. +Use SaveToStream to save the metafile to the stream specified by the Stream parameter. +If the Enhanced property is True, the metafile is saved as an EMF; if False, it it saved as a WMF. + + + Loads a metafile from the Clipboard. +LoadFromClipboardFormat replaces the current image with the data in the clipboard. LoadFromClipboardFormat ignores the AData and APalette parameters. + + + Saves a metafile to a Clipboard format. +Use SaveToClipboardFormat to copy the metafile to a Clipboard format. The resulting values can then be copied to the Windows clipboard using the clipboard's SetAsHandle method. +The metafile's palette is returned in the APalette parameter, the format in the AFormat parameter, and a handle to the data in the AData parameter. Before the metafile can be saved, an application must have registered the format with the metafile object using the RegisterClipboardFormat method. +To save a metafile to a file, call SaveToFile. + + + Copies an object to the metafile. +Assign copies the Enhanced and Palette properties of an object to the metafile. If the metafile is nil (Delphi) or NULL (C++), Assign creates one. Otherwise, Assign calls the inherited method. For assignment, metafiles are polymorphic with other TGraphic objects, and with TPicture. + + + Releases the Windows GDI object represented by the metafile. +Call ReleaseHandle to release the resources used to represent the metafile. ReleaseHandle sets the Handle property to nil. NULL. +Call ReleaseHandle before setting the Handle property, so that the resources associated with the metafile are not lost. + + + Specifies the size of the metafile. +Use the SetSize method to set both the height and width of the metafile. This results in better performance than setting the height and width separately. + + + Specifies the name of the author or application used to create the metafile. +Use CreatedBy to set the string to an optional name of the author or application used to create the metafile. To set the CreatedBy string of a new metafile, call the TMetafileCanvas CreateWithComment constructor (Delphi) or the TMetafileCanvas constructor that takes a comment (C++). + + + Provides an optional text description that is embedded in the metafile. +Set the Description string of a new metafile by calling the TMetafileCanvas CreateWithComment constructor (Delphi) or the TMetafileCanvas constructor that takes a comment (C++).. + + + Determines how the metafile will be stored on disk. +Use Enhanced to determine how the metafile is stored on disk. If Enhanced is True, the metafile is stored as an .EMF (Win32 Enhanced Metafile). If Enhanced is False, the metafile is stored as a .WMF (Windows 3.1 Metafile, with Aldus header). +The in-memory format is always EMF. WMF has very limited capabilities; storing as WMF will lose information that would be retained by EMF. This property is set to match the metafile type when loaded from a stream or file. If loaded as WMF, then save as WMF. +By default, the Enhanced property is True. + + + Provides access to the Windows GDI metafile handle, for accessing the GDI metafile object. +Use Handle when calling a Windows API function that requires the handle of a metafile object. Pass the handle from the Handle property of the metafile object to the function. + + + Contains the width of the metafile image in 0.01 millimeter units, the native scale used by enhanced metafiles. +MMWidth is used for a more accurate reading of the horizontal size of the graphic. The Width property, by contrast, is always in screen device pixel units; to avoid loss of precision in converting between device pixels and millimeters, set or read the dimensions in millimeters with MMWidth. +The MMWidth property is always in screen device pixel units. + + + Contains the height of the metafile image in 0.01 millimeter units, the native scale used by enhanced metafiles. +MMHeight is used for a more accurate reading of the vertical size of the graphic. The Height property, by contrast, is always in screen device pixel units; to avoid loss of precision in converting between device pixels and millimeters, set or read the dimensions in millimeters with MMHeight. + + + Returns the units per inch that are used for the metafile's coordinate mapping. +Use Inch to find the units per inch assumed by a WMF metafile, and to alter scale when writing as WMF, but otherwise this property is obsolete. Enhanced metafiles maintain complete scale information internally. For example, if the metafile was created in a Twips coordinate system (using MM_TWIPS mapping), the value of Inch is 1440. + + + + + TBitmap is an encapsulation of a Windows bitmap (HBITMAP), including its palette (HPALETTE). +A bitmap is a powerful graphics object used to create, manipulate and store images in memory and as files on a disk. +TBitmap contains an internal image of the bitmap graphic and automatically manages realization of the palette when drawn. +To draw a bitmap on a canvas, call the Draw or StretchDraw methods of a TCanvas object, passing a TBitmap as a parameter. +Creating copies of a TBitmap is very fast since the handle is copied rather than the image. If the image is modified and the handle is shared by more than one TBitmap object, the image is copied before the modification is performed (that is, copy on write). + + + Indicate whether graphic supports partial transparency. +Vcl.Graphics.TBitmap.GetSupportsPartialTransparency inherits from Vcl.Graphics.TGraphic.GetSupportsPartialTransparency. All content below this line refers to Vcl.Graphics.TGraphic.GetSupportsPartialTransparency. +Indicate whether graphic supports partial transparency. +GetSupportsPartialTransparency indicates whether the graphic supports partial transparency. +TGraphic descendants should override GetSupportsPartialTransparency if they are capable of having partially transparent pixels. + + + Called when graphic has changed. +Vcl.Graphics.TBitmap.Changed inherits from Vcl.Graphics.TGraphic.Changed. All content below this line refers to Vcl.Graphics.TGraphic.Changed. +Called when graphic has changed. +Changed is called automatically whenever the TGraphic object is modified. It sets the Modified property to True and triggers the OnChange event. + + + Render graphic onto canvas at rectangle. +Vcl.Graphics.TBitmap.Draw inherits from Vcl.Graphics.TGraphic.Draw. All content below this line refers to Vcl.Graphics.TGraphic.Draw. +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + Render graphic onto canvas at rectangle, blending with canvas's background. +Vcl.Graphics.TBitmap.DrawTransparent inherits from Vcl.Graphics.TGraphic.DrawTransparent. All content below this line refers to Vcl.Graphics.TGraphic.DrawTransparent. +Render graphic onto canvas at rectangle, blending with canvas's background. +DrawTransparent renders the graphic onto a canvas at the coordinates specified by the Rect parameter, blending it with the canvas's background. + + + Indicates whether graphics object contains graphic. +Vcl.Graphics.TBitmap.GetEmpty inherits from Vcl.Graphics.TGraphic.GetEmpty. All content below this line refers to Vcl.Graphics.TGraphic.GetEmpty. +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + Get vertical size of graphic in pixels. +Vcl.Graphics.TBitmap.GetHeight inherits from Vcl.Graphics.TGraphic.GetHeight. All content below this line refers to Vcl.Graphics.TGraphic.GetHeight. +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + Get color palette of graphical image. +Vcl.Graphics.TBitmap.GetPalette inherits from Vcl.Graphics.TGraphic.GetPalette. All content below this line refers to Vcl.Graphics.TGraphic.GetPalette. +Get color palette of graphical image. +GetPalette gets the color palette of the graphical image. You can also use the Palette property to get the color palette of a graphical image. If the graphic does not need or use a palette, the Palette property is zero. + + + Get horizontal size of graphic in pixels. +Vcl.Graphics.TBitmap.GetWidth inherits from Vcl.Graphics.TGraphic.GetWidth. All content below this line refers to Vcl.Graphics.TGraphic.GetWidth. +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Create GDI bitmap for TBitmap if it doesn't already exist. +HandleNeeded creates a GDI bitmap for the TBitmap if it doesn't already exist. + + + Create GDI bitmap for TBitmap's mask if it doesn't already exist. +MaskHandleNeeded is called to create a GDI bitmap for the TBitmap object's mask if it doesn't already exist. + + + Create color palette for TBitmap's mask if it doesn't already exist. +PaletteNeeded is called to create a color palette for the TBitmap object if it doesn't already exist. A palette is not created if IgnorePalette is true. IgnorePalette is set to true if a palette can't be created. + + + Read graphic data from TStream. +Vcl.Graphics.TBitmap.ReadData inherits from Vcl.Graphics.TGraphic.ReadData. All content below this line refers to Vcl.Graphics.TGraphic.ReadData. +Read graphic data from TStream. +ReadData is used to read the binary graphic from the virtual property Data (created by DefineProperties) when streaming in a TGraphic from the TStream Stream. + + + Set vertical size of graphic in pixels. +Vcl.Graphics.TBitmap.SetHeight inherits from Vcl.Graphics.TGraphic.SetHeight. All content below this line refers to Vcl.Graphics.TGraphic.SetHeight. +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + Set color palette of graphical image. +Vcl.Graphics.TBitmap.SetPalette inherits from Vcl.Graphics.TGraphic.SetPalette. All content below this line refers to Vcl.Graphics.TGraphic.SetPalette. +Set color palette of graphical image. +SetPalette sets the color palette of the graphical image. +Use the Palette property to get the color palette of a graphical image. If the graphic does not need or does not use a palette, the Palette property is zero. + + + Set horizontal size of graphic in pixels. +Vcl.Graphics.TBitmap.SetWidth inherits from Vcl.Graphics.TGraphic.SetWidth. All content below this line refers to Vcl.Graphics.TGraphic.SetWidth. +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Write graphic data to TStream. +Vcl.Graphics.TBitmap.WriteData inherits from Vcl.Graphics.TGraphic.WriteData. All content below this line refers to Vcl.Graphics.TGraphic.WriteData. +Write graphic data to TStream. +WriteData is used to write the binary graphic to the virtual property Data (created by DefineProperties) when streaming a TGraphic out to the TStream Stream. + + + Instantiates a bitmap object. +Call Create to instantiate a bitmap object at runtime. Create is also called automatically when a bitmap image is loaded into a TImage. +Create allocates memory for a bitmap object, and calls the inherited Create. Then it creates a TBitmapImage as the internal image that represents the bitmap. + + + Instantiates a bitmap object. +Call Create to instantiate a bitmap object at runtime. Create is also called automatically when a bitmap image is loaded into a TImage. +Create allocates memory for a bitmap object, and calls the inherited Create. Then it creates a TBitmapImage as the internal image that represents the bitmap. + + + Disposes of the instance of the bitmap object. +Destroy is the destructor for a TBitmap object. +Do not call the destructor directly in an application. Instead, call Free. Free verifies that the bitmap object is not nil before it calls Destroy. +Destroy releases the internal bitmap image (TBitmapImage object) and frees the canvas before calling the inherited destructor. + + + Copies a new bitmap image to the bitmap object. +Assign copies the bitmap image contained in Source to the bitmap object. If Source is not a bitmap, Assign calls the inherited Assign method, which can copy an image from any class that knows how to copy to a TBitmap object. If the bitmap needs to be changed, the actual bitmap image is copied before the changes are made (copy on write). + +Note: An object of one type can always be assigned to another object of the same type. Also, the Source can be of type TPicture if the Graphic property of the picture is a bitmap. + + + Creates a memory bitmap image in order to release the bitmap handle, forcing the image into DIB format to save resources. +Use Dormant to change the format of the bitmap in memory thereby reducing the amount of GDI resources used by the application. +Dormant creates a bitmap image in memory using a memory stream object. This preserves the image so that the bitmap can then free the HBITMAP (accessed through the Handle property) that was assigned to it. +DIB handles may use fewer Win95 GDI resources than DDB, but DIBs may also use more memory than DDBs, depending on the current video driver and mode. + + + Frees the cached file image stored in memory by the bitmap. +Use FreeImage to reduce the memory requirements of an application when color depth and pixel format are not an issue. Freeing the image releases the memory allocated for the bitmap image when it was originally loaded to disk. Consequently, some of the original pixel format of the bitmap is lost (for example, if you changed its format to a DIB) as well as the color depth of the bitmap. +When a bitmap is loaded into a bitmap object, the bitmap object creates an image of the loaded bitmap in memory. If the bitmap isn't changed, the memory image is used when saving the bitmap, to verify that the bitmap has not lost color depth or changed the pixel format. + +Code Examples +LoadFromFile (Delphi) +LoadFromFile (C++) + + + Indicates whether the TBitmap object has acquired a handle to the underlying GDI object. +Use HandleAllocated to determine whether the Handle property is set to an HBITMAP value. HandleAllocated indicates whether the underlying GDI object has already been created. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, it automatically creates a bitmap and returns its handle if the underlying GDI object does not already exist. + + + Loads a bitmap from the Clipboard into the bitmap object. +LoadFromClipboardFormat is called if the bitmap is registered with the TPicture object using the RegisterClipboardFormat method. +LoadFromClipboardFormat replaces the current image with the data pointed to by the AData parameter. The palette for the bitmap is specified by the APalette parameter. +The following code snippet shows how to load a bitmap from the clipboard and use that picture to draw on the canvas of the form. + +Note: To load a bitmap into the clipboard, you can use the code snippet for the SaveToClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + Bitmap : TBitmap; +begin + Bitmap := TBitMap.Create; + try + Bitmap.LoadFromClipBoardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0); + Canvas.draw(0,0,Bitmap); + finally + Bitmap.Free; + Clipboard.Clear; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TBitmap* Bitmap; + TClipboard* cb = Clipboard(); + + Bitmap = new TBitmap(); + try{ + Bitmap->LoadFromClipboardFormat(CF_BITMAP, cb->GetAsHandle(CF_BITMAP), 0); + Canvas->Draw(0,0,Bitmap); + } + __finally{ + delete Bitmap; + cb->Clear(); + } +} + + + Vcl.Graphics.TBitmap.CanLoadFromStream inherits from Vcl.Graphics.TGraphic.CanLoadFromStream. All content below this line refers to Vcl.Graphics.TGraphic.CanLoadFromStream. +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + Loads the bitmap from a stream into the bitmap object. +Use LoadFromStream to load the bitmap image from a stream. The Stream parameter specifies the stream from which to read the bitmap image. For example, use LoadFromStream to load a bitmap image from a BLOB stream that reads from a graphic field in a dataset. + + + Converts the current bitmap image into a monochrome mask, replacing TransparentColor with white and every other color with black. +Use Mask to produce a monochrome mask bitmap based on a given transparent color. Mask produces the same image that MaskHandle does, except that the resulting mask image replaces the image in the TBitmap object, so it only makes sense to call Mask once. Use MaskHandle when only a bitmap handle of the mask image is needed. + + + Returns the handle to the bitmap so that the TBitmap object no longer knows about the handle. +Use ReleaseHandle to disassociate the bitmap from the bitmap handle. Use it when you need to give a bitmap handle to a routine or object that will assume ownership (or destroy) the bitmap handle. + + + Returns the handle to the bitmap's mask so that the TBitmap object no longer knows about the mask handle. +Use ReleaseMaskHandle to disassociate the bitmap object from the bitmap mask handle. + + + Returns the handle to the bitmap's palette and disassociates the palette from the TBitmap object. +Use ReleasePalette to disassociate the palette from the bitmap image. + + + Creates a local copy of the bitmap in Clipboard format. +Use SaveToClipboardFormat to copy the bitmap to a Clipboard format. The bitmap's palette is returned in the APalette parameter, the format in the AFormat parameter, and a handle to the data in the AData parameter. Before the bitmap can be saved, an application must have registered the format with the TBitmap object using the RegisterClipboardFormat method. +The following code snippet shows how to save a bitmap to the clipboard. + +Note: To load a bitmap from the clipboard, you can use the code snippet for the LoadFromClipboardFormat method. + +Delphi: + +uses + Vcl.Clipbrd; + +procedure TForm1.Button1Click(Sender: TObject); +var + MyFormat : Word; + Bitmap : TBitMap; + AData : THandle; + APalette : HPALETTE; +begin + Bitmap := TBitmap.Create; + try + Bitmap.LoadFromFile('C:\Users\Public\Pictures\Sample Pictures\desert.bmp'); + Bitmap.SaveToClipBoardFormat(MyFormat, AData, APalette); + ClipBoard.SetAsHandle(MyFormat,AData); + finally + Bitmap.Free; + end; +end; + + + +C++: + +#include <Vcl.Clipbrd.hpp> + +void __fastcall TForm1::Button1Click(TObject *Sender){ + TClipboard* cb = Clipboard(); + unsigned short MyFormat; + TBitmap* Bitmap; + unsigned int AData; + HPALETTE APalette; + + Bitmap = new TBitmap(); + try{ + Bitmap->LoadFromFile("C:\\Users\\Public\\Pictures\\Sample Pictures\\desert.bmp"); + Bitmap->SaveToClipboardFormat(MyFormat, AData, APalette); + cb->SetAsHandle(MyFormat, AData); + } + __finally{ + delete Bitmap; + } +} + + + Saves the bitmap to a stream. +Use SaveToStream to write the bitmap image to the stream specified by the Stream parameter. For example, specify a TBlobStream object as the Stream parameter to save the bitmap image to a graphic field in a dataset. + + + Specifies the size of the bitmap. +Use the SetSize method to set both the height and width of the bitmap. This results in better performance than setting the height and width separately. + + + Loads a bitmap resource into the bitmap object. +LoadFromResourceName loads the specified bitmap resource along with palette information from a module's executable file. +Instance is the handle of the module that contains the resource. +ResName is the name of the resource to load. + +Note: Use this routine to load bitmaps from RES files instead of the LoadBitmap API. LoadBitmap does not support 256-color images. + + + Loads a bitmap from a resource into the bitmap object. +Use LoadFromResourceID to load a specified bitmap resource along with palette information from a module's executable file. +Instance is the handle of the module that contains the resource. +ResID is the resource ID for the bitmap. + + + Provides access to a drawing surface that represents the bitmap. +Canvas allows drawing on the bitmap by providing a T Canvas object for this purpose. Drawing on the canvas effectively modifies the underlying bitmap image pixels. Any canvas operation is valid on a bitmap (not just Draw and StretchDraw) including line drawing, rectangles, and circles. The bitmap object is passed as a parameter to these methods. +A canvas object is created automatically for the bitmap and the property is read-only. + + + Provides access to the Windows GDI bitmap handle for accessing the GDI bitmap object. +Use Handle to call a Windows API function that requires the handle of a bitmap object (HBITMAP). Pass Handle as the bitmap handle parameter to these functions. +Handle is the HBITMAP encapsulated by the bitmap object. Avoid grabbing the handle directly since it causes the HBITMAP to be copied if more than one TBitmap shares the handle. + +Warning: Be careful when giving the handle to an object or routine. If the receiver takes ownership (and destroys) the bitmap handle, call ReleaseHandle. + + + Indicates whether the bitmap is a device-dependent bitmap, or a device-independent bitmap. +HandleType is used to find or modify the type of the bitmap. Device-dependent bitmaps (DDBs) may be faster to draw on the screen, but may be stored in memory in a device-specific format. Device-independent bitmaps (DIBs) are stored in memory in a standard format supported by all devices (including printers). + + + Determines whether the bitmap realizes its palette when drawing its image. +Use IgnorePalette when speed of drawing is a priority. When IgnorePalette is true, the bitmap does not realize its palette when drawing itself, resulting in lower picture quality on 256-color video drivers, but faster drawing of the bitmap image. + +Note: + + + Provides access to the Windows GDI bitmap handle for accessing the GDI bitmap object. +Use MaskHandle to call a Windows API function that requires the handle of a bitmap object. Pass MaskHandle as the bitmap handle parameter to these functions. MaskHandle is the HBITMAP encapsulated by the bitmap object's mask. + + + Determines whether the bitmap displays its image in monochrome. +If Monochrome is true if the bitmap displays as a monochrome bitmap. Monochrome is false if the bitmap displays in color, that is, if it contains more than one bit per pixel. + +Note: +Code Examples +LoadFromFile (Delphi) +LoadFromFile (C++) + + + Indicates the bit format of the bitmap image, specifying how the image is displayed and how the pixels of the bitmap image are stored in memory. +Use PixelFormat to change a TBitmap's internal image to a particular memory format and color depth, or to find out what memory format and color depth a TBitmap is using. The possible formats are specified in TPixelFormat. +For example, PixelFormat can be used to set the pixel format of the bitmap image to 8-bit for video drivers that cannot display the native format of a bitmap image. + +Note: The PixelFormat of a JPEG image object applies to the bitmap if the JPEG image is copied to it. +Changing the pixel format is most commonly used with ScanLine, because your code must decode the pixel data accessed by ScanLine. Image-editing tools usually use one pixel for all internal image operations and copy the results to the screen (in whatever format) as the last step. + + + Determines which color of the bitmap is to be transparent when the bitmap is drawn. +Use TransparentColor to determine how to draw the bitmap transparently. When the TransparentMode property is set to tmAuto (default), TransparentColor returns the color of the first pixel in the bitmap image data. For "bottom-up" bitmaps, the first pixel is the bottom leftmost pixel shown onscreen. For "top-down" bitmaps (less common), the first pixel is in the top left corner shown onscreen. +If TransparentColor is assigned, the TransparentMode is automatically set to tmFixed so that the new transparent color can be used later. If you want TransparentColor to disregard any assignments and return the bottom leftmost pixel color again, set TransparentMode to tmAuto. + + + Determines whether the TransparentColor property's value is automatically calculated or stored with the bitmap object. +When TransparentMode is set to tmAuto (the default), the TransparentColor property returns the color of the bottom-leftmost pixel of the bitmap image. When TransparentMode is set to tmFixed, the TransparentColor property refers to the color stored in the bitmap object. + + + Indicates how reserved byte of each pixel is used in 32 bit bitmaps. +Use AlphaFormat to change the way a TBitmap uses the reserved byte of each pixel in a 32bit Bitmap. + + + + + TIcon is an encapsulation of a Windows icon. +Use TIcon to represent one of the icons in an image list. Assign an icon to objects that have an Icon property, such as TForm or TPicture. +Icon objects represent the value loaded from a Windows icon file (.ICO file). Draw an icon on a canvas, using the Draw method of the TCanvas object. Icons do not stretch, so do not use StretchDraw (TCanvas) with an icon. + +Note: TIcon can be used to display the value of a multi-resolution (>16 color) icon. However, it can not support the creation of multi-resolution icons, nor the resizing of the image after it is loaded from a file or stream. + + + Render graphic onto canvas at rectangle. +Vcl.Graphics.TIcon.Draw inherits from Vcl.Graphics.TGraphic.Draw. All content below this line refers to Vcl.Graphics.TGraphic.Draw. +Render graphic onto canvas at rectangle. +TCanvas.Draw calls this function to render the graphic onto its canvas at the coordinates specified by the Rect parameter. Descendants of TGraphic should override this function with a specific rendering implementation. + + + Indicates whether graphics object contains graphic. +Vcl.Graphics.TIcon.GetEmpty inherits from Vcl.Graphics.TGraphic.GetEmpty. All content below this line refers to Vcl.Graphics.TGraphic.GetEmpty. +Indicates whether graphics object contains graphic. +GetEmpty indicates whether the TGraphic object contains a graphic. +Each descendant of the TGraphic class should override the GetEmpty method to indicate whether a given TGraphic object is bound to an image. + + + Get vertical size of graphic in pixels. +Vcl.Graphics.TIcon.GetHeight inherits from Vcl.Graphics.TGraphic.GetHeight. All content below this line refers to Vcl.Graphics.TGraphic.GetHeight. +Get vertical size of graphic in pixels. +GetHeight gets the vertical size of the TGraphic object in pixels. +Each descendant of TGraphic defines its own GetHeight and SetHeight methods to access the Height property. + + + Get horizontal size of graphic in pixels. +Vcl.Graphics.TIcon.GetWidth inherits from Vcl.Graphics.TGraphic.GetWidth. All content below this line refers to Vcl.Graphics.TGraphic.GetWidth. +Get horizontal size of graphic in pixels. +GetWidth gets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Set vertical size of graphic in pixels. +Vcl.Graphics.TIcon.SetHeight inherits from Vcl.Graphics.TGraphic.SetHeight. All content below this line refers to Vcl.Graphics.TGraphic.SetHeight. +Set vertical size of graphic in pixels. +SetHeight sets the vertical size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetHeight and SetHeight methods to access the Height property. + + + Specify if graphic should be drawn transparently. +Vcl.Graphics.TIcon.SetTransparent inherits from Vcl.Graphics.TGraphic.SetTransparent. All content below this line refers to Vcl.Graphics.TGraphic.SetTransparent. +Specify if graphic should be drawn transparently. +SetTransparent specifies if a graphic should be drawn transparently. + + + Set horizontal size of graphic in pixels. +Vcl.Graphics.TIcon.SetWidth inherits from Vcl.Graphics.TGraphic.SetWidth. All content below this line refers to Vcl.Graphics.TGraphic.SetWidth. +Set horizontal size of graphic in pixels. +SetWidth sets the horizontal size of the graphic in pixels. +Each descendant of the TGraphic class defines its own GetWidth and SetWidth methods to access the Width property. + + + Creates an instance of TIcon. +Call Create to create an empty icon object. Once an image has been read into the icon from a file or stream, or by assigning another icon object, the icon can be drawn on a canvas or added to an image list. Do not create an icon object for setting the icon property of a form or picture. These objects create a TIcon object in their own constructors. Instead, use the LoadFromFile, LoadFromStream, or LoadFromClipboardFormat method on the TIcon object that you can obtain by reading the Icon property. + + + Destroys an instance of TIcon. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TIcon reference is not nil, and only then calls Destroy. + + + Copies an icon image from another TIcon object. +Call Assign to copy another icon object. Assign copies the icon image from the Source parameter if it is another TIcon object. Otherwise, Assign calls the inherited method, which copies the icon image from any source object that specifies how to copy to a TIcon in its AssignTo method. + + + Copies an icon image to a TBitmap graphical object. +Call AssignTo to copy an icon to a TBitmap object. AssignTo copies the icon image to the Dest parameter if it is a TBitmap object. Otherwise, AssignTo fails. +The preferred way to copy an icon image to a bitmap is to use the Assign method of the TBitmap class, passing the icon object as the Source parameter. + +Note: The bitmap resulted after a call to AssignTo always has alpha channel (transparency) information and a 32-bit color depth. + + + Indicates whether the TIcon object has acquired a handle to the underlying GDI object. +Use HandleAllocated to determine whether the Handle property is set to an HICON value. HandleAllocated indicates whether the underlying GDI object has already been created. Use HandleAllocated rather than reading the Handle property. When an application reads the Handle property, it automatically creates an icon and returns its handle if the underlying GDI object does not already exist. + + + Prevents applications from loading icons from the clipboard. +LoadFromClipboardFormat is overridden in TIcon because the clipboard format is not supported. + + + Vcl.Graphics.TIcon.CanLoadFromStream inherits from Vcl.Graphics.TGraphic.CanLoadFromStream. All content below this line refers to Vcl.Graphics.TGraphic.CanLoadFromStream. +CanLoadFromStream returns True when a specified stream contains a streamed image of a specific TGraphic subclass. +The method uses current stream position, it does not change current stream position. + + + Loads the icon from a stream. +Use LoadFromStream to read the icon image from a stream. Set the Stream parameter to a stream object that provides access to the memory image of the icon. To load the icon from a .ico file, use the LoadFromFile method. To load the icon from the Clipboard, use the LoadFromClipboardFormat method. + + + Releases the Windows GDI object represented by the icon. +Call ReleaseHandle to release the resources used to represent the icon. ReleaseHandle sets the Handle property to nil (Delphi) or NULL (C++). +ReleaseHandle informs the TIcon instance that it is no longer responsible for destroying the icon handle. + + + Prevents applications from saving icons to the clipboard. +SaveToClipboardFormat is overridden in TIcon because the format is not supported for the Clipboard. + + + Saves the icon to a stream. +Use SaveToStream to write the icon image to a stream. Specify the Stream parameter as the stream object that receives the memory image of the icon. To write the icon to a .ico file, use the SaveToFile method. To write the icon to the Clipboard, use the SaveToClipboardFormat method. + + + Specifies the size of the icon. +Use the SetSize method to set both the height and width of the icon. This results in better performance than setting the height and width separately. + + + Loads an icon resource into the icon object. +LoadFromResourceName loads the specified icon resource from a module's executable file. +Instance is the handle of the module that contains the resource. +ResName is the name of the resource to load. + + + Embarcadero Technologies does not currently have any additional information. + + + Provides access to the Windows GDI icon handle. +Use Handle to specify the icon when using a Windows API function that requires the handle of an icon object. The Handle property is nil (Delphi) or NULL (C++) if the icon has not been loaded. +Call the ReleaseHandle method before changing the icon image by setting the Handle property. The icon image can also be loaded by assigning another icon object or using the LoadFromClipboardFormat, LoadFromFile, or LoadFromStream method. + + + + + TObject is the ultimate ancestor of all objects and components. +TObject encapsulates fundamental behavior common to objects by introducing methods that: + +Create, maintain, and destroy instances of the object by allocating, initializing, and freeing required memory. +Respond when object instances are created or destroyed. +Return class-type and instance information on an object and runtime type information (RTTI) about its published properties. +Support message handling. +Support interfaces implemented by the object. +Use TObject as an immediate base class when declaring simple objects that do not need to persist (are not saved and reloaded) and that do not need to be assigned to other objects. +Much of the capability of objects is established by methods that TObject introduces. Many of these methods are used internally by IDEs and are not intended for users to call directly. Others are overridden in descendant objects that have more complex behavior. +Although TObject is the based object of a component framework, not all objects are components. All component classes descend from TComponent. + +Note: TObject is never directly instantiated. Although it does not use programming language features that prevent instantiation, TObject is an abstract class. + + + Constructs an object and initializes its data before the object is first used. +Create constructs an object. The purpose, size, and behavior of objects differ greatly. The Create constructor defined by TObject allocates memory but does not initialize data. +Descendant objects usually define a constructor that creates the particular kind of object and initializes its data. + +Note: If an exception escapes from a constructor, the object's destructor is called to clean up the failed instance. + + + Destroys an object and frees its associated memory, if necessary. +Use Free to destroy an object. Free automatically calls the destructor if the object reference is not nil. Any object instantiated at run time that does not have an owner should be destroyed by a call to Free, so that it can be properly disposed of and its memory released. Unlike Destroy, Free is successful even if the object is nil; if the object was never initialized, Free would not result in an error. +When you call Free for a component, it calls Free for all components that it owns�that is, all components in its component list. Since a form owns all the controls and other components that are created on it in design mode, those components are automatically freed when the form is freed. By default, all forms are owned by the Application object; when the application terminates, it frees the Application object, which frees all forms. For objects that are not components, or for components created with a nil owner, be sure to call Free after you are finished with them; otherwise the allocated memory will not be usable until after the application terminates. + +Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, do not free a button or the form that owns the button in its OnClick event handler. +To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing. + +Note: In C++ code, do not use Free to destroy an object. Use the delete keyword. + + + DisposeOf forces the execution of the destructor code in an object. +It was an artifact from previous versions when the Delphi Mobile compilers supported Automatic Reference Counting. In current versions of Delphi, DisposeOf is used as a wrapper that invokes TObject.Free. + +type + TMySimpleClass = class + private + stringMember: String; + constructor Create(const Text: String); + destructor Destroy; + end; + +constructor TMySimpleClass.Create(const Text: String); +begin + stringMember := Text; +end; + +destructor TMySimpleClass.Destroy; +begin + // this will be executed on calling the DisposeOf method. +end; + +var + myObject: TMySimpleClass; +begin + myObject := TMySimpleClass.Create('This is a code snippet indicating the usage of the DisposeOf method'); + try + // Use 'myObject' here + finally + myObject.DisposeOf; + end; +end. + + + Initializes a newly allocated object instance to all zeros and initializes the instance's virtual method table pointer. +You should not call InitInstance directly. InitInstance is called by NewInstance when an object is created. When overriding NewInstance, be sure to call InitInstance as the last statement. +InitInstance is not virtual, so you cannot override it. Instead, initialize any data for an object in the constructor. + + + Performs finalization on long strings, variants, and interface variables within a class. +Do not call CleanupInstance directly. CleanupInstance is called automatically when the object instance is destroyed. +CleanupInstance releases all long strings and variants. It sets long strings to empty and variants to Unassigned. + + + Returns the class reference for the object's class. + +Note: ClassType dynamically determines the type of an object and returns its class reference, or metaclass. +Avoid using ClassType in application code. + +Note: In Delphi code, use the is or as operators instead of ClassType. +Note: In C++ code, use a dynamic cast or the InheritsFrom method instead of ClassType. + + + Returns a string indicating the type of the object instance (as opposed to the type of the variable passed as an argument). +Use ClassName to obtain the class name from an object instance or class reference. This is useful for differentiating object instances that are assigned to a variable that has the type of an ancestor class. + +Note: In C++ code, call ClassName as a method to obtain an object's class name. Use the global static function to obtain the class name from a metaclass object. + + + Determines whether an object is of a specific type. +ClassNameIs determines whether an object instance or class reference has a class name that matches a specified string. This is useful to query objects across modules or shared libraries. + +Note: In C++ code, call ClassNameIs as a method to compare an object's class name. Use the global static function to compare the class name from a metaclass object. + + + Returns the type of the immediate ancestor of a class. +ClassParent returns the name of the parent class for an object instance or class reference. For TObject, ClassParent returns nil (Delphi) or NULL (C++). +Avoid using ClassParent in application code. + +Note: In Delphi code, use the is or as operators instead of ClassParent. +Note: In C++ code, use a dynamic cast or the InheritsFrom method instead of ClassParent. + + + Returns a pointer to the run-time type information (RTTI) table for the object type. +ClassInfo provides access to the RTTI table for a given object type. +Some classes do not provide run-time type information. For these classes, ClassInfo returns nil (Delphi) or NULL (C++). All classes descended from TPersistent do provide run-time type information. + + + Returns the size in bytes of each instance of the object type. +InstanceSize indicates how many bytes of memory are required for a class's instance data. InstanceSize is called from methods that allocate and deallocate memory. InstanceSize is not a virtual method, so it cannot be overridden. InstanceSize should be called only when implementing a custom version of NewInstance. + + + Determines the relationship of two object types. +Use InheritsFrom to determine whether a particular class type or object is an instance of a class or one of its descendants. InheritsFrom returns True if the object type specified in the aClass parameter is an ancestor of the object type or the type of the object itself. Otherwise, it returns False. + +Note: InheritsFrom is similar to the Delphi is operator, but applies to class references. +Note: In C++ code, a nonstatic version of InheritsFrom is provided. This call is useful in determining whether a descendant class method or property can be used, given a variable of a base class. For example, use InheritsFrom to determine whether the Sender parameter in an event handler is of a particular class type or one of its descendants. + + + Returns the address of a class method by name. + +Note: You can use MethodAddress for published methods only. +There are situations when it is useful to invoke an object method without hard coding the method name in advance. Call MethodAddress to dynamically retrieve the address of such a method by specifying the method Name as a string. +An easy way to invoke the method is to define a procedure or function data type, such as: + +type TProc = procedure of object; + +Assign the object name and the MethodAddress method to a TMethod variable, such as: + +MethodVar.Data�:= Pointer(ObjectInstanceName); +MethodVar.Code�:= ObjectInstanceName.MethodAddress('MethodNameString'); + +Pass this in a call to a variable of the procedure or function type: + +Proc�:= TProc(MethodVar); +Proc; + + + Returns the address of a class method by name. + +Note: You can use MethodAddress for published methods only. +There are situations when it is useful to invoke an object method without hard coding the method name in advance. Call MethodAddress to dynamically retrieve the address of such a method by specifying the method Name as a string. +An easy way to invoke the method is to define a procedure or function data type, such as: + +type TProc = procedure of object; + +Assign the object name and the MethodAddress method to a TMethod variable, such as: + +MethodVar.Data�:= Pointer(ObjectInstanceName); +MethodVar.Code�:= ObjectInstanceName.MethodAddress('MethodNameString'); + +Pass this in a call to a variable of the procedure or function type: + +Proc�:= TProc(MethodVar); +Proc; + + + Returns the name of a class method by address. +There are situations when it is useful to invoke an object method without hard coding the method name in advance. Call MethodAddress to dynamically retrieve the address of such a method by specifying the method name as a string. +MethodName is the opposite of this process--by supplying an Address method, the name of the method is returned as a string. + + + Returns the qualified name of the class. +QualifiedClassName returns the class's unit scope concatenated with the class name. Example: + +uses + SysUtils, SyncObjs; + +begin + Writeln(TEvent.QualifiedClassName); // displays System.SyncObjs.TEvent + + + Returns the address of a published object field. +FieldAddress is used internally by the component streaming system to access a specified published field of an object. FieldAddress returns a pointer to the field, if it exists. If the object has no published field by that name, FieldAddress returns nil (Delphi) or NULL (C++). +Programs should access and manipulate fields by using properties instead of FieldAddress. + + + Returns the address of a published object field. +FieldAddress is used internally by the component streaming system to access a specified published field of an object. FieldAddress returns a pointer to the field, if it exists. If the object has no published field by that name, FieldAddress returns nil (Delphi) or NULL (C++). +Programs should access and manipulate fields by using properties instead of FieldAddress. + + + Retrieves a specified interface. +GetInterface retrieves the interface designated by a GUID or type name. The basic implementation of GetInterface uses the GUID specified in the IID parameter. If the specified interface is supported by the class, it is returned in the Obj parameter, and GetInterface has a return value of True. Otherwise, Obj contains nil (Delphi) or NULL (C++), and GetInterface returns False. + +Note: In Delphi code, IID can be an interface name. The compiler automatically translates this name into the corresponding GUID. +Note: In C++ code, use the templated version of GetInterface to obtain an interface from a DelphiInterface object. +GetInterface is equivalent to the as operator (Delphi) and dynamic casts (C++), except that GetInterface does not raise an exception if the interface is not supported. + + + Returns the entry for a specific interface implemented in a class. +GetInterfaceEntry returns the class entry for the interface specified by the IID parameter. + +Note: In Delphi Code, IID can be an interface name. The compiler replaces this name with the actual GUID. +Note: COM objects can use GetInterfaceEntry to automate dispatch calls to a dual-IDispatch interface. + + + Returns a pointer to a structure containing all of the interfaces implemented by a given class. +GetInterfaceTable returns the interface entries for the class. This list contains only interfaces implemented by this class, not its ancestors. To find the ancestor list, iteratively call ClassParent and then call GetInterfaceTable on the value it returns. To find the entry for a specific interface, use the GetInterfaceEntry method instead. + + + Returns the name of the unit where the class is defined. +UnitName can be used to obtain the unit where a specific class is defined. For example, calling UnitName on TButton returns the Vcl.StdCtrls string. + + + Returns the class's unit scope. +The class's unit scope is currently equivalent with the class's unit name. + +uses + SysUtils, SyncObjs; + +begin + Writeln(TEvent.UnitScope); // displays System.SyncObjs + // ... + + + Checks whether the current instance and the Obj parameter are equal. +The function has one Obj parameter of the TObject type. +By default, the Equals method shows whether the addresses corresponding to the current object and the Obj object are identical. The method returns a boolean value that represents the equality between the two addresses. + + +Note: Equals is supposed to be overridden in user-derived classes, to provide consumer objects with an equality determining function. +For example, in the FMX.Types.TBounds class, Equals also returns True if the Rect properties of the current object and of the Obj object are equal. In the FMX.StdActns.TBaseValueRange class, Equals also returns True if all the properties of the current object and of the Obj object are equal. + + + Returns an integer containing the hash code. +By default, calling GetHashCode on an object returns an integer representing the virtual address at which the object is stored. + +Notes: +GetHashCode is supposed to be overridden in user-derived classes, to provide consumer objects with an integer hash code representation. +The sign of the hash code depends on the address of the particular object instance. Negative hash code can appear for object instances that reside at higher memory locations. + + + Returns a string containing the class name. +By default, the ToString returns a string containing the class name of the instance that is being called. +For example, calling ToString on a TButton instance returns a string containing "TButton". + +Note: ToString is intended to be overridden in user-derived classes, to provide consumer objects with a string representation. + + + Handles exceptions in methods declared using the safecall calling convention. +SafeCallException handles exceptions in methods that use the safecall calling convention. Some classes that implement interfaces override this method to handle possible errors. +As implemented in TObject, SafeCallException simply returns E_UNEXPECTED. This is the appropriate response for classes that do no support interfaces. + + + Responds after the last constructor has executed. +AfterConstruction is called automatically after the object's last constructor has executed. Do not call it explicitly in your applications. +The AfterConstruction method implemented in TObject does nothing. Override this method when creating a class that performs an action after the object is created. For example, TCustomForm overrides AfterConstruction to generate an OnCreate event. + + + Responds before the first destructor executes. +BeforeDestruction is called automatically before the object's first destructor executes. Do not call it explicitly in your applications. +The BeforeDestruction method implemented in TObject does nothing. Override this method when creating a class that performs an action before the object is destroyed. For example, TCustomForm overrides BeforeDestruction to generate an OnDestroy event. + +Note: BeforeDestruction is not called when the object is destroyed before it is fully constructed. That is, if the object's constructor raises an exception, the destructor is called to dispose of the object, but BeforeDestruction is not called. + + + Calls message-handling methods for the object, based on the contents of the Message parameter. +Call Dispatch to automatically pass messages to the appropriate message handler. +Dispatch determines whether a message is in the list of message handlers declared for the object. If the object does not handle the message, Dispatch then examines the message-handler list of the ancestor class, and continues checking ancestors until it either finds a specific handler or runs out of ancestors, in which case it calls DefaultHandler. +The only assumption Dispatch makes about the data in Message is that the first two bytes contain a message ID�that is, an integer that determines which message handler Dispatch calls. Although any kind of data can be passed to Dispatch, most TObject descendants expect a message record such as TMessage or a specific data structure type. + + + Provides the interface for a method that processes message records. +DefaultHandler is called by Dispatch when it cannot find a method for a particular message. DefaultHandler provides message handling for all messages for which an object does not have specific handlers. Descendant classes that process messages override DefaultHandler according to the types of messages they handle. + +Note: In a Delphi message-handling method, calling inherited results in a call to the ancestor's DefaultHandler method only if that ancestor does not specify a message method for the particular message being handled. Otherwise, calling inherited results in a call to the specific handler for that type of message. + + + Allocates memory for an instance of an object type and returns a pointer to that new instance. +All constructors call NewInstance automatically. NewInstance calls InstanceSize to determine how much memory containing a particular instance to allocate from the heap. Do not call NewInstance directly. +Override NewInstance only for special memory allocation requirements. For example, when allocating a large number of identical objects that all need to be in memory at the same time, you can allocate a single block of memory for the entire group, then override NewInstance to use part of that larger block for each instance. +If you override NewInstance to allocate memory, you may need to override FreeInstance to deallocate the memory. + +Note: By default, NewInstance calls InitInstance. + + + Deallocates memory allocated by a previous call to the NewInstance method. +All destructors call FreeInstance automatically to deallocate memory that was allocated by overriding NewInstance. +Do not call FreeInstance directly. FreeInstance should be overridden if NewInstance was overridden to change the way the object's instance data was allocated. +Like NewInstance, FreeInstance uses the value returned from InstanceSize to deallocate the object's memory. + + + Disposes of an object instance. +Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy. +The Destroy method defined by TObject deallocates memory. Descendent objects usually define a destructor that is customized for that particular kind of object. +When declaring a Destroy method in a descendant, always add the override directive to the declaration and call the inherited Destroy as the last statement in the overriding method. Because Destroy is a virtual method, overriding it ensures that the proper inherited behavior occurs. + +Note: If an exception escapes from the constructor, the destructor is called to destroy the partially constructed object instance that failed to initialize completely. Therefore, destructors should check that allocated resources such as handles were actually allocated before trying to release them, since their value might be zero. +Destroy should be implemented so that it calls Free on all subobjects created within the object's constructor (that is, allocated by the constructor). Unlike Destroy, Free provides a safeguard when destroying objects that are nil. + + + Getter for the Disposed property. + + + Embarcadero Technologies does not currently have any additional information. + + + Disposed is a read-only property that shows the current state of this object. +The Disposed property returns True if the object has been disposed using the DisposeOf method. Otherwise, it returns False. + +type + TMySimpleClass = class + private + // + stringMember: String; + constructor Create(Text: String); + destructor Destroy; + end; + +constructor TMySimpleClass.Create(Text: String); +begin + stringMember := Text; +end; + +destructor TMySimpleClass.Destroy; +begin + // this will be executed on calling the DisposeOf method. +end; + +var + myObject: TMySimpleClass; +begin + myObject := TMySimpleClass.Create + ('This is a code snippet illustrating the functionality for the DisposeOf method and Disposed property'); + if not myObject.Disposed then + myObject.DisposeOf; + //Starting here, the object has entered the Disposed state. +end. + +Note: The System.TObject.DisposeOf method is supported by the Delphi mobile compilers. The Disposed state only takes effect under compilers that use Automatic Reference Counting, such as DCCIOSARM.EXE, DCCIOSARM64.EXE, and DCCIOS32.EXE. + + + + + For internal use only. + + + Internal use only + + + Internal use only + + + TypeInfo of element type + + + Number of element type + + + + + Internal use only. + + + Internal use only + + + Alignment in bytes + + + + + TMediaPlayer controls devices that provide a Media Control Interface (MCI) driver. +The TMediaPlayer component includes a set of buttons (Play, Stop, Eject, and so on) that control a multimedia device such as a CD-ROM drive, MIDI sequencer, or VCR. A multimedia device may be hardware or software. +The media player component contains of multiple buttons. These buttons can be clicked with the mouse, but are not separate objects or button components. + + + + + +Button + +Value + +Action + + + +Play + + + +btPlay + + + +Plays the media player + + + + +Pause + + + +btPause + + + +Pauses playing or recording. If already paused when clicked, resumes playing or recording. + + + + +Stop + + + +btStop + + + +Stops playing or recording + + + + +Next + + + +btNext + + + +Skips to the next track, or to the end if the medium doesn't use tracks + + + + +Prev + + + +btPrev + + + +Skips to the previous track, or to the beginning if the medium doesn't use tracks + + + + +Step + + + +btStep + + + +Moves forward a number of frames + + + + +Back + + + +btBack + + + +Moves backward a number of frames + + + + +Record + + + +btRecord + + + +Starts recording + + + + +Eject + + + +btEject + + + +Ejects the medium + + + + +The multimedia device is played, paused, stopped, and so on when the user clicks the corresponding button on the TMediaPlayer component. The device can also be controlled by the control methods that correspond to the buttons (Play, Pause, Stop, Next, Previous, Step, Back, StartRecording, and Eject). +The type of multimedia device (such as dtWaveAudio or dtVideodisc) is specified by the DeviceType property. If the device stores its media in a file, the name of the media file is specified by the FileName property. If DeviceType is dtAutoSelect, the media player attempts to determine the type of device from the extension of the file specified by FileName. +To have the media player attempt to open the device specified by DeviceType automatically when the media player component is created at runtime, set the AutoOpen property to true. + + + Provides responses when the user types arrow keys or the space bar. +KeyDown overrides the inherited method to implement the media player's response to certain keystrokes. It changes the current button when the user types the left or right arrow keys. When the user presses the space bar, KeyDown simulates a click on the current button. + + + Initializes the media player after it is loaded from a stream. +Loaded provides an opportunity for a component to initialize itself after all its parts have loaded from a stream. TMediaPlayer overrides the inherited method to implement the AutoOpen property. + + + Enables or Disables the media player's buttons. +AutoButtonSet implements the automatic enabling and disabling of the media player's buttons when the AutoEnable property is true. The Btn parameter indicates which of the media player's buttons the user pressed. + + + Responds when components are about to be inserted or removed. +By default, components pass along the notification to their owned components, if any. Notification calls the inherited Notification and then, if the Display window is deleted at runtime, it sets the video display back to original window. + + + Renders the image of the media player. +When the media player component receives a WM_PAINT message, like other custom controls, it responds by initializing the control's canvas and calling Paint. Paint draws the frame and all visible buttons. +When creating a descendant media player class, Paint can be overridden to draw the image of the corresponding media player object. + + + Responds to a notification that the MCI device has completed an operation. +MMNotify responds to a notification message from Windows that a multimedia command completed by updating button states if the AutoEnable property is true, setting internal flags to reflect the outcome of the command, then calling the DoNotify method to trigger the OnNotify event and any other special responses. + + + Generates an OnClick event. +Click for media-player components is the implementation method for the OnClick event. By default, Click does nothing other than call any event handler attached to the media player's OnClick event. Click can be overridden in descendant classes to customize responses to clicks. + + + Determines the action that takes place when an OnPostClick event occurs. +PostClick is the implementation method for the OnPostClick event. By default, PostClick does nothing other than call any event handler attached to the media player's OnPostClick event. PostClick can be overridden in descendant types to customize responses to clicks. + + + Generates an OnNotify event. +DoNotify is the implementation method for a media-player component's OnNotify event. The media player's MMNotify method calls DoNotify after correcting the enabling and disabling of buttons and setting internal flags from the values passed in the notification message parameters. +By default, DoNotify does nothing except call any event handler attached to the media player's OnNotify event. DoNotify can be overridden to provide other responses in addition to the inherited event-handler call. + + + Signals that the media player has finished updating. +Updated calls the inherited Updated before it modifies the layout of the media player buttons and forces a repaint. + + + Creates a media player object. +Call Create to instantiate a media player at runtime. For media players created at design time, Create is called automatically. +Create allocates memory for a media player and calls the inherited Create. Then it loads the bitmaps for the media player's buttons and initializes its properties, setting AutoEnable, AutoRewind, Colored, Enabled, and Visible to true, AutoOpen to false, and DeviceType to dtAutoSelect. + + + Destroys an instance of the media player. +Do not call Destroy directly in an application. Call Free instead. Free checks that the TMediaPlayer reference is not nil before it calls Destroy. +Destroy first verifies that no device is open, then destroys the bitmaps used for the media player's buttons and calls the inherited Destroy. + + + Opens a multimedia device. +Use Open to open a multimedia device. The multimedia device type must be specified in the DeviceType property before a device can be opened. +Upon completion, Open stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Open method is completed. The Notify property determines whether Open generates an OnNotify event. + + + Closes the open multimedia device. +Upon completion, Close stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Close method is completed. The Notify property determines whether Close generates an OnNotify event. +Close is called automatically when the application is terminated. + + + Plays the media loaded in the open multimedia device. +Play is called when the Play button on the media player control is clicked at runtime. +Upon completion, Play stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Play method has completed. The Notify property determines whether Play generates an OnNotify event. +If the StartPos property is set, playing starts at the position specified in StartPos. Otherwise, playing starts at the current position, specified in the Position property. Similarly, if the EndPos property is set, playing stops at the position specified in EndPos. Otherwise, playing stops at the end of the medium. +Whether the medium (specified in the Position property) is rewound before playing starts depends on the AutoRewind property. + + + Halts playing or recording. +Stop is called when the Stop button on the media player control is clicked at runtime. +Upon completion, Stop stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Stop method has completed. The Notify property determines whether Stop generates an OnNotify event. + + + Toggles the open multimedia device on or off. +If the device is already paused when Pause is called, the device resumes playing or recording by calling the Resume method. Pause is called when the Pause button on the media player control is clicked at runtime. +Upon completion, Pause stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Pause method has completed. The Notify property determines whether Pause generates an OnNotify event. + + + Moves forward a number of frames (determined by the Frames property) in the currently loaded medium. +Step is called when the Step button on the media player control is clicked at runtime. +Upon completion, Step stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Step method has completed. The Notify property determines whether Step generates an OnNotify event. + + + Steps backward a number of frames (determined by the value of the Frames property) in the currently loaded medium. +Back is called when the Back button on the media player control is clicked at runtime. +Upon completion, Back stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Back method has been completed. The Notify property determines whether Back generates an OnNotify event. + + + Sets the current position to the beginning of the previous track if the position was at the beginning of a track when Previous was called. +If the position is at the first track or somewhere other than the beginning of a track when Previous was called, Previous sets the current position to the beginning of the current track. If the device doesn't use tracks, Previous sets the current position to the beginning of the medium, which is specified in the Start property. Previous is called when the Previous button on the media player control is clicked at runtime. +Upon completion, Previous stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Previous method has completed. The Notify property determines whether Previous generates an OnNotify event. + + + Moves to the beginning of the next track of the currently loaded medium. +If the current position is at the last track when Next is called, Next makes the current position the beginning of the last track. If the multimedia device doesn't use tracks, Next goes to the end of the medium. Next is called when the Next button on the media player control is clicked at runtime. +Upon completion, Next stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Next method has completed. The Notify property determines whether Next generates an OnNotify event. + + + Begins recording from the current Position or from the position specified in StartPos. +StartRecording is called when the Record button on the media player control is clicked at runtime. +Upon completion, StartRecording stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the StartRecording method has completed. The Notify property determines whether StartRecording generates an OnNotify event. +By default, the Notify property becomes true, and the Wait property becomes false upon completion of the StartRecording method. However, if these properties have been set to specific values prior to calling StartRecording, they remain unchanged. + + + Releases the loaded medium from the open multimedia device. +Eject is called when the Eject button on the media player control is clicked at runtime. It ejects the loaded medium from the open multimedia device. +Upon completion, Eject stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Eject method has been completed. The Notify property determines whether Eject generates an OnNotify event. + + + Saves the currently loaded medium to the file specified in the FileName property. +Save is ignored for devices that don't use media stored in files (videodiscs, for example). +Upon completion, Save stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Save method has completed. The Notify property determines whether Save generates an OnNotify event. + + + Pauses the open multimedia device. +If the device is already paused when PauseOnly is called, the device will remain paused. +Upon completion, PauseOnly stores a numerical error code in the Error property and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the PauseOnly method has completed. The Notify property determines whether PauseOnly generates an OnNotify event. + + + Resumes playing or recording the currently paused multimedia device. +Resume is called when the Pause button on the media player control is clicked at runtime, when the device is paused. +Upon completion, Resume stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Resume method has completed. The Notify property determines whether Resume generates an OnNotify event. + + + Sets the current position to the beginning of the the medium, which is stored in the Start property. +Upon completion, Rewind stores a numerical error code in the Error property, and the corresponding error message in the ErrorMessage property. +The Wait property determines whether control is returned to the application before the Rewind method has completed. The Notify property determines whether Rewind generates an OnNotify event. + + + Determines the capabilities of the open multimedia device. +The various capabilities specified in Capabilities are determined when the device is opened with the Open method. + +Note: Currently, there is no way to check whether a device can step forward or backward. Capabilities includes mpCanStep only if the device type (specified in the DeviceType property) is Animation, AVI Video, Digital Video, Overlay, or VCR. + + + Specifies the MCI error code returned by the media control method. +Error specifies the MCI error code returned by the most recent media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop). The ErrorMessage property describes the Error. +The error code returned by media control methods are the same error code returned by the mciSendCommand function. The message describing the error code is stored in the ErrorMessage property. +The value of Error is zero if the most recent media control method didn't cause an error. If a method results in an error, a value other than zero is stored in Error. If the error occurs during the opening of the device, an EMCIDeviceError exception occurs. + + + Describes the error code stored in the Error property. +ErrorMessage specifies the error message that describes the error code returned from the most recent media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop). +The error code described by the message is stored in the Error property. + + + Specifies the starting position within the currently loaded medium. +Start is the beginning of the medium for devices that don't use tracks, or the beginning of the first track for devices that use tracks. Start is defined when a multimedia device is opened with the Open method. Start is specified according to the current time format, which is stored in the TimeFormat property. Start is read-only at runtime and is unavailable at design time. + + + Specifies the length of the medium in the open multimedia device. +Length is specified using the current time format, which is specified by the TimeFormat property. + + + Specifies the number of playable tracks on the open multimedia device. +Tracks indicates how many of playable tracks are available on the open multimedia device. +Tracks is undefined for devices that don't use tracks. + + + Specifies the number of frames moved forward or backward. +Frames specifies the number of frames the Step method steps forward or the Back method steps backward. Frames defaults to ten percent of the length of the currently loaded medium, which is specified by the Length property. +The definition of a frame varies by multimedia device. For display media, a frame is one still image. + + + Indicates the state of the currently open multimedia device. +Mode specifies the current state or mode of the currently open multimedia device. +The TMPModes type defines the modes for a multimedia device used with a TMediaPlayer. + + + Specifies the current position within the currently loaded medium. +The value of Position is specified according to the current time format, which is specified in the TimeFormat property. +Position defaults to the beginning of the medium. If the medium supports multiple tracks, Position defaults to the beginning of the first track. + + + Determines whether a media control method returns control to the application only after it has been completed. +Wait determines whether a media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop) returns control to the application only after it has been completed. +Wait is unavailable at design time. +If Wait is true, the media player component waits until the next media control method has completed before returning control to the application. If Wait is false, the application won't wait for the next media control method to finish before continuing. +Wait affects only the next media control method called after setting Wait. Wait must be reset to affect any subsequent call to a media control method. +By default, Play and StartRecording function as if Wait is false. Wait must be set to true before calling Play or StartRecording to prevent control from returning to the application before playing or recording has finished. By default, all other media control methods function as if Wait is true. + +Note: Wait is usually set to false only if the next media control is expected to take a long time, so that the application can execute other code before the media control method has completed. If Wait is set to false, you should set Notify to true so the application is notified when the media control method completes. + + + Determines whether an OnNotify event is generated. +Notify determines whether the next call to a media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop) generates an OnNotify event when the method has completed. +If Notify is true, the next media control method generates OnNotify event upon completion and stores the notification message in the NotifyValue property. If Notify is false, the method does not generate an OnNotify event and NotifyValue remains unchanged. +Notify affects only the next call to a media control method. After an OnNotify event, Notify must be reset to affect any subsequent media control methods. +By default, Play and StartRecording function as if Notify is true. Set Notify to false before calling Play or StartRecording to prevent an OnNotify event from being generated when playing or recording has finished. By default, all other media control methods function as if Notify is false. + +Tip: Set Notify to true if the next media control is expected to take a long time, so the application is notified when the media control method has completed. If Notify is set to true, it is recommended to set Wait to false so that control returns to the application before the media control method is finished. +Note: When trying to resume a device that doesn't support Resume, the device is resumed as if the Play method was called. If Notify was assigned true before calling Resume (or any other media control method), Notify doesn't affect the call to Resume. Resume does not generate an OnNotify event upon completion, and NotifyValue remains unchanged. + + + Indicates the result of the last media control method that requested a notification. +NotifyValue reports the result of the last media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step, or Stop) that requested a notification. +To request notification, set Notify to true before calling a media control method. + + + Specifies the position within the currently loaded medium from which to begin playing or recording. +StartPos is specified using the current time format, which is specified in the TimeFormat property. +The StartPos property affects only the next Play or StartRecording method called after setting StartPos. Reset must be set to StartPos to affect any subsequent calls to Play or StartRecording. +StartPos does not affect the current position of the medium (specified in the Position property) until the next Play or StartRecording method is called. + + + Specifies the position within the currently loaded medium at which to stop playing or recording. +EndPos is specified using the current time format, which is specified in the TimeFormat property. +The EndPos property affects only the next Play or StartRecording method called after setting EndPos. Reset EndPos to affect any subsequent calls to Play or StartRecording. + + + Specifies the device ID for the currently open multimedia device. +The value of DeviceID is determined when a device is opened with the Open method. If no device is open, DeviceID is 0. + + + Determines the format used to specify position information. +TimeFormat determines how the StartPos, Length, Position, Start, and EndPos properties are interpreted. For example, if Position is 180 and TimeFormat is tfMilliseconds, the current position is 180 milliseconds into the medium. If Position is 180 and TimeFormat is tfMSF, the current position is 180 minutes into the medium. +Not all formats are supported by every device. When trying to set an unsupported format, the assignment is ignored. +The current timing information is always passed in a 4-byte integer. In some formats, the timing information returned is not really one integer, but single bytes of information packed in the long integer. + + + Specifies a rectangular area in the control specified by the Display property that is used to display output from a multimedia device. +To display output in a specific rectangle area on a form assign a TRect record to DisplayRect. The Rect function can be used to create a TRect record. +Media that use a rectangle to display output usually perform best if the default DisplayRect size is used. To set DisplayRect to the default size, position the rectangle in the upper left corner and use 0, 0 for the lower right corner. +DisplayRect is ignored if Display is nil (Delphi) or NULL (C++). +Examples of multimedia devices that use a window to display output are Animation, AVI Video, Digital Video, Overlay, and VCR. + +Note: DisplayRect can be set only after the media device is opened. + + + Determines which buttons on the media player control have color. +ColoredButtons controls which buttons on the media player are colored. +If a button is not colored with ColoredButtons, it appears in black-and-white when visible. All media player control buttons are colored by default. + + + Determines which buttons on the media player are usable. +EnabledButtons controls which buttons on the media player are enabled and usable. +An enabled button is colored and usable. A disabled button is dimmed and not usable. If a button is not enabled with EnabledButtons, it is disabled. By default, all buttons are enabled. +If the AutoEnable property is true, AutoEnable supersedes EnabledButtons. The buttons automatically enabled or disabled by the media player override any buttons enabled or disabled with the EnabledButtons property. + + + Indicates which of the buttons on the media player are visible. +VisibleButtons determines which buttons on the media player that are visible. If a button is not made visible with VisibleButtons, it does not appear on the media player control. By default, all buttons are visible when a media player component is added to a form. + + + Determines whether the media player automatically enables and disables individual buttons in the component. +Use AutoEnable to automatically enable or disable the control buttons on the media player. If AutoEnable is true, the media player automatically enables or disables its control buttons. The media player determines which buttons to enable or disable by the current mode specified in the Mode property, and the current multimedia device type specified in the DeviceType property. +AutoEnable overrides the EnabledButtons property. The buttons enabled or disabled automatically by the media player supersede any buttons enabled or disabled with EnabledButtons. +If AutoEnable is false, the media player does not enable or disable buttons. The buttons must enabled or disabled with the EnabledButtons property. +The following table shows whether buttons are automatically enabled or disabled for each device mode: + + + + + +Button + +Play + +Record + +Pause + +Stop + +Not Open + + + +Back + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Eject + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Next + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Pause + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + +Disabled + + + + +Play + + + +Disabled + + + +Disabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Prev + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Record + + + +Disabled + + + +Disabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Step + + + +Enabled + + + +Enabled + + + +Enabled + + + +Enabled + + + +Disabled + + + + +Stop + + + +Enabled + + + +Enabled + + + +Disabled + + + +Disabled + + + +Disabled + + + Determines if the media player is opened automatically when the application is run. +Use AutoOpen to have the media player automatically open at runtime. +If AutoOpen is true, the media player attempts to open the multimedia device specified by the DeviceType property (or FileName if DeviceType is dtAutoSelect) when the form containing the media player component is created at runtime. +If AutoOpen is false, the device must be opened with a call to the Open method. +If an error occurs when opening the device, an exception of type EMCIDeviceError exception is raised that contains the error message. Upon completion, a numerical error code is stored in the Error property, and the corresponding error message is stored in the ErrorMessage property. +The Wait property determines whether control is returned to the application before opening the multimedia device. The Notify property determines whether opening the device generates an OnNotify event. + + + Determines if the media player control rewinds before playing or recording. +If AutoRewind is true and the current position is at the end of the medium, Play or StartRecording moves the current position to the beginning of the medium before playing or recording. If AutoRewind is false, the user must click the Prev button or write code to call Previous to move to the beginning. +If values have been assigned to StartPos or EndPos or if the multimedia device uses tracks, AutoRewind has no effect on playing or recording. When calling Play or StartRecording, the current position remains at the end of the medium. + + + Specifies a multimedia device type to open with the media player. +DeviceType specifies a multimedia device type to open with the Open method. The default is dtAutoSelect. +If DeviceType is dtAutoSelect, the device type is determined by the file extension specified in the FileName property. If no device type is associated with the extension, the correct device type must be explicitly specified by setting DeviceType to a value other than dtAutoSelect. +A multimedia device is typically associated with an appropriate file name extension when the device is installed. Associations are specified in the registry or SYSTEM.INI file. See the documentation for the specific device for instructions about how to associate file name extensions with the device. + + + Specifies the display window for a multimedia device that uses a window for output. +To use Display, assign the name of a windowed control such as a form or panel to Display to display output in that control. +The default value of Display is nil (Delphi) or NULL (C++), meaning that the device creates its own window to display output. Also, by freeing the control assigned to Display after the device has been opened, video output will be in its own default window. +Examples of multimedia devices that use a window to display output are Animation, AVI Video, Digital Video, Overlay, and VCR. + + + Specifies the opened or saved media file. +FileName specifies the media file to be opened by the Open method, or the file to save by the Save method. +At design time, use a file open dialog box to specify the FileName property by clicking the ellipsis button (...) in the Object Inspector. + + + Determines whether more than one application can share a multimedia device. +If Shareable is false, no other components or applications can access the device. If Shareable is true, more than one component or application can access the device. Shareable defaults to false. +Be sure to set Shareable before opening a device. +Some devices are not shareable. If Shareable is set to true for a device that isn't shareable, the Open method fails and the error code is returned to the Error property. + + + Occurs when the user presses and releases the mouse button while the mouse pointer is over one of the control buttons, or when the user presses Spacebar while the media player control has focus. +When the media player control has focus and the Spacebar is pressed, the user can use the Left Arrow or Right Arrow keys to select which control button to click. +The EMPNotify type is a method pointer that is called when an OnClick event for a TMediaPlayer components occurs. The Button argument can be one of the following values: btBack, btEject, btNext, btPause, btPlay, btPrev, btRecord, btStep, or btStop. +The default value of the event handler's DoDefault argument is true. If DoDefault is true, the media player control calls the method that corresponds to the clicked button. For example, if the user clicks the Play button (btPlay), the Play method is called. +If DoDefault is false, the user must write code that executes when a media player control button is clicked in the OnClick event handler. The following table lists the default methods corresponding to the media player control buttons: + + + + + +Control button + +Button value + +Method called + + + +Play + + + +btPlay + + + +Play + + + + +Record + + + +btRecord + + + +StartRecording + + + + +Stop + + + +btStop + + + +Stop + + + + +Next + + + +btNext + + + +Next + + + + +Prev + + + +btPrev + + + +Previous + + + + +Step + + + +btStep + + + +Step + + + + +Back + + + +btBack + + + +Back + + + + +Pause + + + +btPause + + + +Pause + + + + +Eject + + + +btEject + + + +Eject + + + Occurs after the OnClick event handler is called. +OnPostClick is generated after the code of the OnClick event handler has been called. If Wait is true when the media player was clicked, OnPostClick won't be called until the completion of the OnClick code. If Wait is false, control can return to the application before completion of the OnClick code; therefore, the OnPostClick event may occur before the actions initiated by the OnClick event have completed. +For example, if the user clicks the Play button and the DoDefault parameter of the OnClick event handler for the media player is true, the media is played. If the media is long enough, it will still be playing when the OnPostClick event is generated if Wait is true. If Wait is false, however, OnPostClick won't occur until the media has finished playing. + + + Occurs upon the completion of a media control method. +OnNotify occurs upon the completion of a media control method (Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, Resume, Rewind, StartRecording, Step, or Stop) when the Notify property is set to true before the call to the media control method. After an OnNotify event, the Notify property must be reset to true for the next OnNotify event to occur. + + + + + TTitleBar encapsulates the properties and methods used to draw a custom titlebar. + + + DrawTitleBarIcon is used to draw the icon of the owner form. + + + DrawTitleBarCaption is used to draw the text of the owner form. + + + DrawCustomTitleBar is used to draw a custom title bar, supports basic customization like show/hide icon and set caption and foreground colors. + + + InitTitleBarColors use this method to reset the colors used in the titlebar. + + + IconRect retrieves the bounds of the icon in the owner form. + + + ClientRect retrieves the bounds of the window returned by AdjustWindowRectEx. + + + ClientRect retrieves the bounds of the titlebar. + + + CaptionButtonsRect retrieves the bounds of the caption button area in the owner form. + + + CaptionAlignment used to set the alignment for the caption. + + + Control is used to assign a TCustomTitleBarPanel descendent to handle the titlebar drawing. + + + Enabled allows enable/disable the customization of the titlebar area. + + + Height retrieves the height of the titlebar and allows set a custom height for titlebar if the SystemHeight property is False . + + + SystemHeight used to specify if titlebar should use the system default height. Set to False allows set a custom height for the titlebar. + + + ShowCaption used to show/hide the caption on the title-bar + + + ShowIcon used to show/hide the icon on the title-bar. + + + SystemColors used to specify if titlebar should use the system default colors. Set to False allows set customs colors for the titlebar. + + + SystemButtons used to specify if titlebar should use the system caption buttons. Set to False allows set customs colors for the titlebar buttons. Windows 10 Only. + + + BackgroundColor gets or sets the color of the title bar background. + + + ForegroundColor gets or sets the color of the title bar foreground. + + + InactiveBackgroundColor gets or sets the color of the title bar background when the owner form is inactive. + + + InactiveForegroundColor gets or sets the color of the title bar foreground when the owner form is inactive. + + + ButtonForegroundColor gets or sets the foreground color of the title bar buttons. + + + ButtonBackgroundColor gets or sets the background color of the title bar buttons. + + + ButtonHoverForegroundColor gets or sets the foreground color of the title bar buttons when are hovered. + + + ButtonHoverBackgroundColor gets or sets the background color of the title bar buttons when are hovered. + + + ButtonPressedForegroundColor gets or sets the foreground color of the title bar buttons when are pressed. + + + ButtonPressedBackgroundColor gets or sets the background color of the title bar buttons when are pressed. + + + ButtonInactiveForegroundColor gets or sets the color of the title bar buttons foreground when the owner form is inactive. + + + ButtonInactiveBackgroundColor gets or sets the color of the title bar buttons background when the owner form is inactive. + + + + + TCustomForm is the base class from which to derive a window such as a form or dialog. +Derive from TCustomForm to create a custom window. The TCustomForm descendant can contain other objects, such as TButton, TCheckBox, and TComboBox objects. + + + Activation event dispatcher. +Activation is the event dispatcher for form activations. +The form component calls Activate in response to the CM_ACTIVATE message, sent when a form gets the focus either because of a change in active windows within an application or because of the application becoming active. As defined in TCustomForm, Activate simply calls the OnActivate event handler. + + + Active state event dispatcher. +ActiveChanged is the event dispatcher for changes in the form's active status. As implemented in TCustomForm, ActiveChanged does nothing. Override this method in a descendant class to implement event handling or other response to a change in the active form. + + + Adjusts the ClientRect property to exclude the scroll bars. +Vcl.Forms.TCustomForm.AdjustClientRect inherits from Vcl.Forms.TScrollingWinControl.AdjustClientRect. All content below this line refers to Vcl.Forms.TScrollingWinControl.AdjustClientRect. +Adjusts the ClientRect property to exclude the scroll bars. +AdjustClientRect is called internally when the control needs accurate information on where to place child controls within the client area. It indents Rect to exclude the area taken by the scroll bars, then calls the inherited AdjustClientRect method. + + + Aligns all child controls of the form that fall within a specified rectangle. +Use AlignControls to align all controls within an area of the form. Specify the area in which to align the controls as the value of the Rect parameter. +AlignControls uses the Align property value for each child control to determine how to align it. The AControl parameter can be nil (Delphi) or NULL (C++). If you specify a control in AControl, that control takes precedence in alignment over other, similarly aligned controls. + + + Responds when the user starts dragging the form if DragMode is dmAutomatic. +BeginAutoDrag suppresses the default behavior of the BeginAutoDrag method. This is because forms do not change the mouse cursor when dragged. + + + Repositions and resizes the form by the ratio M/D, adjusting its client area and font size as needed. +TCustomForm overrides ChangeScale to rescale any scroll bars and child controls. + + + Provides specific message responses for a MDI form from the client. +The ClientWndForm method receives message for a MDI form from a client. ClientWndForm is called when a form is created. ClientWndForm handles messages that deal with background erase, repaint, and determining which part of the window corresponds to a particular screen coordinate. Override ClientWndForm to change how the form responds to Windows client messages. + + + CloseModal prepares a modal form for closing. +Do not call CloseModal in your application. CloseModal is used by the VCL when a modal form needs to be closed. CloseModal does not close the form by itself; it simply calls the registered close events and updates the ModalResult property. + + + Initializes the window-creation parameter record when the form window is created. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomForm overrides CreateParams to customize the way the form creates its Windows representation after calling the inherited method. You should never need to override this method in the context of a form class. +The fields of the Params parameter become the parameters to a call to the CreateWindowEx OS function. + + + Creates a form window given a set of window-creation parameters. +The CreateWnd method calls CreateWindowHandle to create the form window once it has been specified in the window-creation parameters. CreateWindowHandle creates the window by calling the CreateWindowEx API function, passing parameters from the record passed in the Params parameter. CreateWindowHandle removes the CS_HREDRAW and CS_VREDRAW class styles from the window class. +Params holds information needed when telling Windows to create a window handle. + + + Creates the form window. +CreateWnd is called when the form is created, and whenever a change to the form requires the window to be recreated. CreateWnd calls (indirectly) the CreateParams method to obtain the window creation parameters, and then calls CreateWindowHandle to direct Windows to create the underlying window for the form. It then initializes the newly-created window to reflect the property settings of the form. + + + Generates an OnDeactivate event. +The form component calls Deactivate in response to the CM_DEACTIVATE message, sent when a form gets the focus either because of a change in active windows within an application or because of the application becoming active. +The default Deactivate method calls any event handler attached by the user to the OnDeactivate event. Override this method to block the OnDeactivate event or provide additional responses to the loss of activation. + + + Designates methods for storing a form's unpublished data on a stream such as a form file. +DefineProperties calls the inherited method and calls the filer object's DefineProperty method for the PixelsPerInch,and TextHeight properties. TForm descendants can also specify methods that read and write data other than properties by overriding the DefineProperties method. + + + Destroys the control's window without destroying the control. +Vcl.Forms.TCustomForm.DestroyHandle inherits from Vcl.Controls.TWinControl.DestroyHandle. All content below this line refers to Vcl.Controls.TWinControl.DestroyHandle. +Destroys the control's window without destroying the control. +Call DestroyHandle to dispose of the window, but leave the control intact. The control can later recreate the window if needed. DestroyHandle is the converse operation to CreateHandle. Applications should call the high-level CreateHandle and DestroyHandle methods, rather than the lower-level methods of CreateWnd and DestroyWnd, whenever possible. +If the control has TWinControl objects as child controls, DestroyHandle calls each of their DestroyHandle methods before calling DestroyWnd to destroy its own handle. + + + Destroys the window created in the CreateWindowHandle method. +DestroyWindowHandle is called automatically to destroy the window associated with a form before destroying the form. + + + Form closing event dispatcher. +DoClose is called automatically when the form is about to close. DoClose can alter closing behavior by changing the Action parameter. For more information, refer to the OnClose event handler. +As implemented in TCustomForm, DoClose simply calls the OnClose event handler. + + + Form creation event dispatcher. +DoCreate is called automatically after form construction is complete. The precise way DoCreate is called can be modified by setting the OldCreateOrder property. +As implemented in TCustomForm, DoCreate simply calls the OnCreate event handler. + + + Form destruction event dispatcher. +DoDestroy is called automatically when the TCustomForm object is about to be deallocated. The precise way DoDestroy is called can be modified by setting the OldCreateOrder property. +As implemented in TCustomForm, DoDestroy simply calls the OnDestroy event handler. + + + Form hide event dispatcher. +DoHide is called automatically when the form is hidden. +As implemented in TCustomForm, DoHide calls the OnHide event handler. + + + Form show event dispatcher. +DoShow is called automatically when the application is about to show the form. As implemented in TCustomForm, DoShow simply calls the OnShow event handler. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the value of the ClientRect property. +GetClientRect is the protected access function for the ClientRect property. It returns the dimensions of the form window, indented by any scroll bars and menus. +Override this method to change the way the client area of the form is defined. + + + Returns the value of the Floating property. +GetFloating is the protected access function for the Floating property. Override this method in descendants that implement floating windows in some class-specific way. + + + Returns the FTextHeight integer value of TCustomForm. + + + Embarcadero Technologies does not currently have any additional information. + + + Handles exceptions that are raised by the OnCreate event handler. +The form calls HandleCreateException internally if the OnCreate event handler raises an exception. HandleCreateException forwards the exception on to the application object, which generates an OnException event. If there is no OnException event handler, the application displays an exception message box. +HandleCreateException returns true if it handles the exception, false otherwise. + + + Embarcadero Technologies does not currently have any additional information. + + + Performs fix-ups when the form is first loaded into memory. +Loaded overrides the inherited method to give focus to the ActiveControl if it is assigned. Before assigning focus, Loaded calls the inherited method to perform any lower-level initialization. + + + Responds to notifications that objects are about to be inserted or removed. +Notification is called when the component specified by AComponent is about to be inserted or removed, as specified by Operation. By default, forms pass along the notification to their owned components, if any. In addition, Notification makes internal adjustments if the main menu is added or deleted. +A form can, if needed, override Notification to make other adjustments when components are inserted or removed. In particular, if a form has object fields or properties that contains references to other components, it might check the notifications of component removals and invalidate those references as needed. + + + Generates an OnPaint event. +The form component calls Paint in response to the WM_PAINT message (sent when the window needs to be painted) before rendering all controls on the form. +The default Paint method calls any event handler attached by the user to the OnPaint event. Override Paint to block the OnPaint event or to draw additional features before or after the OnPaint event. + + + Renders the image of the form. +Applications can't call this protected method. It is called when the form needs to be painted. +PaintWindow locks the canvas to prevent threading issues, assigns the DC parameter as the Handle of the form's canvas, and then calls the Paint method to render the image of the form. + + + Responds to changes in the system's palette by realizing the control's palette as returned from GetPalette. +PaletteChanged is called automatically when the system palette changes. The Foreground parameter indicates whether the palette realization should treat this control's palette as being in the foreground or the background. The return value from PaletteChanged indicates whether the form actually realized its palette, returning true only if the form has an associated palette. +Most applications should not need to alter the default behavior of PaletteChanged. + + + Obtains the design Dpi for the form where the control was designed. +Vcl.Forms.TCustomForm.GetDesignDpi inherits from Vcl.Controls.TControl.GetDesignDpi. All content below this line refers to Vcl.Controls.TControl.GetDesignDpi. +Obtains the design Dpi for the form where the control was designed. + + + Embarcadero Technologies does not currently have any additional information. + + + Reads the form's published properties, stored data, and owned components from a reader object. +ReadState is part of a sequence of calls used by the VCL streaming system that loads and saves VCL components. It reads the values of all the component's published properties, stored data, and owned components from the reader object passed in Reader. Do not call ReadState directly. +Any descendant classes overriding ReadState should end with a call to the inherited ReadState method. + + + Instructs the form's parent (if any) to reposition the form, enforcing its Align property. +RequestAlign is called internally when changes are made to the size or position of the form, so that it remains properly aligned within a dock site or properly positioned on the screen. + + + Changes the order in which Child appears when GetChildren is called. +Use SetChildOrder to change the order in which child components are loaded and saved. The Child moves as if it were an item in a list object: items previously below the child's old position move up, and those below the new position move down. + + + Sets the ParentBiDiMode property. +SetParentBiDiMode is the protected implementation of the ParentBiDiMode property. It overrides the inherited method to obtain the BiDiMode property of the application if the form does not have a parent. + + + Docking event dispatcher. +DoDock supplements the inherited DoDock method by updating form borders. + + + Sets the Parent property. +SetParent is the protected implementation of the Parent property. It overrides the inherited method to regenerate the form's window when the Parent property is changed to nil (Delphi) or NULL (C++). + + + Updates all actions associated with the form. +UpdateActions is called automatically when the application is idle to allow all components in the form an opportunity to update any actions for which the component is a target. This allows actions to be checked, grayed, and so on to reflect the current state of their targets. +UpdateActions updates all actions associated with the form, its menus, and the components contained in the form. + + + Updates the WindowState property to reflect the current state of the form. +UpdateWindowState ensures that the WindowState property reflects the current state of the form. + + + Called when the StyleElements property changes. +Vcl.Forms.TCustomForm.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + Determines if a form can rename one of its owned components. +The ValidateRename method checks to see if a form can rename one of its owned components, passed in AComponent, from its current name (CurName) to the string passed in NewName. If AComponent is nil (Delphi) or NULL (C++) or NewName is already the name of a component in the form's list, ValidateRename raises an EComponentError exception. + + + Responds just before the form changes the value of its Visible property. +This protected method raises an exception if, for some reason, the form should not change its visible state. + + + Provides specific message responses for the form. +WndProc is the first method that receives messages for a form. After calling the inherited method, WndProc performs some window activation, focus, and position message handling necessary to keep in sync with Windows. Override WndProc to change how the form responds to Windows messages. + + + Makes any required adjustments when the form changes size. +This protected method is called automatically when the form is resized, including when it is maximized, minimized, or restored to normal size. Resizing adjusts the size and position of any child controls that are aligned to the form. +The State parameter indicates the state of the form after the resize. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns a reference to a specified interface if that interface is supported by the form. +For forms that support interfaces, QueryInterface calls the QueryInterface method of the interface supported by the form. QueryInterface returns a reference to the interface specified by the IID parameter, as the Obj parameter. If the form does not support the interface, the Obj parameter is nil (Delphi) or NULL (C++). +QueryInterface returns S_OK if the Obj parameter is successfully assigned. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the MDI child that has focus. +Use ActiveMDIChild to get the MDI child that has focus. +If the form is not an MDI parent (that is, if the FormStyle property of the form is not fsMDIForm), ActiveMDIChild returns nil (Delphi) or NULL (C++). + + + Specifies whether the form is translucent. +Set AlphaBlend to specify that the form represents a layered window that allows a translucent color. The AlphaBlendValue property specifies the degree of translucency. + +Note: AlphaBlend does not work on all systems. The application must be running under Windows 2000 or better, and the machine must be a P90 or better. + + + Specifies the degree of translucency on a translucent form. +Set AlphaBlendValue to a value between 0 and 255 to indicate the degree of translucency when the AlphaBlend property is true. A value of 0 indicates a completely transparent window. A value of 255 indicates complete opacity. + +Note: AlphaBlendValue only has an effect when the AlphaBlend property is true. + + + Specifies which icons appear on the title bar of the form. +Use BorderIcons to get or set the icons that appear on the title bar of the form. BorderIcons can include any of the following TBorderIcons values: + + + + + +Value + +Meaning + + + +biSystemMenu + + + +The form has a Control menu (also known as a System menu). + + + + +biMinimize + + + +The form has a Minimize button + + + + +biMaximize + + + +The form has a Maximize button + + + + +biHelp + + + +If BorderStyle is bsDialog or biMinimize and biMaximize are excluded, a question mark appears in the form's title bar and when clicked, the cursor changes to crHelp; otherwise,no question mark appears. + + + + + +Note: Certain combinations of the BorderIcons and BorderStyle properties are mutually exclusive. For example, BorderIcons biMax, biMin with BorderStyle of bsDialog are mutually exclusive. + + + Indicates whether scroll bars appear automatically on the scrolling windowed control if it is not large enough to display all of its controls. +If AutoScroll is true, the scroll bars appear automatically when necessary. For example, if the user resizes the control so that some of its controls are partially obscured, scroll bars appear. +If AutoScroll is false, scroll bars don't appear automatically. In this case, use the HorzScrollBar and VertScrollBar properties to make scroll bars appear. + + + Specifies the height of the control's client area in pixels. +Use ClientHeight to read or change the height of the control's client area. +For TControl, ClientHeight is the same as Height. Derived classes may implement a ClientHeight property that differs from Height. For example, the ClientHeight of a form is the value of the Height property minus the height of the title bar, resize border, and scroll bars. + + + Specifies the horizontal size of the control's client area in pixels. +Use ClientWidth to read or change the width of the control's client area. ClientWidth is equivalent to ClientRect.Right. +For TControl, ClientWidth is the same as Width. Derived classes may implement a ClientWidth property that differs from Width. For example, the ClientWidth of a form is the value of the Width property minus the width of the resize border and scroll bars. + + + Specifies whether a color on the form appears transparent. +Use TransparentColor to indicate that one of the colors on the form should be treated as transparent, allowing windows behind the form to completely show through. The TransparentColorValue property indicates the color that appears completely transparent. + +Note: To make the entire form transparent, or to make it translucent rather than transparent, use the AlphaBlend and AlphaBlendValue properties. +Note: TransparentColor does not work on all systems. The application must be running under Windows 2000 or better, with adequate hardware. + + + Indicates the color on the form that appears transparent when TransparentColor is true. +Use TransparentColorValue to indicate the color that appears transparent when the TransparentColor property is true. + +Note: If the application uses a 16-bit color palette, TransparentColorValue must be a basic color. + + + Determines whether a control has a three-dimensional (3-D) or two-dimensional look. +Ctl3D is provided for backward compatibility. It is not used by 32-bit versions of Windows or NT4.0 and later, with the exception of Windows XP Home, where it is used on occasion. +On earlier platforms, Ctl3D controlled whether the control had a flat or beveled appearance. + + +Note RAD Studio no longer supports Windows Vista or earlier. + + + Specifies the monitor on which the form appears. +Use DefaultMonitor to associate a form with a particular monitor in a multi-monitor application. The following table lists the possible values: + + + + + +Value + +Meaning + + + +dmDesktop + + + +No attempt is made to position the form on a specific monitor. + + + + +dmPrimary + + + +The form is positioned on the first monitor listed in the global screen object's Monitors property. + + + + +dmMainForm + + + +The form appears on the same monitor as the application's main form. + + + + +dmActiveForm + + + +The form appears on the same monitor as the currently active form. + + + + + +Note: DefaultMonitor has no effect if the application does not have a main form. + + + Represents the horizontal scroll bar for the scrolling windowed control. +Use HorzScrollBar to hide, show, or manipulate the horizontal scroll bar for the scrolling windowed control. + + + Specifies the icon that appears when the form is minimized. +Set the Icon property to provide an icon for the form. If Icon is not set, the system provides a default icon when the form is minimized. + + + Specifies the number of open MDI child forms. +Use MDIChildCount to get the number of open MDI child forms. +MDIChildCount is meaningful only if the form is an MDI parent (that is, if the form's FormStyle property is set to fsMDIForm). + + + Represents an OLE object menu item that reacts to selections of OLE objects. +Use ObjectMenuItem to get or set a menu item that becomes enabled or disabled when an OLE object on the form is selected or unselected respectively. +The OLE object menu item can be used for standard OLE commands, such as Activate or Convert. (The implementations of these commands are provided by the OLE server.) + + + Specifies where a control looks for its font information. +To have a control use the same font as its parent control, set ParentFont to true. If ParentFont is false, the control uses its own Font property. Many controls default ParentFont to true so that all the controls in a form or other container present a uniform appearance. When the value of a control's Font property changes, ParentFont becomes false automatically. +When ParentFont is true for a form, the form uses the default font. Currently, the default font is Tahoma 8 pt. + + + Specifies the pop-up menu associated with the control. +Assign a value to PopupMenu to make a pop-up menu appear when the user selects the control and clicks the right mouse button. If the TPopupMenu's AutoPopup property is True, the pop-up menu appears automatically. If the menu's AutoPopup property is False, display the menu with a call to its Popup method from the control's OnContextPopup event handler. + + + Embarcadero Technologies does not currently have any additional information. + + + Represents the size and placement of the form. +Use Position to get or set the size and placement of the form. Position can have one of the following TPosition values: + + + + + +Value + +Meaning + + + +poDesigned + + + +The form appears positioned on the screen and with the same height and width as it had at design time. + + + + +poDefault + + + +The form appears in a position on the screen and with a height and width determined by the operating system. Each time you run the application, the form moves slightly down and to the right. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of bsDialog or bsNone, for example), the window is positioned in the upper-left corner of the screen. + + + + +poDefaultPosOnly + + + +The form displays with the size you created it at design time, but the operating system chooses its position on the screen. Each time you run the application, the form moves slightly down and to the right. When the form can no longer move down and to the right and keep the same size while remaining entirely visible on the screen, the form displays at the upper-left corner of the screen. +The operating system only supports this for overlapped windows. For a pop-up or child window (that has a BorderStyle of bsDialog or bsNone, for example), the window is positioned in the upper-left corner of the screen. + + + + +poDefaultSizeOnly + + + +The form appears in the position you left it at design time, but the operating system chooses its size. The right side of the form is always near the rightmost side of the screen, and the bottom of the form is always near the bottom of the screen, regardless of the screen's resolution. + + + + +poScreenCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. In multi-monitor applications, the form may be moved from this center position so that it falls entirely on one monitor, as specified by the DefaultMonitor property. + + + + +poDesktopCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the screen. No adjustments are made for multi-monitor applications. + + + + +poMainFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the application's main form. No adjustments are made for multi-monitor applications. This position should only be used with secondary forms. If set for a main form, it acts like poScreenCenter. + + + + +poOwnerFormCenter + + + +The form remains the size you left it at design time, but is positioned in the center of the form specified by the Owner property. If the Owner property does not specify a form, this position acts like poMainFormCenter. + + + + +Note that if Position is set to poDefault, poDefaultPosOnly or poDefaultSizeOnly, and BorderStyle is set to bsDialog or bsNone, the form will be positioned at (0,0). + + + Represents the proportions of a printed form. +Use PrintScale to get or set the proportions of the printed form. PrintScale can have one of the following TPrintScale values: + + + + + +Value + +Meaning + + + +poNone + + + +No special scaling occurs; therefore, the printed form and how the form appears onscreen may appear squished or stretched. + + + + +poProportional + + + +The form is printed so that the printed image is approximately the same visible size as on the screen (WYSIWYG). The form image is scaled so that the printed image is approximately the same visible size as on the screen. + + + + +poPrintToFit + + + +The form is printed using the same screen proportions, but in a size that just fits the printed page. + + + Represents how MDI child forms are arranged when the Tile method is called. +TileMode can have one of the following TTileMode values: + + + + + +Value + +Meaning + + + +tbHorizontal + + + +Each form stretches across the width of the parent form + + + + +tbVertical + + + +Each form stretches along the height of the parent form + + + + +TileMode is meaningful only if the form is an MDI child (that is, if the form's FormStyle property is set to fsMDIChild). + + + Represents the vertical scroll bar for the scrolling windowed control. +Use VertScrollBar to hide, show, or manipulate the vertical scroll bar for the scrolling windowed control. + + + Specifies whether the component appears onscreen. +Use the Visible property to control the visibility of the control at run time. If Visible is True, the control appears. If Visible is False, the control is not visible. +Calling the Show method sets the control's Visible property to True. Calling the Hide method sets it to False. +For TCustomForm descendants, the Show and ShowModal methods set Visible to True and bring the form to the front of all open windows. +For TTabSheet descendants, Visible does not control the visibility of the control at run time. For more information, see the description of the TabVisible property. + + + Specifies the Window menu for an MDI parent form. +Use WindowMenu to get or set the Window menu for an MDI parent form. The Window menu is a standard menu in MDI applications. It contains commands that let the user manage the windows in the application. Menu items usually include Cascade, Arrange Icons, Tile, and so on. +The Window menu also lists (at the bottom) the child windows that are currently open in the application. When the user selects one of these windows from the menu, the window becomes the active window in the application. +Although this menu is commonly called the Window menu, it can have any name that corresponds to an existing menu item on the menu bar. The names of open child forms are merged onto the menu automatically at run-time. +WindowMenu is meaningful only if the form is an MDI parent (that is, if the form's FormStyle property is set to fsMDIForm). + + + Provides access to the handle of the form's internal MDI client window. +Use ClientHandle to get the handle for the form's internal MDI client window. +ClientHandle is meaningful only if the form is an MDI parent (that is, if the form's FormStyle property is set to fsMDIForm). + +Note: Use the Handle property instead to get the handle to the form window itself. + + + Determines the form's style. +Use FormStyle to get or set the form's style. FormStyle is one of the following values: + + + + + +Value + +Meaning + + + +fsNormal + + + +The form is neither an MDI parent window nor an MDI child window. + + + + +fsMDIChild + + + +The form is an MDI child window. + + + + +fsMDIForm + + + +The form is an MDI parent window. + + + + +fsStayOnTop + + + +This form remains on top of the desktop and of other forms in the project, except any others that also have FormStyle set to fsStayOnTop. If one fsStayOnTop form launches another, neither form will consistently remain on top. + + + + +If the form is the main form of an MDI application, its FormStyle property must be set to fsMDIForm. + +Note: It is not advisable to change FormStyle at runtime. +Warning: TGraphicControl descendants placed in the client area of a form with FormStyle set to fsMDIForm will not paint. + + + Specifies the vertical size of the control in pixels. +Use the Height property to read or change the height of the control. + + + Specifies the horizontal size of the control or form in pixels. +Use the Width property to read or change the width of the control. + +Note: For tab sheet controls, changing this property at run time has no effect. + + + Occurs when the form becomes active. +Use OnActivate to perform special processing when the form receives focus. A form becomes active when focus is transferred to it (when the user clicks on the form, for example). + +Note: The OnActivate event of the application (TApplication), not the form, occurs when Windows switches control from another application. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Occurs when an attempt is made to resize the control. +Use OnCanResize to adjust the way a control is resized. If necessary, change the new width and height of the control in the OnCanResize event handler. The OnCanResize event handler also allows applications to indicate that the entire resize should be aborted. +If there is no OnCanResize event handler, or if the OnCanResize event handler indicates that the resize attempt can proceed, the OnCanResize event is followed immediately by an OnConstrainedResize event. +OnCanResize is an event handler of type Vcl.Controls.TCanResizeEvent. + + + Occurs when the user clicks the control. +Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action's OnExecute method responds to click events unless it is superseded by an OnClick event handler. +Usually, OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when: + +The user selects an item in a grid, outline, list, or combo box by pressing an arrow key. +The user presses the SPACEBAR while a button or check box has focus. +The user presses ENTER when the active form has a default button (specified by the Default property). +The user presses ESC when the active form has a cancel button (specified by the Cancel property). +The user presses the accelerator key for a button or check box. For example, if the value of the Caption property of a check box is '&Bold', the B is underlined at run time and the OnClick event of the check box is triggered when the user presses Alt+B. However, focus does not move to the control in these instances. +The Checked property of a radio button is set to True. +The value of the Checked property of a check box is changed. +Note: When you change the value of the Checked property programmatically, the OnClick event of the check box control occurs. Do not modify the value of the Checked property in the event handler of the OnClick event, because that leads into a deadlock situation. +The Click method of a menu item is called. +For a form, an OnClick event occurs when the user clicks a disabled component or in a blank area of the form. +OnClick is an event handler of type TNotifyEvent. + + + Occurs when the form closes. +Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close. The handler specified by OnClose might, for example, test to make sure all fields in a data-entry form have valid contents before allowing the form to close. +A form is closed by the Close method or when the user chooses Close from the form's system menu. +The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines if the form actually closes. These are the possible values of Action: + + + + + +Value + +Meaning + + + +caNone + + + +The form is not allowed to close, so nothing happens. + + + + +caHide + + + +The form is not closed, but just hidden. Your application can still access a hidden form. + + + + +caFree + + + +The form is closed and all allocated memory for the form is freed. + + + + +caMinimize + + + +The form is minimized, rather than closed. This is the default action for MDI child forms. + + + + +If a form is an MDI child form, and its BorderIcons property is biMinimize, then the default Action is caMinimize. If a MDI child form does not have these settings, the default Action is caNone, meaning that nothing happens when the user attempts to close the form. +If a form is an SDI child form, Action defaults to caHide. +To close the form and free it in an OnClose event, set Action to caFree. + +Note: When the application shuts down, the main form receives an OnClose event, but any child forms do not receive the OnClose event. + + + Occurs when close is attempted. +Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler returns a Boolean CanClose value that determines whether a form is allowed to close. Its default value is true. +You can use an OnCloseQuery event handler to ask users if they are sure they really want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form. +The TCloseQueryEvent type points to the method that determines whether a form can be closed. The value of the CanClose parameter determines if the form can close or not. + + + Occurs when the form is created. +Use OnCreate to perform special processing when the form is created and is invoked by TCustomForm's constructor. Either implement this event or override the constructor of the form; do not do both. Any objects created in the OnCreate event should be freed by the OnDestroy event. +When a form is being created and its Visible property is true, the following events occur in the order listed: + +OnCreate +OnShow +OnActivate +OnPaint +Note: Use of the OnCreate event is discouraged in C++ code because it can interact badly with the form's constructor (see OldCreateOrder). It is recommended that you override the form constructor instead. + + + Occurs when the user double-clicks the left mouse button when the mouse pointer is over the control. +Use the OnDblClick event to respond to mouse double-clicks. +OnDblClick is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the form is destroyed. +Use OnDestroy to perform special processing when the form is destroyed. Either implement this event or override the destructor of the class, but not both. This event should destroy any objects created in the OnCreate event. + + + Occurs when the form loses focus. +Use OnDeactivate to perform special processing when the active form becomes inactive and another form in the same application becomes the active one. If activation goes to another application, this event is not triggered. To determine whether another application has become active, use the TApplication object's OnDeactivate event. + +Note: OnDeactivate is called differently than described, when the form's parent is set to another component (for example, a panel). + + + Occurs when the user drops an object being dragged. +Use the OnDragDrop event handler to specify what happens when the user drops an object. The Source parameter of the OnDragDrop event is the object being dropped, and the Sender is the control on which the object is being dropped. The X and Y parameters are the coordinates of the mouse positioned over the control. +OnDragDrop is an event handler of type TDragDropEvent. + + + Occurs when the user drags an object over a control. +Use an OnDragOver event to signal that the control can accept a dragged object so the user can drop or dock it. +Within the OnDragOver event handler, change the Accept parameter to False to reject the dragged object. Leave Accept as True to allow the user to drop or dock the dragged object on the control. +To change the shape of the cursor, indicating that the control can accept the dragged object, change the value of the DragCursor property for the control before the OnDragOver event occurs. +The Source is the object being dragged, the Sender is the potential drop or dock site, and X and Y are screen coordinates in pixels. The State parameter specifies how the dragged object is moving over the control. + +Note: Within the OnDragOver event handler, the Accept parameter defaults to True. However, if an OnDragOver event handler is not supplied, the control rejects the dragged object, as if the Accept parameter were changed to False. +OnDragOver is an event handler of type TDragOverEvent. + + + Occurs when the form receives a request for Help. +Write an OnHelp event handler to perform special processing when the user requests Help. The HelpContext and HelpJump methods automatically trigger the OnHelp event. +The THelpEvent type has the following parameters: CallHelp, Command, and Data. +Set CallHelp to true if the application should still invoke the Help system after the event. Set CallHelp to false to prevent the default response given by the Help system. All application Help methods go through OnHelp. The application calls the Help system only if OnHelp's CallHelp parameter is true or if no OnHelp event handler is assigned. +The event handler returns True if it succeeds, False if it fails. +The possible values for the Data parameter depend upon the value of the Command parameter. To find the possible values of the Command and Data parameters, see the appropriate HTMLHelp topics in the MSDN Library. +In order for the OnHelp event handler to work properly, insert in the uses clause of your application the Vcl.HtmlHelpViewer or another unit that provides an interface to the external Help viewer to use. The Vcl.HtmlHelpViewer unit provides a Delphi interface to the HTMLHelp Windows native Help handling function. For C++, you need to include the HTMLHelpViewer.hpp header file. + + + Occurs when the form is hidden (that is, when its Visible property is set to false). +Use OnHide to perform special processing when the form is hidden (that is, when the form's Visible property is set to false). + + + Occurs when a user presses any key while the control has focus. +Use the OnKeyDown event handler to specify special processing to occur when a key is pressed. The OnKeyDown handler can respond to keyboard keys, including function keys and keys combined with the SHIFT, ALT, and CTRL keys, and pressed mouse buttons. + +Note: TCheckBox does not fire OnKeyDown events for arrow keys. +OnKeyDown is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTRL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. + + + Occurs when a key is pressed. +Use the OnKeyPress event handler to make something happen as a result of a single character key press. +The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that do not correspond to an ASCII Char value (SHIFT or F1, for example) do not generate an OnKeyPress event. Key combinations (such as SHIFT+A) generate only one OnKeyPress event (for this example, SHIFT+A results in a Key value of "A" if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the OnKeyDown or OnKeyUp event handler. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTROL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. +OnKeyPress is an event handler of type Vcl.Controls.TKeyPressEvent. + + + Occurs when the user releases a key that was pressed. +Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, keys that represent characters, function keys, and keys combined with the SHIFT, ALT, and CTRL keys. +If Key is set to #0, any further processing of the OnKeyUp event will be prevented. +OnKeyUp is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. + + + Occurs when the user presses a mouse button with the mouse pointer over a control and the parent form is not active. +Use the OnMouseActivate event handler to implement any special processing that should occur as a result of pressing a mouse button on a control when the parent top-level form is not active. +The event type is: + +TMouseActivateEvent = procedure (Sender: TObject; Button: TMouseButton; ShiftState: TShiftState; +X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object; + +When you click a control and the parent top-level form is not active, this event fires on the control that the mouse cursor is over. MouseActivate is a protected virtual function in TControl. MouseActivate can be overridden in custom control descendants to provide special built-in processing of the OnMouseActivate events. If you leave the default value of MouseActivate as maDefault, the parent control fires the OnMouseActivate event and repeats the process all the way up to the top-level form. If no control in the chain sets the value of MouseActivate, the behavior is the same as if a control set TMouseActivate to maActivate. At any point, a control can set the value of TMouseActivate and the parent processing stops. +Some controls set focus to themselves when they get a button down message so, in some cases, setting maNoActivate appears to have no effect. For instance, a TButton control sets focus to itself in the WM_LBUTTONDOWN message regardless of whether or not TMouseActivate is set to maNoActivate. In this case, setting maNoActivateAndEat will work because the top-level form is not activated and the WM_LBUTTONDOWN message is suppressed. +The HitTest parameter is the hit test value obtained from the WM_NCHITTEST message. See Windows.pas for valid values and their meanings. In most cases this value will be HTCLIENT, which means that the user clicked in the client area of a control. However, in the case of a top-level form, this can take other values such as HTCAPTION or HTBOTTOM. This allows the code to decide which value to set for MouseActivate, based on the HitTest code. For example, the following code in the OnMouseActivate event handler for a TForm forces the user to click into a non-client area to activate the form: + +if HitTest = HTCLIENT then +MouseActivate�:= maNoActivateAndEat; + +Even though this event is tied to how Windows processes WM_MOUSEACTIVATE, the actual handling of the message is done at the TControl level, which is the point in the VCL hierarchy where the control has no window handle. The OnMouseActivate event is then simulated because all the TControl descendants also have OnMouseDown, OnMouseMove, and OnMouseUp events. This information is applicable to both VCL Win32 and VCL.NET. + + + Occurs when the user presses a mouse button with the mouse pointer over a control. +Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button. +The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseDown is an event handler of type Vcl.Controls.TMouseEvent. + + + Occurs when the user moves the mouse pointer while the mouse pointer is over a control. +Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse. +Use the Shift parameter of the OnMouseMove event handler to determine the state of the shift keys and mouse buttons. Shift keys are the SHIFT, CTRL, and ALT keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender. +OnMouseMove is an event handler of type Vcl.Controls.TMouseMoveEvent. + + + Occurs when the user releases a mouse button that was pressed with the mouse pointer over a component. +Use an OnMouseUp event handler to implement special processing when the user releases a mouse button. +The OnMouseUp event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseUp is an event handler of type Vcl.Controls.TMouseEvent. + + + Occurs when the form is redrawn. +Use OnPaint to perform special processing when the form is redrawn. Any special painting on the form should be done in this event. OnPaint occurs before any controls on the form are painted. +To determine which portions of the form's canvas need to be repainted, use the ClipRect property of the canvas. +If you use the form's Canvas property outside the OnPaint event, it will be erased and drawn-over by the next OnPaint event. + + + Occurs immediately after the control is resized. +Use OnResize to make any final adjustments after a control is resized. +To modify the way a control responds when an attempt is made to resize it, use OnCanResize or OnConstrainedResize. + +Note: Some controls call this event handler when the control is first created. +OnResize is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the user presses a key (before the OnKeyDown event). +Use OnShortCut to dispatch shortcut keystrokes before the form handles them. When the user presses a key, the form can dispatch it as a shortcut key instead of allowing the standard keystroke processing (OnKeyDown, OnKeyPress, and OnKeyUp). Built-in shortcut processing is provided for menu shortcuts and actions associated with the form. OnShortCut allows the form to implement additional shortcuts. +If the OnShortCut implements a response to the keystroke, set the Handled parameter of the event handler to true. This prevents the keystroke from being passed on to menus or actions associated with the form. It also prevents the standard keystroke processing in the same way that a menu or action shortcut does. + + + Occurs when the form is shown (that is, when its Visible property is set to true). +Use OnShow to perform special processing when the form is shown (that is, when the form's Visible property is set to true). + + + Creates and initializes a new TForm object. +Use Create to instantiate a TForm object or descendant of TForm at runtime. AOwner is the owner of the TCustomForm object. +For descendants of TCustomForm that are not TForm objects, use CreateNew instead. Calling Create for a TCustomForm descendant that is not a TForm will raise an exception. + + + Removes the form from memory. +Do not call Destroy. Instead, call Release, which indirectly produces a call to the Free method, which in turn calls Destroy. + + + Checks if there is a change in Dpi and performs the necessary changes to scale all the controls for the new Dpi. + + + Embarcadero Technologies does not currently have any additional information. + + + Closes the form. +Call Close to close a form. +Attempts to close a form can be aborted by the CloseQuery event dispatcher or the OnCloseQuery event handler. + +Note: When the main form of the application closes, the application terminates. + + + Close attempt event dispatcher. +CloseQuery is called automatically when an attempt is made to close the form. CloseQuery can allow the form to close by returning true, or prevent the form from closing by returning false. +As implemented in TCustomForm, CloseQuery polls any MDI children by calling their CloseQuery methods. If no child form aborts the close, CloseQuery then calls the OnCloseQuery event handler, if it exists, to determine if the close should be allowed. If no such event handler exists, CloseQuery returns true. + + + Provides message handling for all messages that the form does not fully process. +Override DefaultHandler to change the default message handling for the form. This is seldom necessary because messages can be handled by creating message methods. +DefaultHandler passes any otherwise-unhandled messages to the form's window procedure by calling the CallWindowProc OS function. + +Note: In Delphi code, calling inherited in a message-handling method results in a call to the ancestor's DefaultHandler method unless that ancestor specifies a handler for the message. + + + Removes focus from a control on the form. +Use DefocusControl to remove focus from a control on the form. This method is used internally by the VCL. +Control is the control from which to remove focus. If Control is the form's active control, DefocusControl sets the form's ActiveControl property to nil (Delphi) or NULL (C++). +Removing specifies whether to set focus to the control's parent. + + + Handles automatic docking of the form into other windows. +Do not call Dock in application code. It is called automatically when the form is released on a docking site that will accept it. To dock a form programmatically, use the ManualDock method instead. + + + Sets focus to a control on the form. +Use FocusControl to set focus to a control on the form. +Control is a TWinControl object encapsulating the control on which to set focus. FocusControl sets the ActiveControl property. + + + Returns the "child" components of the form; that is, those components that return the form from their GetParentComponent method. +The component streaming system calls GetChildren to request that the form execute a callback for every child component in the form. The callback must execute in creation order (the order the child components appear in the form file). A child component is defined as any component that returns this form from its GetParentComponent method. +Proc is the callback to execute for every child component. +Root specifies the top-level component (such as a form or data module) that is currently being loaded or saved. +In TCustomForm, GetChildren first calls the inherited method, which executes Proc for every control that lists the form as its Parent. Then, if the Root parameter identifies this form, GetChildren executes Proc for every child component that does not have a Parent. + + + Returns a bitmap of the form. +Use the GetFormImage method to obtain a bitmap of the form. + + + Hides the form. +Hide sets the Visible property to false. + + + Processes shortcut keys when the form has focus. +IsShortCut is called automatically when the user presses a key while the form has focus. It allows the form to dispatch shortcut keys and bypass the standard keystroke processing (OnKeyDown, OnKeyPress, and OnKeyUp events). +The Message parameter encapsulates the Windows message describing the keypress. If a shortcut for the key exists, IsShortCut executes the appropriate command and returns true. Otherwise IsShortCut returns false. +IsShortCut generates an OnShortCut event to allow the developer to insert shortcuts for the form. If the keystroke is not handled in an OnShortCut event handler, IsShortCut checks for any shortcuts associated with the form's menus and actions. + + + Ensures that the form is fully visible on a specified monitor. +Call MakeFullyVisible to ensure that the form does not appear split over more than one monitor in a multi-monitor application. +AMonitor is the monitor on which the form should appear. If AMonitor is nil (Delphi) or NULL (C++), MakeFullyVisible uses the Monitor property. +MakeFullyVisible checks whether the form fits entirely on the specified monitor. If not, it repositions the form so that it fits, if possible. + + + Directs mouse wheel messages to the appropriate control. +MouseWheelHandler is called automatically when the form or any windowed control contained in the form receives a message from a mouse wheel. The Message parameter encapsulates the message. +As implemented in TCustomForm, MouseWheelHandler performs no special processing, but simply redirects the message to the active control by calling its Perform method. By default, the Perform method generates the appropriate mouse wheel events. + + + Prints the form. +Call Print to print the form. Print uses the GetFormImage method to obtain a bitmap of the form and draws that to the printer's HDC. + + + Embarcadero Technologies does not currently have any additional information. + + + Destroys the form and frees its associated memory. +Use Release to destroy the form and free its associated memory. +Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form's event queue are processed before the form is released. Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error. + +Note: Release returns immediately to the caller. It does not wait for the form to be freed before returning. + + + Cancels modes on the form. +Use SendCancelMode to release the mouse capture and cancel scroll bar input and menu processing on the form. + + + Sets focus to the form. +Use SetFocus to give the form input focus. SetFocus calls the SetFocus method of the active control, if one exists. To determine whether the form has focus, use the Active property. + + + Sets focus to a control on the form. +Use SetFocusedControl to give a control on the form input focus. SetFocusedControl returns false if the Control specified by the Control parameter was already in the process of receiving focus, true otherwise. + +Note: A return value of true does not indicate the control has successfully received input focus. If the Control can't have focus (for example, if it is not visible), SetFocusedControl will still return true, indicating that an attempt was made. + + + Shows the form. +Use Show to set the form's Visible property to true and to bring the form to the front of other forms on the screen. + + + Shows a form as a modal dialog. +Use ShowModal to show a form as a modal form. A modal form is one where the application can't continue to run until the form is closed. Thus, ShowModal does not return until the form closes. When the form closes, it returns the value of the ModalResult property. +To close a modal form, set its ModalResult property to a nonzero value. + +Note: If the form contains buttons with a ModalResult property set to a value other than mrNone, the form automatically closes when the user clicks one of those buttons and returns the ModalResult value as the return value of ShowModal. +You can check the return value against common return values using the global IsAbortResult, IsAnAllResult, IsNegativeResult, or IsPositiveResult functions. + + + Indicates whether the form processes keyboard input for a control it owns. +WantChildKey is called by any control that the form owns when the control receives keyboard input. If WantChildKey returns true, the control performs no further processing in response to the keyboard input, instead deferring to its parent form to respond to the keystroke. In its default implementation, WantChildKey always returns false; it is overridden in TActiveForm to implement certain ActiveX functionality. + + + Embarcadero Technologies does not currently have any additional information. + + + Construction event dispatcher. +AfterConstruction is the dispatcher for the event that occurs immediately after the form object's construction. As implemented in TCustomForm, AfterConstruction calls the OnCreate event handler, provided the OldCreateOrder property is false. + + + Destruction event dispatcher. +BeforeDestruction is the dispatcher for the event that occurs immediately before the form object's destruction. As implemented in TCustomForm, BeforeDestruction calls the OnDestroy event handler, provided the OldCreateOrder property is false. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies whether the form has focus. +Use Active to determine whether the form has focus. The Active Form receives all keyboard input. If it has a title bar, it is drawn using the active colors specified in the Control panel. +If Active is true , the form has focus; if Active is false, the form does not have focus. + + + Specifies the control that has focus on the form. +Use ActiveControl to get or set the control that has focus on the form. Only one control can have focus at a given time in an application. +If the form does not have focus, ActiveControl is the control on the form that will receive focus when the form receives focus. + +Note: When focus shifts to another control, ActiveControl is updated before the OnExit event occurs. + + + Specifies the OLE control on the form that reacts to changes in focus. +Use ActiveOleControl to get or set an OLE control on the form that reacts to changes in focus. +If ActiveOleControl is not nil (Delphi) or NULL (C++), the user interface for the specified OLE control is deactivated when it is not focused. Also, when the form receives or loses focus, the document window for the specified OLE control is activated or deactivated respectively. + + + Specifies the appearance and behavior of the form border. +Use BorderStyle to get or set the appearance and behavior of the form border. BorderStyle can be any of the following TForm BorderStyle values: + + + + + +Value + +Meaning + + + +bsDialog + + + +Not resizable; no minimize/maximize menu + + + + +bsSingle + + + +Not resizable; minimize/maximize menu + + + + +bsNone + + + +Not resizable; no visible border line + + + + +bsSizeable + + + +Standard resizable border + + + + +bsToolWindow + + + +like bsSingle but with a smaller caption + + + + +bsSizeToolWin + + + +like bsSizeable with a smaller caption + + + + + +Note: Changing the border style of an MDI child form to bsDialog or bsNone has no effect. + + + Provides access to the drawing area of the form. +Use TCanvas to draw on the client area of the form. Canvas is often used in the OnPaint event handler. + + + Specifies the designer interface for the form. +The Designer property is used internally at design time. Never assign a value to this property. This is done automatically by the form designer. Only use this property when designing classes for use in the form designer, such as property editors and component editors. + + + Specifies whether the form is the target of a drag-and-drop operation. +Use DropTarget to determine whether the form is currently the target of a drag-and-drop operation. + + + Indicates transitional state information about the form. +Read FormState to determine the state of the form. FormState indicates when the form is in various transitional states or when certain Windows operations have occurred. The following table lists the values that can be included in a form's state: + + + + + +Value + +Meaning + + + +fsCreating + + + +The form's constructor is currently executing. + + + + +fsVisible + + + +The form's window is visible. This state is used to update the Visible property. + + + + +fsShowing + + + +The form's WindowState property is changing. This state is used to prevent WindowState changes from interfering with a transition that is in progress. + + + + +fsModal + + + +The form was created as a modal window. + + + + +fsCreatedMDIChild + + + +The form is an MDI parent window. This state is only set once the MDI client window has been created. + + + + +fsActivated + + + +The form has received a CM_ACTIVATE message (because it received focus or the application became active) but has not yet called the Activate method to generate an OnActivate event. + + + Accesses the Glass Frame under Windows Vista, Windows 7, or later Windows operating systems. +Use GlassFrame to make your forms Windows Vista or Windows 7 Aero-compatible, displaying a glass effect. +GlassFrame is a property of a TGlassFrame object created automatically for any form. + +Note: The property is only available for Windows Vista or Windows 7 with Aero. Otherwise, the Glass Frame is ignored. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the name of the Help file the form uses to display the Help from. +If your form should have a Help file different from the default Help file of the application specified using the TApplication.HelpFile property of the global TApplication type object, then use the HelpFile property of the form to specify the name of the Help file the form will use to display the Help from. +The Help system specified by TApplication.HelpSystem displays Help topics from the Help file specified by the HelpFile property of the form when the form has the focus. + + + Specifies whether the form should receive keyboard events before the active control. +If KeyPreview is true, keyboard events occur on the form before they occur on the active control. (The active control is specified by the ActiveControl property.) +If KeyPreview is false, keyboard events occur only on the active control. +Navigation keys (Tab, BackTab, the arrow keys, and so on) are unaffected by KeyPreview because they do not generate keyboard events. Similarly, when a button has focus or when its Default property is true, the Enter key is unaffected by KeyPreview because it does not generate a keyboard events. +KeyPreview is false by default. + + + Specifies the form's main menu. +Use Menu to get or set the form's main menu. At design time, Menu is set to the first TMainMenu component added to the form. + + + Represents the return value of a form that is used as a modal dialog. +Use ModalResult to close the form when it is displayed modally. +By default, ModalResult is mrNone. Set ModalResult to any nonzero value to close the form. The value assigned to ModalResult becomes the return value of the ShowModal function call used to display the form. + +Note: This property is modified automatically by some components such as the TButton control. +Tip: If you call the Close method from a modal form, then ModalResult is automatically set to mrCancel. + + + Provides access to the monitor on which the form appears. +Use Monitor to access information about the monitor on which the form appears if the application runs on a multi-monitor system. The monitor is determined by the DefaultMonitor property. + + + Specifies the IOleForm interface for an in-place OLE object contained in the form. +OleFormObject is used to communicate resize and destroy notifications when a form is used as a frame for an in-place OLE object. + + + Controls how the top-level form behaves with respect to Window's WS_POPUP style. +The PopupMode property controls how the top-level form behaves with respect to Window's WS_POPUP style. A window that has the WS_POPUP style is always above its "owner" in Z-order. You can use the PopupMode property in conjunction with the PopupParent property to avoid the appearance of a hung application caused by a modal dialog showing up behind another form on the screen. + +Note: Using the PopupMode property is similar to specifying fsStayOnTop for the FormStyle property, but allows better control over the layering. +The PopupMode property is automatically set to pmAuto when the ShowModal method is called. However, this causes the window handle to be recreated, which is not usually desirable. To avoid the re-creation of window handles, you can explicitly set the PopupMode property to pmAuto prior to calling the ShowModal method (such as at design time). +Set the PopupMode property to pmExplicit for non-modal design windows such as tool palettes and other floating tool windows. This causes the windows to always remain on top of the main form. In the case of a snapped together design (in which the window is docked to the main form), the design window remains on top of the designer. + +Note: For undocked windows, the design window remains above the main form, allowing other top-level forms to obscure the design window. +Set the PopupMode property to pmNone if you want the pop-up window to have the pre-Delphi 8 behavior (except for the ShowModal item mentioned above). +You can force the Z-Ordering of your forms and create a "stacked" appearance that the user cannot change by setting the PopupParent property to an explicit TCustomForm. If the PopupMode property is pmExplicit and PopupParent is nil, then the Application.MainForm is implicitly used as the PopupParent. If no Application.MainForm is assigned, then Application.Handle is used as the PopupParent. If the PopupMode property is set to pmAuto, Screen.ActiveForm is used as the PopupParent. + + + Specifies whether the form is sized according to the value of the PixelsPerInch property. +Scaled determines whether the form adjusts itself to differences between the font used at design time and the current system font used by a system at runtime. If Scaled is true, the form resizes itself and all its child controls to maintain the relationship between the size of controls and the height of text displayed in the default font. If Scaled is false, no such resizing occurs. +By setting Scaled to true, the form can adjust to fonts that are not scalable (that is, fonts that only supply discrete point sizes) or to differences such as forms designed using small fonts at design time that are run on systems that use large fonts. +The degree of resizing is determined by the PixelsPerInch property, which measures the proportion of the font on the system used when designing the form. + + + Specifies whether form snaps to edge of screen. +ScreenSnap determines whether the edges of the form snap to the edge of the screen when the user moves the form. To control the snap distance, set the SnapBuffer property. + + + Specifies distance for screen snap. +If ScreenSnap is true, SnapBuffer determines the maximum number of pixels that be between the form edge and the screen edge before the form snaps to the screen edge. + + + Represents how the form appears on the screen. +Set WindowState to minimize, maximize, or restore the form window. Read WindowState to determine whether the form is minimized, maximized, or in a normal state. + + + Sets an order for stacked forms that users cannot change. +If the PopupMode property is set to pmExplicit and PopupParent is nil, then the Application.MainForm is implicitly used as the PopupParent. If no Application.MainForm is assigned, then Application.Handle is used as the PopupParent. +If the PopupMode property is set to pmAuto, Screen.ActiveForm is used as the PopupParent property. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the horizontal coordinate of the left edge of a component relative to its parent. +Vcl.Forms.TCustomForm.Left inherits from Vcl.Controls.TControl.Left. All content below this line refers to Vcl.Controls.TControl.Left. +Specifies the horizontal coordinate of the left edge of a component relative to its parent. +Use the Left property to determine where the left side of the control begins or to reposition the left side of the control. +If the control is contained in another control, the Left and Top properties are relative to the parent control. If the control is contained directly by the form, the property values are relative to the form. For forms, the value of the Left property is relative to the screen in pixels. + + + Specifies the Y coordinate of the upper-left corner of a control, relative to its parent or containing control in pixels. +Vcl.Forms.TCustomForm.Top inherits from Vcl.Controls.TControl.Top. All content below this line refers to Vcl.Controls.TControl.Top. +Specifies the Y coordinate of the upper-left corner of a control, relative to its parent or containing control in pixels. +Use Top to locate the top of the control or reposition the control to a different Y coordinate. The Top property, like the Left property, is the position of the control relative to its container. Thus, if a control is contained in a TPanel, the Left and Top properties are relative to the panel. If the control is contained directly by the form, it is relative to the form. For forms, the value of the Top property is relative to the screen in pixels. + + + + + TForm represents a standard application window (form). +When you create forms in the Form designer at design time, they are implemented as descendants of TForm. Forms can represent the application's main window, or dialog boxes, or MDI children. A form can contain other objects, such as TButton, TCheckBox, and TComboBox objects. +Examples of forms include TLoginDialog and TPasswordDialog objects. + + + Arranges the icons of minimized MDI child forms. +Use ArrangeIcons to arrange the icons of minimized MDI child forms so they are evenly spaced and don't overlap. +ArrangeIcons works only if the form is an MDI parent form (that is, if the form's FormStyle property is fsMDIForm). + + + Arranges MDI child forms so they overlap. +Use Cascade to arrange MDI child forms so they overlap. +Cascade works only if the form is an MDI parent form (that is, if the form's FormStyle property is fsMDIForm). + + + Activates the next child form in the form sequence. +Use Next to change the active child form of an MDI parent. For example, if you have three child forms within a parent form and Form2 is the active form, the Next method makes Form3 the active form. Calling Next again makes Form4 active. The next time your application calls Next, the sequence starts over again and Form2 becomes the active form once again. +The Next method applies only to forms that are MDI parent forms (have a FormStyle property value of fsMDIForm). + + + Activates the previous MDI child form in the form sequence. +Use Previous to change the active child form of an MDI parent. For example, if you have three child forms within a parent form and Form4 is the active form, the Previous method makes Form3 the active form. Calling Previous again makes Form2 active. The next time your application calls Previous, the sequence starts over again and Form4 becomes the active form once again. +The Previous method applies only to forms that are MDI parent forms (have a FormStyle property value of fsMDIForm). + + + Arranges MDI child forms so that they are all the same size. +Use Tile to arrange MDI child forms so that they are all the same size. Tiled forms completely fill up the client area of the parent form. How the forms arrange themselves depends upon the values of their TileMode properties. +Tile works only if the form is an MDI parent form (that is, if the form's FormStyle property is fsMDIForm). + + + Occurs when an attempt is made to resize the control. +Use OnCanResize to adjust the way a control is resized. If necessary, change the new width and height of the control in the OnCanResize event handler. The OnCanResize event handler also allows applications to indicate that the entire resize should be aborted. +If there is no OnCanResize event handler, or if the OnCanResize event handler indicates that the resize attempt can proceed, the OnCanResize event is followed immediately by an OnConstrainedResize event. +OnCanResize is an event handler of type Vcl.Controls.TCanResizeEvent. + + + Occurs when the user clicks the control. +Use the OnClick event handler to respond when the user clicks the control. If the control has an associated action, and that action has an OnExecute method, the action's OnExecute method responds to click events unless it is superseded by an OnClick event handler. +Usually, OnClick occurs when the user presses and releases the left mouse button with the mouse pointer over the control. This event can also occur when: + +The user selects an item in a grid, outline, list, or combo box by pressing an arrow key. +The user presses the SPACEBAR while a button or check box has focus. +The user presses ENTER when the active form has a default button (specified by the Default property). +The user presses ESC when the active form has a cancel button (specified by the Cancel property). +The user presses the accelerator key for a button or check box. For example, if the value of the Caption property of a check box is '&Bold', the B is underlined at run time and the OnClick event of the check box is triggered when the user presses Alt+B. However, focus does not move to the control in these instances. +The Checked property of a radio button is set to True. +The value of the Checked property of a check box is changed. +Note: When you change the value of the Checked property programmatically, the OnClick event of the check box control occurs. Do not modify the value of the Checked property in the event handler of the OnClick event, because that leads into a deadlock situation. +The Click method of a menu item is called. +For a form, an OnClick event occurs when the user clicks a disabled component or in a blank area of the form. +OnClick is an event handler of type TNotifyEvent. + + + Occurs when the user double-clicks the left mouse button when the mouse pointer is over the control. +Use the OnDblClick event to respond to mouse double-clicks. +OnDblClick is an event handler of type System.Classes.TNotifyEvent. + + + Occurs when the user drops an object being dragged. +Use the OnDragDrop event handler to specify what happens when the user drops an object. The Source parameter of the OnDragDrop event is the object being dropped, and the Sender is the control on which the object is being dropped. The X and Y parameters are the coordinates of the mouse positioned over the control. +OnDragDrop is an event handler of type TDragDropEvent. + + + Occurs when the user drags an object over a control. +Use an OnDragOver event to signal that the control can accept a dragged object so the user can drop or dock it. +Within the OnDragOver event handler, change the Accept parameter to False to reject the dragged object. Leave Accept as True to allow the user to drop or dock the dragged object on the control. +To change the shape of the cursor, indicating that the control can accept the dragged object, change the value of the DragCursor property for the control before the OnDragOver event occurs. +The Source is the object being dragged, the Sender is the potential drop or dock site, and X and Y are screen coordinates in pixels. The State parameter specifies how the dragged object is moving over the control. + +Note: Within the OnDragOver event handler, the Accept parameter defaults to True. However, if an OnDragOver event handler is not supplied, the control rejects the dragged object, as if the Accept parameter were changed to False. +OnDragOver is an event handler of type TDragOverEvent. + + + Occurs when a user presses any key while the control has focus. +Use the OnKeyDown event handler to specify special processing to occur when a key is pressed. The OnKeyDown handler can respond to keyboard keys, including function keys and keys combined with the SHIFT, ALT, and CTRL keys, and pressed mouse buttons. + +Note: TCheckBox does not fire OnKeyDown events for arrow keys. +OnKeyDown is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTRL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. + + + Occurs when a key is pressed. +Use the OnKeyPress event handler to make something happen as a result of a single character key press. +The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that do not correspond to an ASCII Char value (SHIFT or F1, for example) do not generate an OnKeyPress event. Key combinations (such as SHIFT+A) generate only one OnKeyPress event (for this example, SHIFT+A results in a Key value of "A" if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the OnKeyDown or OnKeyUp event handler. +An application gets Windows WM_KEYDOWN messages for all keys when the user presses a key. These messages indirectly fire the OnKeyDown event. Setting the Key parameter to #0 prevents any further processing of this message. But for keys that generate characters Windows also produces WM_CHAR. At the time your OnKeyDown event fires, the WM_CHAR message for the key will already be in the message queue. Setting Key to #0 does not stop it from being delivered, so it fires the OnKeyPress event. If you set the Key to #0, OnKeyPress will be prevented from being fired only for keys that do not have chars. For keys that represent characters, OnKeyPress will continue to be fired. +This method of organizing key processing has advantages. Code that only deals with characters, including control characters like #13 for carriage return, #3 for CTROL-C, and so on, should go into the OnKeyPress event. Code that deals with keys that do not generate characters should be put into the OnKeyDown event. +OnKeyPress is an event handler of type Vcl.Controls.TKeyPressEvent. + + + Occurs when the user releases a key that was pressed. +Use the OnKeyUp event handler to provide special processing that occurs when a key is released. The OnKeyUp handler can respond to all keyboard keys, keys that represent characters, function keys, and keys combined with the SHIFT, ALT, and CTRL keys. +If Key is set to #0, any further processing of the OnKeyUp event will be prevented. +OnKeyUp is an event handler of type Vcl.Controls.TKeyEvent. See TKeyEvent for a description of the parameters. + + + Occurs when the user presses a mouse button with the mouse pointer over a control and the parent form is not active. +Use the OnMouseActivate event handler to implement any special processing that should occur as a result of pressing a mouse button on a control when the parent top-level form is not active. +The event type is: + +TMouseActivateEvent = procedure (Sender: TObject; Button: TMouseButton; ShiftState: TShiftState; +X, Y: Integer; HitTest: Integer; var MouseActivate: TMouseActivate) of object; + +When you click a control and the parent top-level form is not active, this event fires on the control that the mouse cursor is over. MouseActivate is a protected virtual function in TControl. MouseActivate can be overridden in custom control descendants to provide special built-in processing of the OnMouseActivate events. If you leave the default value of MouseActivate as maDefault, the parent control fires the OnMouseActivate event and repeats the process all the way up to the top-level form. If no control in the chain sets the value of MouseActivate, the behavior is the same as if a control set TMouseActivate to maActivate. At any point, a control can set the value of TMouseActivate and the parent processing stops. +Some controls set focus to themselves when they get a button down message so, in some cases, setting maNoActivate appears to have no effect. For instance, a TButton control sets focus to itself in the WM_LBUTTONDOWN message regardless of whether or not TMouseActivate is set to maNoActivate. In this case, setting maNoActivateAndEat will work because the top-level form is not activated and the WM_LBUTTONDOWN message is suppressed. +The HitTest parameter is the hit test value obtained from the WM_NCHITTEST message. See Windows.pas for valid values and their meanings. In most cases this value will be HTCLIENT, which means that the user clicked in the client area of a control. However, in the case of a top-level form, this can take other values such as HTCAPTION or HTBOTTOM. This allows the code to decide which value to set for MouseActivate, based on the HitTest code. For example, the following code in the OnMouseActivate event handler for a TForm forces the user to click into a non-client area to activate the form: + +if HitTest = HTCLIENT then +MouseActivate�:= maNoActivateAndEat; + +Even though this event is tied to how Windows processes WM_MOUSEACTIVATE, the actual handling of the message is done at the TControl level, which is the point in the VCL hierarchy where the control has no window handle. The OnMouseActivate event is then simulated because all the TControl descendants also have OnMouseDown, OnMouseMove, and OnMouseUp events. This information is applicable to both VCL Win32 and VCL.NET. + + + Occurs when the user presses a mouse button with the mouse pointer over a control. +Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button. +The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseDown is an event handler of type Vcl.Controls.TMouseEvent. + + + Occurs when the user moves the mouse pointer while the mouse pointer is over a control. +Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse. +Use the Shift parameter of the OnMouseMove event handler to determine the state of the shift keys and mouse buttons. Shift keys are the SHIFT, CTRL, and ALT keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender. +OnMouseMove is an event handler of type Vcl.Controls.TMouseMoveEvent. + + + Occurs when the user releases a mouse button that was pressed with the mouse pointer over a component. +Use an OnMouseUp event handler to implement special processing when the user releases a mouse button. +The OnMouseUp event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the SHIFT, CTRL, and ALT keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender. +OnMouseUp is an event handler of type Vcl.Controls.TMouseEvent. + + + Occurs immediately after the control is resized. +Use OnResize to make any final adjustments after a control is resized. +To modify the way a control responds when an attempt is made to resize it, use OnCanResize or OnConstrainedResize. + +Note: Some controls call this event handler when the control is first created. +OnResize is an event handler of type System.Classes.TNotifyEvent. + + + + + TMonitor represents a monitor on which an application runs. +TMonitor represents a monitor that displays the user interface of an application. It introduces properties to describe the dimensions of a single monitor. In addition, the Primary property distinguishes the primary property from other monitors on the system. +When writing multi-monitor applications, use TMonitor to help lay out forms and dialogs so that they are not split over several monitors. +Applications do not create instances of TMonitor. Instead, monitor components for all available monitors are listed by the Monitors property of the global Screen variable. The global Screen variable also provides global information about the monitors on which the application runs, such as screen resolution, available fonts, and so on. + + + Indicates the Windows handle for the monitor. +Read Monitor to obtain a Windows handle for the monitor represented by this TMonitor component. Use this handle for Windows API calls such as GetMonitorInfo. + + + Specifies the index of the monitor in the global screen object's Monitors list. +The global screen variable maintains a list of all monitors in a multi-monitor application. MonitorNum is the index of this monitor in the list object that is the screen's Monitors property. +Use MonitorNum to identify a specific monitor when working with multiple monitors. + + + Indicates the logical position of the left edge of the monitor. +In multi-monitor applications, the available screen space can span multiple monitors from left to right. Read Left to determine where, in the entire available screen space, this monitor appears. The value of Left is in pixels relative to the left edge of the primary monitor. + + + Indicates the vertical size of the monitor in pixels. +Read Height to learn the size of the monitor in pixels. Use this value along with the Top property to calculate how to position objects vertically in multi-monitor applications. + +Note: The Height property does not take into account any task bars or tool bars docked on the monitor. To determine the area on the monitor that is free of such docked windows, use the WorkareaRect property. + + + Indicates the logical position of the top edge of the monitor. +In multi-monitor applications, the available screen space can span multiple monitors from top to bottom. Read Top to determine where, in the entire available screen space, this monitor appears. The value of Top is in pixels relative to the top edge of the primary monitor. + + + Indicates the horizontal size of the monitor in pixels. +Read Width to learn the size of the monitor in pixels. Use this value along with the Left property to calculate vertical positions for objects in multi-monitor applications. + +Note: The Width property does not take into account any task bars or tool bars docked on the monitor. To determine the area on the monitor that is free of such docked windows, use the WorkareaRect property. + + + Indicates the dimensions of the monitor in pixels. +Read BoundsRect to learn the dimensions of the monitor. BoundsRect gives the dimensions of the monitor in pixels, where (0,0) represents the top-left corner of the primary monitor. +The top of BoundsRect is given by the Top property, the left edge by the Left property, and the height and width by the Height and Width properties respectively. + +Note: The BoundsRect property does not take into account any task bars or tool bars docked on the monitor. To determine the area on the monitor that is free of such docked windows, use the WorkareaRect property. + + + Gives the application useable area of the monitor. +WorkareaRect returns a TRect value furnished with the coordinates and dimensions of the work area of the Monitor. On Windows, for example, the application tabs at the screen mean that the Workarea is smaller than the monitor size. + +Note: The TRect Right and Bottom values are one pixel beyond Workarea boundary. They are given these values to allow for easy calculation of Workarea width and height as (Right-Left) and (Bottom-Top) respectively. + + + Indicates whether this is the primary monitor. +Read Primary to determine whether a monitor is the primary monitor in a multi-monitor application. When Primary is true, the monitor is the primary monitor. The coordinates of other monitors are given in terms of the primary monitor. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TCustomTabControl is the base type for tab control components such as TTabControl and TPageControl. +Use TCustomTabControl as a base class when defining a control that includes a set of notebook style tabs across the top. TCustomTabControl introduces many properties, methods, and events to manage appearance and behavior of the tabs, and to respond when the user selects one of the tabs. + +Note: When using one of the page controls, if you want to restrict a user from switching to a tab, you cannot set TTabSheet.Enabled to false to accomplish that restriction. Instead, use the OnChanging event to prevent the user from selecting a tab. + + + Calculates the control's display area given a rectangle. +AdjustClientRect is called internally when the tab control needs accurate information on where to place child controls within the client area. As implemented in TCustomTabControl, returns the DisplayRect property as the Rect parameter. + + + Change permission event dispatcher. +CanChange is called automatically when an attempt is made to change the selected tab. CanChange generates an OnChanging event so that an OnChanging event handler can prevent the selection from changing. If there is no OnChanging event handler, CanChange returns true, allowing the change. +Override CanChange to specify additional processing before the OnChanging event handler executes or to block the OnChanging event. + + + Selection permission event dispatcher. +CanShowTab is called automatically when an attempt is made to show a tab. CanShowTab is exposed as a protected method so that descendants can override this method to provide application-specific criteria that determines whether a tab is accessible. +TabIndex is the index of the tab in the list of labels maintained by the Tabs property. +CanShowTab returns a Boolean value that indicates whether the tab specified in TabIndex can be accessed. + +Tip: CanShowTab can be used with such methods as CanFocus (TWinControl) to determine whether the tab can both be accessed and can receive focus. Criteria for an overridden CanShowTab might include checking whether the tab is enabled. + + + Pending tab change event dispatcher. +Change is called automatically when the selected tab changes. Override Change to specify additional processing before the OnChange event handler executes, or to block the OnChange event. + + + Resize and reposition children and self. +Vcl.ComCtrls.TCustomTabControl.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Sets up the window-creation parameters for the tab control. +Tab controls call CreateParams internally when the window for the tab control must be generated. CreateParams overrides the inherited method to specify a tab control window with the current property settings. + + + Creates the window for a tab control. +CreateWnd is called automatically when the tab control's window is recreated. CreateWnd calls the inherited method, before assigning any saved tab text strings in internal storage. + + + Tab drawing event dispatcher. +Override DrawTab in a derived class to control the painting of tabs. +TabIndex is the index of the tab that requires painting. +Rect is the area in which the tab should be painted. +Active is whether the tab is active. +Use the Canvas property to paint the tab. + + + Generates an OnGetImageIndex event +Override GetImageIndex in a derived class to specify the index of the image to display for a particular tab. +TabIndex is the index of the tab that is about to be displayed. +The Return Value is an integer that is the index of the image in the Images property that will be displayed in the tab. + + + Form load event dispatcher. +The protected Loaded method is called automatically when the form that contains the tab control is loaded into memory. It provides an opportunity for the tab control to perform any initializations after the control and all other components in the form are loaded into memory, but before the first paint operation. +In TCustomTabControl, Loaded ensures that the layout of the tabs accommodate the images specified by the Images property. + + + Updates the tab images. +UpdateTabImages is called automatically to update the tab images after streaming in the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Specifies the bounding rectangle of a tab control client area. +Use DisplayRect to obtain the coordinates, in pixels, of the portion of the tab control that represents the contents of the tab pages. The appearance of this portion of the tab control does not change when different tabs are selected. +Use DisplayRect rather than the ClientRect property to determine the portion of the tab control that can contain other objects. + + + Determines whether labels on the tab under the mouse are automatically highlighted. +Set HotTrack to true to provide visual feedback to the user about which tab would be selected if the mouse button is clicked. HotTrack is especially useful when the tab control contains multiple rows of tabs. + + + Specifies the images drawn in tabs. +Images specifies the images that are drawn in tabs. For disabled tabs, grayed versions of the images are used. +In the implementation of TCustomTabControl, the order of images in image list properties directly corresponds to the associated tabs in the control. In the descendant class, TPageControl, this behavior is replaced by support for individual TTabSheet objects, each with an ImageIndex property. In any case, the application programmer can define customized image displays by defining an OnGetImageIndex event handler. + + + Determines whether the tabs can appear on more than one row. +Use MultiLine to determine how the tabs are displayed. If MultiLine is true, the tabs are displayed on more than one row when the number of tabs exceeds the number that fits across the top of the tab control. How many rows is determined by how many tabs are in the tab control. If MultiLine is false, the tabs are displayed on one row only, and the user must scroll the displayed scroll arrows to view all the tabs. + + + Specifies whether multiple tabs can be selected. +Use MultiSelect to get or set whether multiple tabs can be selected. +MultiSelect can only be true if Style is tsFlatButtons or tsButtons. + + + Event dispatcher for creation and destruction of child objects. +Notification checks whether the notification indicates that the component that implements the Images property is about to be destroyed, and if so, sets that property to nil (Delphi) or NULL (C++). + + + Sets the TabIndex property. +SetTabIndex is called to change the value of the TabIndex property. Descendant classes should override SetTabIndex to provide special implementations of this property. + + + Specifies whether the tab control handles its own painting. +Set OwnerDraw to true to override any default painting behavior. + + + Specifies whether rows of tabs stretch to fill the width of the control. +Use RaggedRight to get or set whether rows of tabs stretch to fill the width of the control. + + + Determines how the rows of tabs are scrolled in a multi-line tab control. +Set ScrollOpposite to determine where previous rows of tabs in a multi-line tab control move when the user selects a tab in another row. When ScrollOpposite is true, previous rows of tabs are moved to the bottom of the tab control if TabPosition is tpTop, or to the top if TabPosition is tpBottom. When ScrollOpposite is false, previous rows of tabs are moved to the back of all other rows of tabs. +For example, in a tab control with three rows of tabs at the top, if the user selects a tab in the second row, ScrollOpposite determines where the first row moves. If ScrollOpposite is true, the second row now appears at the front (bottom) row on top of the tab control, followed by the third row behind (above) it. The first row moves to the bottom of the tab control. If ScrollOpposite is false, the first row moves to the back (top), so that the tab control displays the second row in front (at the bottom of the tab region), followed by the third row (now in the middle), followed by the first row. + +Note: Setting ScrollOpposite to true automatically sets the MultiLine property to true. + + + Specifies the style of the tab control. +Use Style to determine the appearance of the tabs. These can appear as notebook tabs or as buttons. + + + Specifies the height, in pixels, of the tabs in the tab control. +Set TabHeight to control the height of the tabs that appear above the client region of the tab control. The TabHeight property is the vertical size in pixels of the individual tabs. If TabHeight is set to 0, the tabs automatically size themselves to fit their text. + + + Identifies the selected tab on a tab control. +Read TabIndex to determine which tab was selected by the user. TabIndex is the index of the tab in the list of labels maintained by the Tabs property. The first (leftmost) tab has a TabIndex of 0, the next has 1, and so on. If no tabs are selected, TabIndex has a value of -1. +Set TabIndex to programmatically change the selected tab in the tab control. + + + Determines whether tabs appear at the top or bottom. +Set TabPosition to tpTop to display the tabs at the top of the tab control. Set TabPosition to tpBottom to display the tabs at the bottom. If the ScrollOpposite property is True, tabs can appear at both top and bottom, with the row containing the current tab and all subsequent rows on the side indicated by TabPosition. +Due to a limitation in the windows common control, if TabPosition is tpLeft or tpRight, Font must be a True Type font. Otherwise, tab text may paint incorrectly. + + + Contains the list of text strings that label the tabs of the tab control. +Tabs contains a TStrings, a list of strings that label the tabs in the tab control. To add new tabs to the tab control or to edit the tabs themselves, add a new string or edit the strings currently in the Tabs property. (To open the String List editor, double-click the Tabs property in the Object Inspector.) To rearrange the tabs, rearrange the list of strings. +Tabs can also contain objects associated with the labels, using the System.Classes.TStrings.Objects property. + + + Specifies the horizontal size, in pixels, of the tabs in the tab control. +TabWidth specifies a fixed width for all tabs. If TabWidth is 0, then each tab is automatically made wide enough to show its caption. + + + Occurs after a new tab is selected. +Write an OnChange event handler to take specific action immediately after the selected tab changes. Use the TabIndex property to determine which tab is now selected. This is the opportunity to make any changes to the control that reflect the new state implied by the selected tab. +Before the value of TabIndex changes, an OnChanging event occurs. + +Note: The event is not called if you change the active page in code, for example, by setting the value of ActivePage. + + + Occurs immediately before a new tab is selected. +Write an OnChanging event handler to take specific action immediately before the selected tab changes. Set the AllowChange parameter to False to prevent the change. +Use an OnChanging event handler to prevent the user from leaving a tab setting until certain conditions have been met. An OnChanging event handler can also be used to save information about the current state of the tab control before it is changed by a new tab selection. + +Note: The event is not called if you change the active page in code, for example, by setting the value of TPageControl.ActivePage. +OnChanging is an event handler of type Vcl.ComCtrls.TTabChangingEvent. + + + Occurs when a tab is about to be drawn. +Use OnDrawTab to customize the painting of tabs. +You can paint the tab using the Canvas property. +OnDrawTab is an event handler of type Vcl.ComCtrls.TDrawTabEvent. See TDrawTabEvent for a description of the parameters. + + + Occurs when a tab is about to display its associated image. +Write an OnGetImageIndex event handler to specify the ImageIndex for a given TabIndex. +On entry to the event handler, the ImageIndex parameter is the same as the TabIndex parameter, where TabIndex is the index of the tab which is about to display its image. Change the ImageIndex parameter to specify the index into the Images property that specifies the image that should be painted. +OnGetImageIndex is an event handler of type Vcl.ComCtrls.TTabGetImageEvent. + + + Creates and initializes an instance of TCustomTabControl. +Call Create to instantiate a tab control at runtime. Tab controls placed on forms at design time are created automatically. Create calls the inherited Create method and sets the initial values for the tab control, including the creation of a tab list that contains the text strings for the tabs. +AOwner is a component, typically the form, that is responsible for freeing the tab control. It becomes the value of the Owner property. + + + Destroys an instance of TCustomTabControl. +Do not call Destroy directly in an application. Instead, use Free. Free checks that the tab control is not nil, and only then calls Destroy. Destroy frees the tab list that holds the list of text strings for the tabs and calls the inherited destructor. + + + Indicates the index of the tab at a specified point. +Use IndexOfTabAt to locate which tab is at the point specified by X and Y. If the point with X-coordinate X and Y-coordinate Y is over a tab, IndexOfTabAt returns the 0-offset index of that tab in the Tabs property (TTabControl) or in the Pages property (TPageControl). If the point defined by X and Y is not over a tab, IndexOfTabAt returns 1. + + + Returns information about the location of a point relative to the client area of the tab control. +Call GetHitTestInfoAt to determine what portion of the tab control, if any, sits under the point specified by the X and Y parameters. +GetHitTestInfo returns a THitTests type. This set describes the possible elements under the mouse. When interpreting these values, each tab can be considered an "item" of the tab control. + + + Returns the bounding rectangle for a specified tab. +Use TabRect to determine the current position of the tab with the specified index. Index is the 0-offset index of a tab in the Tabs property (TTabControl) or in the Pages property (TPageControl). TabRect returns the bounding rectangle (in client coordinates) of the specified tab. + + + Sets TabIndex property. +RowCount is called to change the value of the TabIndex property. Descendant classes should override RowCount to provide special implementations of this property. + + + Scrolls the tabs that are visible when the tab control is not multi-line. +Call ScrollTabs to change the tabs that are visible in the tab control. When Delta is positive, Delta additional tabs to the right are scrolled into view. When Delta is negative, the tabs to the left are scrolled into view, with the absolute value of Delta indicating how many tabs are scrolled. If there are fewer than the absolute value of Delta tabs in the indicated direction, ScrollTabs scrolls as far as possible. +ScrollTabs has no effect if there are no scrolled tabs, either because the control is wide enough to display all tabs or because the MultiLine property is true. + +Note: ScrollTabs scrolls the visible tabs. It does not change the current selection. Calling ScrollTabs may scroll the selected tab out of view. + + + Gives access to the tab control's canvas. +Use Canvas to paint to the tab control's canvas during the OnDrawTab event. + + + + + TTabControl is a tab set that has the appearance of notebook dividers. +Use TTabControl to add a control with multiple tab settings to a form. Unlike a page control, TTabControl is not made up of several pages that contain different controls. Instead, TTabControl is a single object. When the current tab changes, the tab control must directly update its contents to reflect the change in an OnChange event handler. +Disabling a TTabControl object disables all tabs because it is one control. To disable individual tabs, use TPageControl and disable the individual TTabSheet controls that represent the pages. + +Note: When using one of the page controls, if you want to restrict a user from switching to a tab, you cannot set TTabSheet.Enabled to false to accomplish that restriction. Instead, use the OnChanging event to prevent the user from selecting a tab. +The Tabs property can be used to define an accelerator key to a tab item of the TTabControl. + + + TTabSheet is an individual page in a TPageControl object. +Use TTabSheet to represent a single page in a tabbed page control. Tab sheets are typically referred to as pages. TPageControl maintains an indexed array of its tab sheets in its Pages property. Users can click on a tab to activate the tab sheet. +You can use the Caption property of the TTabSheet control to define an accelerator key to a page of the TPageControl. + + + Initializes window-creation parameters for the tab sheet. +The tab sheet calls CreateParams internally when the tab sheet must be generated. CreateParams overrides the inherited method to specify the type of window for the tab sheet. + + + Called when the user selects another tab. +Generates an OnHide event. DoHide is called automatically when the TabVisible property changes to false. Override DoHide in a derived class to perform class-specific actions when the tab sheet is temporarily removed from its page control, or to block the OnHide event. + + + Called when the user selects another tab. +Generates an OnShow event. DoShow is called automatically when the TabVisible property changes to false. Override DoShow in a derived class to perform class-specific actions when the tab sheet appears in its page control after being temporarily hidden, or to block the OnHide event. + + + Renders the image of a windowed control. +Vcl.ComCtrls.TTabSheet.PaintWindow inherits from Vcl.Controls.TWinControl.PaintWindow. All content below this line refers to Vcl.Controls.TWinControl.PaintWindow. +Renders the image of a windowed control. +Call PaintWindow to repaint the control. PaintWindow sends a WM_PAINT message to the windowed control's DefaultHandler method, setting the message record's WParam field to the value passed in DC and the other parameter and result fields to zeros. + + + Prepare control to be initialized from a stream. +TTabSheet reimplements in order to assign Reader's parent as the Tab Sheet's parent. + + + Updates the original size of the parent control. +Vcl.ComCtrls.TTabSheet.UpdateControlOriginalParentSize inherits from Vcl.Controls.TWinControl.UpdateControlOriginalParentSize. All content below this line refers to Vcl.Controls.TWinControl.UpdateControlOriginalParentSize. +Updates the original size of the parent control. +UpdateControlOriginalParentSize is a protected method that updates the original size of the parent control. It is used internally to update the anchor rules of the control. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Sets the parent of the control. +Vcl.ComCtrls.TTabSheet.SetParent inherits from Vcl.Controls.TControl.SetParent. All content below this line refers to Vcl.Controls.TControl.SetParent. +Sets the parent of the control. +SetParent is the protected implementation of the Parent property. Override SetParent to execute additional code when the value of the Parent property changes. +The AParent parameter specifies the new parent of the control. +If the control already has a parent, SetParent removes the control from that parent's list of controls by calling the parent's RemoveControl method. If AParent is not nil (Delphi) or NULL (C++), SetParent calls its InsertControl method to add the control to its list of controls. +The TControl destructor calls SetParent(nil (Delphi) or NULL (C++)) to remove the control from its parent's control list before destroying the component. + + + Creates and initializes an instance of TTabSheet. +Call Create to instantiate a tab sheet at runtime. Tab sheets added to a page control at design time are created automatically. +Create calls the inherited Create method, then sets the initial values for the tab sheet component. +When creating tab sheets at runtime, use the PageControl property to insert them into a page control object. + + + Destroys an instance of TTabSheet. +Do not call Destroy directly at runtime. Instead, call Free. Free verifies that the tab sheet is not nil and only then calls Destroy. Destroy removes the tab sheet from the page control and then calls the inherited Destroy method. + + + Indicates the page control object that contains the tab sheet. +Read PageControl to gain access to the page control object that uses the tab sheet. The properties and methods of the PageControl object can be used to locate the selected page, iterate through the other pages in the page control, or change the display properties of the tabs. +Set PageControl to remove the tab sheet from its current page control (if any) and insert it into a new page control. + +Code Examples +TTabSheetPageControl (Delphi) +TabSheetPageControl (Delphi) +TTabSheetPageControl (C++) +TabSheetPageControl (C++) + + + Indicates the position of the tab sheet in the set of visible tabs in a TPageControl object. +Read TabIndex to determine where the user sees the tab sheet. A value of 0 indicates the first visible tab sheet, a value of 1 indicates the second visible tab sheet, and so on. TabIndex is always less than or equal to PageIndex. For example, a tab sheet that has a PageIndex of 3 will have a TabIndex of 2 if one of the previous tab sheets in the page control is not visible. +If a tab sheet's TabVisible property is false, the TabIndex property is -1. + + + Indicates whether the tab sheet appears highlighted. +Use Highlighted to make a tab sheet stand out visually. When Highlighted is true, the tab sheet is drawn using a highlight color so that it stands out visually from other tab sheets. + +Note: Highlighted is not linked to the active page of the host page control. A page control can have only one active page, but can have multiple highlighted pages. + + + Specifies an image for the tab. +Use ImageIndex to get or set the index of an image to be drawn in the tab. This index identifies an image from the Images property of the page control that contains the tab sheet. Specify -1 to prevent an image from being drawn. + + + Displays the name of linked items from the Image Collection. + + + Indicates the index of the tab sheet in the list of tab sheets maintained by the page control. +Use PageIndex to determine where the tab sheet sits in its page control. Each tab sheet in a page control is automatically assigned a PageIndex when it is inserted in the page control. The first tab sheet receives a value of 0, the second has a value of 1, and so on. PageIndex values are reassigned if tab sheets are deleted or moved. +To access a particular tab sheet given its index value, use the indexed Pages property of the TPageControl object. + + + Specifies whether the tab of the TTabSheet object appears in its TPageControl. +Use TabVisible to temporarily remove a tab sheet from a page control. When TabVisible is false, the tab does not appear in the page control and its TabIndex property is -1. Setting TabVisible to true allows the user to see the tab of the tab sheet again. + + + Occurs when the TabVisible property changes to false. +Write an OnHide event handler to take specific action when the tab sheet is temporarily removed from its page control. + + + Occurs when the TabVisible property changes to true. +Write an OnShow event handler to take specific action when the tab sheet appears in its page control after being temporarily hidden. + + + + + TPageControl is a set of pages used to make a multiple page dialog box. +Use TPageControl to create a multiple page dialog or tabbed notebook. TPageControl displays multiple overlapping pages that are TTabSheet objects. The user selects a page by clicking the page's tab that appears at the top of the control. To add a new page to a TPageControl object at design time, right-click the TPageControl object and choose New Page. +You can define an accelerator key to a page of the TPageControl. To define the accelerator key use the Caption property of the TTabSheet control. +To create a tabbed control that uses only a single body portion (page), use TTabControl instead. + +Note: When using one of the page controls, if you want to restrict a user from switching to a tab, you cannot set TTabSheet.Enabled to false to accomplish that restriction. Instead, use the OnChanging event to prevent the user from selecting a tab. + + + Indicates whether a tab sheet in the page control can be selected. +Call CanShowTab to determine whether a tab can be selected or accessed. +TabIndex is the index of the tab in the list of tab sheets maintained by the Pages property. +CanShowTab returns true if the specified Tab sheet is enabled (its Enabled property is true ). + + + Responds to changes in the page control. +Change is called automatically when Windows notifies the page control of a change. TPageControl responds to this notification by updating its display to show the new current page. + + + Provides necessary adjustments when a new client is docked in the page control. +DoAddDockClient is called when a new client is docked to the page control. It sets the page control's tab sheet as the new client's parent. +Client is the client being docked. + + + Indicates whether an object that is dragged over the page control can be docked. +DockOver is called automatically when the user drags a dockable window over the page control. +The Source parameter describes the object that is being dragged. +The X and Y parameters give the current position of the dragged control. +The State parameter indicates how the mouse is moving. +DockOver initializes the Source parameter to reflect the dockable region of the page control and generates an OnDockOver event. An OnDockOver event handler can change the Accept parameter to false if the Source control should not be docked. + +Note: DockOver is only called if the DockSite property is true. + + + Provides necessary adjustments when a control is undocked from the page control. +DoRemoveDockClient is called when a client is undocked from the page control. It selects the next page in the tab sheet. +Client is the client being undocked. + + + Specifies the image to display for a particular page. +Override GetImageIndex in a derived class to specify the index of the image to display for a particular page. +TabIndex is the page's index that is about to be displayed. +The Return Value is an integer that is the image's index (in the Images property) that will be displayed in the tab. +By default, if there is no OnGetImageIndex event handler, GetImageIndex returns the ImageIndex property for the page with the specified index; otherwise, GetImageIndex calls the inherited GetImageIndex method, returning the result. + + + Returns the tab sheet on which a client is docked. +Call GetPageFromDockClient to get the tab sheet on which Client is docked. +Returns nil (Delphi) or NULL (C++) if Client is not docked. + + + Returns the page control's docking information. +Call GetSiteInfo to determine the docking region of the page control and whether a dragged window can be docked. +Client is a potential docking client. +InfluenceRect returns the area in which the client can be docked. +MousePos is the current mouse position. +CanDock indicates whether the client can be docked in the page control. +GetSiteInfo initializes CanDock to true if Client is not already docked in the page control. It then inflates the influence rectangle by 10 pixels and generates an OnOnGetSiteInfo event. + + + Initializes the page control after all its parts have been loaded from a stream. +Loaded is called automatically when the form containing the page control is first loaded into memory. TPageControl overrides the Loaded method to ensure that all tab sheets with a Highlighted property of true appear highlighted. + + + Embarcadero Technologies does not currently have any additional information. + + + Assigns indexes to the pages that reflect the order in which pages are loaded from a stream. +SetChildOrder is called automatically when the children of the page control are loaded from a stream. It assigns each page an index that reflects the order in which pages are loaded and saved. +The Child parameter is a page of the page control. The Order parameter indicates when the page is loaded or saved. The first page loaded or saved is called with Order set to 0, the second with Order set to 1, and so on. +SetChildOrder assigns the PageIndex property of the individual pages to the value of Order. + + + Sets the TabIndex property. +Vcl.ComCtrls.TPageControl.SetTabIndex inherits from Vcl.ComCtrls.TCustomTabControl.SetTabIndex. All content below this line refers to Vcl.ComCtrls.TCustomTabControl.SetTabIndex. +Sets the TabIndex property. +SetTabIndex is called to change the value of the TabIndex property. Descendant classes should override SetTabIndex to provide special implementations of this property. + + + Displays a specified page. +ShowControl is called automatically when a particular page of the page control should be visible. The AControl parameter specifies the page that should be displayed on screen. +ShowControl makes the specified page active it is not already active, and sets its own Visible property to true. It then calls the ShowControl method of its parent object to ensure that the page control is showing (and therefore able to display the active page). + + + Updates the ActivePage property when changes are made to the Pages property. +This protected method is used internally when the pages listed in the Pages property change. It ensures that the page control is internally consistent and that the active page is displayed. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates an instance of PageControl. +Call Create to instantiate a page control at runtime. Page controls added to forms at design time are created automatically. +AOwner is the form in which the page control should appear. It becomes the value of the Owner property. +When creating a page control at runtime, the pages must be added programmatically. To add a page to a page control at runtime, create the TTabSheet object for the page and set its PageControl property. + + + Destroys an instance of TPageControl. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TPageControl reference is not nil, and only then calls Destroy. Destroy frees the TList object that holds the pages of the control, and then calls the inherited destructor. + + + Returns the next page in the page control before or after a specified page. +Call FindNextPage to locate a page in the page control by its position relative to the page specified by the CurPage parameter. If the GoForward parameter is true, FindNextPage returns the next page in the page control after CurPage. If GoForward is false, FindNextPage returns the previous page. If CurPage is not a page in the page control, FindNextPage returns the first page when GoForward is true or the last page when GoForward is false. If GoForward is true and CurPage is the last page in the page control, FindNextPage returns the first page. If GoForward is false and CurPage is the first page in the page control, FindNextPage returns the last page. +When CheckTabVisible is true, FindNextPage returns the next page with a TabVisible property set to true, if CheckTabVisible is false, FindNextPage returns the next page, including pages with TabVisible set to false. + + + Calls a specified procedure for every page in the page control. +Call GetChildren to execute a callback for every page in the page control. The Proc parameter is the callback. The Root parameter is ignored by TPageControl. +GetChildren is intended primarily for the streaming system that loads and saves components. + + + Changes the ActivePage to the first visible page that is before or after the currently active page. +Use SelectNextPage to select the page next to the currently active page. +If the GoForward parameter is true, SelectNextPage selects the first page after ActivePage; if GoForward is false, SelectNextPage selects the first page previous to ActivePage. +If CheckTabVisible is true, SelectNextPage only considers pages with their TabVisible property set to true. + +Note: To select a page at design-time, right-click the TPageControl and choose Previous Page or Next Page. + + + Specifies the page currently displayed by the page control. +Use ActivePageIndex to get or set the active page by index rather than by object. The value of ActivePageIndex identifies a page in the Pages property array. Changing the value of ActivePageIndex changes the ActivePage property, and vice versa. +If there is no active page, reading ActivePageIndex gives a value of -1. +Setting ActivePageIndex to a value that is out of bounds (less than 0 or greater than PageCount - 1) results in the page control having no active page. + + + Indicates the number of pages in the TPageControl object. +Use PageCount to determine the number of pages listed by the Pages property. If the MultiLine property is false, not all pages may have tabs visible to the user. + + + Specifies the page currently displayed by the page control. +Read ActivePage to determine which page is selected by the user. The user selects a page by clicking the mouse on its tab. Set ActivePage to bring a page to the foreground. Only one page can be active at a time. +To change the ActivePage to the page that precedes or follows the active page, use the SelectNextPage method. To iterate through all the pages to locate a specific page, use the FindNextPage method. +Two events occur when one attempts to change the current page. They are OnChange and OnChanging. OnChanging occurs immediately before you attempt to change the current page, while OnChange occurs immediately after the page has been changed. + + + + + TCustomStatusBar is the base class for objects that represent status bars. +TCustomStatusBar component is the base class for status bar controls. Status bars consist of a row of panels, usually aligned at the bottom of a form, that display information about an application as it runs. Each panel is represented by a TStatusPanel object listed in the Panels property. +TCustomStatusBar is intended only as a base class. To add a status bar to a form, use a TCustomStatusBar descendant such as TStatusBar. + + + Repositions and resizes the status bar by a specified ratio. +ChangeScale is called automatically when the form that contains the status bar is rescaled. ChangeScale modifies the position as well as the size of a control. Thus, ChangeScale modifies the control's Top, Left, Width, and Height properties. +The M and D parameters define a fraction by which to scale the control. The M parameter is the multiplier and the D parameter is the divisor. For example, to make a control 75% of its original size, specify the value of M as 75, and the value of D as 100 (75/100). Alternately, the same results are achieved by specifying the value of M as 3, and the value of D as 4 (3/4). Both fractions are equal and result in the control being scaled by the same amount, 75%. +TCustomStatusBar overrides the inherited method to ensure that the new size of the status bar matches the system font if the UseSystemFont property is true. + + + Creates a new panel that can be added to the Panels property. +The TStatusPanels object that implements the Panels property calls CreatePanel when it needs to add a new panel. CreatePanel generates an OnCreatePanelClass event to determine the class of the new TStatusPanel object, and then creates an instance of that class. CreatePanel returns the new status panel instance. + + + Creates the TStatusPanels object that implements the Panels property. +TCustomStatusBar calls CreatePanels internally generate the implementation object for the Panels property. +Override this method to substitute a TStatusPanels descendant as the implementation of the Panels property or to provide special initializations to the TStatusPanels instance. + + + Initializes the window-creation parameter record when the status bar window is created. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. TCustomStatusBar overrides CreateParams to customize the parameters to specify a status bar control that reflects the properties of TCustomStatusBar. +The fields of the Params parameter become the parameters to a call to the CreateWindowEx API function. + + + Creates the Windows control that represents the status bar. +The CreateHandle method calls CreateWnd to handle the particulars of creating the status bar window. TCustomStatusBar overrides the inherited method to ensure that the newly-created window and the TCustomStatusBar properties correctly reflect each other. +The Windows control for the status bar can be temporarily destroyed and recreated in order to set properties that require changing the window creation parameters. Thus, CreateWnd may be called more than once during the lifetime of the TCustomStatusBar instance. + + + Generates an OnHint event. +DoHint is called automatically when the value of AutoHint is true and the status bar receives notification that it should display a hint. +If there is an OnHint event handler, DoHint calls the event handler and returns true. If no OnHint event handler is assigned, DoHint returns false. + + + Draws an owner-drawn panel. +DrawPanel is called automatically for each status panel that has a Style of psOwnerDraw. If there is an event handler for the OnDrawPanel event, DrawPanel calls the OnDrawPanel event handler. Otherwise, it fills the panel background using the color specified by the Color property. +Panel is the owner drawn status panel that needs to be drawn. +Rect indicates the dimensions of that panel on the status bar's canvas. + + + Returns the class to use for implementing the panels of the status bar. +The CreatePanel method calls GetPanelClass to determine the default class to use when creating new panels for the status bar. This class can then be changed by an OnCreatePanelClass event handler. +TCustomStatusBar returns TStatusPanel as the default class for status bar panels. Descendants that use a TStatusPanel descendant by default can override this method to indicate a different default class. + + + Indicates whether the value of the Font property should be saved in the form file. +TCustomStatusBar uses IsFontStored internally to determine whether the value of the Font property should be stored in a form file with the other properties of the status bar object. IsFontStored checks the UseSystemFont, ParentFont, and DesktopFont properties. If any of these is true, the status bar gets its font from an external source, and the value of the Font property does not need to be saved. + + + Sets the value of the Parent property. +SetParent is the protected write implementation of the Parent property. +AParent is the new parent of the status bar. + + + Creates and initializes a TCustomStatusBar component. +The Create method creates a status bar along with its canvas and status panels. +AOwner is a component, typically the form, that becomes the value of the Owner property. + + + Destroys TCustomStatusBar and frees its memory. +Do not call Destroy directly. Instead, use the Free method, which checks for a nil object before calling Destroy. +The Destroy method destroys the status bar along with its canvas and status panels. + + + Processes actions for the status bar. +When an action executes, the application makes a series of calls to respond to that action. If, in the course of that processing, the application identifies the status bar as a potential target of the action, it calls the status bar's ExecuteAction method. +If the action in a hint action (THintAction), ExecuteAction checks the AutoHint property, and if it is true, displays the hint and returns true. Otherwise, it allows the inherited method to respond to any other actions. +The Action parameter specifies the action that was invoked. +ExecuteAction returns true if the action was successfully dispatched, and false if the component could not handle the action. + + + Reverses the positions of the status bar's panels. +FlipChildren iterates through the panels of the status bar, reversing their order but otherwise leaving their properties intact. +AllLevels specifies whether FlipChildren should be called recursively on the control's children. TCustomStatusBar ignores this parameter when reversing the panels. + + + Sets the Left, Top, Width, and Height properties all at once. +TCustomStatusBar overrides SetBounds in order to update the size grip. +ALeft, ATop, AWidth, and AHeight specify the new values for the Left, Top, Width, and Height properties, respectively. + + + Provides runtime access to the status bar's drawing surface. +The read-only Canvas property provides access to the status bar's drawing surface that you can use when implementing a handler for the OnDrawPanel event. + + + Specifies whether the status bar's text is set automatically to the current hint. +Use AutoHint to specify whether the status bar's text is set automatically to the current hint. When AutoHint is True, the status bar automatically responds to hint actions by displaying the long version of the hint's text in the first panel. + + + Lists the panels (TStatusPanel objects) in the status bar. +The Panels property holds a TStatusPanels, that is, a collection of TStatusPanel objects. At design time, you can add, remove, or modify panels with the Panels editor. To open the Panels editor, select the Panels property in the Object Inspector, then double-click in the Value column to the right or click the ellipsis (...) button. +At design time, you can add, remove, or modify panels with the Panels editor: + +To open the Panels editor from the the Object Inspector, select the Panels property and either double-click in the Value column to the right or click the ellipsis (...) button. +To open the Panels editor from the Form Designer, right-click TStatusBar and select Panels editor from the context menu. + + + Determines whether the status bar displays a single panel or multiple panels. +If SimplePanel is set to True, the status bar consists of a single panel displaying the text in SimpleText. If SimplePanel is set to False, the status bar displays a separate panel for each item in its Panels property. + +Note: When SimplePanel is False, you cannot use the SimpleText property to display text in the status bar. Instead, you must set the Text property on one of the panel objects. + + + Contains a text string to be displayed in the status panel when SimplePanel is True. + +Note: Microsoft Windows XP and earlier versions limited the size of the string to 127 chars. Under Microsoft Windows Vista, Windows 7, or later Windows operating systems, SimpleText has no such limit. + + + Determines whether the status bar is resizable at run time. +If SizeGrip is set to True, the status bar has a triangular grip on the lower right corner. The user can resize the status bar by dragging the grip with the mouse. +A size grip will not be drawn unless the Parent property refers to the child of a TCustomForm descendant with a BorderStyle of bsSizeable or bsSizeToolWin. + +Note: If Align is set to alBottom, alRight, or alClient, the sizing grip will not work. If the Alignment property of the last panel in the status bar is set to taRightJustify, the sizing grip will truncate the panel's text. + + + Specifies whether the status bar uses the system font. +UseSystemFont specifies whether the status bar uses the system font. To change fonts, use the Font property. + + + Occurs when a status panel needs to be created. +Write an OnCreatePanelClass event handler to specify a custom TStatusPanel descendant that the status bar should use to implement its panels. +OnCreatePanelClass is an event handler of type Vcl.ComCtrls.TSBCreatePanelClassEvent. + + + Occurs when the AutoHint property is True and the status bar receives a hint action. +Write an OnHint event handler to customize the way the status bar displays hints when the AutoHint property is True. When AutoHint is True and the status bar needs to display a hint, it generates an OnHint event. If the status bar has an OnHint event handler, then the status bar assumes that the event handler displays the hint and does not set the panel text to the value of the application's current hint. If there is no OnHint event handler (and AutoHint is True), the status bar displays the text of the hint in the first panel. +OnHint does not occur if the AutoHint property is False. + + + Occurs when a status panel needs to be redrawn. +The OnDrawPanel event occurs when a status panel needs to be redisplayed for example, when the user resizes the status bar. OnDrawPanel occurs only if the status panel's Style property is set to psOwnerDraw. +OnDrawPanel is an event handler of type Vcl.ComCtrls.TCustomDrawPanelEvent. + + + + + TStatusBar represents a status bar. +The TStatusBar component is a row of panels, usually aligned at the bottom of a form, that display information about an application as it runs. Each panel is represented by a TStatusPanel object listed in the Panels property. The SimplePanel property can be used to toggle the status bar at runtime between a single- and multiple-panel display. + + + Occurs when a status panel needs to be redrawn. +The OnDrawPanel event occurs when a status panel needs to be redisplayed for example, when the user resizes the status bar. OnDrawPanel occurs only if the status panel's Style property is set to psOwnerDraw. +OnDrawPanel is an event handler of type Vcl.ComCtrls.TDrawPanelEvent. + + + + + + + + Sets the stored directive for Touch properties. + + + Setter for the Encoding property. + + + Read-only property that contains the value of the encoding detected when the LoadFromStream or + LoadFromFile methods are called. + + + + + TTrackBar is a wrapper for a track bar control. +Use TTrackBar to put a track bar on a form. A track bar represents a position along a continuum using a slider and, optionally, tick marks. A track bar can also display a selected range marked by triangular ticks at the starting and ending positions of the selection. +During program execution, the slider can be moved to the desired position by dragging it with the mouse or by clicking the mouse on the bar. To use the keyboard to move the slider, press the arrow keys or the Page Up and Page Down keys. + + + Initializes a window-creation parameter data structure. +Vcl.ComCtrls.TTrackBar.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + Resize and reposition children and self. +Vcl.ComCtrls.TTrackBar.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Creates the underlying window. +Vcl.ComCtrls.TTrackBar.CreateWnd inherits from Vcl.Controls.TWinControl.CreateWnd. All content below this line refers to Vcl.Controls.TWinControl.CreateWnd. +Creates the underlying window. +CreateWnd is called automatically when the control is first created or when the underlying screen object must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the screen object when it is created. + + + Destroys the control's window. +Vcl.ComCtrls.TTrackBar.DestroyWnd inherits from Vcl.Controls.TWinControl.DestroyWnd. All content below this line refers to Vcl.Controls.TWinControl.DestroyWnd. +Destroys the control's window. +DestroyWnd is called when the control needs to replace its window. For example, changing properties that are implemented by window parameter settings require the control to be destroyed and then recreated using the CreateWnd method. +Before the window is destroyed, DestroyWnd saves a copy of the control's text in memory, frees any device contexts, and finally calls DestroyWindowHandle. When the window is recreated, the stored copy of the control's text is assigned to the new window. + + + Sends a CM_CHANGED message to the control. +Vcl.ComCtrls.TTrackBar.Changed inherits from Vcl.Controls.TControl.Changed. All content below this line refers to Vcl.Controls.TControl.Changed. +Sends a CM_CHANGED message to the control. +Call Changed after changing the properties of the control in a way that affects the properties of a parent object. Changed sends a CM_CHANGED message back to the control. If the control is a windowed control, this message is sent to the parent so that it can make any necessary adjustments. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates and initializes an instance of TTrackBar. +Call Create to instantiate a TTrackBar object at runtime. Track bars placed on forms at design time are created automatically. +Create allocates memory and initializes the following properties: +ControlStyle is set to [csCaptureMouse, csClickEvents, csSetCaption]. +Frequency is set to 1. +Height is set to 45 and Width to 150. +LineSize is set to 1 and PageSize to 2. +Max is set to 10 and Min to 0. +Orientation is set to trHorizontal. +TickMarks is set to tbBottomRight and TickStyle to tsAuto. +TabStop is set to true. + + + Adds a tick mark to the track bar at a specified location. +Use SetTick to place a tick mark on the bar at the position that corresponds to the Value parameter. Tick marks specified in this manner are only displayed when the TickStyle is set to tsManual. + + + Indicates the amount the value of Position changes when the user presses the arrow keys. +Use LineSize to specify the distance along the slider that represents a single unit. The current Position is marked by a slider. The right and down arrow keys increment the value of Position by LineSize, and the left and up arrow keys decrement the value of Position by LineSize. +Use the PageSize property to set the number of ticks moved using the Page Up and Page Down keys. + + + Specifies the maximum Position of a TTrackBar. +Use Max to set an upper limit to the value that can be represented using the track bar. A slider indicates the current Position in a range between Min and Max. + + + Specifies the minimum Position of a TTrackBar. +Use Min to set a lower limit to the value that can be represented using the track bar. A slider indicates the current Position in a range between Min and Max. + + + Specifies whether the track bar is horizontal or vertical. +Set Orientation to the desired orientation of the track bar. Orientation has these possible values: + + + + + +Value + +Meaning + + + +tbHorizontal + + + +The long edge of the track is parallel to the top of the form. The Min position is on the left and the Max position is on the right. + + + + +tbVertical + + + +The long edge of the track is parallel to the side of the form. The Min position is on the top and the Max position is on the bottom. + + + Specifies the amount Position is changed when the PageUp or PageDown key is pressed, or when the bar is clicked. +Set PageSize to the distance along the track bar that corresponds to a single view. A slider marks the current Position. The Page Up key increments the value of Position by PageSize, and Page Down key decrements the value of Position by PageSize. +Use the LineSize property to set the number of ticks moved using the arrow keys. + + + Specifies the increment between tick marks on the track bar. +Use Frequency to specify the spacing of the tick marks, using the logical units used by the Position property. For example, a Frequency of 5 sets a tick mark at every fifth possible increment. To provide visual feedback about the units used by the track bar, set Frequency to LineSize or PageSize. + +Note: If the value of the TickStyle property is not set to tsAuto, the value of Frequency is ignored. + + + Contains the current position of the slider of a TTrackBar. +Read Position to determine the current value represented by the track bar. Position is a value in the range between Min and Max (inclusive). Set Position to programmatically move the slider of the track bar to a new value. + + + Determines the position of the (optional) Tool Tip displaying the position of the track bar. +You can set this property to one of the following values. + + + + + +Value + +Meaning + + + +ptNone + + + +No Tool Tip is shown. + + + + +ptTop + + + +The Tool Tip appears at the top side of the TrackBar. + + + + +ptBottom + + + +The Tool Tip appears at the bottom side of the TrackBar. + + + + +ptLeft + + + +The Tool Tip appears at the left side of the TrackBar. + + + + +ptRight + + + +The Tool Tip appears at the right side of the TrackBar. + + + + + +Note: Use ptLeft and ptRight for the vertical Track Bars. Use ptTop and ptBottom for the horizontal Track Bars. + + + Specifies whether the track bar's slider is visible. +Use SliderVisible to get or set whether the track bar's slider is visible. + + + Specifies the position of the end point of the selection range. +Set SelEnd to determine the length of a selection that begins at SelStart. The track bar indicates a selection range on the bar by placing special tick marks at the positions specified by the SelStart and SelEnd properties and highlighting the selected portion of the bar. +SelEnd must be greater than or equal to Position. If SelEnd is set to a value less than Position, Position changes to SelEnd. SelEnd must be greater than or equal to SelStart. If SelEnd is the same as SelStart, there is no selection, and the value of Position is the same as SelStart and SelEnd. + + + Specifies the position of the starting point of the selection range. +Set SelStart to determine the beginning of a selection that runs to SelEnd. The track bar indicates a selection range on the bar by placing special tick marks at the positions specified by the SelStart and SelEnd properties and highlighting the selected portion of the bar. +SelStart must be less than or equal to Position. If SelStart is set to a value greater than Position, Position changes to SelStart. SelStart must be less than or equal to SelEnd. If SelStart is the same as SelEnd, there is no selection, and the value of Position is the same as SelStart and SelEnd. + + + Specifies whether the track bar shows the selection range. +If set to True, the selection range on the track bar is displayed. If set to False, the selection range is not displayed. + + + Specifies the length of the track bar's slider. +Use ThumbLength to get or set the length of the track bar's slider. + + + Specifies the location of the tick marks. +Set TickMarks to specify where the tick marks should be drawn. TickMarks has these possible values: + + + + + +Value + +Meaning + + + +tmBottomRight + + + +Tick marks are on the bottom or right of the track bar, depending of the value of Orientation. + + + + +tmTopLeft + + + +Tick marks are on the top or left of the track bar, depending of the value of Orientation. + + + + +tmBoth + + + +Tick marks are on both sides of the track bar. + + + + +If the TickStyle property is tsNone, the value of TickMarks is ignored. + + + Specifies how tick marks are placed on the track bar. +Set TickStyle to specify whether the track bar should display tick marks, and if so, how those tick marks are set. TickStyle has these possible values: + + + + + +Value + +Meaning + + + +tsAuto + + + +Tick marks are automatically displayed at increments equal to the value of the Frequency property. + + + + +tsManual + + + +Tick marks are displayed at the Min and Max values. Additional tick marks can be set using the SetTick method. + + + + +tsNone + + + +No tick marks are displayed. + + + + + TToolBar manages tool buttons and other controls, arranging them in rows and automatically adjusting their sizes and positions. +TToolBar is a container for tool buttons (TToolButton). It provides an easy way to arrange and manage visual controls. +All tool buttons on a toolbar maintain a uniform width and height. +Other controls can sit on a toolbar. These controls (which are held in place by invisible tool buttons) maintain a uniform height. +Controls can automatically wrap around and start a new row when they do not fit horizontally on the toolbar. +The Flat property allows the background to show through the toolbar and gives pop-up borders to the tool buttons. +Spaces and dividers (which are in fact specially configured tool buttons) can group controls on the toolbar both visually and functionally. +Typically, the tool buttons correspond to items in an application's menu and give the user more direct access to the application's commands. + + + Aligns any child controls of the toolbar within a specified area of the control. +The protected AlignControls method is called automatically to align all controls within an area of container control (in this case the tool bar). In TToolBar, AlignControls takes into account the special needs of a tool bar in arranging its buttons. +Control is a child control that should have precedence when laying out the child controls. If Control is nil (Delphi) or NULL (C++), none of the child controls has precedence. +Rect is the area in which to align the child controls. + + + Indicates whether the toolbar can resize itself automatically to accommodate its contents. +CanAutoSize is called automatically when the AutoSize property is true and an attempt is made to resize the control. It allows the toolbar to implement the AutoSize property before the resize sequence that ends with the OnResize event. +When CanAutoSize is called, the NewWidth and NewHeight parameters indicate the proposed new dimensions of the toolbar. CanAutoSize adjusts these values so that the toolbar's size adjusts to its buttons. If the adjustment results in values of NewWidth and NewHeight that differ from the control's current width and height, CanAutoSize returns true, indicating that the resize sequence should proceed. If, after adjustment, NewWidth and NewHeight equal Width and Height, CanAutoSize returns false, and the resize sequence is aborted. + + + Called when the menu associated with a toolbar button is canceled. +Override CancelMenu in a derived class to handle the canceling of a menu on one of the tool buttons. +By default, CancelMenu clears the highlighting and hot item in the menu. + + + Repositions and resizes the toolbar by a specified ratio. +Use ChangeScale to change the scale of the toolbar. +ChangeScale modifies the position and size of a toolbar as well as rescaling the buttons. Thus, ChangeScale modifies the Top, Left, Width, and Height properties. +The M and D parameters define a fraction by which to scale the control. The M parameter is the multiplier and the D parameter is the divisor. For example, to make a control 75% of its original size, specify the value of M as 75, and the value of D as 100 (75/100). Alternately, the same results are achieved by specifying the value of M as 3, and the value of D as 4 (3/4). Both fractions are equal and result in the control being scaled by the same amount, 75%. + + + Displays a toolbar button's drop-down menu. +CheckMenuDropdown is called automatically when the drop-down arrow portion of a toolbutton is clicked or if a toolbutton has an assigned MenuItem property. +Button is the drop-down toolbar button that was clicked. +CheckMenuDropdown has no effect unless the button's Style property contains tbsDropDown. + + + Simulates the clicking of a toolbar button. +Call ClickButton to simulate the clicking of a toolbar button. +Button is the toolbar button to click. + + + Initializes a window-creation parameter record passed in the Params parameter. +CreateParams is called automatically to initialize the window-creation parameters whenever the window for the toolbar needs to be created. CreateParams overrides the inherited method to implement those properties that require a specialize window style. + + + Creates the window that implements the toolbar. +The Windows control for the toolbar can be temporarily destroyed and recreated in order to set properties that require changing the window creation parameters. TToolBar calls CreateWnd to create this Windows control when necessary. + + + Use this method for drawing the toolbar when gdoGradient and dsGradient are both set. +This method is used for drawing the toolbar when gdoGradient and dsGradient are both set + + + Use this method for drawing toolbuttons when gdoGradient and dsGradient are both set. +This method is used for drawing toolbuttons when gdoGradient and dsGradient are both set. + + + Generates OnCustomDraw and OnAdvancedCustomDraw events. +CustomDraw is called automatically at discrete stages during the drawing process to generate the OnCustomDraw and OnAdvancedCustomDraw events. +ARect specifies the boundaries of the toolbar on the toolbar's Canvas. +Stage indicates the current stage of the paint process. When Stage is cdPrePaint, CustomDraw generates an OnCustomDraw event followed by an OnAdvancedCustomDraw event. At all other stages, CustomDraw generates only the OnAdvancedCustomDraw event. +CustomDraw returns true if the toolbar should continue with its default painting sequence, false if the painting sequence should end after the call. + + + Generates OnCustomDrawButton and OnAdvancedCustomDrawButton events. +CustomDrawButton is called automatically at discrete stages during the drawing process to generate the OnCustomDrawButton and OnAdvancedCustomDrawButton events. +Button specifies the tool button that needs to be drawn. +State describes the state of the button, so that the event handler can reflect that state in the button's image. +Stage indicates the current stage of the paint process. When Stage is cdPrePaint, CustomDrawButton generates an OnCustomDrawButton event followed by an OnAdvancedCustomDrawButton event. At all other stages, CustomDrawButton generates only the OnAdvancedCustomDrawButton event. +Flags is used only when Stage is cdPrePaint. It influences how the button is subsequently rendered by the default drawing process. CustomDrawButton returns the set of flags that indicates how the toolbar should proceed with rendering the button. + + + Generates an OnCustomizeCanInsert event. +DoQueryInsert is called automatically when the user tries to add a button to a customizable tool bar. It generates an OnCustomizeCanInsert event, allowing the application to block the insertion. +Index is the index (in the Buttons property) where the user is trying to insert a new button. + + + Generates an OnCustomizeCanDelete event. +DoQueryDelete is called automatically when the user tries to delete a button from a customizable tool bar. It generates an OnCustomizeCanDelete event, allowing the application to block the deletion. +Index is the index (in the Buttons property) of the button that the user is trying to delete. + + + Returns the toolbar button with the specified accelerator. +Use FindButtonFromAccel to determine which toolbar button has the specified accelerator. +If the accelerator is not found, FindButtonFromAccel returns nil (Delphi) or NULL (C++). + + + Called when the menu associated with a drop-down toolbar button is about to be displayed. +InitMenu initializes the highlighting and hot-tracking for the drop-down menu associated with the tool button that Button specifies. +Override InitMenu in a derived class to perform other initializations to the toolbar button's menu. + + + Indicates whether an event handler exists to respond at a particular stage in the paint process. +TToolBar uses IsCustomDrawn internally to determine whether it needs generate the various custom draw events. +Target indicates what object is currently being painted. If Target is dtControl, it is the background of the toolbar, and IsCustomDrawn checks whether there is an OnCustomDraw or OnAdvancedCustomDraw event handler. If Target is dtItem, it is one of the tool buttons, and IsCustomDrawn checks for an OnCustomDrawButton or OnAdvancedCustomDrawButton event handler. TToolBar does not use dtSubItem as a target. +Stage indicates the current stage of the paint process. If stage is not cdPrePaint, then the tool bar only generates an event if it has one of the advanced custom draw event handlers. +IsCustomDrawn returns true if the toolbar should generate an event (there is an event handler to respond.) IsCustomDrawn returns false if there is no need to generate a custom draw event. + + + Initializes the component after the form file has been read into memory. +TToolBar overrides Loaded in order to managed the ButtonWidth property. + + + Responds to a notification that a component has been added or is about to be deleted. +Notification is called automatically when a component has just been added to the form or is about to be deleted. +AComponent is the component that was just added or that is about to be deleted. +Operation indicates whether AComponent was added or is about to be deleted. +As implemented in TToolBar, Notification checks whether the image list that is the value of the Images, HotImages, or DisabledImages property is about to be deleted. If so, it resets the property to nil (Delphi) or NULL (C++). + + + Updates the position of a specified button in the toolbar. +TToolBar uses RepositionButton internally when laying out the buttons in the toolbar. RepositionButton calculates where to place the button with the specified index, given the positions of all previous buttons in the toolbar. It then changes the position and size of the specified tool button. + + + Updates the positions of all buttons in the toolbar from a specified button on. +TToolBar uses RepositionButtons internally when laying out the buttons in the toolbar. RepositionButtons calculates where to place all the buttons with the specified index or greater, and updates their positions and sizes. + + + Provides specific message responses for the toolbar. +WndProc overrides the WndProc for TWinControl to handle mouse messages, and sends all others to the inherited WndProc. +Derived classes that override WndProc to provide specialized responses to messages should call the inherited WndProc at the end to dispatch any other messages. + + + Rearranges the toolbar's buttons so they fit in the toolbar. +Call WrapButtons to rearrange the toolbar's buttons. +NewWidth is the width in which the buttons must fit. +NewHeight is the height in which the buttons must fit. +WrapButtons returns true if the buttons fit; otherwise, WrapButtons returns false. + + + Respond to control resize. +Vcl.ComCtrls.TToolBar.Resize inherits from Vcl.Controls.TControl.Resize. All content below this line refers to Vcl.Controls.TControl.Resize. +Respond to control resize. +Resize is called automatically immediately after the control's dimensions change. As implemented in TControl, Resize calls the control's OnResize event handler if it is assigned. + + + Sets the value of the AutoSize property. +Vcl.ComCtrls.TToolBar.SetAutoSize inherits from Vcl.Controls.TControl.SetAutoSize. All content below this line refers to Vcl.Controls.TControl.SetAutoSize. +Sets the value of the AutoSize property. +SetAutoSize is a protected method in the TControl class and is used to set the value of the AutoSize property. + + + Called when the StyleElements property changes. +Vcl.ComCtrls.TToolBar.UpdateStyleElements inherits from Vcl.Controls.TControl.UpdateStyleElements. All content below this line refers to Vcl.Controls.TControl.UpdateStyleElements. +Called when the StyleElements property changes. +Override the UpdateStyleElements method in a descendant class to provide customized behavior for the control when the value of the StyleElements property changes. + + + Creates and initializes a TToolBar instance. +Call Create to create a toolbar at runtime. Toolbars added to forms at design time are created automatically. +AOwner is the component, typically the form, that is responsible for freeing the toolbar instance. It becomes the value of the Owner property. + + + Destroys the TToolBar instance and frees its memory. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TToolBar reference is not nil, and only then calls Destroy. + + + Prevents the toolbar buttons from reversing position when the parent control is flipped. +FlipChildren overrides the inherited method in order to prevent the flipping of the toolbar's children. + + + Returns a TComponent enumerator. +Vcl.ComCtrls.TToolBar.GetEnumerator inherits from System.Classes.TComponent.GetEnumerator. All content below this line refers to System.Classes.TComponent.GetEnumerator. +Returns a TComponent enumerator. +GetEnumerator returns a TComponentEnumerator reference, which enumerates the components contained within a specified containing component. +To process all these subcomponents, call the TComponentEnumerator GetCurrent method within a While MoveNext do loop. + + + Allows the streaming system to load and save child controls in the order they appear in the toolbar. +GetChildren is introduced in TComponent for the streaming system that loads and saves VCL components. It executes the callback specified by Proc for all the button in the toolbar, as well as any other controls that have the toolbar as a parent and the component specified by Root as an Owner. +Proc is a callback that the streaming system uses to load or save persistent objects on a form. +Root is the the top-level component (such as a form or data module) that is currently being loaded or saved. + + + Called when the accelerator for a toolbar button is pressed. +TrackMenu is called automatically in response to the accelerator on a toolbar button. It initializes the menu of a drop-down menu button, and forwards a click to the underlying Windows control. +Button is the toolbar button for which an accelerator was pressed. +Override TrackMenu in a derived class to perform additional actions when the accelerator for a toolbar button is pressed. + + + Gives the number of buttons in the toolbar. +ButtonCount gives the number of buttons in the Buttons array. + + + Specifies the drawing surface for the toolbar. +Use Canvas to draw or paint on the surface of the toolbar in an OnCustomDraw or OnCustomDrawButton event handler. The TCanvas object provides the properties and methods needed for drawing and painting. + + + Specifies the registry key where the tool bar saves its current button configuration before the user changes it using the toolbar customize dialog. +Use CustomizeKeyName to specify where the toolbar saves its button configuration when the user first displays the toolbar customize dialog. This is a subkey of HKEY_CURRENT_USER. +When the user double-clicks the tool bar to display the toolbar customize dialog, the tool bar receives an OnCustomizing event and then automatically saves its current configuration to this key using the name specified by the CustomizeValueName property. If the user instructs the dialog to restore this configuration, the toolbar fetches the saved configuration from this registry key. + + + Specifies the registry value under which the tool bar saves its current button configuration before the user changes it using the toolbar customize dialog. +Use CustomizeValueName to specify the name that the toolbar uses to save its button configuration when the user first displays the toolbar customize dialog. This is a value under the registry key specified by the CustomizeKeyName property. +When the user double-clicks the tool bar to display the toolbar customize dialog, the tool bar receives an OnCustomizing event and then automatically saves its current configuration to the Registry using this value. If the user instructs the dialog to restore this configuration, the toolbar fetches this saved configuration. + + + Indicates the number of rows in the toolbar. +Reading RowCount returns the number of rows in which the tool buttons are arranged. + + + Specifies the height of the controls in the toolbar. +ButtonHeight represents the height, in pixels, of the controls in the toolbar. + + + Specifies the width of the tool buttons (TToolButton) in the toolbar. +ButtonWidth represents the width, in pixels, of the TToolButton components on the toolbar. It has no effect on tool buttons whose Style property is set to tbsSeparator or tbsDivider. + + + Specifies whether the user can customize the toolbar at runtime. +Set Customizable to true to allow the user to add, delete, and move toolbar buttons at runtime. There are two ways the user can change a customizable toolbar: +By holding the shift key, the user can drag a button to a new position on the tool bar, or drag it off the toolbar entirely to delete the button. +By double-clicking on the toolbar, the user can display the toolbar customize dialog. The toolbar customize dialog shows all the possible buttons in two list boxes, one that contains buttons not on the tool bar, and one that contains buttons currently on the tool bar. The user can use this dialog to add or remove buttons and to change their order. + +Note: When Customizable is true, a number of events inform the tool bar component when the user makes changes. + + + Lists the images that can appear on disabled tool buttons. +DisabledImages contains a list of images that can appear on tool buttons when they are disabled. Each tool button's ImageIndex property determines the specific image displayed on it. If DisabledImages is unassigned, disabled tool buttons display grayed versions of their regular images (specified by the Images property). + + + Stores the style type. +This property stores either the dsNormal or dsGradient style choice. + + + Makes the toolbar transparent and eliminates tool-button borders. +If Flat is set to true, the toolbar and its tool buttons are transparent; background colors and graphics show through them. In addition, when Flat is true, tool buttons (TToolButton) on the toolbar have pop-up borders that appear only when the mouse is passed over the button. + + + Color used as end color for the gradient. +This property stores the color that is used to paint the gradient when the drawing ends. (The end color blends with the start color). + + + Color used as start color for the gradient. +The property stores the value that represents the drawing color when the gradient starts painting. + + + Specifies handling of buttons obscured by adjacent toolbar. +If HideClippedButtons is set to true, any button partially obscured by a neighboring band is hidden. + + + Lists the images that can appear on tool buttons when the mouse points to them. +HotImages contains a list of images that can appear on tool buttons when the mouse passes over them at runtime. Each tool button's ImageIndex property determines the specific image displayed when the mouse points to it. If HotImages is unassigned, tool buttons retain their regular images (specified by the Images property) when pointed to. Use a TImageList control to hold the images that will be shown for hot images. Typically, then, the application will have two TImageList controls, one for the Images property and one for the HotImages property. +To use HotImages set the Flat property to True. + + + Color used as hot tracking color when in gradient style. +This is the color used as the hot tracking color when the toolbar's DrawingStyle property is set to dsGradient. The hot tracking color is the color the button turns when the mouse moves over it. + + + Lists the images that can appear on tool buttons. +Images contains a list of images that can appear on the toolbar's tool buttons. Each tool button's ImageIndex property determines the specific image displayed on it. If Images is unassigned, no images are displayed on the tool buttons. +Images in the list should be 16x16. + + + Specifies the margin on the left side of the toolbar. +Indent specifies, in pixels, the margin that separates the left edge of the toolbar from the controls within it. + + + Aligns captions on the right and images on the left in tool buttons. +When List is false, tool buttons (TToolButton) appear in the toolbar with their images (if any) centered and their captions (if visible) underneath. Setting List to true aligns captions to the right and images to the left. + + + Causes the toolbar to populate itself with buttons that correspond to items in a menu. +Use the menu property to populate the tool bar to match a menu component. Setting Menu causes the toolbar to delete all of its current buttons and replace them with tool buttons that match the items in the specified menu component. +In applications that use Menu to populate the toolbar, do not change the Buttons property by adding, deleting, or editing toolbar buttons. + +Note: The toolbar does not dynamically track any changes to the menu specified by Menu. That is, it sets the tool buttons to reflect the set of items in the menu at the point when the application sets this property, and ignores any subsequent changes. + + + Specifies whether the direction of the gradient is horizontal or vertical. +This property stores the value for the gradient direction. + + + Stores the drawing option chosen. +This property contains either the gdoHotTrack or gdoGradient option, depending on which one was chosen. + + + Determines whether text captions are displayed on tool buttons. +If ShowCaptions is set to true, tool buttons appear in the toolbar with their captions displayed. Setting ShowCaptions to true may increase the size of the tool buttons. + + + Determines whether tool buttons that consist only of text can be placed on the Toolbar. +When set to true, the tbsTextButton style is available for the TToolButton control, allowing you to create tool buttons on the Toolbar that consist only of text. When set to false, the tbsTextButton style is not available for the TToolButton control. + + + Specifies whether the toolbar is transparent. +Use Transparent to get or set whether the toolbar is transparent. Note the Transparent property applies only to the toolbar itself not its buttons. + +Tip: To avoid painting problems, set the Transparent property before the toolbar becomes visible. + + + Enables automatic line-wrap for components in the toolbar. +If Wrapable is true, components automatically wrap around and form new rows when they do not fit horizontally in the toolbar. + + + Occurs at discrete stages during the painting of the toolbar's background. +Write an OnAdvancedCustomDraw event handler to enhance or replace the automatic painting of the toolbar. Use the toolbar's Canvas property to render the toolbar's image. OnAdvancedCustomDraw is for painting the background of the toolbar. The painting of individual buttons on the toolbar should be handled in an OnCustomDrawButton or OnAdvancedCustomDrawButton event handler. + +Note: OnAdvancedCustomDraw occurs at several points during the painting of the toolbar's background. If you only need to respond immediately prior to the default painting of the toolbar, use OnCustomDraw instead. +OnAdvancedCustomDraw is an event handler of type Vcl.ComCtrls.TTBAdvancedCustomDrawEvent. + + + Occurs at discrete stages during the painting of the toolbar's buttons. +Write an OnAdvancedCustomDrawButton event handler to enhance or replace the automatic painting of the toolbar's buttons. Use the toolbar's Canvas property to render the button's image. OnAdvancedCustomDrawButton occurs during the erasure and painting of individual buttons on the toolbar. The painting of the toolbar itself should be handled in an OnCustomDraw or OnAdvancedCustomDraw event handler. + +Note: OnAdvancedCustomDrawButton occurs at several points during the painting of the toolbar's buttons. If you only need to respond immediately prior to the default painting of each button and are not using the Flags parameter, use OnCustomDrawButton instead. +OnAdvancedCustomDrawButton is an event handler of type Vcl.ComCtrls.TTBAdvancedCustomDrawBtnEvent. + + + Occurs when the toolbar must be painted. +Write an OnCustomDraw event handler to enhance or replace the automatic painting of the toolbar. Use the toolbar's Canvas property to render the toolbar's image. OnCustomDraw is for painting the background of the toolbar. The painting of individual buttons on the toolbar should be handled in an OnCustomDrawButton or OnAdvancedCustomDrawButton event handler. + +Note: OnCustomDraw only occurs prior to painting the toolbar's background. To respond at other points in the paint process (when the background is erased, or after the default painting of the toolbar's background), use OnAdvancedCustomDraw instead. +OnCustomDraw is an event handler of type Vcl.ComCtrls.TTBCustomDrawEvent. + + + Occurs when one of the buttons in the toolbar must be painted. +Write an OnCustomDrawButton event handler to enhance or replace the automatic painting of the toolbar's buttons. Use the toolbar's Canvas property to render the button's image. OnCustomDrawButton is for painting individual buttons on the toolbar. The painting of the toolbar itself should be handled in an OnCustomDraw or OnAdvancedCustomDraw event handler. + +Note: OnCustomDrawButton only occurs prior to painting the button. To respond at other points in the process of painting a button (when the background is erased, or after the default painting of the button), use OnAdvancedCustomDrawButton instead. +OnCustomDrawButton is an event handler of type Vcl.ComCtrls.TTBCustomDrawBtnEvent. + + + Occurs when the user adds a button to the toolbar. +Write an OnCustomizeAdded handler to respond when the user adds a new button to the toolbar using the toolbar customize dialog. +This event occurs after the new button is already added to the toolbar. To respond before the button is added, possibly even preventing the user from adding the button, use the OnCustomizeCanInsert event instead. +OnCustomizeAdded is an event handler of type Vcl.ComCtrls.TTBButtonEvent. + + + Occurs when user tries to add a button to the toolbar. +When the Customizable property is true, the user can add buttons to the toolbar using the toolbar customize dialog. OnCustomizeCanInsert occurs when the user tries to add a button, and allows the application to reject the insertion. If the OnCustomizeCanInsert event handler sets its Allow parameter to false, the toolbar customize dialog rejects the insertion. +OnCustomizeCanInsert is an event handler of type Vcl.ComCtrls.TTBCustomizeQueryEvent. + + + Occurs when user tries to delete one of the buttons on the toolbar. +When the Customizable property is true, the user can remove buttons from the toolbar by dragging them off the toolbar when the Shift key is pressed or using the toolbar customize dialog. OnCustomizeCanDelete occurs when the user tries to delete a button in one of these ways, and allows the application to reject the deletion. If the OnCustomizeCanDelete event handler sets its Allow parameter to false, the tool button returns to the position it occupied before the user tried to delete it. +OnCustomizeCanDelete is an event handler of type Vcl.ComCtrls.TTBCustomizeQueryEvent. + + + Occurs when the user finishes making changes to the toolbar. +Write an OnCustomized event handler to take action after the user has finished making changes to the toolbar. This event occurs when the user finishes a drag operation (with the Shift key down) that moves or deletes a tool button, and when the user exits the toolbar customize dialog. + + + Occurs when the user deletes a button from the toolbar. +Write an OnCustomizeDelete event handler to respond when the user deletes a tool button by dragging it off the toolbar when the SHIFT key is pressed or by using the toolbar customize dialog. +This event occurs after the button has been removed from the toolbar. To respond before the button is being deleted, possibly preventing the user from deleting the button, use the OnCustomizeCanDelete event instead. +OnCustomizeDelete is an event handler of type Vcl.ComCtrls.TTBButtonEvent. + + + Occurs when the user displays the toolbar customize dialog in order to make changes to the toolbar. +Write an OnCustomizing event handler to take action when the user first displays the toolbar customize dialog. + + + Occurs when the user tries to add a new button to the tool bar. +Write an OnCustomizeNewButton event handler to supply your own TToolButton objects to represent the tool buttons that a user adds in the toolbar customize dialog. +OnCustomizeNewButton is an event handler of type Vcl.ComCtrls.TTBNewButtonEvent. + + + Occurs when the user cancels a customization to the toolbar. +Write an OnCustomizeReset event handler to respond when the user cancels changes made in the toolbar customize dialog. + + + + + + + + Override background painting for custom style + + + + + TDateTimePicker displays a list box for entering dates or times. +TDateTimePicker is a visual component designed specifically for entering dates or times. In dmComboBox date mode, it resembles a list box or combo box, except that the drop-down list is replaced with a calendar illustration; users can select a date from the calendar. Dates or times can also be selected by scrolling with Up and Down arrows and by typing. +Date-time picker ignores the BiDiMode setting for right-to-left reading, displaying dates according to the system locale. +TDateTimePicker formats date and time values according to the date and time settings in the Regional Settings of the Control panel on the user's system. Because TDateTimePicker is a wrapper for a Windows control, these formats can't be changed by changing the formatting variables in the SysUtils unit. However, you can use the Windows API call DateTime_SetFormat to programmatically specify these settings. + +Note: The underlying Windows control is known to behave unpredictably when used to set dates in 1752, the year English-speaking countries changed to the Gregorian calendar. Similar problems may appear for different dates when a non-English locale is used. If an application might be used to specify dates on or before the changeover in the current locale (for example, 1918 or before in Russian locales), be sure to test the application using the dates affected. + + + Embarcadero Technologies does not currently have any additional information. + + + Clears the check box associated with the calendar. +Vcl.ComCtrls.TDateTimePicker.CheckEmptyDate inherits from Vcl.ComCtrls.TCommonCalendar.CheckEmptyDate. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.CheckEmptyDate. +Clears the check box associated with the calendar. +CheckEmptyDate is called automatically when DateTime is assigned a value that represents a time and not a date value (or Date is assigned a value of 0). As implemented in TCommonCalendar, CheckEmptyDate does nothing. +TDateTimePicker overrides CheckEmptyDate to clear the check box associated with the calendar, or raise an EDateTimeError if the ShowCheckbox property is false. This allows TDateTimePicker to represent time values that do not include a date portion. (When a TDateTime value represents a time and not a date, the date portion is 0). + + + Initializes a window-creation parameter data structure. +Vcl.ComCtrls.TDateTimePicker.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + Creates the windows control for the calendar. +Vcl.ComCtrls.TDateTimePicker.CreateWnd inherits from Vcl.ComCtrls.TCommonCalendar.CreateWnd. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.CreateWnd. +Creates the windows control for the calendar. +CreateWnd is called automatically when the windowed control is first created or when the window must be destroyed and recreated to reflect property changes. Override CreateWnd to pass additional initialization messages to the window when it is first created. +CreateWnd calls the TWinControl CreateWnd method to generate the window, and then sends messages to initialize the control so that it reflects the current property settings. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the calendar control's window handle. +Vcl.ComCtrls.TDateTimePicker.GetCalendarHandle inherits from Vcl.ComCtrls.TCommonCalendar.GetCalendarHandle. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.GetCalendarHandle. +Returns the calendar control's window handle. +GetCalendarHandle is the protected read implementation of the CalendarHandle property. For TCommonCalendar, this is an abstract method. It must be implemented in descendant classes. + + + Sets the calendar's colors. +Vcl.ComCtrls.TDateTimePicker.MsgSetCalColors inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetCalColors. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetCalColors. +Sets the calendar's colors. +MsgSetCalColors implements the CalColors property by sending a message to the calendar window handle. MsgSetCalColors is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The ColorIndex parameter indicates which of the TMonthCalColors properties is being set. It is one of the following values: + + + + + +Value + +Property + + + +0 + + + +BackColor + + + + +1 + + + +TextColor + + + + +2 + + + +TitleBackColor + + + + +3 + + + +TitleTextColor + + + + +4 + + + +MonthBackColor + + + + +5 + + + +TrailingTextColor + + + + +The ColorValue parameter is the value that should be set. +MsgSetCalColors returns true if the color is set by the method. + + + Sets the calendar's date/time. +Vcl.ComCtrls.TDateTimePicker.MsgSetDateTime inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetDateTime. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetDateTime. +Sets the calendar's date/time. +MsgSetDateTime implements the DateTime property by sending a message to the calendar window handle. MsgSetDateTime is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The Value parameter indicates the value of DateTime as a TSystemTime value. This can be obtained from the DateTime property value by calling DateTimeToSystemTime. +MsgSetDateTime returns true if the date/time value is set by the method. + + + Implements the MinDate and MaxDate properties. +Vcl.ComCtrls.TDateTimePicker.MsgSetRange inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetRange. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetRange. +Implements the MinDate and MaxDate properties. +MsgSetRange implements the MinDate and MaxDate properties by sending a message to the calendar window handle. MsgSetRange is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The Flags parameter indicates what type of information is included in the SysTime array. It includes the GDTR_MIN flag if a minimum date is supplied and GDTR_MAX if a maximum date is supplied. +The SysTime parameter is a two-element array containing the minimum date as the first element and the maximum date as the second element. These values can be obtained from the MinDate and MaxDate properties by calling DateTimeToSystemTime. +MsgSetRange returns true if the range is set by the method. + + + Implements the MinDate and MaxDate properties. +Vcl.ComCtrls.TDateTimePicker.MsgSetRange inherits from Vcl.ComCtrls.TCommonCalendar.MsgSetRange. All content below this line refers to Vcl.ComCtrls.TCommonCalendar.MsgSetRange. +Implements the MinDate and MaxDate properties. +MsgSetRange implements the MinDate and MaxDate properties by sending a message to the calendar window handle. MsgSetRange is an abstract method, and must be overridden in descendant objects to send the appropriate message. +The Flags parameter indicates what type of information is included in the SysTime array. It includes the GDTR_MIN flag if a minimum date is supplied and GDTR_MAX if a maximum date is supplied. +The SysTime parameter is a two-element array containing the minimum date as the first element and the maximum date as the second element. These values can be obtained from the MinDate and MaxDate properties by calling DateTimeToSystemTime. +MsgSetRange returns true if the range is set by the method. + + + Creates and initializes a TDateTimePicker instance. +Create calls the inherited constructor method and initializes the Date and Time properties to the current date and time. It also sets the following ControlStyle flags: csCaptureMouse, csOpaque, csClickEvents, csDoubleClicks, and csFixedHeight. + + + Specifies whether the date time picker control is dropped down. +DroppedDown specifies whether the date time picker control is dropped down. + + + Determines the alignment of the drop-down calendar. +Set CalAlignment to dtaLeft or dtaRight to align the drop-down calendar on the left or right side of the component. This property is applicable only if the Kind property is dtkDate and the DateMode property is dmComboBox. + + + Specify format for date-time string. +Format specifies custom format string for the date-time display, overriding the control panel strings. A custom format can include both date and time fields, but time fields are not editable unless the Kind property is dtkTime. The following format characters are understood. + + + + + +Element + +Description + + + +d + + + +The one- or two-digit day. + + + + +dd + + + +The two-digit day. Single-digit day values are preceded by a zero. + + + + +ddd + + + +The three-character weekday abbreviation. + + + + +dddd + + + +The full weekday name. + + + + +h + + + +The one- or two-digit hour in 12-hour format. + + + + +hh + + + +The two-digit hour in 12-hour format. Single-digit values are preceded by a zero. + + + + +H + + + +The one- or two-digit hour in 24-hour format. + + + + +HH + + + +The two-digit hour in 24-hour format. Single-digit values are preceded by a zero. + + + + +m + + + +The one- or two-digit minute. + + + + +mm + + + +The two-digit minute. Single-digit values are preceded by a zero. + + + + +M + + + +The one- or two-digit month number. + + + + +MM + + + +The two-digit month number. Single-digit values are preceded by a zero. + + + + +MMM + + + +The three-character month abbreviation. + + + + +MMMM + + + +The full month name. + + + + +t + + + +The one-letter AM/PM abbreviation (that is, AM is displayed as "A"). + + + + +tt + + + +The two-letter AM/PM abbreviation (that is, AM is displayed as "AM"). + + + + +yy + + + +The last two digits of the year (that is, 2001 would be displayed as "01"). + + + + +yyyy + + + +The full year (that is, 2001 would be displayed as "2001"). + + + + +To include literal strings in the format, enclose them in single quotes. Failing to quote literal strings can have unpredictable results, even if they do not include formatting codes. Use two single quotes to represent one single quote character in a literal string. For example, +Today's date: MMM dd, yyyy +entered in the property editor, produces the following results for April 1, 2001: +"Today's date: Apr 01, 2001" + +Note: When setting Format programmatically in Delphi code, double each single quote again: + + + +DateTimePicker1.Format := '''Today''''s date:'' MMM dd, yyyy'; + + + Indicates the time entered by the user. +Time represents the time entered by the user. Set Time in program code or in the Object Inspector to determine which time is selected by default. (Applies only when Kind = dtkTime.) + + + Displays a check box next to the date or time. +Set ShowCheckbox to true to display a check box in the TDateTimePicker component. + + + Indicates whether the check box next to the date or time is selected. +Checked is true if the check box in the TDateTimePicker component is selected. Setting Checked to true at design time makes the check box appear selected by default. + + + Specifies format in which the date is presented. +If DateFormat is set to dfShort, the date is formatted using the short date format specified in the Windows control panel. By default, it appears like this: 3/21/97. +If DateFormat is set to dfLong, the date is formatted using the long date format specified in the Windows control panel. By default, it appears like this: Friday, March 21, 1997. (Applies only when Kind is dtkDate.) +For custom date formats, set the Format property. + + + Determines the method of date selection used by the component. +If DateMode is dmComboBox, the component has a drop-down calendar illustration from which the user can select a date. If DateMode is dmUpDown, the component has Up/Down arrows with which the user can adjust the date. (Applies only when Kind is dtkDate.) + + + Determines whether the component is a date selector or a time selector. +If the Kind property is dtkDate, the control is configured to support date editing. The default format gives only the date portion of the control value, and a drop-down calendar is available if the DateMode property is dmComboxBox. +If the Kind property is dtkTime, the control is configured to support time editing. The default format give only the time portion of the control value, but the date portion can also be edited if the Format property includes date field codes.. + + + Enables the OnUserInput event. +If ParseInput is True, the OnUserInput event occurs whenever the user types into the component's edit box. + + + Occurs when the drop-down calendar closes. +Write an OnCloseUp event handler to implement special processing that needs to occur only when the drop-down calendar closes. + + + Occurs when a date or time is entered. +Write an OnChange event handler to take specific action whenever the date or time entered in the component changes. + + + Occurs when the user opens the drop-down calendar by clicking the arrow at the right of the control. +Write an OnDropDown event handler to implement special processing that needs to occur only when the drop-down calendar is opened. + + + Occurs when the user types directly into the component's edit box. +This event occurs only if ParseInput is set to True. Write an OnUserInput event handler implementing special processing that needs to occur when the user types directly into the TDateTimePicker (rather than selecting with the drop-down calendar or scroll arrows). +OnUserInput is an event handler of type Vcl.ComCtrls.TDTParseInputEvent. + + + + + + + + Custom handler for WM_GETTEXTLENGTH message. + + + Custom handler for WM_GETTEXT message. + + + Custom handler for WM_SETTEXT message. + + + Custom handler for CB_GETEDITSEL message. + + + Custom handler for CB_SETEDITSEL message. + + + + + + + + Override background painting + + + + + TTimer encapsulates the Windows API timer functions. +TTimer is used to simplify calling the Windows API timer functions SetTimer and KillTimer, and to simplify processing the WM_TIMER messages. Use one timer component for each timer in the application. +The execution of the timer occurs through its OnTimer event. TTimer has an Interval property that determines how often the timer's OnTimer event occurs. The interval corresponds to the parameter for the Windows API SetTimer function. + +Warning: Limitations on the total number of timers system-wide are system-dependent. + + + Embarcadero Technologies does not currently have any additional information. + + + Instantiates a timer object. +Call Create to instantiate a timer at runtime. Timers added to forms or data modules at design time are created automatically. +AOwner specifies the component, typically a form or data module, that is responsible for freeing the timer. + + + Disposes of a timer object. +Do not call Destroy directly in an application. Instead, an application should call Free. Free verifies that the timer is not nil before it calls Destroy. +Destroy deactivates the timer by setting Enabled to False before freeing the resources required by the timer. + + + Controls whether the timer generates OnTimer events periodically. +Use Enabled to enable or disable the timer. If Enabled is true, the timer responds normally. If Enabled is false, the timer does not generate OnTimer events. The default is true. + + + Determines the amount of time, in milliseconds, that passes before the timer component initiates another OnTimer event. +Interval determines how frequently the OnTimer event occurs. Each time the specified interval passes, the OnTimer event occurs. +Use Interval to specify any cardinal value as the interval between OnTimer events. The default value is 1000 (one second). + +Note: A 0 value is valid, however the timer will not call an OnTimer event for a value of 0. + + + Occurs when a specified amount of time, determined by the Interval property, has passed. +Write an OnTimer event handler to execute an action at regular intervals. +The Interval property of a timer determines how frequently the OnTimer event occurs. Each time the specified interval passes, the OnTimer event occurs. + + + + + Specifies a page in a TNotebook control. +The TPage class implements a page in a TNotebook control. + + + Prepares the control for having its properties assigned values from a stream. +Vcl.ExtCtrls.TPage.ReadState inherits from Vcl.Controls.TWinControl.ReadState. All content below this line refers to Vcl.Controls.TWinControl.ReadState. +Prepares the control for having its properties assigned values from a stream. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Be sure to include a call to the inherited method when overriding ReadState. +As implemented in TWinControl, ReadState disables control alignment until all the child controls have been read from the stream, calls the inherited ReadState method, and re-enables the alignment of all the controls. The method then builds the tab order list of controls and synchronizes its visibility with that of its parent control. + + + Renders the image of a custom control. +Vcl.ExtCtrls.TPage.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + Creates an instance of TCustomControl. +Vcl.ExtCtrls.TPage.Create inherits from Vcl.Controls.TCustomControl.Create. All content below this line refers to Vcl.Controls.TCustomControl.Create. +Creates an instance of TCustomControl. +Calling Create constructs and initializes an instance of TCustomControl. However, you should never attempt to instantiate a TCustomControl. This class is intended solely as a base class from which other control classes descend and you should only call Create to instantiate one of these descendants. Controls placed on forms at design time are created automatically. +After calling the inherited constructor, Create initializes the control and also a TCanvas object for its Canvas property. +When overriding Create, always call the inherited Create method first, then proceed with the control's initialization. Remember to specify the override directive when overriding the Create method. + +Note: If a component's constructor allocates resources or memory, also override the destructor to free those resources. + + + + + TNotebook displays multiple pages, each with its own set of controls. +Notebook components are frequently used with tab set controls (TTabSet) to let the user select pages in the notebook by clicking a tab. TNotebook is provided for backward compatibility. New applications should use TPageControl instead. + + + Initializes a window-creation parameter data structure. +Vcl.ExtCtrls.TNotebook.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + Returns the owner of a child component being read from a stream. +Vcl.ExtCtrls.TNotebook.GetChildOwner inherits from System.Classes.TComponent.GetChildOwner. All content below this line refers to System.Classes.TComponent.GetChildOwner. +Returns the owner of a child component being read from a stream. +GetChildOwner is used internally by the component streaming system. It is rarely necessary to call it directly. +In TComponent, GetChildOwner always returns nil (Delphi) or NULL (C++), indicating that the owner is the root component currently being read (usually a form or data module). The Owner of a component is responsible for destroying it. + + + Prepares the control for having its properties assigned values from a stream. +Vcl.ExtCtrls.TNotebook.ReadState inherits from Vcl.Controls.TWinControl.ReadState. All content below this line refers to Vcl.Controls.TWinControl.ReadState. +Prepares the control for having its properties assigned values from a stream. +Override ReadState to change the preparations the control makes as it readies itself to have its property values assigned from a stream. For example, a control might destroy temporary internal data structures or objects before new instances are loaded from the stream. Be sure to include a call to the inherited method when overriding ReadState. +As implemented in TWinControl, ReadState disables control alignment until all the child controls have been read from the stream, calls the inherited ReadState method, and re-enables the alignment of all the controls. The method then builds the tab order list of controls and synchronizes its visibility with that of its parent control. + + + Ensures that a specified child control is visible. +Vcl.ExtCtrls.TNotebook.ShowControl inherits from Vcl.Controls.TWinControl.ShowControl. All content below this line refers to Vcl.Controls.TWinControl.ShowControl. +Ensures that a specified child control is visible. +Call ShowControl to display a child control. Specify the control you want to ensure will be visible as the value of the AControl parameter. +As implemented in TWinControl, ShowControl simply calls the ShowControl method of the control's parent. Derived objects override ShowControl to perform whatever actions are necessary to allow the indicated child object to be visible. Possible actions include scrolling the particular child object into view, or changing to the appropriate notebook page. + + + Constructs a TNotebook component. +Call Create to instantiate a notebook at runtime. Notebook components placed in forms at design time are created automatically. +The AOwner parameter specifies the component (usually the form) that is responsible for freeing the notebook. + + + Destroys the TNotebook component. +Do not call Destroy directly in an application. Instead, use Free, which checks that the TNotebook reference is not nil before calling Destroy. + + + Calls a specified method for each child of the control. +Vcl.ExtCtrls.TNotebook.GetChildren inherits from Vcl.Controls.TWinControl.GetChildren. All content below this line refers to Vcl.Controls.TWinControl.GetChildren. +Calls a specified method for each child of the control. +GetChildren is called by the streaming system that loads and saves components. Applications seldom need to call this routine. +GetChildren executes the callback specified by the Proc parameter for every child control listed by the Controls property that lists the Root parameter as its Owner. +Override GetChildren to limit or augment which child controls are saved with the control. When overriding GetChildren, call the procedure passed as the Proc parameter for every child control that should be saved. The Root parameter indicates the component (usually a form) that owns the control. + + + Determines which page displays in the notebook. +ActivePage determines which page displays in the notebook. The value of ActivePage must be one of the strings contained in the Pages property. +To get or set the active page by index rather than string, use the PageIndex property instead. + + + Determines which page displays in the notebook control. +The value of PageIndex determines which page displays in the notebook. Changing the PageIndex value changes the page in the control. +Each string in the Pages property is automatically assigned a PageIndex value when the page is created. The first page receives a value of 0, the second has a value of 1, and so on. If you delete a string from the Pages property, the PageIndex values are reassigned so that the values always begin with 0 and continue to increase without any gaps between values. +To get or set the current page using its string rather than its index, use the ActivePage property instead. + + + Contains the strings that identify the individual pages of the notebook control. +The Pages property contains the strings that identify the individual pages of the notebook control. Both these controls create a separate page for each string in the Pages property. For example, if Pages contains three strings, First, Second, and Third, the control has three separate pages. +You can access the various pages in a notebook or tabbed notebook control with either the ActivePage or PageIndex property. + + + Occurs when the user selects a new page in the notebook. +Use the OnPageChanged event when you want special processing to occur when the active page changes. + + + + + THeader is a sectioned visual control that displays text and allows each section to be resized with the mouse. +THeader is provided for backward compatibility. New applications should use THeaderControl instead. + + + Resize and reposition children and self. +Vcl.ExtCtrls.THeader.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Renders the image of a custom control. +Vcl.ExtCtrls.THeader.Paint inherits from Vcl.Controls.TCustomControl.Paint. All content below this line refers to Vcl.Controls.TCustomControl.Paint. +Renders the image of a custom control. +The Paint method for TCustomControl does nothing other than provide the interface for a method that responds to WM_PAINT messages. Paint is called by the PaintWindow method, after that method has supplied the Canvas with the handle to a device context. When creating a custom control, always override Paint to draw the image of the control. + +Tip: To determine which portions of the control's canvas need to be repainted when Paint is called, use the ClipRect property of the canvas. + + + Initializes a window-creation parameter data structure. +Vcl.ExtCtrls.THeader.CreateParams inherits from Vcl.Controls.TWinControl.CreateParams. All content below this line refers to Vcl.Controls.TWinControl.CreateParams. +Initializes a window-creation parameter data structure. +The CreateWnd method calls CreateParams to initialize the parameters it passes to CreateWindowHandle. Override CreateParams to customize the way a control creates its Windows representation. When overriding CreateParams, always call the inherited method first to set the default values, then make any desired adjustments. +CreateParams fills in the parameter that is passed as the value of the Params parameter. This data structure holds information needed when telling Windows to create a window handle. The fields of a TCreateParams record become the parameters to a call to the CreateWindowEx API function. +TWinControl implements CreateParams by setting all the fields of Params to generic base values. A number of the standard controls override CreateParams to change one or more of the default values in Params. + + + OnMouseDown event dispatcher. +Vcl.ExtCtrls.THeader.MouseDown inherits from Vcl.Controls.TControl.MouseDown. All content below this line refers to Vcl.Controls.TControl.MouseDown. +OnMouseDown event dispatcher. +Override the protected MouseDown method to provide other responses in addition to calling the OnMouseDown event handler when the user presses the mouse button down while the cursor's hotspot is over the control. +The Button parameter determines which mouse button the user pressed. Shift indicates which shift keys (Shift, Ctrl, or Alt) were down when the user pressed the mouse button. X and Y are the pixel coordinates of the mouse pointer within the client area of the control. +A control calls MouseDown in response to any of the Windows mouse-down messages (WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was pressed down: left, right, or middle. + + + Responds to mouse moving over control area. +Vcl.ExtCtrls.THeader.MouseMove inherits from Vcl.Controls.TControl.MouseMove. All content below this line refers to Vcl.Controls.TControl.MouseMove. +Responds to mouse moving over control area. +Override the protected MouseMove method to provide other responses in addition to calling the OnMouseMove event handler when the user moves the mouse. +A control calls MouseMove in response to any of the Windows mouse-move messages (WM_MOUSEMOVE), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. +As the mouse cursor moves across a control, this method is called repeatedly. Each time it is called, it is with the new coordinates that reflect the continuous path of the mouse cursor across the screen real estate covered by the control's visual representation. + + + Is an OnMouseUp event dispatcher. +Vcl.ExtCtrls.THeader.MouseUp inherits from Vcl.Controls.TControl.MouseUp. All content below this line refers to Vcl.Controls.TControl.MouseUp. +Is an OnMouseUp event dispatcher. +Override the protected MouseUp method to provide other responses in addition to calling the OnMouseUp event handler when the user releases a previously pressed mouse button while the cursor's hot spot is over the control. +A control calls MouseUp in response to any of the Windows mouse-up messages (WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP), decoding the message parameters into the shift-key state and position, which it passes in the Shift, X, and Y parameters, respectively. The value of the Button parameter indicates which mouse button was released: left, right, or middle. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Creates a new THeader object. +Call Create to instantiate a header at runtime. Headers added to forms at design time are created automatically. +The AOwner parameter initializes the Owner property of the header. + + + Frees the memory associated with the THeader object. +Do not call Destroy directly. Instead, use the Free method, which checks whether the THeader reference is nil before calling Destroy. + + + Determines if the user can modify the size of the header at runtime with the mouse. +If AllowResize is false, the sections within a header can't be resized. If AllowResize is true, clicking a border of a header section and dragging it left or right changes the width of the section. The default value is true. + + + Determines whether the header control has a border. +These are the possible values: + + + + + +Value + +Meaning + + + +bsNone + + + +No visible border + + + + +bsSingle + + + +Single-line border + + + Lists the strings that contain the text for the sections of a header. +The number of lines of the string list determines the number of sections of the header. If the string list is empty, the header has one blank section. If this string list contains one or more lines, the text of each line is in its own section. The first line is in the leftmost section, the second line is in the next section to the right, and so on. + + + Occurs before the header is resized. +Write an OnSizing event handler to perform special processing immediately before the header is resized. In this event, AWidth is the width that the section will have after it is resized. Use the SectionWidth property to determine the current size of the section. + + + Occurs after the header has been resized. +Write an OnSized event handler to perform special processing after the header has been resized. In this event, the AWidth parameter is the width of the section before it was resized. Use the SectionWidth property to determine the new size of the section. +OnSized is an event handler of type Vcl.ExtCtrls.TSectionEvent. + + + + + TRadioGroup represents a group of radio buttons that function together. +A TRadioGroup object is a special group box that contains only radio buttons. Radio buttons that are placed directly in the same control component are said to be "grouped." When the user checks a radio button, all other radio buttons in its group become unchecked. Hence, two radio buttons on a form can be checked at the same time only if they are placed in separate containers, such as group boxes. +To add radio buttons to a TRadioGroup, edit the Items property in the Object Inspector. Each string in Items makes a radio button appear in the group box with the string as its caption. The value of the ItemIndex property determines which radio button is currently selected. +Display the radio buttons in a single column or in multiple columns by setting the Columns property. + +Note: Setting the radio group's BiDiMode to bdRightToLeft automatically flips its radio buttons. The FlipChildren method has no effect. + + + TControlBar manages the layout of toolbar components. +Use TControlBar as a docking site for toolbar components. Control bars contain child controls (usually TToolBar objects) that can be moved and resized independently. As with a cool bar, each child control resides on its own individual band that the user positions by dragging its sizing grip. + +Tip: When docking TToolBar objects to a control bar, you may find it useful to use TToolDockObject. +Note: If you want to use TActionToolBar on a TControlBar component, you should set the AutoSize property to False. When the AutoSize property is set to True (default), the TActionToolBar control wraps its controls and expands itself in size, accordingly. This does not allow the TActionToolBar component to display properly on a TControlBar component. When the AutoSize property is set to False, the TActionToolBar hides items on the end of the bar and displays a dropdown button that provides access to those items. The control displays in the proper size. + + + TBoundLabel is the type of a labeled edit control's label. +TBoundLabel implements the label of a labeled edit control. Unlike other label controls such as TLabel, TBoundLabel "belongs" to the labeled edit control (it is a subcomponent of the edit control). This means that the bound label's Owner is the edit control rather than the form, and the edit control is responsible for loading and saving the bound label. +Use the properties of TBoundLabel to specify how you want the labeled edit control's label to appear. For example, you can use the Caption property to specify the text that appears in the label. You can use the Alignment and Layout properties to specify the placement of that caption within the label. + + + Resizes the label when the text changes. +Vcl.ExtCtrls.TBoundLabel.AdjustBounds inherits from Vcl.StdCtrls.TCustomLabel.AdjustBounds. All content below this line refers to Vcl.StdCtrls.TCustomLabel.AdjustBounds. +Resizes the label when the text changes. +When the text in the label or the font changes, AdjustBounds is implicitly called. It redraws the text in the client area, and then resizes the label if the AutoSize property is true. +When WordWrap is true, the width of the label is fixed. If AutoSize is also true, changes to the text cause the label to change in height. When AutoSize is true and WordWrap is false, the height of the label is determined by the font, and changes to the text cause the label to change in width. +Override AdjustBounds to make additional adjustments when the text changes. + + + Creates a new TBoundLabel object. +Do not create instances of TBoundLabel. Bound labels are instantiated by the labeled edit controls to which they belong. +AOwner specifies the labeled edit control that acts as the bound label's Owner. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TLabeledEdit is an edit control that has an associated label. +Use TLabeledEdit to add an edit control with a label to a form. TLabeledEdit works with an associated label control, which is the value of its EditLabel property. The position of that label relative to the edit control is determined by the LabelPosition and LabelSpacing properties. +Use the Text property to work with the text in the control, and the label's Caption property to work with the text in the label. + + + TColorBox represents a combo box that lets users select a color. +Use TColorBox to provide the user with a drop-down combo box from which to select a color. Use the Style property to specify which colors the color box should list. Each color is displayed next to a small square that is drawn in the corresponding color. +Use the Selected property to access the color that the user selects. The Colors property provides access to the entire list of colors, while the ColorNames property lists their names. + + + + + + Override background painting and font color + + + + + The class of errors that appear when working with actions + + + This is the base class that implements the operation with + a list of keyboard shortcuts. Should be established descendants + of this class (see TContainedAction.CreateShortCutList) for each platform (VCL, FMX), which should be overridden the method Add. + + + TContainedAction is the base class for actions that can be grouped by category and that can appear in action lists. +TContainedAction introduces properties and methods that enable actions to appear in an action list. The properties of TContainedAction contain information about the relationship between the action and its action list. Methods of TContainedAction override those of the base class to take into account the action list that owns the action. +TContainedAction defines the published Category property. +Objects of type TContainedAction can be associated with a Category of actions. This category is used at design time to organize the actions in an action list using the Action List editor or the Action Manager editor (only available for VCL). + + + Reads the state of the action. +ReadState is used internally in the actions system. It is not necessary to call it directly. +ReadState calls the inherited System.Classes.TComponent.ReadState procedure. Then +ReadState checks whether the Parent of Reader (Reader.Parent) is an action list, then ReadState sets that the action belongs to this action list (ActionList). + + + Retrieves whether the list stored in the SecondaryShortCuts property is created. +SecondaryShortCutsCreated returns True if the SecondaryShortCuts list is created. + + + Introduces an interface for creating the ShortCutList object for the action. +As implemented in TContainedAction, CreateShortCutList does not create any shortcut list object and just returns nil. + + + Stores the value of the Enabled property when the action is suspended. +The System.Actions.TContainedActionList.SetState method uses SavedEnabledState internally: + +When System.Actions.TContainedActionList.SetState changes State from asSuspendedEnabled to asNormal, then the value stored in SavedEnabledState is used to set the Enabled property. +When System.Actions.TContainedActionList.SetState sets State to asSuspendedEnabled, then the value of the Enabled property is saved in SavedEnabledState and Enabled is set to True. + + + Copies the properties of this action to a destination action. +Dest specifies the destination action. AssignTo ensures the correct assignment of property values. +If Dest is nil or Dest is not of the TContainedAction type, then an error is raised. + + + Executes the action when the user types one of its shortcuts. +HandleShortCut calls System.Classes.TBasicAction.Execute to cause the action to perform its function. HandleShortCut returns the value that System.Classes.TBasicAction.Execute returns. +Descendant classes can override HandleShortCut to respond in other ways when the user types the action's shortcut keys. + + + Sets the specified Value to the AutoCheck property of the action, and propagates this Value to all clients of the action. + + + Sets the specified Value to the Caption property of the action, and propagates this Value to all the clients of the action. + + + Sets the Name and Caption properties of the action. +SetName calls the inherited System.Classes.TComponent.SetName method to set the specified Value to the Name property of the action. If the action does not have any clients and the current values of the Name and Caption properties of the action are equal, then SetName sets Value to the Caption property of the action also. + +Warning: Using SetName to change the name of an action at run time causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception. + + + Sets the specified Value to the Checked property of the action, and propagates this Value to all clients of the action. +If the action has a GroupIndex value greater than 0, then setting Checked to True causes all other actions in the group to have their Checked property set to False. + + + Sets the Enabled property of the action to the specified Value and propagates this Value to all clients of the action. +The behavior of SetEnabled depends upon the State of the ActionList action list: + +If the value of State is asSuspended, then SetEnabled sets to the specified Value only the Enabled property of the action. +If the value of State is asSuspendedEnabled, then SetEnabled sets to True the Enabled property of the action and of all clients of the action. +Otherwise, SetEnabled sets to the specified Value the Enabled property of the action and propagates this Value to all clients of the action. + + + Sets the specified Value to the GroupIndex property of the action and properly handles the ON or OFF state of the Checked properties of all actions in the group specified by Value. +SetGroupIndex sets the specified Value to the GroupIndex property of the action. If the Checked property of this action is True, then SetGroupIndex sets the Checked property to False for all the other actions in the group defined by the specified Value. +When Value is greater than 0, the group of actions with the GroupIndex property having this Value forms a group of actions that act like a group of radio buttons. When the Checked property of any action in this group is True, the Checked properties of all other actions in the group are False. That is, one and only one action in the group is checked ON at a time. + +Note: All actions in a group must be listed by the same action list. + + + Sets the Help context ID for the action and action's clients. +SetHelpContext sets the new Value of the integer help context ID, stored in the HelpContext property, for the action. +SetHelpContext always propagates this Value to all clients of the action. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help in your application, you need to enable Help in your application. + + + Defines the Help keyword for the action and action's clients. +SetHelpKeyword sets the new Value of the string help keyword, stored in the HelpKeyword property, for the action. +SetHelpKeyword always propagates this Value to all clients of the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + + + Sets the HelpType property for the action and action's clients. +SetHelpType sets the new Value of the HelpType property for the action. +SetHelpType always propagates this Value to all clients of the action. + + + Sets the Hint property for the action and action's clients to a new Value. +SetHint sets the new Value of the Hint property for the action. +SetHint always propagates this Value to all clients of the action. + + + Sets the new Value of the Visible property for the action and action's clients. +SetVisible always propagates this Value to all clients of the action. + + + Sets the new Value of the ShortCut property for the action and action's clients. +SetShortCut always propagates this Value to all clients of the action. + + + Sets the new Value of the ImageIndex property for the action and action's clients. +SetImageIndex always propagates this Value to all clients of the action. + + + Sets the new Value of the StatusAction property for the action and action's clients. +SetStatusAction always propagates this Value to all clients of the action. + + + Instantiates and initializes a TContainedAction object. +Applications do not need to call Create directly. Actions are created automatically when you choose New Action in the Action List editor. +Create calls the inherited System.Classes.TBasicAction.Create constructor and then +initializes the Enabled (setting it to True), Visible (setting it to True), and ImageIndex (setting it to -1) properties. + + + Destroys the instance of the contained action. +If the action is contained in an action list or action manager, Destroy removes the action from that list. Then it calls the inherited Destroy method. + + + Returns the action list containing the action. +GetParentComponent returns the action list containing the action. This action list is stored in the ActionList property. If ActionList stores nil, then GetParentComponent calls the inherited System.Classes.TComponent.GetParentComponent method. + + + Indicates whether the action is contained in an action list. +HasParent returns True if the action is contained in an action list stored in the ActionList property. If ActionList stores nil, then HasParent calls the inherited System.Classes.TComponent.HasParent method. + + + Sets the action list containing the action. +SetParentComponent sets the specified AParent action list as the action list containing the action. This action list is stored in the ActionList property. + + + Holds the action list to which the action belongs. + + + Returns True if the action list of the action is suspended. + + + Specifies the index of the action in its action list. +Index indicates the position of the action in its action list. You can change the action's Index at design time using one of the IDE editors to handle actions. +The index of actions determines the order in which they appear in user interface elements such as menus and tool bars. +Index is zero-based. When Index is -1, this means that the ActionList property does not contain any list. + + + Indicates whether the action's clients should be disabled if no OnExecute event handler is found. +DisableIfNoHandler defines whether to set the Enabled property of the action to False if no OnExecute event handler is set for the action. Setting Enabled to False disables all the action's clients. +See, for example, how FMX.Forms.TApplication.UpdateAction uses DisableIfNoHandler to define whether to set Enabled to False if the OnExecute event handler is not defined to the action. +For example, setting DisableIfNoHandler to False can be useful when managing submenus. In this case, pointing to a command on the main menu, which causes the submenu to open, does not need any OnExecute event handler. Then, if DisableIfNoHandler is True, this main menu command becomes disabled and the submenu cannot be opened. In such cases it can be convenient to use actions of types FMX.Controls.TControlAction and Vcl.Controls.TControlAction. Objects of these classes have the value of DisableIfNoHandler set to False, by default. + + + Controls whether the Checked property toggles when the action executes. +AutoCheck causes the Checked property to toggle when the action executes. This allows the Checked property of the action to remain in sync with the Checked property of the client (or an equivalent). +If the client has an AutoCheck property of its own, the AutoCheck property of the action is propagated to the AutoCheck property of the client. + + + Represents the caption of the action. +Caption holds the string that is used as the caption of the action, when it is set. The value of Caption can be propagated to all client controls and client menu items linked to the action. + + + Indicates whether client controls and menu items appear checked. +Checked specifies the checked state for the action. The value of Checked can be propagated to all client controls and client menu items linked to the action. + +Note: If the action has a GroupIndex value greater than 0, then setting Checked to True sets to False the Checked properties of all other actions in the GroupIndex group. +Tip: Use the AutoCheck property to ensure that the action's Checked property toggles when the action executes. + + + Specifies the enabled state for the action. +The value of Enabled can be propagated to all client controls and client menu items linked to the action. + + + Indicates a group of actions in one action list. Actions in this group act like the group of radio buttons. +The value of GroupIndex is used to define groups of actions. Actions in each group act like groups of radio buttons. When GroupIndex is greater than 0, this value identifies the group to which some actions belong. The value of GroupIndex can be propagated to all client controls and client menu items linked to the action. +When the Checked property of any action in that group is set to True, the Checked properties of all other actions in the group are set to False. That is, only one action in the group can be checked at a time. + +Note: All actions in a group must be listed by the same action list. + + + Keeps the integer context ID that identifies the Help topic for the action. +HelpContext specifies the integer context ID to identify the Help topic to show when invoking Help for the action. The value of HelpContext can be propagated to all client controls and client menu items linked to the action. See also IsHelpLinked. +HelpContext is only used when htContext is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the value of the HelpContext property to invoke the online Help that shows the topic with this context ID. The target topic is uniquely identified by a HelpContext context ID value. + + + Contains the keyword string that identifies the Help topic for the action. +The value of HelpKeyword can be propagated to all client controls and client menu items linked to the action. +HelpKeyword is only used when htKeyword is selected in the HelpType property. + +Note: To use Help, you need to enable Help in your application. When your application supports usage of the appropriate Help system, then it can show Help topics from the associated Help file. When a client control has focus and the user presses the F1 key, the control uses the HelpKeyword property's value to invoke the online Help showing the topic with this keyword. + + + Keeps whether to use the HelpContext or HelpKeyword property to identify the Help topic. +The value of HelpType can be propagated to all client controls and client menu items linked to the action. +HelpType can keep one of the following constants: + +htContext � instructs to use the HelpContext property to identify the Help topic to show when invoking Help. +htKeyword � instructs to use the HelpKeyword property to identify the Help topic to show when invoking Help. + + + Stores the Help hint text. +Hint holds the hint string indicating the hint text for the action. +Hint contains the text strings that appear in a pop-up box (or in a status bar) when the user moves the mouse over screen elements. +This hint string can be propagated to clients of the action � to controls, menu items, and other GUI elements. + +Note: VCL controls support hint strings containing three parts that can be shown in separate locations (see Vcl.Controls.TControl.Hint). + + + Stores whether the action representation is visible. +Visible specifies the visible state for the action (True means visible, False means invisible). +This Visible value is propagated to a client of the action if IsVisibleLinked method of the action link linking the client to the action returns True. +If the Visible of an action is False and IsVisibleLinked of an action link returns True, then the Visible of the client (a control, menu item, or others) is also set False and this client is also invisible. Typically, IsVisibleLinked of an action link returns False if the action belongs to TCustomViewAction. Otherwise, when the action belongs to TAction, then IsVisibleLinked of an action link returns True. That is, TCustomViewAction is used when one need to provide visible representation of clients of actions that have Visible set True. + + + Shortcut that triggers the action. +The value of Shortcut can be propagated to all client controls and client menu items linked to the action. + + + Stores shortcuts (in addition to ShortCut) for triggering the action. +Actions can execute in response to multiple shortcut key combinations. SecondaryShortCuts lists all the shortcut key combinations (other than the one specified by the ShortCut property) that can trigger the action. This lets you provide additional, secondary shortcuts. +When the user types one of the key combinations listed in SecondaryShortCuts, the action's Execute method is called. + + + Stores an index in a list of images. +ImageIndex is a zero-based index in a list of images. TContainedAction does not provide the actual list of images, only implementations of actions in GUI application frameworks provide such a property. In general, this list of images contains images that are associated with controls and menu items that use this action. +The value of ImageIndex can be propagated to all client controls and client menu items linked to the action. + +Note: When ImageIndex is -1, this means that the list does not contain any images. +In typical implementations of controls, an image is drawn at the leftmost position in the control, and a control's text is drawn to the right of the image. If ImageIndex is -1, then a control does not offset the text to the right to reserve a placeholder for the image. Otherwise, if ImageIndex is not -1, then the control's text is always drawn with the offset to the right to reserve a place for drawing an image. + + + Calls the OnHint event handler. +Typically, applications do not call the DoHint method. It is called automatically when the user pauses the mouse on one of the action's client controls or menu items. DoHint is called by the action's client when the client asks to show the hint. + +DoHint checks for an OnHint event handler and passes HintStr to it, if the event handler exists. The OnHint event handler can change the specified hint string HintStr. DoHint returns True if no event handler is assigned or if OnHint returns True. DoHint can be used to determine which hint text should be shown. For example, Vcl.Controls.TControlActionLink.DoShowHint calls DoHint internally, and if DoHint returns True, then Vcl.Controls.TControlActionLink.DoShowHint appends the action's shortcut specification to the hint text to display. + + + Occurs when the mouse pauses over a client control or menu item. +Use OnHint to override the default hint that appears when the user pauses the mouse over a client control or menu item. The OnHint event handler can change the hint that appears (by changing the string stored in the client's Hint property), or display the hint in an application-specific way. + + + Stores the status for an input field in an action. +StatusAction holds the status for an input field in the action, when it is set. +The value of StatusAction can be propagated to all client controls and client menu items linked to the action. + + + Group or category where the action belongs. +IDE editors for actions group together actions that share the same category. In the VCL, if you are using an action manager, you can generate user interface elements that correspond to action categories. +Action categories group actions by similarities, usually of behavior or functionality. Standard categories are Edit, Format, Help, Windows, and others. At design time you can modify or set the Category for an action by selecting the action from the action list or object tree view, and choosing Category in the Object Inspector. + + + + + This class is designed to communicate with some of the object. + + + Auxiliary class for enumeration actions in TContainedActionList + + + The base class for list of actions, without the published properties. +Implement TContainedActionList to work with common properties for all GUI application frameworks. +Actions lists the actions maintained by the action list. +The ActionCount property returns the number of actions in the list. +OnStateChange sends a notification when the State changes. + + + Returns True if the internal list of actions of the TContainedActionList instance has been created. It returns False otherwise. +The internal list of actions is created when you create the TContainedActionList instance. + + + Raises an EActionError exception if the internal list of actions of the TContainedActionList has not been created. + + + Adds an action to the list. +Applications cannot call this protected method. AddAction is used internally to add an action to the Actions property array. +To add an action to an action list, set the action's ActionList property. + + + Removes an action from the list. +Applications cannot call this protected method. RemoveAction is used internally to remove an action from the Actions property array. RemoveAction removes the action and sets its ActionList property to nil (Delphi) or NULL (C++). +To remove an action from an action list, change the action's ActionList property. + + + Triggers the OnChange event on the action list and then on all its actions. +The internal list of actions is created when you create the TContainedActionList instance. + + + Handles notifications about the removal of one of the actions of the list. +If AComponent is an action of the list and Operation is opRemove, the action is removed from the list. + + + Sets the order in which actions are passed to a callback by the GetChildren method. +SetChildOrder specifies the order in which the component streaming system loads and saves the action components owned by this action list. It ensures that the actions are loaded and saved in the same order that they appear in the Actions property array. You should not need to call this method directly. + + + Sets the State property for the action list. +If Value is asSuspendedEnabled, then SetState also sets Enabled to True for all the actions in the action list. This is useful when designing in the Action Manager. +If the OnStateChange event handler is set, then SetState calls this event handler. + + + Occurs when a change occurs in the action list. +Write an OnChange event handler to update your application in response to changes in the action list. Changes to the action list that trigger an OnChange event include changes to an action category or to the action list's image list. + +Note: The action list automatically informs the actions in the list when an OnChange event occurs. You need only provide an OnChange event handler for application-specific responses. +OnChange is an event handler of type TNotifyEvent. + + + Occurs when a client object triggers an action in the list. +Write an OnExecute event handler to respond when an action in the list fires. +When the user invokes a client object, the action list�s OnExecute event is the first event to occur in response. If the OnExecute event handler sets its Handled parameter to True, the action is considered handled, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class in response to the user action. +If the OnExecute event handler does not set its Handled parameter to True, the application�s OnActionExecute event occurs next. If the OnActionExecute event does not respond to the user input, the action object�s OnExecute event occurs. Finally, if the action does not have an OnExecute event handler, the application locates a target object and executes any predefined response implemented by the action object. + + + Occurs when the application is idle so that the action list can update a specific action in the list. +Write an OnUpdate event handler to configure the properties of a specified action in the list so that it reflects current conditions. +When the application is idle, it cycles through every action in turn, giving it a chance to update itself to reflect current conditions. For each action, the first event to occur in this sequence is the action list's OnUpdate event. If the OnUpdate event handler sets its Handled parameter to True, the action is considered updated, and processing stops there. This blocks the execution of any other event handlers or any built-in response by a predefined action class. +If the OnUpdate event handler does not set its Handled parameter to True, the application's OnActionUpdate event occurs next. If the OnActionUpdate event does not update the action, the action object's OnUpdate event occurs. Finally, if the action does not have an OnUpdate event handler, the application executes any predefined update method implemented by the action object. + + + Returns True if the Source and Dest categories are the same. If IncludeSubCategory is True, this function also returns true if Dest is a subcategory of Source. +These are some examples of calls to this function: + + + +Source + +Dest + +IncludeSubCategory + +Result + + +File + +File + +True + +True + + +File.Recent + +File + +True + +False + + +File + +File.Recent + +True + +True + + +File + +File + +False + +True + + +File.Recent + +File + +False + +False + + +File + +File.Recent + +False + +False + + + Creates an instance of TContainedActionList. +This creator is inherited from TComponent, see TComponent.Create for more information. + + + Destroys an instance of TContainedActionList. +This destructor is inherited from TComponent, see TComponent.Destroy for more information. + + + Generates an OnExecute event. +Typically, applications do not call the ExecuteAction method. Instead, the action indicated by the Action parameter calls ExecuteAction in response to a user command. It is possible, however, to call ExecuteAction to generate an OnExecute event even though no client control has been triggered. +ExecuteAction invokes the OnExecute event handler for the action list. It returns True if the event handler handles the action, False otherwise. + + + Calls a specified method for each child action of the action list. +GetChildren is used by the component streaming system. For each action in the action list, GetChildren calls the method passed in Proc. The actions are passed to the callback in the order that they are loaded or saved by the component streaming system. + + + Returns a TContainedActionList enumerator, a TActionListEnumerator reference that enumerates the actions in the list. +To process all actions, read Current from the enumerator within a �while MoveNext do� loop. + + + Generates an OnUpdate event. +Typically, applications do not call the UpdateAction method. Instead, the action indicated by the Action parameter calls UpdateAction when informed by the application that it can update itself. It is possible, however, to call UpdateAction to generate an OnUpdate event even though this has not been initiated by the application. +UpdateAction invokes the OnUpdate event handler for the action list. It returns True if the event handler updates the action, False otherwise. + + + Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + Calls the specified procedure (TEnumActionListEvent or TEnumActionListRef) once for every action of the list in the specified category. +IncludeSubCategory determines whether actions in subcategories are included (True) or not (False) in the loop of calls. +Proc, an instance of either TEnumActionListEvent or TEnumActionListRef, can set its Done argument to True to stop the loop of calls prematurely. + + + Indicates the number of actions in the action list. +ActionCount indicates how many actions are contained in the action list. + + + Indicates whether the actions in the action list respond when the user triggers a client object. +State can be one of the constants defined in the TActionListState type: +asNormal, asSuspended, and asSuspendedEnabled. + + + Occurs after the State property's value is changed. +Write an OnStateChange event handler to respond after the State property's value is changed. + + + + + TCustomGrid is the base type for all components that present information in a two-dimensional grid. +Use TCustomGrid as a base class when defining components that represent information in a tabular format. TCustomGrid introduces properties and methods to control the appearance and behavior of the grid, including responses to mouse actions and user editing. +Do not create instances of TCustomGrid. Instead, put a grid control in a form by instantiating a descendant of TCustomGrid. Use TDrawGrid to represent non-textual material in a tabular grid. For text, use a TStringGrid object. If the text represents field values from a dataset, use TDBGrid. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Calculates the pixel locations of the grid boundaries. +Use CalcDrawInfo to determine the pixel locations of the major grid boundaries in the X and Y directions, including things like the first visible column/row, the last visible column/row, the pixel extent of the fixed column/row, etc. + + + Calculates the pixel locations of the fixed cells. +Use CalcDrawInfo to determine the pixel locations of the fixed cells in the X and Y directions. + + + Determines the appearance of the mouse cursor during resizing. +Use CalcSizingState to determine if the mouse cursor should be changed to a resize or drag cursor based on where the mouse is in the grid. For example, cursor over a grid line, in the fixed cell region, and column resize is enabled = resize cursor. + + + Embarcadero Technologies does not currently have any additional information. + + + Prepares the grid's canvas for painting to reflect a right-to-left or left-to-right orientation. +TCustomGrid uses ChangeGridOrientation internally when painting. ChangeGridOrientation sets the origin and dimensions of the grid's canvas so that painting occurs from right-to-left or from left-to-right based on the value of the RightToLeftOrientation parameter. +RightToLeftOrientation is true if the grid should prepare for painting from right to left. RightToLeftOrientation is false if the grid should restore the canvas to normal. + + + Creates the inplace editor control. +Grid controls call CreateEditor internally the first time the grid goes into edit mode. CreateEditor is exposed as a protected method so that descendants of TCustomGrid can substitute a specialized descendant of TInplaceEdit to handle cell editing. + + + Initializes the window-creation parameter record. +The CreateWnd method is called internally to specify the properties of the window that implements this control. These properties are set in the window-creation parameter record passed as Params. The fields of this record become the parameters to a call to the CreateWindowEx API function. +After calling the inherited method, CreateParams adjusts the value of Params to request that the grid receive double click messages, and to implement the values of the ScrollBars and BorderStyle properties. + + + CreateWnd is used in control initialization. +The CreateWnd method is called internally to specify the properties of the window that implements this control. As implemented in TCustomGrid, CreateWnd makes sure that the grid can use the themes before continuing with the other initializations. + + + Processes the unhandled gesturing events. +Vcl.Grids.TCustomGrid.DoGesture inherits from Vcl.Controls.TControl.DoGesture. All content below this line refers to Vcl.Controls.TControl.DoGesture. +Processes the unhandled gesturing events. +DoGesture is run automatically for all gesturing events that were not handled by the user. DoGesture is run only if OnGesture is not set or if it did not handle the gesture event. +Override DoGesture in descending classes to support default behavior for gesture events that were not handled by the user. In TControl, the DoGesture method simply returns and does no special processing. + + + Provides special processing when the user presses a key. +After generating an OnKeyDown event, KeyDown calls CanGridAcceptKey to screen out problematic key combinations. KeyDown moves to the appropriate cell in response to navigational key combinations, or sets the EditorMode property to true when the user presses F2. + + + Provides special processing when the user presses a key. +KeyPress is called automatically after the KeyDown method, but before the user releases the key. +After generating an OnKeyPress event, KeyPress toggles the EditorMode property when the user presses the Enter key. + + + Provides special processing when the user presses a mouse button. +MouseDown hides the editor window so that it can move selection to the cell that receives the mouse click. If the mouse lands in the hot region for beginning a move or resize of a row or column, MouseDown starts the move or resize, and provides visual feedback by changing the cursor. If the editor window was hidden, it is brought back up in its new location. Finally, MouseDown generates an OnMouseDown event. + + + Provides special processing when the user moves the mouse. +If the grid is in the middle of moving or resizing a row or column, or in the middle of selecting a range of cells using the mouse, MouseMove calculates the changes implied by the mouse move and provides visual feedback to the user. Finally, MouseMove generates an OnMouseMove event. + + + Provides special processing when the user releases the mouse button. +MouseUp finishes a move or resize operation on a row or column, or if the user is selecting a range of cells using the mouse, MouseUp finishes the select operation. Finally, MouseUp generates an OnMouseUp event. + + + Adds or deletes rows or columns from the grid. +Grid components call AdjustSize internally to fix up the number of rows or columns when the user resizes them using the mouse. Index is the index of the row or column where the insertion or deletion should begin. Amount is the number of rows or columns to insert (Amount > 0) or delete (Amount < 0). Rows is a boolean that indicates whether the rows or the columns are changing. + + + Returns the screen coordinates of a specified set of cells. +Call BoxRect to obtain the screen coordinates, in pixels, of the cells that run from the column with index ALeft to the column with index ARight and the row with index ATop to the row with index ABottom. The coordinates of cells that are not visible onscreen are not included in the final rectangle. + + + Hides the inplace editor when selection moves to another control in a form. +After calling the inherited method, which generates an OnExit event, DoExit hides the inplace editor unless the Options property includes goAlwaysShowEditor. + + + Embarcadero Technologies does not currently have any additional information. + + + Returns the screen coordinates of a cell in the grid. +Call CellRect to obtain the boundaries, in pixels, of the cell in the column and row indicated by the ACol and ARow parameters. The top left cell is specified when ACol and ARow are set to zero. +If the indicated cell is not visible, CellRect returns an empty rectangle. + + + Indicates whether the Key parameter can be entered into the current cell. +CanEditAcceptKey provides a simple screening of keyboard input while the user is editing the contents of a cell. The CanEditAcceptKey method for TCustomGrid always returns true. Descendants of TCustomGrid override this method to screen out illegal characters. +More refined validation can be obtained by using an edit mask. + + + Indicates whether the grid should respond to a given key combination. +Grid controls call CanGridAcceptKey internally to screen key combinations when the user first presses a key. The CanGridAcceptKey method for TCustomGrid always returns true. Descendants of TCustomGrid override this method to screen out irrelevant key combinations, or key combinations that indicate actions that would violate the Options or mode of the grid. + + + Indicates whether the current cell in the grid can be edited. +Grid components use CanEditModify internally to determine whether to allow the user to edit the current cell. CanEditModify returns true unless the inplace editor has disallowed editing for the cell. + + + Indicates whether the inplace edit control can be created to allow editing. +Grid controls call CanEditShow internally before creating the editor for a cell. CanEditShow is called after the grid has determined that the field can be edited by calling CanEditModify. +CanEditShow returns false if the Options property does not indicate that the grid allows editing, or if it indicates that the grid permits row selection. Otherwise, if the Options property indicates that the grid is locked in edit mode, or if the grid has input focus, CanEditShow returns true. If the grid is not locked in edit mode and the grid does not have input focus, CanEditShow returns false. + + + Resize and reposition children and self. +Vcl.Grids.TCustomGrid.ChangeScale inherits from Vcl.Controls.TWinControl.ChangeScale. All content below this line refers to Vcl.Controls.TWinControl.ChangeScale. +Resize and reposition children and self. +ChangeScale rescales the control in the same manner as the ChangeScale method in TControl. If the control contains any children, their ChangeScale methods are called before the parent itself is rescaled. +To rescale the control's children without rescaling the control itself, use ScaleControls. To rescale the control without repositioning, use ScaleBy. + + + Performs tasks when the mouse wheel is rotated downward. +Override DoMouseWheelDown to perform tasks when the mouse wheel is rotated downward. +DoMouseWheelDown returns false if the control's parent should handle the message. +In TCustomGrid, DoMouseWheelDown increments the current row and returns true. + + + Performs tasks when the mouse wheel is rotated upward. +Override DoMouseWheelUp to perform tasks when the mouse wheel is rotated downward. +DoMouseWheelUp should return false if the control's parent should handle the message. +In TCustomGrid, DoMouseWheelUp decrements the current row and returns true. + + + Triggers the OnFixedCellClick event. +FixedCellClick is called whenever the user clicks in a fixed cell. Descending classes can override FixedCellClick to support custom processing for this event. As defined in TCustomGrid, FixedCellClick simply triggers the OnFixedCellClick event. +OnFixedCellClick is only triggered if the Options property includes either goFixedRowClick or goFixedColClick, or both. Also, at least one fixed column or row must me defined. + + + Changes the current cell to a specified cell. +TCustomGrid calls FocusCell internally to change the currently selected cell. FocusCell changes the current cell and updates the selection appropriately. +ACol is the column of the cell to select. +ARow is the row of the cell to select. +MoveAnchor determines how the selection changes. If the grid does not allow multiple cells to be selected (Options does not include goRangeSelect), MoveAnchor is ignored and the specified cell becomes the selected cell. If the grid allows multiple cells to be selected, MoveAnchor determines whether the new cell becomes the starting cell (anchor) of a new selection, or whether the current selection is updated to range from the current anchor to the specified cell. + + + Returns the value of the indicated cell formatted for editing. +The inplace editor calls GetEditText to obtain the text for the indicated cell. GetEditText returns an empty string. Descendants of TCustomGrid override the GetEditText method to return a string that represents the contents of the cell indicated by the ACol and ARow parameters. + + + Provides the interface for a method that updates the text associated with a cell. +SetEditText is called by the inplace editor so that the grid can store the new value for the current cell. The SetEditText method for TCustomGrid does nothing. Descendants of TCustomGrid override this method to update an internal representation of the cell's value or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnSetEditText. + + + Provides the interface for a method that limits the number of characters the user can type into cells. +The inplace editor calls GetEditLimit to determine if a limit should be placed on the number of characters a user can type into a cell. GetEditLimit sets no limits. Descendants of TCustomGrid override this method to limit the text for certain cells. + + + Provides the interface for a method that returns an input mask for the specified cell. +The inplace editor calls GetEditMask to obtain any input mask associated with the cell specified by the ACol and ARow parameters. GetEditMask returns an empty string, indicating that the cell has no input mask. Descendants of TCustomGrid override this method to provide an input mask or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnGetEditMask. + + + Indicates whether a specified cell has an ellipsis button or drop-down arrow. +GetEditStyle indicates whether the specified cell can only be edited directly (esSimple), whether it has an ellipsis button that users can click to launch an editor for modifying field values (esEllipsis ), or whether it has a drop-down arrow that users can click to display a pick list of possible values (esPickList). +ACol is the column that contains the cell. ARow is the row that contains the cell. +In TCustomGrid, GetEditStyle always returns esSimple, indicating that there is no ellipsis button or drop-down arrow. Descendant classes can override this methods if they provide a way to add pick lists or ellipsis buttons to cells. + + + Returns the value of the GridWidth property. +GetGridWidth is the protected property access method for the GridWidth property. It computes the value of the GridWidth property based on the column widths, separator width, and the size of the control. + + + Returns the value of the GridHeight property. +GetGridHeight is the protected property access method for the GridHeight property. It computes the value of the GridHeight property based on the row heights, separator width, and the size of the control. + + + Hides the inplace editor. +The HideEditor method calls the protected HideEdit method to hide the editor. This method hides the editor window after updating the text to reflect the text in the editor. + + + Hides the inplace editor when it is not in use. +Grid controls call HideEditor when the grid goes out of edit mode. HideEditor hides the window of the inplace editor. + + + Displays the inplace editor when the grid enters edit mode. +Grid controls call ShowEditor when the grid enters edit mode. ShowEditor displays the window of the inplace editor over the currently selected cell. If the inplace editor does not yet exist, ShowEditor creates it. + + + Displays the inplace editor, with its text set to the specified character. +Grid controls call ShowEditorChar when the user types a character into a cell and the editor is not already showing. ShowEditorChar displays the window of the inplace editor over the currently selected cell, and sets its text property to the character Ch. If the inplace editor does not yet exist, ShowEditorChar creates it. + + + Causes the inplace editor to repaint itself, moving to a new location if necessary. +InvalidateEditor is called when the selected cell changes while the grid is in edit mode. + + + Tells Windows to repaint the grid after other important Windows messages are handled. +InvalidateGrid is used internally to ensure that the grid is repainted when its properties change. It calls the Invalidate method to indicate that the grid needs repainting. + + + Moves a column to a new position. +Call MoveColumn to move the column identified by the FromIndex parameter to the position specified by the ToIndex parameter. + + + Provides the interface for a method that responds when the position of a column changes. +ColumnMoved is called immediately after a column in the grid has moved. +The FromIndex parameter is the old index of the column, +The ToIndex parameter is the new index. +The ColumnMoved method of TCustomGrid does nothing. Descendants of TCustomGrid override this method to make internal adjustments or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnColumnMoved. + + + Moves a row to a new position. +Call MoveRow to move the row identified by the FromIndex parameter to the position specified by the ToIndex parameter. + + + Provides the interface for a method that responds when the position of a row changes. +RowMoved is called immediately after a row in the grid changes position. +The FromIndex parameter is the old index of the row, and the ToIndex parameter is the new index. +The RowMoved method of TCustomGrid does nothing. Descendants of TCustomGrid override this method to make internal adjustments or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnRowMoved. + + + Embarcadero Technologies does not currently have any additional information. + + + Provides the prototype for a method that draws the contents of a cell in the grid. +Descendants of TCustomGrid implement the DrawCell method to draw the contents of the cell. If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the 3D effects of the fixed cells or the focus rectangle around the focused cell are drawn after DrawCell. +The ACol and ARow parameters give the column and row indexes of the cell that should be drawn. +The ARect parameter gives the boundaries of the cell in the coordinates of the canvas. +The AState parameter indicates whether the cell is selected, whether the cell has input focus, and whether the cell is in the fixed, non-scrolling portion of the grid. + + + Draws the background of a cell in the grid. +DrawCellBackground draws the background of a cell. Descendants of TCustomGrid can override the DrawCellBackground method to supply custom drawing techniques. +If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the three-dimensional effects of the fixed cells or the focus rectangle around the focused cell is drawn after DrawCell. +The ACol and ARow parameters give the column and row indexes of the cell that should be drawn. The ARect parameter gives the boundaries of the cell in the coordinates of the canvas. The AState parameter indicates whether the cell is selected, has input focus, or is in the fixed, nonscrolling portion of the grid. + + + Draws the background of a highlighted cell in the grid. +DrawCellHighlight draws the background of a highlighted cell. Descendants of TCustomGrid can override the DrawCellHighlight method to implement custom drawing techniques. +If the DefaultDrawing property is true, the background of the highlighted cell is painted before DrawCell is called, and the three-dimensional effects of the fixed cells or the focus rectangle around the focused cell is drawn after DrawCellHighlight. +The ACol and ARow parameters give the column and row indexes of the cell that should be drawn. The ARect parameter gives the boundaries of the cell in the coordinates of the canvas. The AState parameter indicates whether the cell is selected, has input focus or is in the fixed, nonscrolling portion of the grid. + + + Adds the ColWidths and RowHeights properties to the values saved with the grid. +DefineProperties overrides the inherited method to save the ColWidths and RowHeights properties with the grid when they contain values other than the default widths and heights. + + + Selects the cell indicated by the ACol and ARow parameters. +Grid controls call MoveColRow internally when changing the selected cell or cells. MoveColRow selects the indicated cell, but does not take care of removing any previous selection. +The ACol and ARow parameters are the column index and the row index of the cell to be selected. The MoveAnchor parameter indicates whether the new cell becomes the upper left corner of the selected region. MoveAnchor is true unless MoveColRow is called when extending a multicell selected region. The Show parameter indicates whether MoveColRow should ensure that the newly selected cell is visible. + + + Determines whether a particular cell in the grid can be selected. +Grid controls call SelectCell internally before attempting to move selection to a the cell identified by the ACol and ARow parameters. ACol and ARow are the column and row indexes for the cell, where the first column has index 0, and the top row has index 0. +The SelectCell method for TCustomGrid always returns true, allowing the cell to be selected. Descendants of TCustomGrid override this method to check the properties of the information displayed in the cell or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnSelectCell. + + + Responds to changes in the size of the grid. +SizeChanged provides the interface for a method that responds to changes in the number of rows or columns in the grid. The SizeChanged method of TCustomGrid does nothing. Descendants of TCustomGrid override this method to make internal adjustments or generate events. + + + Indicates whether the indicated coordinates are on one of the resize hot zones of the graph. +Grid controls call Sizing internally with the coordinates of a mouse click to determine whether the user is about to resize a row or column. + + + Scrolls the visual image of the cells in the grid. +Grid controls call ScrollData internally when the nonfixed rows or columns scroll. ScrollData updates the image of the grid. + + + Embarcadero Technologies does not currently have any additional information. + + + Invalidates the region occupied by a cell so that it will be repainted with the next Windows paint message. +Call InvalidateCell when the contents of a cell change so that the cell will need to be repainted. The ACol parameter is the column index of the cell, and the ARow parameter is the row index. + + + Invalidates the region occupied by a column so that it will be repainted with the next Windows paint message. +Call InvalidateCol when a column changes so that the area it occupies will need to be repainted. The ACol parameter is the column index. + + + Invalidates the region occupied by a row so that it will be repainted with the next Windows paint message. +Call InvalidateRow when a row changes so that the area it occupies will need to be repainted. The ARow parameter is the row index. + + + Checks whether the associated touch manager stored any of the given options. +Vcl.Grids.TCustomGrid.IsTouchPropertyStored inherits from Vcl.Controls.TControl.IsTouchPropertyStored. All content below this line refers to Vcl.Controls.TControl.IsTouchPropertyStored. +Checks whether the associated touch manager stored any of the given options. +IsTouchPropertyStored is used internally by the VCL framework to check whether the associated touch manager component has stored the given options. Do not call IsTouchPropertyStored directly. IsTouchPropertyStored is used primarily to ensure that controls that do not require gesturing are not storing useless data in the DFMs or executables. + + + Updates the position of the inplace editor when the grid scrolls. +Grid controls call TopLeftChanged internally, whenever the LeftCol or TopRow property changes. +Descendants of TCustomGrid override this method to make additional adjustments or to generate an event, such as Vcl.Grids.TCustomDrawGrid.OnTopLeftChanged. + + + Extends a move, resize, or selection out of the scrollable region when the user drags the mouse in a direction where the grid is scrolled. +TimedScroll is called periodically as the user continues to drag with the mouse outside of the scrollable cells in the grid. TimedScroll does nothing unless the user is moving a row or column, resizing a row or column, or selecting a multiple cell region using the mouse. TimedScroll scrolls the cells in the grid to allow the operation to continue into the portion of the grid that was hidden due to scrolling. + + + Draws the image of the grid control on the screen. +Paint is called when the grid receives a paint message. Paint draws the grid, calling the DrawCell method when it is time to paint the contents of each cell. If DefaultDrawing is false, Paint does not draw the background of the cells, provide the raised 3D effects on the fixed cells, or draw the focus rectangle around the selected cell when it has focus. + + + Responds when the column widths change. +ColWidthsChanged is called immediately after the column widths change. The change can result from setting the ColWidths property, from setting the DefaultColWidth property, from moving one of the columns, or from resizing the columns with the mouse. +ColWidthsChanged adjusts the scroll bar and the position of the inplace editor to take into account the new column size and positions of the columns. + + + Responds when the row heights change. +RowHeightsChanged is called immediately after the row heights change. The change can result from setting the RowHeights property, from setting the DefaultRowHeight property, from moving one of the rows, or from resizing the rows with the mouse. +RowHeightsChanged adjusts the scroll bar and the position of the inplace editor to take into account the new row size and positions of the rows. + + + Deletes a specified column from the grid. +Call DeleteColumn to remove a column from the middle of the grid. Provide the index of the column to remove as ACol. To remove the last column from the grid, set the ColCount property instead. + + + Deletes a specified from the grid. +Call DeleteRow to remove a row from the middle of the grid. Provide the index of the row to remove as ARow. To remove the last row from the grid, set the RowCount property instead. + + + Notifies the designer when rows and columns of the grid are moved or resized. +At design time, the designer automatically keeps track of property changes so that it can prompt the user to save any changes. Moving or resizing the rows and columns of the grid using the mouse bypasses this system. When such changes occur, UpdateDesigner notifies the designer that the properties of the grid have changed and that the changes should be saved. + + + Starts the dragging of a column in the grid. +BeginColumnDrag is called automatically when the user clicks on a column to start dragging. It enables the grid to control whether the column can be repositioned and if so, which column. +Origin is the index of the column to be moved. When BeginColumnDrag is called, this is the index of the column in which the mouse was clicked. TCustomGrid does not change this value. However, descendant classes can override this method to adjust which column can be moved. +Destination is the index of where the column should move. When BeginColumnDrag is called, this is the same as Origin. TCustomGrid does not change this value because the mouse has not yet moved. Descendant classes can override this method to adjust the default destination of the column. +MousePt is the coordinates of the mouse button when the user clicked. +BeginColumnDrag returns true if the drag operation is permitted, false if the drag should be disallowed. + + + Starts the dragging of a row in the grid. +Call BeginRowDrag to start a drag operation. BeginRowDrag enables the grid to control where the row can be dropped. It is exposed as a protected method so that descendants of TCustomGrid can customize row dragging in a grid. + + + CheckColumnDrag validates whether the column currently selected for dragging can be dropped at the current location. +Use CheckColumnDrag to validate that the column currently selected for dragging can be dropped at the current location. CheckColumnDrag can change the Origin (the column being dragged) and/or the Destination (the drop target), as needed, to keep the grid's columns in order. + + + CheckRowDrag validates whether the row currently selected for dragging can be dropped at the current location. +Use CheckRowDrag to validate that the row currently selected for dragging can be dropped at the current location. CheckRowDrag can change the Origin (the row being dragged) and/or the Destination (the drop target), as needed, to keep the grid's rows in order. + + + Ends the dragging of a column in the grid. +Call EndColumnDrag to end a drag operation. EndColumnDrag enables the grid to control where the column can be dropped. It is exposed as a protected method so that descendants of TCustomGrid can customize column dragging in a grid. + + + Ends the dragging of a row in the grid. +Call EndRowDrag to end a drag operation. EndRowDrag enables the grid to control where the row can be dropped. It is exposed as a protected method so that descendants of TCustomGrid can customize row dragging in a grid. + + + Determines whether a single line border is drawn around the grid. +Set BorderStyle to bsSingle to add a single line border around the grid's image. Set BorderStyle to bsNone to omit the border. + + + Specifies the index of the column that contains the selected cell. +Use Col at runtime to determine the current column in the grid. Setting Col moves focus to the cell in the current row that is in the new column. The first column has an index of 0, the second column an index of 1, and so on. +The selected cell in the grid can be located by reading the Col property and the Row property to obtain the indexes of its column and row. When focus moves to the grid, the selected cell gets input focus. + + + Specifies the background color of the control. +Use Color to read or change the background color of the control. +If a control's Vcl.Controls.TControl.ParentColor property is True, then changing the Color property of the control's parent automatically changes the Color property of the control. When the value of the Color property is changed, the control's ParentColor property is automatically set to False. +The Color of a TLabel is always the color of the background unless you set TLabel.Transparent to False. + + + Specifies the number of columns in the grid. +Read ColCount to determine the number entries in the ColWidths array. Set ColCount to add or delete columns at the right side of the grid. The value of ColCount includes any fixed columns at the left of the grid as well as the scrollable columns in the body of the grid. + + + Determines the width (in pixels) of all columns that have not been explicitly resized. +Set DefaultColWidth to change the size of all columns in the grid. When DefaultColWidth is set, columns that have been resized using the mouse or by setting the ColWidths property are given the DefaultColWidth as well. +When new columns are added to the grid using the ColCount property, they are created with a width of DefaultColWidth. + + + DefaultColAlignment is the default text alignment for all columns where alignment is not explicitly specified using TCustomGrid.ColAlignments. + + + Determines whether the Cells are painted when the grid is drawn. +Set DefaultDrawing to true to have the grid automatically paint the cells in the grid, including adding the background color, the 3-D effects on the fixed cells, and the focus rectangle around the selected cell. Set DefaultDrawing to false to skip the painting of the cells when the grid is drawn. +When DefaultDrawing is false, the cells should be painted using the DrawCell method. For TCustomGrid, DrawCell is an abstract method. Descendants of TCustomGrid use DrawCell to provide their own customized drawing code, or to generate an OnDrawCell event. + + + Specifies the height (in pixels) of all rows that have not been explicitly resized. +Set DefaultRowHeight to change the size of all rows in the grid. When DefaultRowHeight is set, rows that have been resized using the mouse or by setting the RowHeights property are given the DefaultRowHeight as well. +When new rows are added to the grid using the RowCount property, they are created with a height of DefaultRowHeight. + + + Determines the style used when drawing the grid. +DrawingStyle determines the style used to draw the grid. The following table lists the possible values of DrawingStyle. + + + + +Value + +Meaning + + + +gdsClassic + + + +The grid control uses the standard, unthemed style. + + + + +gdsThemed + + + +The grid control uses the current operating system theme. + + + + +gdsGradient + + + +The grid control uses gradients for styling. + + + + +Notes about DrawingStyle for Vcl.Grids.TStringGrid: +Setting FixedColor has no effect unless you also set DrawingStyle to gdsClassic. +Setting GradientStartColor and GradientEndColor has no effect unless you set the value of DrawingStyle to gdsGradient. + + + Determines whether the current cell can be edited. +Set EditorMode to true, at runtime, to put the grid in edit mode. When EditorMode is true, the user can edit cells in the grid. When the user presses F2, EditorMode is set to true. When the user presses Enter, the value of EditorMode is toggled. + +Note: EditorMode has no effect if the Options property does not include goEditing or if the Options property includes goAlwaysShowEditor. + + + Specifies the background color of the fixed rows and columns in the grid. +Set FixedColor to specify the color for the nonscrolling cells in the grid. The scrolling region of the grid is drawn using the Color property. + + + Specifies the number of columns on the left of the grid that cannot be scrolled. +Set FixedCols to create or get rid of nonscrolling columns. Nonscrolling columns appear at the left of the grid, and are always visible, even when the user scrolls the other columns in the grid. Use nonscrolling columns for displaying row titles or row numbers, or to implement a scroll lock that the user can set. +Nonscrolling columns are visually distinct from the scrollable columns in the grid. They are painted with a separate background color, and their cells have a raised, 3-D look. + +Note: Grids must include at least one scrolling column. Do not set FixedCols to a value greater than ColCount - 1. + + + Specifies the number of rows on the top of the grid that cannot be scrolled. +Set FixedRows to create or get rid of nonscrolling rows. Nonscrolling rows appear at the top of the grid, and are always visible, even when the user scrolls the other rows in the grid. Use nonscrolling rows for displaying column titles or column numbers. +Nonscrolling rows are visually distinct from the scrollable rows in the grid. They are painted with a separate background color, and their cells have a raised, 3-D look. + +Note: Grids must include at least one scrolling row. Do not set FixedRows to a value greater than RowCount - 1. + + + Determines the ending gradient color. +GradientEndColor determines the ending gradient color. GradientEndColor is used when the value of DrawingStyle is gdsGradient. GradientEndColor and GradientStartColor define the color range used when drawing individual cells within the grid control. + + + Determines the starting gradient color. +GradientStartColor determines the starting gradient color. GradientStartColor is used when the value of DrawingStyle is gdsGradient. GradientEndColor and GradientStartColor define a color range used when drawing individual cells within the grid control. + + + Specifies the height of the grid in pixels. +Read GridHeight to determine the size of the grid. If GridHeight is less than the value of ClientHeight, all of the rows of the grid appear in the control with an empty region below the grid. If the underlying grid is too tall to appear in the control, GridHeight is the same as ClientHeight, and the user must scroll to see the entire contents of the grid. + + + Specifies the width (in pixels) of the lines that separate the cells of the grid. +Set GridLineWidth to make the lines that separate the cells in the grid heavier or lighter. When GridLineWidth is zero, no separators are drawn between the cells of the grid. +GridLineWidth will have no effect if the Options property does not include goFixedHorzLine, goFixedVertLine, goHorzLine, or goVertLine. + +Note: Values greater than 3 pixels are not recommended for applications that run on Windows 9x or Windows ME because of distortions that can appear. + + + Specifies the width of the grid in pixels. +Read GridWidth to determine the size of the grid. If GridWidth is less than the value of ClientWidth, all of the columns of the grid appear in the control with an empty region to the right of the grid. If the underlying grid is too wide to appear in the control, GridWidth is the same as ClientWidth, and the user must scroll to see the entire contents of the grid. + + + Indicates the current position of the mouse cursor. +Read HitTest to determine the position of the mouse when it is over the grid or when the grid has captured the mouse. HitTest may represent a position that is not within the client area of the grid control if the user is moving or resizing the rows or columns, or if the user is selecting a range of cells using the mouse. HitTest is the position of the mouse cursor in the coordinate system where (0,0) is the upper left corner of the grid control's client area. + + + Designates the edit control the grid uses to allow users to edit the contents of the selected cell. +Read InplaceEditor to gain direct access to the edit control that sits on top of the selected cell when the grid is in edit mode. The inplace editor is created the first time the grid is put in edit mode. It is not destroyed until the grid is destroyed. The grid moves the editor when the selected cell changes. The grid hides the editor's window when the grid goes out of edit mode. + + + Specifies the index of the first visible scrollable column in the grid. +Read LeftCol to determine the index of the first column in the scrollable region that is visible. Set LeftCol to scroll the columns in the grid so that the column with index LeftCol is the first column after the fixed columns. + + + Specifies various display and behavioral properties of the grid. +Set Options to include the desired properties for the grid. See the type Vcl.Grids.TGridOptions for definitions of these properties. + + + Specifies where a control looks for its color information. +To have a control use the same color as its parent control, set ParentColor to True. If ParentColor is False, the control uses its own Color property. +Set ParentColor to True for all controls to ensure that all the controls on a form have a uniform appearance. For example, if ParentColor is True for all controls in a form, changing the background color of the form to gray causes all the controls on the form to also have a gray background. +When the value of a control's Color property changes, ParentColor becomes False automatically. + + + Specifies the index of the row that contains the selected cell. +Use Row at runtime to determine the current row in the grid. Setting Row moves focus to the cell in the current column that is in the new row. The first row has an index of 0, the second row an index of 1, and so on. +The selected cell in the grid can be located by reading the Row property and the Col property to obtain the indexes of its row and column. When focus moves to the grid, the selected cell gets input focus. + + + Specifies the number of rows in the grid. +Read RowCount to determine the number of entries in the RowHeights array. Set RowCount to add or delete rows at the bottom of the grid. The value of RowCount includes any fixed rows at the top of the grid as well as the scrollable rows in the body of the grid. + + + Specifies whether the grid includes horizontal and vertical scroll bars. +Use ScrollBars to give the grid horizontal or vertical scroll bars. + +Note: If all the cells in the grid fit in the ClientWidth, no horizontal scroll bar appears, even if ScrollBars is ssHorizontal or ssBoth. If all the cells fit in the ClientHeight, no vertical scroll bar appears, even if ScrollBars is ssVertical or ssBoth. + + + Indicates the boundaries of the current selection. +Set Selection to select a range of cells in the grid. Selection can either represent the first column, first row, last column and last row in the grid, or the row and column coordinates of the upper left and bottom right cells in the selected region. +Selection can only indicate more than one cell when Options includes goRangeSelect. + + + Specifies the index of the first visible scrollable row in the grid. +Read TopRow to determine the index of the first row in the scrollable region that is visible. Set TopRow to scroll the rows in the grid so that the row with index TopRow is the first row after the fixed rows. + + + Indicates the number of scrollable columns visible in the grid. +Use VisibleColCount to determine the number of scrollable columns fully visible in the grid. VisibleColCount does not include the fixed columns counted by the FixedCols property. It does not include any partially visible columns on the right edge of the grid. + + + Indicates the number of scrollable rows visible in the grid. +Use VisibleRowCount to determine the number of scrollable rows fully visible in the grid. VisibleRowCount does not include the fixed rows counted by the FixedRows property. It does not include any partially visible rows on the bottom of the grid. + + + Determines the event triggered when a user clicks in a fixed cell. +Write an event handler for OnFixedCellClick to supply custom logic to your application in response to a user clicking in a fixed cell. OnFixedCellClick is only triggered if the Options property includes either the goFixedColClick or goFixedRowClick option, or both options. +OnFixedCellClick can be useful when implementing sorting on columns. By clicking in a fixed cell, the applied sorting rule can be reversed. + + + Creates an instance of TCustomGrid. +Call Create to create a grid control at runtime. Grid controls placed on a form at design time are created automatically. +Owner is a component that is responsible for freeing the grid and for initiating the streaming process when it is saved to a form file. + + + Destroys an instance of TCustomGrid. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the grid reference is not nil, and only then calls Destroy. + + + Returns the row and column indexes of the cell that contains a point specified in screen coordinates. +Call MouseCoord to locate the column and row of the cell which contains a given screen coordinate. Usually, MouseCoord is used to locate the cell that is under the mouse. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + Embarcadero Technologies does not currently have any additional information. + + + + + TCustomDrawGrid is the base class for grids that publish events for painting and manipulating the cells in the grid. +Use TCustomDrawGrid as a base class when defining grid components that publish events for painting or manipulating the cells in the grid. TCustomDrawGrid introduces a number of events and methods that take advantage of the tabular organization of the grid in responding to user actions. +Do not create instances of TCustomDrawGrid. Instead, put a grid control in a form by instantiating a descendant of TCustomDrawGrid. Use TDrawGrid to represent non-textual material in a tabular grid. For text, use a TStringGrid object. If the text represents field values from a dataset, use TDBGrid. If you are displaying Name/Value pairs, use TValueListEditor. + + + Generates an OnColumnMoved event. +ColumnMoved is called immediately after a column in the grid has moved. It overrides the inherited method to generate an OnColumnMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnColumnMoved event. + + + Generates an OnDrawCell event. +DrawCell is called automatically whenever a cell in the grid is drawn. If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the 3D effects of the fixed cells or the focus rectangle around the focused cell are drawn after DrawCell. Descendants of TCustomDrawGrid can override this method to draw the contents of the cell or to block the OnDrawCell event. + + + Generates an OnGetEditMask event. +The inplace editor calls GetEditMask to obtain any input mask associated with the cell specified by the ACol and ARow parameters. +GetEditMask returns the Value parameter set by the OnGetEditMask event handler. If there is no OnGetEditMask event handler, GetEditMask returns an empty string, indicating that there is no edit mask. + + + Generates an OnGetEditText event. +The inplace editor calls GetEditText to obtain the text for the indicated cell. GetEditText returns the Value parameter set by the OnGetEditText event handler. If there is no OnGetEditText event handler, GetEditText returns an empty string. + + + Generates an OnRowMoved event. +RowMoved is called immediately after a row in the grid changes position. It overrides the inherited method to generate an OnRowMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnRowMoved event. + + + Determines whether a particular cell in the grid can be selected. +Grid controls call SelectCell internally before attempting to move selection to a the cell identified by the ACol and ARow parameters. ACol and ARow are the column and row indexes for the cell, where the first column has index 0, and the top row has index 0. +SelectCell generates an OnSelectCell event. This method then returns true, unless the OnSelectCell event handler indicates that the cell should not be selected. Descendants of TCustomDrawGrid can override this method to check the properties of the information displayed in the cell or block the OnSelectCell event. + + + Generates an OnSetEditText event. +SetEditText is called by the inplace editor so that the grid can store the new value for the current cell. SetEditText overrides the inherited parent class's method to generate an OnSetEditText event. Descendants of TCustomDrawGrid can override this method to update an internal representation of the cell's value, or to block the OnSetEditText event. + + + Generates an OnTopLeftChanged event. +Grid controls call TopLeftChanged internally, whenever the LeftCol or TopRow property changes. After calling the inherited parent class's method to update the position of the InplaceEditor (inherited from TCustomGrid), TopLeftChanged generates an OnTopLeftChanged event. + + + Occurs immediately after the position of a column changes. +Use OnColumnMoved to perform special processing when the position of a grid column changes. Columns can be moved programmatically or by user manipulation. OnColumnMoved does not occur unless the Options property includes goColMoving. + + + Occurs when a cell in the grid needs to be drawn. +Write an OnDrawCell event handler to draw the contents of all the cells in the grid. Draw on the cell using the methods of the Canvas property. The Rect parameter indicates the location of the cell on the canvas. The Col and Row parameters indicate the column and row indexes of the cell that should be drawn. The State parameter indicates whether the cell has input focus, whether the cell is selected, and whether the cell is a fixed (nonscrolling) cell. +If the OnDrawCell event handler is not assigned, all cells in the draw grid will appear empty. If the DefaultDrawing property is True, the draw grid paints the background color of the cell before the OnDrawCell event, and draws a focus rectangle around the selected cell after the OnDrawCell event handler finishes drawing the contents of the cell. If the DefaultDrawing property is False, the OnDrawCell event handler should paint the background of the cell and provide all visual indication of selection and focus. + + + Occurs when the in-place editor requests an edit mask. +Write an OnGetEditMask event handler to provide the in-place editor with an edit mask that describes the valid input strings a user can type into a cell. Set the Value parameter to the string that describes the edit mask for the cell specified by the ACol and ARow parameters. If the cell does not have an edit mask, set the Value parameter to an empty string. +OnGetEditMask does not occur unless the Options property includes goEditing. + + + Occurs when the in-place editor requests the value of a cell. +Write an OnGetEditText event handler to provide the in-place editor with a string representing the contents of the cell. Set the Value parameter to the string for the cell specified by the ACol and ARow parameters. When the cell enters edit mode, the contents of the cell are drawn as the Value string returned by the OnGetEditText event handler. This image need not match the appearance of the cell when it is not in edit mode, which is drawn using the OnDrawCell event handler. +OnGetEditText does not occur unless the Options property includes goEditing. + + + Occurs immediately after the position of a row changes. +Write an OnRowMoved event handler to provide special processing whenever a row in the grid changes position. Rows can be moved programmatically or by user manipulation. OnRowMoved does not occur unless the Options property includes goRowMoving. + + + Occurs before a cell in the grid is selected. +Write an OnSelectCell event handler to specify whether any particular cell in the grid can be selected. The Col and Row parameters indicate the column and row indexes of the cell that is about to be selected. Set the CanSelect parameter to False to prevent the cell being selected. + + + Occurs when the user edits the value of a cell. +Write an OnSetEditText event handler to perform any special processing of the text edited by the user in an in-place editor. For example, use the OnSetEditText event to retrieve and store the value of a cell so that it can be displayed in an OnDrawCell event handler. OnSetEditText occurs every time the user changes the text. +The Value parameter is the new value for the cell specified by the ACol and ARow parameters. +OnSetEditText does not occur unless the Options property includes goEditing. + + + Occurs immediately after the TopRow property or the LeftCol property changes. +Use OnTopLeftChanged to perform special processing when the non-fixed cells in the grid are scrolled. + + + Returns the screen coordinates of a cell in the grid. +Call CellRect to obtain the boundaries, in pixels, of the cell in the column and row indicated by the ACol and ARow parameters. The top left cell is specified when ACol and ARow are set to zero. +If the indicated cell is not visible, CellRect returns an empty rectangle. + + + Returns the column and row of the cell at the position with screen coordinates (X,Y). +Call MouseToCell to convert from grid-relative screen coordinates to row and column indexes. The X and Y parameters are the screen coordinates of the point to be converted. MouseToCell returns the ACol parameter as the number of the column over the point (X,Y), and the ARow parameter as the number of the row. +Usually the MouseToCell method is used in a mouse event handler, which supplies the mouse coordinates as the X and Y parameters of the method call. + + + + + TDrawGrid represents a grid control that displays information in column and row format. +Add a TDrawGrid object to a form to present arbitrary information in a tabular format. TDrawGrid provides many properties to control the appearance of the grid, as well as events and methods that take advantage of the tabular organization of the grid in responding to user actions. +TDrawGrid introduces several events and methods to allow applications to customize the appearance and behavior of the grid. +If the cells of the grid contain text strings that represent objects, consider using a TStringGrid object instead. If the grid displays field values from the records in a dataset, use TDBGrid instead. + + + TStringGrid represents a grid control designed to simplify the handling of strings and associated objects. +Add a TStringGrid object to a form to present textual data in a tabular format. TStringGrid provides many properties to control the appearance of the grid, as well as events and methods that take advantage of the tabular organization of the grid in responding to user actions. +TStringGrid introduces the ability to associate an object with each string in the grid. These objects can encapsulate any information or behavior represented by the strings that are presented to the user. +For a TStringGrid, the DrawingStyle property controls whether the current settings have any effect for FixedColor, and for GradientStartColor and GradientEndColor: + +Setting FixedColor has no effect unless you also set DrawingStyle to gdsClassic. +Setting GradientStartColor and GradientEndColor has no effect unless you set the value of DrawingStyle to gdsGradient. +Note: If the strings to be presented in a grid represent field values from the records in a dataset, use TDBGrid instead. +Note: To display the string and the associated object or control, use TDrawGrid instead. . + + + Generates an OnColumnMoved event. +Vcl.Grids.TStringGrid.ColumnMoved inherits from Vcl.Grids.TCustomDrawGrid.ColumnMoved. All content below this line refers to Vcl.Grids.TCustomDrawGrid.ColumnMoved. +Generates an OnColumnMoved event. +ColumnMoved is called immediately after a column in the grid has moved. It overrides the inherited method to generate an OnColumnMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnColumnMoved event. + + + Generates an OnDrawCell event. +Vcl.Grids.TStringGrid.DrawCell inherits from Vcl.Grids.TCustomDrawGrid.DrawCell. All content below this line refers to Vcl.Grids.TCustomDrawGrid.DrawCell. +Generates an OnDrawCell event. +DrawCell is called automatically whenever a cell in the grid is drawn. If the DefaultDrawing property is true, the background of the cell is painted before DrawCell is called, and the 3D effects of the fixed cells or the focus rectangle around the focused cell are drawn after DrawCell. Descendants of TCustomDrawGrid can override this method to draw the contents of the cell or to block the OnDrawCell event. + + + Generates an OnGetEditText event. +Vcl.Grids.TStringGrid.GetEditText inherits from Vcl.Grids.TCustomDrawGrid.GetEditText. All content below this line refers to Vcl.Grids.TCustomDrawGrid.GetEditText. +Generates an OnGetEditText event. +The inplace editor calls GetEditText to obtain the text for the indicated cell. GetEditText returns the Value parameter set by the OnGetEditText event handler. If there is no OnGetEditText event handler, GetEditText returns an empty string. + + + Generates an OnSetEditText event. +Vcl.Grids.TStringGrid.SetEditText inherits from Vcl.Grids.TCustomDrawGrid.SetEditText. All content below this line refers to Vcl.Grids.TCustomDrawGrid.SetEditText. +Generates an OnSetEditText event. +SetEditText is called by the inplace editor so that the grid can store the new value for the current cell. SetEditText overrides the inherited parent class's method to generate an OnSetEditText event. Descendants of TCustomDrawGrid can override this method to update an internal representation of the cell's value, or to block the OnSetEditText event. + + + Generates an OnRowMoved event. +Vcl.Grids.TStringGrid.RowMoved inherits from Vcl.Grids.TCustomDrawGrid.RowMoved. All content below this line refers to Vcl.Grids.TCustomDrawGrid.RowMoved. +Generates an OnRowMoved event. +RowMoved is called immediately after a row in the grid changes position. It overrides the inherited method to generate an OnRowMoved event. Descendants of TCustomDrawGrid can override this method to make internal adjustments or to block the OnRowMoved event. + + + Creates an instance of TStringGrid. +Call Create to create an instance of TStringGrid at runtime. For string grids placed on forms at design time, Create is called automatically. +AOwner is another component, typically a form, that becomes the grid's Owner. The Owner is responsible for freeing the grid. + + + Destroys an instance of TStringGrid. +Do not call Destroy directly in an application. Instead, call Free. Free verifies that the string grid is not nil, and only then calls Destroy. +Destroy frees the helper objects used to manage the array of strings and their associated objects. + + + + diff --git a/Modules/DelphiVCL/uMain.pas b/Modules/DelphiVCL/uMain.pas index 5d64287b..9a7e1765 100644 --- a/Modules/DelphiVCL/uMain.pas +++ b/Modules/DelphiVCL/uMain.pas @@ -1,59 +1,61 @@ -unit uMain; - -interface - -uses PythonEngine; - -function PyInit_DelphiVCL: PPyObject; cdecl; - -implementation - -uses - System.SysUtils, WrapDelphi, WrapDelphiVCL; - -var - gEngine : TPythonEngine; - gModule : TPythonModule; - gDelphiWrapper : TPyDelphiWrapper; - -// This must match the pattern "PyInit_[ProjectName]" -// So if the project is named DelphiVCL then -// the function must be PyInit_DelphiVCL -function PyInit_DelphiVCL: PPyObject; -begin - try - gEngine := TPythonEngine.Create(nil); - gEngine.AutoFinalize := False; - gEngine.UseLastKnownVersion := true; - - gModule := TPythonModule.Create(nil); - gModule.Engine := gEngine; - // This must match the ProjectName and the function name pattern - gModule.ModuleName := 'DelphiVCL'; - - gDelphiWrapper := TPyDelphiWrapper.Create(nil); - gDelphiWrapper.Engine := gEngine; - gDelphiWrapper.Module := gModule; - - gEngine.LoadDllInExtensionModule(); - except - on E: Exception do begin - WriteLn('An error has occurred: ' + E.Message); - end; - end; - Result := gModule.Module; -end; - -initialization - gEngine := nil; - gModule := nil; - gDelphiWrapper := nil; - -finalization - gEngine.Free; - gModule.Free; - gDelphiWrapper.Free; - -end. - - +unit uMain; + +interface + +uses PythonEngine; + +function PyInit_DelphiVCL: PPyObject; cdecl; + +implementation + +uses + System.SysUtils, WrapDelphi, WrapDelphiVCL, PythonDocs; + +var + gEngine : TPythonEngine; + gModule : TPythonModule; + gDelphiWrapper : TPyDelphiWrapper; + +// This must match the pattern "PyInit_[ProjectName]" +// So if the project is named DelphiVCL then +// the function must be PyInit_DelphiVCL +function PyInit_DelphiVCL: PPyObject; +begin + try + gEngine := TPythonEngine.Create(nil); + gEngine.AutoFinalize := False; + gEngine.UseLastKnownVersion := true; + + gModule := TPythonModule.Create(nil); + gModule.Engine := gEngine; + // This must match the ProjectName and the function name pattern + gModule.ModuleName := 'DelphiVCL'; + + gDelphiWrapper := TPyDelphiWrapper.Create(nil); + gDelphiWrapper.Engine := gEngine; + gDelphiWrapper.Module := gModule; + + gEngine.LoadDllInExtensionModule(); + except + on E: Exception do begin + WriteLn('An error has occurred: ' + E.Message); + end; + end; + Result := gModule.Module; +end; + +initialization + gEngine := nil; + gModule := nil; + gDelphiWrapper := nil; + PyDocServer := TPythonDocServer.Create(); + +finalization + PyDocServer := nil; + gEngine.Free; + gModule.Free; + gDelphiWrapper.Free; + +end. + + diff --git a/Modules/ModulesDoc/Compiler/DocCompiler.dpr b/Modules/ModulesDoc/Compiler/DocCompiler.dpr new file mode 100644 index 00000000..3bb5a7b4 --- /dev/null +++ b/Modules/ModulesDoc/Compiler/DocCompiler.dpr @@ -0,0 +1,263 @@ +(******************************************************** + * XML Doc Compiler for P4D Modules * + * * + * Copyright (c) 2023 by Lucas Moura Belo - lmbelo * + * Licensed under the MIT License * + * * + * * + * Generates a minimalistic XML doc as a result of a * + * group of XML doc files. * + * * + * * + * For full license text and more information visit: * + * https://github.com/Embarcadero/python4delphi * + ********************************************************) +program DocCompiler; + +{$APPTYPE CONSOLE} + +{$R *.res} + +uses + System.Rtti, + System.TypInfo, + System.Classes, + System.IOUtils, + System.SysUtils, + System.Generics.Collections, + Xml.xmldom, + Xml.XMLIntf, + Xml.XMLDoc, + Xml.omnixmldom; + +type + TPythonDocXml = class + public type + TDocStr = record + Name: string; + &Type: string; + DocStr: string; + Children: TArray; + end; + TDiscoveredDocs = TList; + TDiscoveredFiles = TObjectDictionary; + private + FDiscoveredFiles: TDiscoveredFiles; + function Bufferize(const AFileName: string; const ADirectory: string): TDiscoveredDocs; + procedure BufferizeClass(const AClassNodes: IXMLNode; const AList: TDiscoveredDocs); + function BufferizeMembers(const AMemberNodes: IXMLNode): TArray; + public + constructor Create(); + destructor Destroy(); override; + + /// + /// Automatically discover and bufferize files and its xml content. + /// + procedure DiscoverAndBufferize(const ADirectory: string); + + function LeanUp(): IXMLDocument; + end; + +{ TPythonDocXml } + +constructor TPythonDocXml.Create; +begin + FDiscoveredFiles := TDiscoveredFiles.Create([doOwnsValues]); +end; + +destructor TPythonDocXml.Destroy; +begin + FDiscoveredFiles.Free(); + inherited; +end; + +function TPythonDocXml.Bufferize(const AFileName, + ADirectory: string): TDiscoveredDocs; +var + LXMLDoc: IXMLDocument; + LXmlDOMNodeSelect: IDOMNodeSelect; + LXmlDOMNodes: IDOMNodeList; + I: Integer; +begin + //We expect UTF-8 XML files + LXMLDoc := LoadXmlDocument(AFileName); + + LXmlDOMNodeSelect := (LXMLDoc.DOMDocument.documentElement as IDOMNodeSelect); + if not Assigned(LXmlDOMNodeSelect) then + Exit(nil); + + //We currently only support classes + LXmlDOMNodes := LXmlDOMNodeSelect.selectNodes('/namespace/class'); + if not Assigned(LXmlDOMNodes) then + Exit(nil); + + Result := TDiscoveredDocs.Create(); + try + //Bufferize all classes + for I := 0 to Pred(LXmlDOMNodes.Length) do + BufferizeClass(TXMLNode.Create(LXmlDOMNodes.Get_Item(I), nil, + LXMLDoc as TXMLDocument) as IXMLNode, Result); + except + FreeAndNil(Result); + raise; + end; +end; + +procedure TPythonDocXml.BufferizeClass(const AClassNodes: IXMLNode; + const AList: TDiscoveredDocs); +var + LDiscoveredDocs: TDiscoveredDocs; + LXmlDevNotes: IXMLNode; + LXmlSummary: IXMLNode; + LXmlMembers: IXMLNode; + LDocStr: TDocStr; +begin + LDocStr.Name := AClassNodes.GetAttribute('name'); + LDocStr.&Type := AClassNodes.NodeName; + + //Look for class doc + LXmlDevNotes := AClassNodes.ChildNodes.FindNode('devnotes'); + if Assigned(LXmlDevNotes) then begin + LXmlSummary := LXmlDevNotes.ChildNodes.FindNode('summary'); + if Assigned(LXmlSummary) then begin + LDocStr.DocStr := LXmlSummary.Text; + end; + end; + + //Scan class members + LXmlMembers := AClassNodes.ChildNodes.FindNode('members'); + if Assigned(LXmlMembers) then + LDocStr.Children := BufferizeMembers(LXmlMembers) + else + LDocStr.Children := []; + + if not LDocStr.DocStr.IsEmpty() or Assigned(LDocStr.Children) then + AList.Add(LDocStr); +end; + +function TPythonDocXml.BufferizeMembers( + const AMemberNodes: IXMLNode): TArray; +var + I: Integer; + LXmlMember: IXMLNode; + LXmlDevNotes: IXMLNode; + LXmlSummary: IXMLNode; + LIdentifier: string; + LDocStr: TDocStr; +begin + Result := []; + for I := 0 to AMemberNodes.ChildNodes.Count - 1 do begin + LXmlMember := AMemberNodes.ChildNodes[I]; + //Look for member doc + LXmlDevNotes := LXmlMember.ChildNodes.FindNode('devnotes'); + if Assigned(LXmlDevNotes) then begin + LXmlSummary := LXmlDevNotes.ChildNodes.FindNode('summary'); + if not (Assigned(LXmlSummary) and LXmlSummary.IsTextElement) then + Continue; + + LDocStr.Name := LXmlMember.GetAttribute('name'); + LDocStr.&Type := LXmlMember.NodeName; + LDocStr.DocStr := LXmlSummary.Text; + LDocStr.Children := []; + + Result := Result + [LDocStr]; + end; + end; +end; + +procedure TPythonDocXml.DiscoverAndBufferize(const ADirectory: string); +var + LFiles: TArray; + I: integer; +begin + if not TDirectory.Exists(ADirectory) then + Exit(); + + LFiles := TDirectory.GetFiles(ADirectory, + '*.xml', + TSearchOption.soAllDirectories); + + if not Assigned(LFiles) then + Exit(); + + //Add all symbol docs discovered from a unit (currently classes only) + for I := Low(LFiles) to High(LFiles) do + FDiscoveredFiles.TryAdd( + TPath.GetFileName(LFiles[I].Replace('.xml', '')), Bufferize(LFiles[I], ADirectory)); +end; + +function TPythonDocXml.LeanUp: IXMLDocument; + + procedure AddDoc(const AParent: IXMLNode; const AUnit: string; const ADocStr: TDocStr); + begin + var LNode := AParent.AddChild(ADocStr.&Type); + if AParent.NodeName = 'docs' then + LNode.Attributes['unit'] := AUnit; + LNode.Attributes['name'] := ADocStr.Name; + LNode.AddChild('docstr').Text := ADocStr.DocStr; + + if not Assigned(ADocStr.Children) then + Exit; + + LNode := LNode.AddChild('members'); + for var LChild in ADocStr.Children do + AddDoc(LNode, AUnit, LChild); + end; + +begin + Result := NewXMLDocument(); + Result.Encoding := 'UTF-8'; + Result.Options := [doNodeAutoIndent]; + + var LRootNode := Result.AddChild('docs'); + + for var LDiscFile in FDiscoveredFiles do + for var LDiscSym in LDiscFile.Value do + AddDoc(LRootNode, LDiscFile.Key, LDiscSym); +end; + +begin + try + DefaultDomVendor := sOmniXmlVendor; + + const INFO = + '(*******************************************************' + sLineBreak + + '* XML Doc Compiler for P4D Modules *' + sLineBreak + + '* *' + sLineBreak + + '* *' + sLineBreak + + '* Generates a minimalistic XML doc as a result of a *' + sLineBreak + + '* group of XML doc files. *' + sLineBreak + + '* *' + sLineBreak + + '* *' + sLineBreak + + '* For full license text and more information visit: *' + sLineBreak + + '* https://github.com/Embarcadero/python4delphi *' + sLineBreak + + '*******************************************************)'; + + WriteLn(INFO + sLineBreak + sLineBreak); + + var LLean := TPythonDocXml.Create(); + try + var LInput := String.Empty; + while not TDirectory.Exists(LInput) do begin + WriteLn('Type the XML files input dir: '); + ReadLn(LInput); + end; + + var LOutput := String.Empty; + while not TDirectory.Exists(LOutput) do begin + WriteLn('Type the XML file output dir: '); + ReadLn(LOutput); + end; + + LLean.DiscoverAndBufferize(LInput); + var LXMLDoc := LLean.LeanUp(); + if Assigned(LXMLDoc) then + LXMLDoc.SaveToFile(TPath.Combine(LOutput, 'docs.xml')); + finally + LLean.Free(); + end; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; +end. diff --git a/Modules/ModulesDoc/Compiler/DocCompiler.dproj b/Modules/ModulesDoc/Compiler/DocCompiler.dproj new file mode 100644 index 00000000..da5c2818 --- /dev/null +++ b/Modules/ModulesDoc/Compiler/DocCompiler.dproj @@ -0,0 +1,964 @@ + + + {5D6C6254-9B23-415A-9490-44E5A86667D9} + 19.5 + None + True + Release + Win32 + 1 + Console + DocCompiler.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + DocCompiler + + + JvNet;vclwinx;DataSnapServer;P4DMatplotLib;P4DPandas;P4DPyQT5;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;tb2k;appanalytics;IndyProtocols;vclx;MPCommonLibD;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;P4DONNXRuntime;EasyListviewD;emsedge;bindcompfmx;DBXFirebirdDriver;JvBands;inetdb;JvAppFrm;FireDACSqliteDriver;DbxClientDriver;P4DMoviePy;FireDACASADriver;JclVcl;soapmidas;SVGIconImageListFMX;vclactnband;fmxFireDAC;dbexpress;Jcl;JvManagedThreads;FireDACInfxDriver;P4DPyPackage;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;JvPascalInterpreter;vcltouch;fmxase;P4DOpenCV;JvPluginSystem;TMSFMXPackPkgDXE14;DBXOdbcDriver;JvTimeFramework;dbrtl;JvDB;FireDACDBXDriver;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;JvCustom;CustomIPTransport;FireDACMSSQLDriver;JvSystem;SVGIconPackage;P4DSciPy;P4DRemBG;DataSnapIndy10ServerTransport;JclDeveloperTools;JvControls;P4DTensorFlow;DataSnapConnectors;P4DKeras;vcldsnap;DBXInterBaseDriver;JvCrypt;FireDACMongoDBDriver;JvJans;JvWizards;IndySystem;JvMM;FireDACTDataDriver;JvGlobus;vcldb;VirtualTreesR;JclContainers;SynEditDR;SpTBXLib;JvPageComps;vclFireDAC;JvCore;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;TestCompPkg;P4DH5Py;IndyCore;RESTBackendComponents;P4DScikitLearn;P4DPyTorch;bindcompdbx;SAX_R70;rtl;FireDACMySQLDriver;SynWeb_RD;FireDACADSDriver;RESTComponents;P4DPSUtil;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;JvHMI;JvDotNetCtrls;DBXSybaseASEDriver;VirtualShellToolsD;JvRuntimeDesign;P4DNLTK;DBXDb2Driver;JvXPCtrls;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;JvStdCtrls;JvDlgs;JvPrintPreview;JvDocking;bindcompvcl;dsnap;P4DPillow;JvCmp;P4DBoto3;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;P4DNumPy;P4DEnvironment;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + DocCompiler.dpr + + + + + + true + + + + + true + + + + + true + + + + + DocCompiler.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + + False + False + False + False + False + False + False + True + False + + + 12 + + + + + diff --git a/Packages/Delphi/Delphi 10.4+/Python.dpk b/Packages/Delphi/Delphi 10.4+/Python.dpk index 8d6d2b03..8d4479af 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dpk +++ b/Packages/Delphi/Delphi 10.4+/Python.dpk @@ -50,6 +50,7 @@ contains WrapFireDAC in '..\..\..\Source\WrapFireDAC.pas', WrapActions in '..\..\..\Source\WrapActions.pas', WrapDelphiDataBind in '..\..\..\Source\WrapDelphiDataBind.pas', - WrapDelphiImageList in '..\..\..\Source\WrapDelphiImageList.pas'; + WrapDelphiImageList in '..\..\..\Source\WrapDelphiImageList.pas', + PythonDocs in '..\..\..\Source\PythonDocs.pas'; end. diff --git a/Packages/Delphi/Delphi 10.4+/Python.dproj b/Packages/Delphi/Delphi 10.4+/Python.dproj index 3760d219..c41368d4 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dproj +++ b/Packages/Delphi/Delphi 10.4+/Python.dproj @@ -109,11 +109,11 @@ Debug - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false Debug - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false Debug @@ -178,6 +178,7 @@ + Base diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj index f3da3849..224e44cc 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj @@ -87,11 +87,11 @@ Debug - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false Debug - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false Debug @@ -159,6 +159,7 @@ + Base diff --git a/Packages/FPC/p4dlaz_register.pas b/Packages/FPC/p4dlaz_register.pas index ab6b0986..f693a653 100644 --- a/Packages/FPC/p4dlaz_register.pas +++ b/Packages/FPC/p4dlaz_register.pas @@ -1,25 +1,25 @@ -unit P4DLaz_register; - -interface - -uses SysUtils, Classes; - -procedure Register; - -implementation -{$R '..\..\Source\PythonEngine.dcr'} - -uses - PythonEngine, - Lcl.PythonGUIInputOutput, - WrapDelphi; - -procedure Register; -begin - RegisterComponents('Python', [TPythonEngine, TPythonInputOutput, - TPythonType, TPythonModule, TPythonDelphiVar]); - RegisterComponents('Python', [TPythonGUIInputOutput]); - RegisterComponents('Python', [TPyDelphiWrapper]); -end; - -end. +unit P4DLaz_register; + +interface + +uses SysUtils, Classes; + +procedure Register; + +implementation +{$R '..\..\Source\PythonEngine.dcr'} + +uses + PythonEngine, + Lcl.PythonGUIInputOutput, + WrapDelphi; + +procedure Register; +begin + RegisterComponents('Python', [TPythonEngine, TPythonInputOutput, + TPythonType, TPythonModule, TPythonDelphiVar]); + RegisterComponents('Python', [TPythonGUIInputOutput]); + RegisterComponents('Python', [TPyDelphiWrapper]); +end; + +end. diff --git a/Source/PythonDocs.pas b/Source/PythonDocs.pas new file mode 100644 index 00000000..a38610a7 --- /dev/null +++ b/Source/PythonDocs.pas @@ -0,0 +1,738 @@ +{$I Definition.Inc} +unit PythonDocs; +(**************************************************************************) +(* This unit is part of the Python for Delphi (P4D) library *) +(* Project home: https://github.com/pyscripter/python4delphi *) +(* *) +(* Project Maintainer: PyScripter (pyscripter@gmail.com) *) +(* Original Authors: Dr. Dietmar Budelsky (dbudelsky@web.de) *) +(* Morgan Martinet (https://github.com/mmm-experts) *) +(* Core developer: Lucas Belo (lucas.belo@live.com) *) +(* Contributors: See contributors.md at project home *) +(* *) +(* LICENCE and Copyright: MIT (see project home) *) +(**************************************************************************) + +interface + +uses + System.Rtti, + System.Types, + System.TypInfo, + System.Classes, + System.SysUtils, + System.SyncObjs, + System.Threading, + System.Generics.Collections, + Xml.xmldom, + Xml.XMLIntf, + Xml.XMLDoc, + Xml.omnixmldom, + WrapDelphi; + +type + TSymbol = string; + TDocScanResult = class; + + {$SCOPEDENUMS ON} + TPythonDocSource = (Xml); + TPythonDocSymbolType = (Constant, Variable, &Constructor, &Destructor, &Procedure, &Function, Enum, &Set, &Record, &Class); + {$SCOPEDENUMS OFF} + + TDiscoverPredicate = reference to function(const ARttiType: TRttiType; out ATypeInfo: PTypeInfo): boolean; + + IPythonDocProvider = interface + ['{4763349F-A25B-41E9-8811-2A6BD5933834}'] + /// + /// Find the doc of a given symbol. + /// + function Find(const ASymbolName: TSymbol; + const ASymbolType: TPythonDocSymbolType; + const ADeclaringUnitName: string): TDocScanResult; + end; + + ITypeAnnotationProvider = interface + ['{7359C6AE-8C5C-4279-9151-A847D1383A11}'] + /// + /// Creates member annotation for type inference in doc. strings. + /// + function CreateTypeAnnotation(const ARttiMember: TRttiMember): string; + end; + + TPythonDocServer = class(TInterfacedObject, IDocServer) + private + FDocProvider: IPythonDocProvider; + FTypeAnnotationProvider: ITypeAnnotationProvider; + FBuffered: boolean; + function GetDocDir(): string; + function GetDocFile(): string; + /// + /// Create member annotation for stubs generation. + /// + function CreateMemberAnnotation(const ARttiMember: TRttiMember): string; + /// + /// Create member docs based on parent class or its descendents. + /// + function CreateMemberDocStr(const AParentInfo: PTypeInfo; + const ARttiMember: TRttiMember): string; + /// + /// Combine docstring and type annotation. + /// + function CombineDocStrAndTypeAnnotation(const ADocString, ATypeAnnotation: string): string; overload; + /// + /// Combine doc. strings and type annotation. + /// + function CombineDocStrAndTypeAnnotation(const ARttiMember: TRttiMember): string; overload; + public + constructor Create(); + /// + /// Bufferize all symbols. + /// + procedure Initialize; + /// + /// Check if symbols have been bufferized. + /// + function Initialized: Boolean; + /// + /// Clear all symbols info from buffer. + /// + procedure Finalize; + /// + /// Reads the docs of a symbol. + /// + function ReadTypeDocStr(const ASymbolName: TSymbol; + const ASymbolType: TPythonDocSymbolType; + const ADeclaringUnitName: string; out ADocStr: string): boolean; overload; + /// + /// Reads the docs of a type. + /// + function ReadTypeDocStr(ATypeInfo: PTypeInfo; out ADocStr: string): boolean; overload; + /// + /// Reads the docs of a member of a type. + /// + function ReadMemberDocStr(AParentInfo: PTypeInfo; AMember: TRttiMember; + out ADocStr: string): boolean; overload; + /// + /// Reads the docs of a member of a type. + /// + function ReadMemberDocStr(AMember: TRttiMember; out ADocStr: string): boolean; overload; + /// + /// Doc provider instance. + /// + property DocProvider: IPythonDocProvider read FDocProvider write FDocProvider; + property TypeAnnotationProvider: ITypeAnnotationProvider read FTypeAnnotationProvider write FTypeAnnotationProvider; + end; + + TPythonDocXML = class(TInterfacedObject, IPythonDocProvider) + private type + TDiscoveredDocs = TDocScanResult; + TDiscoveredSymbols = TObjectDictionary; + TDiscoveredFiles = TObjectDictionary; + private + class var FDiscoveredFiles: TDiscoveredFiles; + /// + /// Creates a XML document instance with the necessary settings. + /// + class function CreateXmlDoc(const AFileName: string): IXMLDocument; + /// + /// Create a buffer with all nodes of the XML file. + /// + class procedure BufferizeClasses(const AClassNodes: IXMLNode; const ASymbolMap: TDiscoveredSymbols); + class procedure BufferizeMembers(const AMemberNodes: IXMLNode; const ADocMap: TDiscoveredDocs); + public + class constructor Create(); + class destructor Destroy(); + /// + /// Find a symbol in the buffered map + /// + function Find(const ASymbolName: TSymbol; + const ASymbolType: TPythonDocSymbolType; + const ADeclaringUnitName: string): TDocScanResult; + /// + /// Bufferizes the XML doc file. + /// + class procedure Bufferize(const AFileName: string); + /// + /// Clear all discovered files with buffered xml from buffer. + /// + class procedure ClearBuffer(); + end; + + /// + /// Using standard function signature for methods. + /// Signature is a string of the format + /// () -> + /// or perhaps without the return type. + + /// Using Google Docstrings Style for fields and properties. It is a string of the format + /// + /// See: https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html + /// + TMyPyTypeAnnotation = class(TInterfacedObject, ITypeAnnotationProvider) + private + function TranslateType(const ARttiObject: TRttiObject): string; + /// + /// Creates method annotation for type inference in doc. strings. + /// + function GetMethodTypeAnnotation( + const ARttiMethod: TRttiMethod): string; + /// + /// Creates field annotation for type inference in doc. strings. + /// + function GetFieldTypeAnnotation(const ARttiField: TRttiField): string; + /// + /// Creates property annotation for type inference in doc. strings. + /// + function GetPropertyTypeAnnotation( + const ARttiProperty: TRttiProperty): string; + /// + /// Creates indexed property annotation for type inference in doc. strings. + /// + function GetIndexedPropertyTypeAnnotation( + const ARttiIndexedProperty: TRttiIndexedProperty): string; + public + /// + /// Creates member annotation for type inference in doc. strings. + /// + function CreateTypeAnnotation(const ARttiMember: TRttiMember): string; + end; + + TDocScanResult = class(TDictionary) + public + class function ExtractMemberPrefix(const AXmlMember: IXMLNode): string; overload; static; inline; + class function BuildMemberIdentifier(const AXmlMember: IXMLNode): string; overload; static; inline; + class function ExtractMemberPrefix(const ARttiNamedType: TRttiNamedObject): string; overload; static; + class function BuildMemberIdentifier(const ARttiNamedType: TRttiNamedObject): string; overload; static; inline; + class function BuildMemberIdentifier(const ATypeInfo: PTypeInfo): string; overload; static; inline; + class function BuildMemberIdentifier(const ASymbolName: string; const ASymbolType: TPythonDocSymbolType): string; overload; static; inline; + end; + +const + DOC_DIR_NAME = 'doc'; + DOC_FILE_NAME = 'docs.xml'; + +implementation + +uses + System.IOUtils, + System.StrUtils; + +{ TPythonDocServer } + +constructor TPythonDocServer.Create; +begin + inherited; + FDocProvider := TPythonDocXML.Create(); + FTypeAnnotationProvider := TMyPyTypeAnnotation.Create(); +end; + +function TPythonDocServer.GetDocDir(): string; +begin + {$IFDEF ANDROID} + Exit(TPath.GetDocumentsPath()); + {$ENDIF ANDROID} + + Result := TPath.Combine( + TDirectory.GetParent(ExcludeTrailingPathDelimiter( + ExtractFilePath(GetModuleName(HInstance)))), DOC_DIR_NAME); +end; + +function TPythonDocServer.GetDocFile: string; +begin + Result := TPath.Combine(GetDocDir(), DOC_FILE_NAME); +end; + +procedure TPythonDocServer.Initialize; +begin + TPythonDocXML.Bufferize(GetDocFile()); + FBuffered := true; +end; + +function TPythonDocServer.Initialized: Boolean; +begin + Result := FBuffered; +end; + +procedure TPythonDocServer.Finalize; +begin + FBuffered := false; + TPythonDocXML.ClearBuffer(); +end; + +function TPythonDocServer.CreateMemberDocStr( + const AParentInfo: PTypeInfo; const ARttiMember: TRttiMember): string; +begin + if not Assigned(AParentInfo) then + Exit(String.Empty); + + if not ReadMemberDocStr(AParentInfo, ARttiMember, Result) then + if not Assigned(GetTypeData(AParentInfo)^.ParentInfo) then + Result := String.Empty + else + Result := CreateMemberDocStr(GetTypeData(AParentInfo)^.ParentInfo^, ARttiMember); +end; + +function TPythonDocServer.CreateMemberAnnotation( + const ARttiMember: TRttiMember): string; +begin + Result := FTypeAnnotationProvider.CreateTypeAnnotation(ARttiMember); +end; + +function TPythonDocServer.CombineDocStrAndTypeAnnotation(const ADocString, + ATypeAnnotation: string): string; +begin + //We only have the docstring or neither + if ATypeAnnotation.IsEmpty() then + Result := ADocString + //We only have the type annotation + else if ADocString.IsEmpty() then + Result := ATypeAnnotation + //We have both values + else + Result := ATypeAnnotation + ADocString; +end; + +function TPythonDocServer.CombineDocStrAndTypeAnnotation(const ARttiMember: TRttiMember): string; +begin + Result := CombineDocStrAndTypeAnnotation( + CreateMemberDocStr(ARttiMember.Parent.Handle, ARttiMember), + CreateMemberAnnotation(ARttiMember)); +end; + +function TPythonDocServer.ReadTypeDocStr(const ASymbolName: TSymbol; + const ASymbolType: TPythonDocSymbolType; + const ADeclaringUnitName: string; out ADocStr: string): boolean; +var + LDocs: TDocScanResult; +begin + LDocs := FDocProvider.Find(ASymbolName, ASymbolType, ADeclaringUnitName); + if not Assigned(LDocs) then + Exit(false); + + Result := LDocs.TryGetValue( + TDocScanResult.BuildMemberIdentifier(ASymbolName, ASymbolType), ADocStr); +end; + +function TPythonDocServer.ReadTypeDocStr(ATypeInfo: PTypeInfo; + out ADocStr: string): boolean; +begin + case ATypeInfo^.Kind of + tkClass: Result := ReadTypeDocStr(TSymbol(ATypeInfo^.Name), + TPythonDocSymbolType.Class, + String(ATypeInfo^.TypeData^.UnitName), ADocStr); + //These docs will be enhanced as needed + else raise ENotSupportedException.Create('Type doesn''t support documentation.'); + end; +end; + +function TPythonDocServer.ReadMemberDocStr(AParentInfo: PTypeInfo; + AMember: TRttiMember; out ADocStr: string): boolean; +var + LDocs: TDocScanResult; +begin + case AParentInfo^.Kind of + tkClass: begin + LDocs := FDocProvider.Find( + TSymbol(AParentInfo^.Name), + TPythonDocSymbolType.Class, + String(AParentInfo^.TypeData^.UnitName)); + + if not Assigned(LDocs) then + Exit(false); + + Result := LDocs.TryGetValue( + TDocScanResult.BuildMemberIdentifier(AMember), ADocStr); + end; + //These docs will be enhanced as needed + else raise ENotSupportedException.Create('Type doesn''t support documentation.'); + end; +end; + +function TPythonDocServer.ReadMemberDocStr(AMember: TRttiMember; + out ADocStr: string): boolean; +begin + ADocStr := CombineDocStrAndTypeAnnotation(AMember); + Result := not ADocStr.IsEmpty; +end; + +{ TPythonDocXML } + +class constructor TPythonDocXML.Create; +begin + FDiscoveredFiles := TDiscoveredFiles.Create([doOwnsValues]); +end; + +class destructor TPythonDocXML.Destroy; +begin + FDiscoveredFiles.Free(); +end; + +function TPythonDocXML.Find(const ASymbolName: TSymbol; + const ASymbolType: TPythonDocSymbolType; + const ADeclaringUnitName: string): TDocScanResult; +var + LSymbols: TDiscoveredSymbols; +begin + //Do we have the given unit bufferized? + if not FDiscoveredFiles.TryGetValue(ADeclaringUnitName, LSymbols) then + Exit(nil); + + case ASymbolType of + TPythonDocSymbolType.Class: + //Do we have the given symbol bufferized? + if LSymbols.ContainsKey(ASymbolName) then + Exit(LSymbols[ASymbolName]); + //These docs will be enhanced as needed + else raise ENotSupportedException.Create('Type doesn''t support documentation.'); + end; + + Result := nil; +end; + +class function TPythonDocXML.CreateXmlDoc(const AFileName: string): IXMLDocument; +var + LXMLDocument: TXMLDocument; +begin + LXMLDocument := TXMLDocument.Create(nil); + try + LXMLDocument.DOMVendor := GetDOMVendor(sOmniXmlVendor); + LXMLDocument.FileName := AFileName; + LXMLDocument.Active := true; + except + LXMLDocument.Free(); + raise; + end; + + Result := LXMLDocument; +end; + +class procedure TPythonDocXML.Bufferize(const AFileName: string); +var + LXMLDoc: IXMLDocument; + LXmlDOMNodeSelect: IDOMNodeSelect; + LXmlDOMNodes: IDOMNodeList; + I: Integer; + LSymbols: TDiscoveredSymbols; +begin + if not TFile.Exists(AFileName) then + Exit; + + LXMLDoc := CreateXmlDoc(AFileName); + + LXmlDOMNodeSelect := (LXMLDoc.DOMDocument.documentElement as IDOMNodeSelect); + if not Assigned(LXmlDOMNodeSelect) then + Exit; + + //We currently only support classes + LXmlDOMNodes := LXmlDOMNodeSelect.selectNodes('/docs/class'); + if not Assigned(LXmlDOMNodes) then + Exit; + + //Bufferize all classes + for I := 0 to Pred(LXmlDOMNodes.Length) do begin + //This must be fast + if not FDiscoveredFiles.TryGetValue( + LXmlDOMNodes.Get_Item(I).attributes.getNamedItem('unit').nodeValue, + LSymbols) then + begin + LSymbols := TDiscoveredSymbols.Create([doOwnsValues]); + FDiscoveredFiles.Add( + LXmlDOMNodes.Get_Item(I).attributes.getNamedItem('unit').nodeValue, + LSymbols); + end; + //Add a class and its members into the buffer + BufferizeClasses(TXMLNode.Create(LXmlDOMNodes.Get_Item(I), nil, + LXMLDoc as TXMLDocument) as IXMLNode, LSymbols); + end; +end; + +class procedure TPythonDocXML.BufferizeClasses(const AClassNodes: IXMLNode; + const ASymbolMap: TDiscoveredSymbols); +var + LDiscoveredDocs: TDiscoveredDocs; + LXmlDocStr: IXMLNode; + LXmlMembers: IXMLNode; +begin + LDiscoveredDocs := TDiscoveredDocs.Create(); + try + //Add a discovered doc map to the class + ASymbolMap.Add(AClassNodes.GetAttribute('name'), LDiscoveredDocs); + + //Look for class doc + LXmlDocStr := AClassNodes.ChildNodes.FindNode('docstr'); + if Assigned(LXmlDocStr) then + LDiscoveredDocs.Add( + TDocScanResult.BuildMemberIdentifier(AClassNodes), LXmlDocStr.Text); + + //Scan class members + LXmlMembers := AClassNodes.ChildNodes.FindNode('members'); + if Assigned(LXmlMembers) then + BufferizeMembers(LXmlMembers, LDiscoveredDocs); + except + FreeAndNil(LDiscoveredDocs); + raise; + end; +end; + +class procedure TPythonDocXML.BufferizeMembers(const AMemberNodes: IXMLNode; + const ADocMap: TDiscoveredDocs); +var + I: Integer; + LIdentifier: string; +begin + for I := 0 to AMemberNodes.ChildNodes.Count - 1 do begin + LIdentifier := TDocScanResult.BuildMemberIdentifier(AMemberNodes.ChildNodes[I]); + if not ADocMap.ContainsKey(LIdentifier) then + ADocMap.Add(LIdentifier, AMemberNodes.ChildNodes[I].ChildNodes.FindNode('docstr').Text) + //Concat docstr for overloaded methods. We are considering any duplicates as overloads. + else begin + ADocMap[LIdentifier] := ADocMap[LIdentifier] + + #13#10 + + AMemberNodes.ChildNodes[I].ChildNodes.FindNode('docstr').Text; + end; + end; +end; + +class procedure TPythonDocXML.ClearBuffer; +begin + FDiscoveredFiles.Clear(); +end; + +{ TDocScanResult } + +class function TDocScanResult.BuildMemberIdentifier( + const AXmlMember: IXMLNode): string; +begin + Result := ExtractMemberPrefix(AXmlMember) + '_' + AXmlMember.GetAttribute('name'); +end; + +class function TDocScanResult.BuildMemberIdentifier( + const ARttiNamedType: TRttiNamedObject): string; +begin + Result := TDocScanResult.ExtractMemberPrefix(ARttiNamedType) + '_' + ARttiNamedType.Name; +end; + +class function TDocScanResult.ExtractMemberPrefix( + const AXmlMember: IXMLNode): string; +begin + Result := AXmlMember.NodeName; +end; + +class function TDocScanResult.BuildMemberIdentifier( + const ATypeInfo: PTypeInfo): string; +var + LRttiContext: TRttiContext; +begin + LRttiContext := TRttiContext.Create(); + try + Result := BuildMemberIdentifier(LRttiContext.GetType(ATypeInfo)); + finally + LRttiContext.Free(); + end; +end; + +class function TDocScanResult.ExtractMemberPrefix( + const ARttiNamedType: TRttiNamedObject): string; +begin + Result := String.Empty; + if ARttiNamedType is TRttiType then begin + if TRttiType(ARttiNamedType).IsInstance then + Result := 'class'; + end else if ARttiNamedType is TRttiMethod then begin + if TRttiMethod(ARttiNamedType).IsConstructor then + Result := 'constructor' + else if TRttiMethod(ARttiNamedType).IsDestructor then + Result := 'destructor' + else if Assigned(TRttiMethod(ARttiNamedType).ReturnType) then + Result := 'function' + else + Result := 'procedure'; + end else if ARttiNamedType is TRttiField then + Result := 'field' + else if ARttiNamedType is TRttiProperty then + Result := 'property' + else if ARttiNamedType is TRttiIndexedProperty then + Result := 'indexed_property'; +end; + +class function TDocScanResult.BuildMemberIdentifier(const ASymbolName: string; + const ASymbolType: TPythonDocSymbolType): string; +begin + case ASymbolType of + TPythonDocSymbolType.Constant: + Result := 'const_' + ASymbolName; + TPythonDocSymbolType.Variable: + Result := 'var_' + ASymbolName; + TPythonDocSymbolType.Constructor: + Result := 'constructor_' + ASymbolName; + TPythonDocSymbolType.Destructor: + Result := 'destructor_' + ASymbolName; + TPythonDocSymbolType.Procedure: + Result := 'procedure_' + ASymbolName; + TPythonDocSymbolType.Function: + Result := 'function_'; + TPythonDocSymbolType.Enum: + Result := 'enum_' + ASymbolName; + TPythonDocSymbolType.Set: + Result := 'set_' + ASymbolName; + TPythonDocSymbolType.Record: + Result := 'record_' + ASymbolName; + TPythonDocSymbolType.Class: + Result := 'class_' + ASymbolName; + end; +end; + +{ TMyPyTypeAnnotation } + +function TMyPyTypeAnnotation.TranslateType( + const ARttiObject: TRttiObject): string; + + function TranslateMethod(const ARttiMethod: TRttiMethod): string; + const + METHOD_DOC_STR_PATTERN = 'Callable[[%s], %s]'; + var + LParams: TArray; + LParam: TRttiParameter; + begin + LParams := nil; + for LParam in ARttiMethod.GetParameters() do + LParams := LParams + [TranslateType(LParam.ParamType)]; + + Result := Format(METHOD_DOC_STR_PATTERN, [ + String.Join(', ', LParams), + TranslateType(ARttiMethod.ReturnType)]); + end; + + function TranslateInvokable(const ARttiInvokableType: TRttiInvokableType): string; + const + INVOKABLE_DOC_STR_PATTERN = 'Callable[[%s], %s]'; + var + LParams: TArray; + LParam: TRttiParameter; + begin + LParams := nil; + for LParam in ARttiInvokableType.GetParameters() do + LParams := LParams + [TranslateType(LParam.ParamType)]; + + Result := Format(INVOKABLE_DOC_STR_PATTERN, [ + String.Join(', ', LParams), + TranslateType(ARttiInvokableType.ReturnType)]); + end; + +begin + if not Assigned(ARttiObject) then + Result := 'None' + else if PTypeInfo(TypeInfo(boolean)) = ARttiObject.Handle then + Result := 'bool' + else if ARttiObject.InheritsFrom(TRttiMethod) then + Result := TranslateMethod(ARttiObject as TRttiMethod) + else if ARttiObject.InheritsFrom(TRttiInvokableType) then + Result := TranslateInvokable(ARttiObject as TRttiInvokableType) + else if ARttiObject.InheritsFrom(TRttiType) then + case TRttiType(ARttiObject).TypeKind of + tkUnknown, + tkVariant, + tkSet, tkEnumeration, + tkClass, tkMethod, tkProcedure, tkClassRef, tkPointer, + tkRecord, tkMRecord, + tkInterface: + Result := TRttiType(ARttiObject).Name.Replace('T', '', []); + tkInteger, tkInt64: + Result := 'int'; + tkChar: + Result := 'ansichr(bytes)'; + tkWChar: + Result := 'unicodechr(str)'; + tkFloat: + Result := 'float'; + tkString, tkUString, tkWString: + Result := 'str'; + tkLString: + Result := 'ansistr(bytes)'; + tkArray, tkDynArray: + Result := 'tuple'; + end; +end; + +function TMyPyTypeAnnotation.GetMethodTypeAnnotation( + const ARttiMethod: TRttiMethod): string; +const + METHOD_DOC_STR_PATTERN = '%s.%s(%s)'; +var + LArgsStr: string; + LRttiParameter: TRttiParameter; +begin + if (Length(ARttiMethod.GetParameters) = 0) then + Exit(String.Empty); + + LArgsStr := String.Empty; + for LRttiParameter in ARttiMethod.GetParameters do begin + if not LArgsStr.IsEmpty then + LArgsStr := LArgsStr + ', '; + + if not Assigned(LRttiParameter.ParamType) then + LArgsStr := LArgsStr + LRttiParameter.Name + else + LArgsStr := LArgsStr + + LRttiParameter.Name + + ': ' + + TranslateType(LRttiParameter.ParamType); + end; + + Result := String.Format(METHOD_DOC_STR_PATTERN, [ + ARttiMethod.Parent.Name, ARttiMethod.Name, LArgsStr]); + + if Assigned(ARttiMethod.ReturnType) then + Result := Result + + ' -> ' + + TranslateType(ARttiMethod.ReturnType) + else + Result := Result + ' -> None'; + + if not Result.IsEmpty() then + Result := Result + #10; +end; + +function TMyPyTypeAnnotation.GetFieldTypeAnnotation( + const ARttiField: TRttiField): string; +const + FIELD_DOC_STR_PATTERN = '%s: '; +begin + Result := Format(FIELD_DOC_STR_PATTERN, [ + TranslateType(TRttiField(ARttiField).FieldType)]); +end; + +function TMyPyTypeAnnotation.GetPropertyTypeAnnotation( + const ARttiProperty: TRttiProperty): string; +const + PROPERTY_DOC_STR_PATTERN = '%s: '; +begin + Result := Format(PROPERTY_DOC_STR_PATTERN, [ + TranslateType(ARttiProperty.PropertyType)]); +end; + +function TMyPyTypeAnnotation.GetIndexedPropertyTypeAnnotation( + const ARttiIndexedProperty: TRttiIndexedProperty): string; +const + INDEXED_PROPERTY_DOC_STR_PATTERN = '%s: '; +begin + Result := Format(INDEXED_PROPERTY_DOC_STR_PATTERN, [ + TranslateType(ARttiIndexedProperty.PropertyType)]); +end; + +function TMyPyTypeAnnotation.CreateTypeAnnotation( + const ARttiMember: TRttiMember): string; +begin + if ARttiMember.InheritsFrom(TRttiMethod) then + Result := GetMethodTypeAnnotation(TRttiMethod(ARttiMember)) + else if ARttiMember.InheritsFrom(TRttiField) then + Result := GetFieldTypeAnnotation(TRttiField(ARttiMember)) + else if ARttiMember.InheritsFrom(TRttiProperty) then + Result := GetPropertyTypeAnnotation(TRttiProperty(ARttiMember)) + else if ARttiMember.InheritsFrom(TRttiIndexedProperty) then + Result := GetIndexedPropertyTypeAnnotation(TRttiIndexedProperty(ARttiMember)) + else + Result := String.Empty; +end; + +end. diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index 63cf5c2b..fd69085f 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -134,7 +134,7 @@ TNamedParamDesc = record end; TNamedParamArray = array of TNamedParamDesc; -{$IF not defined(FPC) and (defined(OSX64) or defined(LINUX) or not defined(DELPHI10_4_OR_HIGHER))} +{$IF not defined(FPC) and (defined(OSX64) or defined(LINUX) or defined(ANDROID) or not defined(DELPHI10_4_OR_HIGHER))} {$DEFINE PATCHEDSYSTEMDISPINVOKE} //To correct memory leaks {$IFEND} @@ -940,7 +940,7 @@ procedure SetClearVarToEmptyParam(var V: TVarData); CPropertyGet = $02; CPropertySet = $04; -{$IF defined(PATCHEDSYSTEMDISPINVOKE) and (defined(OSX64) or defined(LINUX))} +{$IF defined(PATCHEDSYSTEMDISPINVOKE) and (defined(OSX64) or defined(LINUX) or defined(ANDROID))} { Fixes https://quality.embarcadero.com/browse/RSP-28097 } @@ -1036,14 +1036,11 @@ function GetDispatchInvokeArgs(CallDesc: PCallDesc; Params: Pointer; var Strings varVariant: begin PVarParm^.VType := varEmpty; -{$IFDEF CPUX64} - -// PVariant(PVarParm)^ := PVariant(Params^)^; + {$IFDEF CPU64BITS} PVariant(PVarParm)^ := VarArgGetValue(VAList, PVariant)^; -{$ELSE} -// PVariant(PVarParm)^ := PVariant(Params)^; + {$ELSE} PVariant(PVarParm)^ := VarArgGetValue(VAList, Variant); -{$ENDIF} + {$ENDIF} end; varUnknown: PVarParm^.VUnknown := VarArgGetValue(VAList, Pointer); varSmallint: PVarParm^.VSmallInt := VarArgGetValue(VAList, SmallInt); diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 37889b00..f6518756 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1467,8 +1467,6 @@ class function TExposedMethod.MethodDocStr(ARttiMethod: TRttiMethod): string; Result := Result + ' -> ' + ARttiMethod.ReturnType.Name.Replace('T', '', []); - - Result := Result + #10; end; { TExposedGetSet } @@ -4134,17 +4132,15 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; LExposedMethod := TExposedMethod.Create(LRttiMethod, APyDelphiWrapper, APythonType, LRttiType); - //Try to load the method doc string from doc server //Try to load the method doc string from doc server if Assigned(PyDocServer) and PyDocServer.Initialized and PyDocServer.ReadMemberDocStr(LRttiMethod, LDocStr) then - LExposedMethod.DocString := AnsiString(LDocStr); - - //Build the DocStr including method args - LExposedMethod.DocString := - Utf8Encode(TExposedMethod.MethodDocStr(LRttiMethod)) + - LExposedMethod.DocString; + LExposedMethod.DocString := Utf8Encode(LDocStr) + else + //Build the DocStr including method args + LExposedMethod.DocString := + Utf8Encode(TExposedMethod.MethodDocStr(LRttiMethod)); // Keep it alive until the Wrapper is Finalized APyDelphiWrapper.fExposedMembers.Add(LExposedMethod); diff --git a/Tests/FMX/Android/MethodCallBackTest.pas b/Tests/FMX/Android/MethodCallBackTest.pas index f4d2044f..9ea45f45 100644 --- a/Tests/FMX/Android/MethodCallBackTest.pas +++ b/Tests/FMX/Android/MethodCallBackTest.pas @@ -1,262 +1,262 @@ -(**************************************************************************) -(* *) -(* Module: Unit 'MethodCallbackTest' Copyright (c) 2021 *) -(* *) -(* Lucas Moura Belo - lmbelo *) -(* lucas.belo@live.com *) -(* BH, Brazil *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project pages: https://github.com/Embarcadero/python4delphi *) -(* https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Test unit for MethodCallback *) -(* *) -(* *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) - -unit MethodCallBackTest; - -interface - -uses - DUnitX.TestFramework, - MethodCallback, - PythonLoad; - -implementation - -type - TTwoArgArmStdFunction = function (arg1, arg2: string): integer; - TThreeArgArmStdProcedure = procedure (arg1, arg2, arg3: string); - - TFourArgArmStdFunction = function(arg1, arg2, arg3, arg4: integer): integer; - TFiveArgArmStdFunction = function(arg1, arg2, arg3, arg4, arg5: integer): integer; - - TMyFuncCallback = function(arg1, arg2: string): integer of object; - TMyProcCallback = procedure (arg1, arg2, arg3: string) of object; - - TTestObj = class - public - Argument1: string; - Argument2: string; - Argument3: string; - function TwoArgArmStdFunction(arg1, arg2: string): integer; - procedure ThreeArgArmStdProcedure(arg1, arg2, arg3: string); - function FourArgArmStdFunction(arg1, arg2, arg3, arg4: integer): integer; - function FiveArgArmStdFunction(arg1, arg2, arg3, arg4, arg5: integer): integer; - end; - - [TestFixture] - TMethodCallbackTest = class - private - fTestObj: TTestObj; - public - [SetupFixture] - procedure SetupFixture; - [TearDownFixture] - procedure Teardown; - [Test] - procedure TestDeleteOnEmptyAllocator; - [Test] - procedure TestCallBackArmStd; - [Test] - procedure TestOfObjectCallBackArmStd; - [Test] - procedure TestDeleteCallBack; - [Test] - procedure TestFourArgArmStdFunction; - [Test] - procedure TestFiveArgArmStdFunction; - [Test] - procedure TestMemoryMgmt; - end; - -{ TTestObj } - -function TTestObj.FiveArgArmStdFunction(arg1, arg2, arg3, arg4, - arg5: integer): integer; -begin - Result := arg1 * arg4 + arg2 * arg5 + arg3; -end; - -function TTestObj.FourArgArmStdFunction(arg1, arg2, arg3, arg4: integer): integer; -begin - Result := arg1 * arg3 + arg2 * arg4; -end; - -procedure TTestObj.ThreeArgArmStdProcedure(arg1, arg2, arg3: string); -begin - Argument1:=arg1; - Argument2:=arg2; - Argument3:=arg3; -end; - -function TTestObj.TwoArgArmStdFunction(arg1, arg2: string): integer; -begin - Argument1:=arg1; - Argument2:=arg2; - result:=1; -end; - -{ TMethodCallbackTest } - -procedure TMethodCallbackTest.SetupFixture; -begin - fTestObj:=TTestObj.Create; -end; - -procedure TMethodCallbackTest.Teardown; -begin - fTestObj.Free; - FreeCallBacks; -end; - -procedure TMethodCallbackTest.TestMemoryMgmt; -const - AllocCount = {$IFDEF CPUARM} - {$IFDEF CPUARM32} - 31 - {$ELSE} - 46 - {$ENDIF CPUARM32} - {$ELSE} - {$IFDEF CPUX64} - {$IFDEF MSWINDOWS} - 51 - {$ELSE} - 88 - {$ENDIF} - {$ELSE} - 90 - {$ENDIF} - {$ENDIF}; -var - i: integer; - ptr: Pointer; -begin - //---Test the code-memory manager - - FreeCallBacks; - Assert.AreEqual(0, CodeMemPageCount); - - for i:=1 to AllocCount do - ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 5, ctArmStd); - - // there should still be 1 page allocated - Assert.AreEqual(1, CodeMemPageCount); - - // get one callback more and we should have 2 pages - ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 5, ctArmStd); - // getting CodeMemPageCount would crash as the next page pointer was overwritten by the - // last allocation - Assert.AreEqual(2, CodeMemPageCount); -end; - -procedure TMethodCallbackTest.TestCallBackArmStd; -var - ptr: pointer; - func: TTwoArgArmStdFunction; -begin - ptr:=GetCallBack(fTestObj, @TTestObj.TwoArgArmStdFunction, 2, ctArmStd); - - //---call method through pointer - func:=TTwoArgArmStdFunction(ptr); - - Assert.AreEqual(1, func('first arg', 'second arg')); - Assert.AreEqual(string('first arg'), fTestObj.Argument1); - Assert.AreEqual(string('second arg'), fTestObj.Argument2); -end; - -procedure TMethodCallbackTest.TestDeleteCallBack; -var - ptr1, ptr2, ptr3: Pointer; - proc: TThreeArgArmStdProcedure; - func: TTwoArgArmStdFunction; -begin - //---we create 3 callbacks and delete them. - // if there aren't any AV, we assume it works... - ptr1:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 3, ctArmStd); - ptr2:=GetCallBack(fTestObj, @TTestObj.TwoArgArmStdFunction, 2, ctArmStd); - DeleteCallBack(ptr1); - ptr1:=GetCallBack(fTestObj, @TTestObj.TwoArgArmStdFunction, 2, ctArmStd); - ptr3:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 3, ctArmStd); - - func:=TTwoArgArmStdFunction(ptr1); - func('arg1', 'arg2'); - func:=TTwoArgArmStdFunction(ptr2); - func('arg1', 'arg2'); - proc:=TThreeArgArmStdProcedure(ptr3); - proc('arg1', 'arg2', 'arg3'); - - DeleteCallBack(ptr1); - DeleteCallBack(ptr2); - DeleteCallback(ptr3); - Assert.Pass; -end; - -procedure TMethodCallbackTest.TestDeleteOnEmptyAllocator; -var - ptr1 : Pointer; -begin - ptr1 := nil; - DeleteCallBack(ptr1); - Assert.Pass(); -end; - -procedure TMethodCallbackTest.TestFiveArgArmStdFunction; -Var - CallBack : TFiveArgArmStdFunction; -begin - CallBack := GetCallBack(fTestObj, @TTestObj.FiveArgArmStdFunction, 5, ctArmStd); - Assert.AreEqual(CallBack(1,2,3,4,5), 1*4+2*5+3); - DeleteCallBack(@CallBack); -end; - -procedure TMethodCallbackTest.TestFourArgArmStdFunction; -Var - CallBack : TFourArgArmStdFunction; -begin - CallBack := GetCallBack(fTestObj, @TTestObj.FourArgArmStdFunction, 4, ctArmStd); - Assert.AreEqual(CallBack(1,2,3,4), 1*3+2*4); - DeleteCallBack(@CallBack); -end; - -procedure TMethodCallbackTest.TestOfObjectCallBackArmStd; -var - ptr: pointer; - func: TTwoArgArmStdFunction; - cb: TMyFuncCallBack; -begin - cb:=fTestObj.TwoArgArmStdFunction; - ptr:=GetOfObjectCallBack(TCallBack(cb), 2, ctARMSTD); - - //---call method through pointer - func:=TTwoArgArmStdFunction(ptr); - - Assert.AreEqual(1, func('first arg', 'second arg')); - Assert.AreEqual('first arg', fTestObj.Argument1); - Assert.AreEqual('second arg', fTestObj.Argument2); -end; - -initialization - TDUnitX.RegisterTestFixture(TMethodCallBackTest); - -end. +(**************************************************************************) +(* *) +(* Module: Unit 'MethodCallbackTest' Copyright (c) 2021 *) +(* *) +(* Lucas Moura Belo - lmbelo *) +(* lucas.belo@live.com *) +(* BH, Brazil *) +(* *) +(* PyScripter *) +(* e-mail: pyscripter@gmail.com *) +(* *) +(* Project pages: https://github.com/Embarcadero/python4delphi *) +(* https://github.com/pyscripter/python4delphi *) +(**************************************************************************) +(* Functionality: Test unit for MethodCallback *) +(* *) +(* *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(**************************************************************************) + +unit MethodCallBackTest; + +interface + +uses + DUnitX.TestFramework, + MethodCallback, + PythonLoad; + +implementation + +type + TTwoArgArmStdFunction = function (arg1, arg2: string): integer; + TThreeArgArmStdProcedure = procedure (arg1, arg2, arg3: string); + + TFourArgArmStdFunction = function(arg1, arg2, arg3, arg4: integer): integer; + TFiveArgArmStdFunction = function(arg1, arg2, arg3, arg4, arg5: integer): integer; + + TMyFuncCallback = function(arg1, arg2: string): integer of object; + TMyProcCallback = procedure (arg1, arg2, arg3: string) of object; + + TTestObj = class + public + Argument1: string; + Argument2: string; + Argument3: string; + function TwoArgArmStdFunction(arg1, arg2: string): integer; + procedure ThreeArgArmStdProcedure(arg1, arg2, arg3: string); + function FourArgArmStdFunction(arg1, arg2, arg3, arg4: integer): integer; + function FiveArgArmStdFunction(arg1, arg2, arg3, arg4, arg5: integer): integer; + end; + + [TestFixture] + TMethodCallbackTest = class + private + fTestObj: TTestObj; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure Teardown; + [Test] + procedure TestDeleteOnEmptyAllocator; + [Test] + procedure TestCallBackArmStd; + [Test] + procedure TestOfObjectCallBackArmStd; + [Test] + procedure TestDeleteCallBack; + [Test] + procedure TestFourArgArmStdFunction; + [Test] + procedure TestFiveArgArmStdFunction; + [Test] + procedure TestMemoryMgmt; + end; + +{ TTestObj } + +function TTestObj.FiveArgArmStdFunction(arg1, arg2, arg3, arg4, + arg5: integer): integer; +begin + Result := arg1 * arg4 + arg2 * arg5 + arg3; +end; + +function TTestObj.FourArgArmStdFunction(arg1, arg2, arg3, arg4: integer): integer; +begin + Result := arg1 * arg3 + arg2 * arg4; +end; + +procedure TTestObj.ThreeArgArmStdProcedure(arg1, arg2, arg3: string); +begin + Argument1:=arg1; + Argument2:=arg2; + Argument3:=arg3; +end; + +function TTestObj.TwoArgArmStdFunction(arg1, arg2: string): integer; +begin + Argument1:=arg1; + Argument2:=arg2; + result:=1; +end; + +{ TMethodCallbackTest } + +procedure TMethodCallbackTest.SetupFixture; +begin + fTestObj:=TTestObj.Create; +end; + +procedure TMethodCallbackTest.Teardown; +begin + fTestObj.Free; + FreeCallBacks; +end; + +procedure TMethodCallbackTest.TestMemoryMgmt; +const + AllocCount = {$IFDEF CPUARM} + {$IFDEF CPUARM32} + 31 + {$ELSE} + 46 + {$ENDIF CPUARM32} + {$ELSE} + {$IFDEF CPUX64} + {$IFDEF MSWINDOWS} + 51 + {$ELSE} + 88 + {$ENDIF} + {$ELSE} + 90 + {$ENDIF} + {$ENDIF}; +var + i: integer; + ptr: Pointer; +begin + //---Test the code-memory manager + + FreeCallBacks; + Assert.AreEqual(0, CodeMemPageCount); + + for i:=1 to AllocCount do + ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 5, ctArmStd); + + // there should still be 1 page allocated + Assert.AreEqual(1, CodeMemPageCount); + + // get one callback more and we should have 2 pages + ptr:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 5, ctArmStd); + // getting CodeMemPageCount would crash as the next page pointer was overwritten by the + // last allocation + Assert.AreEqual(2, CodeMemPageCount); +end; + +procedure TMethodCallbackTest.TestCallBackArmStd; +var + ptr: pointer; + func: TTwoArgArmStdFunction; +begin + ptr:=GetCallBack(fTestObj, @TTestObj.TwoArgArmStdFunction, 2, ctArmStd); + + //---call method through pointer + func:=TTwoArgArmStdFunction(ptr); + + Assert.AreEqual(1, func('first arg', 'second arg')); + Assert.AreEqual(string('first arg'), fTestObj.Argument1); + Assert.AreEqual(string('second arg'), fTestObj.Argument2); +end; + +procedure TMethodCallbackTest.TestDeleteCallBack; +var + ptr1, ptr2, ptr3: Pointer; + proc: TThreeArgArmStdProcedure; + func: TTwoArgArmStdFunction; +begin + //---we create 3 callbacks and delete them. + // if there aren't any AV, we assume it works... + ptr1:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 3, ctArmStd); + ptr2:=GetCallBack(fTestObj, @TTestObj.TwoArgArmStdFunction, 2, ctArmStd); + DeleteCallBack(ptr1); + ptr1:=GetCallBack(fTestObj, @TTestObj.TwoArgArmStdFunction, 2, ctArmStd); + ptr3:=GetCallBack(fTestObj, @TTestObj.ThreeArgArmStdProcedure, 3, ctArmStd); + + func:=TTwoArgArmStdFunction(ptr1); + func('arg1', 'arg2'); + func:=TTwoArgArmStdFunction(ptr2); + func('arg1', 'arg2'); + proc:=TThreeArgArmStdProcedure(ptr3); + proc('arg1', 'arg2', 'arg3'); + + DeleteCallBack(ptr1); + DeleteCallBack(ptr2); + DeleteCallback(ptr3); + Assert.Pass; +end; + +procedure TMethodCallbackTest.TestDeleteOnEmptyAllocator; +var + ptr1 : Pointer; +begin + ptr1 := nil; + DeleteCallBack(ptr1); + Assert.Pass(); +end; + +procedure TMethodCallbackTest.TestFiveArgArmStdFunction; +Var + CallBack : TFiveArgArmStdFunction; +begin + CallBack := GetCallBack(fTestObj, @TTestObj.FiveArgArmStdFunction, 5, ctArmStd); + Assert.AreEqual(CallBack(1,2,3,4,5), 1*4+2*5+3); + DeleteCallBack(@CallBack); +end; + +procedure TMethodCallbackTest.TestFourArgArmStdFunction; +Var + CallBack : TFourArgArmStdFunction; +begin + CallBack := GetCallBack(fTestObj, @TTestObj.FourArgArmStdFunction, 4, ctArmStd); + Assert.AreEqual(CallBack(1,2,3,4), 1*3+2*4); + DeleteCallBack(@CallBack); +end; + +procedure TMethodCallbackTest.TestOfObjectCallBackArmStd; +var + ptr: pointer; + func: TTwoArgArmStdFunction; + cb: TMyFuncCallBack; +begin + cb:=fTestObj.TwoArgArmStdFunction; + ptr:=GetOfObjectCallBack(TCallBack(cb), 2, ctARMSTD); + + //---call method through pointer + func:=TTwoArgArmStdFunction(ptr); + + Assert.AreEqual(1, func('first arg', 'second arg')); + Assert.AreEqual('first arg', fTestObj.Argument1); + Assert.AreEqual('second arg', fTestObj.Argument2); +end; + +initialization + TDUnitX.RegisterTestFixture(TMethodCallBackTest); + +end. diff --git a/Tests/FMX/Android/P4DAndroidTest.dpr b/Tests/FMX/Android/P4DAndroidTest.dpr index c711bef2..a4b96caa 100644 --- a/Tests/FMX/Android/P4DAndroidTest.dpr +++ b/Tests/FMX/Android/P4DAndroidTest.dpr @@ -1,18 +1,18 @@ -program P4DAndroidTest; -uses - System.StartUpCopy, - FMX.Forms, - DUNitX.Loggers.MobileGUI, - MethodCallBackTest in 'MethodCallBackTest.pas', - NumberServicesTest in 'NumberServicesTest.pas', - PyEnvTest in 'PyEnvTest.pas', - PythonLoad in 'PythonLoad.pas', - VarPythTest in 'VarPythTest.pas', - WrapDelphiTest in 'WrapDelphiTest.pas'; - -{$R *.res} -begin - Application.Initialize; - Application.CreateForm(TMobileGUITestRunner, MobileGUITestRunner); - Application.Run; -end. +program P4DAndroidTest; +uses + System.StartUpCopy, + FMX.Forms, + DUNitX.Loggers.MobileGUI, + MethodCallBackTest in 'MethodCallBackTest.pas', + NumberServicesTest in 'NumberServicesTest.pas', + PyEnvTest in 'PyEnvTest.pas', + PythonLoad in 'PythonLoad.pas', + VarPythTest in 'VarPythTest.pas', + WrapDelphiTest in 'WrapDelphiTest.pas'; + +{$R *.res} +begin + Application.Initialize; + Application.CreateForm(TMobileGUITestRunner, MobileGUITestRunner); + Application.Run; +end. diff --git a/Tests/FMX/Android/P4DAndroidTest.dproj b/Tests/FMX/Android/P4DAndroidTest.dproj index d4528baf..601a5c8e 100644 --- a/Tests/FMX/Android/P4DAndroidTest.dproj +++ b/Tests/FMX/Android/P4DAndroidTest.dproj @@ -1,1847 +1,1847 @@ - - - {652D9A8E-1625-4F00-9B29-2E3D31D7A186} - 19.3 - FMX - True - Debug - Android - 168979 - Application - P4DAndroidTest.dpr - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - - - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - true - true - true - true - true - true - true - true - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - P4DAndroidTest - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - true - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - true - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - Debug - true - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - Debug - true - true - Base - true - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage);$(DCC_UsePackage) - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - 1 - C:\Users\User\Documents\Embarcadero\Studio\Projects\Embarcadero\python4delphi\Source\;$(Debugger_DebugSourcePath) - #000000 - - - 1 - #000000 - C:\Users\lucas\OneDrive\Documents\Embarcadero\Studio\Projects\python4delphi\Source\;$(Debugger_DebugSourcePath) - - - false - true - PerMonitorV2 - - - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - 1 - #000000 - - - 1 - #000000 - - - true - PerMonitorV2 - - - true - PerMonitorV2 - - - - MainSource - - - - - - - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Application - - - - P4DAndroidTest.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - true - - - - - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - true - - - - - true - - - - - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - true - - - - - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - true - - - - - styles.xml - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - 64 - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - true - - - - - libPyLoad.so - true - - - - - libPyLoad.so - true - - - - - classes.dex - true - - - - - library\lib\armeabi-v7a\ - libpython3.9.so - true - - - - - library\lib\armeabi-v7a\ - libpython3.9.so - true - - - - - libPyLoad.so - true - - - - - ic_notification.png - true - - - - - styles.xml - true - - - - - styles.xml - true - - - - - ic_launcher.png - true - - - - - libPyLoad.so - true - - - - - ic_notification.png - true - - - - - ic_launcher.png - true - - - - - library\lib\arm64-v8a\ - libpython3.9.so - true - - - - - library\lib\arm64-v8a\ - libpython3.9.so - true - - - - - 64 - true - - - - - libPyLoad.so - true - - - - - libPyLoad.so - true - - - - - true - - - - - ic_launcher.png - true - - - - - classes.dex - true - - - - - classes.dex - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - ic_launcher.png - true - - - - - true - - - - - .\assets\internal - build.zip - true - - - - - .\assets\internal - build.zip - true - - - - - .\assets\internal - build.zip - true - - - - - true - - - - - .\assets\internal - build.zip - true - - - - - true - - - - - classes.dex - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - libP4DAndroidTest.so - true - - - - - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - libPyLoad.so - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - libPyLoad.so - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - true - - - - - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - true - - - - - true - - - - - true - - - - - true - - - - - ic_launcher.png - true - - - - - ic_launcher.png - true - - - - - libP4DAndroidTest.so - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - true - - - - - ic_notification.png - true - - - - - true - - - - - ic_notification.png - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - libPyLoad.so - true - - - - - libPyLoad.so - true - - - - - P4DAndroidTest.exe - true - - - - - true - - - - - libP4DAndroidTest.so - true - - - - - libP4DAndroidTest.so - true - - - - - styles.xml - true - - - - - ic_notification.png - true - - - - - ic_notification.png - true - - - - - splash_image.png - true - - - - - splash_image.png - true - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - classes - 1 - - - classes - 1 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - - - True - True - True - False - True - True - True - True - - - 12 - - - - - + + + {652D9A8E-1625-4F00-9B29-2E3D31D7A186} + 19.3 + FMX + True + Debug + Android + 168979 + Application + P4DAndroidTest.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + true + true + true + true + true + true + true + true + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + P4DAndroidTest + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + true + Base + true + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage);$(DCC_UsePackage) + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;PythonVcl;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;PythonFmx;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + 1 + C:\Users\User\Documents\Embarcadero\Studio\Projects\Embarcadero\python4delphi\Source\;$(Debugger_DebugSourcePath) + #000000 + + + 1 + #000000 + C:\Users\lucas\OneDrive\Documents\Embarcadero\Studio\Projects\python4delphi\Source\;$(Debugger_DebugSourcePath) + + + false + true + PerMonitorV2 + + + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + 1 + #000000 + + + 1 + #000000 + + + true + PerMonitorV2 + + + true + PerMonitorV2 + + + + MainSource + + + + + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + P4DAndroidTest.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + true + + + + + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + true + + + + + true + + + + + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + true + + + + + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + true + + + + + styles.xml + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + 64 + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + true + + + + + libPyLoad.so + true + + + + + libPyLoad.so + true + + + + + classes.dex + true + + + + + library\lib\armeabi-v7a\ + libpython3.9.so + true + + + + + library\lib\armeabi-v7a\ + libpython3.9.so + true + + + + + libPyLoad.so + true + + + + + ic_notification.png + true + + + + + styles.xml + true + + + + + styles.xml + true + + + + + ic_launcher.png + true + + + + + libPyLoad.so + true + + + + + ic_notification.png + true + + + + + ic_launcher.png + true + + + + + library\lib\arm64-v8a\ + libpython3.9.so + true + + + + + library\lib\arm64-v8a\ + libpython3.9.so + true + + + + + 64 + true + + + + + libPyLoad.so + true + + + + + libPyLoad.so + true + + + + + true + + + + + ic_launcher.png + true + + + + + classes.dex + true + + + + + classes.dex + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + ic_launcher.png + true + + + + + true + + + + + .\assets\internal + build.zip + true + + + + + .\assets\internal + build.zip + true + + + + + .\assets\internal + build.zip + true + + + + + true + + + + + .\assets\internal + build.zip + true + + + + + true + + + + + classes.dex + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + libP4DAndroidTest.so + true + + + + + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + libPyLoad.so + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + libPyLoad.so + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + true + + + + + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + ic_launcher.png + true + + + + + ic_launcher.png + true + + + + + libP4DAndroidTest.so + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + true + + + + + ic_notification.png + true + + + + + true + + + + + ic_notification.png + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + libPyLoad.so + true + + + + + libPyLoad.so + true + + + + + P4DAndroidTest.exe + true + + + + + true + + + + + libP4DAndroidTest.so + true + + + + + libP4DAndroidTest.so + true + + + + + styles.xml + true + + + + + ic_notification.png + true + + + + + ic_notification.png + true + + + + + splash_image.png + true + + + + + splash_image.png + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + + True + True + True + False + True + True + True + True + + + 12 + + + + + diff --git a/Tests/FMX/Android/PyEnvTest.pas b/Tests/FMX/Android/PyEnvTest.pas index d76098b2..1832098c 100644 --- a/Tests/FMX/Android/PyEnvTest.pas +++ b/Tests/FMX/Android/PyEnvTest.pas @@ -1,106 +1,106 @@ -(**************************************************************************) -(* *) -(* Module: Unit 'PyEnvTest' Copyright (c) 2021 *) -(* *) -(* Lucas Moura Belo - lmbelo *) -(* lucas.belo@live.com *) -(* BH, Brazil *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project pages: https://github.com/Embarcadero/python4delphi *) -(* https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Test unit for Python's environment *) -(* *) -(* *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) - -unit PyEnvTest; - -interface - -uses - DUnitX.TestFramework, PythonEngine; - -type - [TestFixture] - TPyEnvTest = class - private - FPythonEngine: TPythonEngine; - public - [SetupFixture] - procedure SetupFixture; - [TearDownFixture] - procedure TearDownFixture; - [Test] - procedure TestLibFile(); - [Test] - procedure TestZipFile(); - [Test] - procedure TestExtraction(); - [Test] - procedure TestConfigure(); - end; - -implementation - -uses - PythonLoad; - -{ TPyEnvTest } - -procedure TPyEnvTest.SetupFixture; -begin - FPythonEngine := TPythonEngine.Create(nil); - FPythonEngine.Name := 'PythonEngine'; -end; - -procedure TPyEnvTest.TearDownFixture; -begin - FPythonEngine.Free(); -end; - -procedure TPyEnvTest.TestConfigure; -begin - TPythonLoad.Configure(FPythonEngine); - FPythonEngine.LoadDll; - Assert.IsTrue(FPythonEngine.IsHandleValid()); -end; - -procedure TPyEnvTest.TestExtraction; -begin - TPythonLoad.Extract(); - Assert.IsTrue(TPythonLoad.HasPythonDist()); -end; - -procedure TPyEnvTest.TestLibFile; -begin - Assert.IsTrue(TPythonLoad.HasPythonLib()); -end; - -procedure TPyEnvTest.TestZipFile; -begin - Assert.IsTrue(TPythonLoad.HasPythonZip()); -end; - -initialization - TDUnitX.RegisterTestFixture(TPyEnvTest); - -end. +(**************************************************************************) +(* *) +(* Module: Unit 'PyEnvTest' Copyright (c) 2021 *) +(* *) +(* Lucas Moura Belo - lmbelo *) +(* lucas.belo@live.com *) +(* BH, Brazil *) +(* *) +(* PyScripter *) +(* e-mail: pyscripter@gmail.com *) +(* *) +(* Project pages: https://github.com/Embarcadero/python4delphi *) +(* https://github.com/pyscripter/python4delphi *) +(**************************************************************************) +(* Functionality: Test unit for Python's environment *) +(* *) +(* *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(**************************************************************************) + +unit PyEnvTest; + +interface + +uses + DUnitX.TestFramework, PythonEngine; + +type + [TestFixture] + TPyEnvTest = class + private + FPythonEngine: TPythonEngine; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure TearDownFixture; + [Test] + procedure TestLibFile(); + [Test] + procedure TestZipFile(); + [Test] + procedure TestExtraction(); + [Test] + procedure TestConfigure(); + end; + +implementation + +uses + PythonLoad; + +{ TPyEnvTest } + +procedure TPyEnvTest.SetupFixture; +begin + FPythonEngine := TPythonEngine.Create(nil); + FPythonEngine.Name := 'PythonEngine'; +end; + +procedure TPyEnvTest.TearDownFixture; +begin + FPythonEngine.Free(); +end; + +procedure TPyEnvTest.TestConfigure; +begin + TPythonLoad.Configure(FPythonEngine); + FPythonEngine.LoadDll; + Assert.IsTrue(FPythonEngine.IsHandleValid()); +end; + +procedure TPyEnvTest.TestExtraction; +begin + TPythonLoad.Extract(); + Assert.IsTrue(TPythonLoad.HasPythonDist()); +end; + +procedure TPyEnvTest.TestLibFile; +begin + Assert.IsTrue(TPythonLoad.HasPythonLib()); +end; + +procedure TPyEnvTest.TestZipFile; +begin + Assert.IsTrue(TPythonLoad.HasPythonZip()); +end; + +initialization + TDUnitX.RegisterTestFixture(TPyEnvTest); + +end. diff --git a/Tests/FMX/Android/PythonLoad.pas b/Tests/FMX/Android/PythonLoad.pas index f8a33ac7..b022fb1e 100644 --- a/Tests/FMX/Android/PythonLoad.pas +++ b/Tests/FMX/Android/PythonLoad.pas @@ -1,129 +1,129 @@ -(**************************************************************************) -(* *) -(* Module: Unit 'PythonLoad' Copyright (c) 2021 *) -(* *) -(* Lucas Moura Belo - lmbelo *) -(* lucas.belo@live.com *) -(* BH, Brazil *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project pages: https://github.com/Embarcadero/python4delphi *) -(* https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Load python distribution *) -(* *) -(* *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) - -unit PythonLoad; - -interface - -uses - System.SysUtils, System.Zip, PythonEngine; - -type - TExtractEvent = reference to procedure(const AFolderExists: boolean; var AReplaceFiles: boolean); - TPythonLoad = class - public - class function GetPyZip(): string; static; - class function GetPyRoot(): string; static; - class function GetPyHome(): string; static; - class function GetPyBin(): string; static; - class function GetPyLib(): string; static; - - class function HasPythonLib(): boolean; static; - class function HasPythonZip(): boolean; static; - class function HasPythonDist(): boolean; static; - class procedure Extract(); static; - class procedure Configure(const APythonEngine: TPythonEngine); static; - end; - -implementation - -uses - System.IOUtils; - -const - PY_KNOWN_VER = 7; - -{ TPythonLoad } - -class procedure TPythonLoad.Extract(); -begin - var LPyRoot := TPythonLoad.GetPyRoot(); - var LPyZip := TPythonLoad.GetPyZip(); - - if not TDirectory.Exists(LPyRoot) then - TZipFile.ExtractZipFile(LPyZip, LPyRoot, nil); -end; - -class function TPythonLoad.GetPyBin: string; -begin - Result := TPath.Combine(GetPyHome(), 'bin'); -end; - -class function TPythonLoad.GetPyHome: string; -begin - Result := TPath.Combine(GetPyRoot(), 'usr'); -end; - -class function TPythonLoad.GetPyLib: string; -begin - Result := TPath.Combine(GetPyHome(), 'lib'); -end; - -class function TPythonLoad.GetPyRoot: string; -begin - Result := TPath.Combine(TPath.GetDocumentsPath(), 'build'); -end; - -class function TPythonLoad.GetPyZip: string; -begin - Result := TPath.Combine(TPath.GetDocumentsPath(), 'build.zip'); -end; - -class function TPythonLoad.HasPythonDist: boolean; -begin - Result := TDirectory.Exists(TPythonLoad.GetPyRoot()); -end; - -class function TPythonLoad.HasPythonLib: boolean; -begin - Result := TFile.Exists(TPath.Combine(TPath.GetLibraryPath(), - PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName)); -end; - -class function TPythonLoad.HasPythonZip: boolean; -begin - Result := TFile.Exists(TPythonLoad.GetPyZip()); -end; - -class procedure TPythonLoad.Configure(const APythonEngine: TPythonEngine); -begin - APythonEngine.UseLastKnownVersion := false; - APythonEngine.ProgramName := TPythonLoad.GetPyBin(); - APythonEngine.PythonHome := TPythonLoad.GetPyHome(); - APythonEngine.RegVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].RegVersion; - APythonEngine.DllName := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName; - APythonEngine.APIVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].APIVersion; -end; - -end. +(**************************************************************************) +(* *) +(* Module: Unit 'PythonLoad' Copyright (c) 2021 *) +(* *) +(* Lucas Moura Belo - lmbelo *) +(* lucas.belo@live.com *) +(* BH, Brazil *) +(* *) +(* PyScripter *) +(* e-mail: pyscripter@gmail.com *) +(* *) +(* Project pages: https://github.com/Embarcadero/python4delphi *) +(* https://github.com/pyscripter/python4delphi *) +(**************************************************************************) +(* Functionality: Load python distribution *) +(* *) +(* *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(**************************************************************************) + +unit PythonLoad; + +interface + +uses + System.SysUtils, System.Zip, PythonEngine; + +type + TExtractEvent = reference to procedure(const AFolderExists: boolean; var AReplaceFiles: boolean); + TPythonLoad = class + public + class function GetPyZip(): string; static; + class function GetPyRoot(): string; static; + class function GetPyHome(): string; static; + class function GetPyBin(): string; static; + class function GetPyLib(): string; static; + + class function HasPythonLib(): boolean; static; + class function HasPythonZip(): boolean; static; + class function HasPythonDist(): boolean; static; + class procedure Extract(); static; + class procedure Configure(const APythonEngine: TPythonEngine); static; + end; + +implementation + +uses + System.IOUtils; + +const + PY_KNOWN_VER = 7; + +{ TPythonLoad } + +class procedure TPythonLoad.Extract(); +begin + var LPyRoot := TPythonLoad.GetPyRoot(); + var LPyZip := TPythonLoad.GetPyZip(); + + if not TDirectory.Exists(LPyRoot) then + TZipFile.ExtractZipFile(LPyZip, LPyRoot, nil); +end; + +class function TPythonLoad.GetPyBin: string; +begin + Result := TPath.Combine(GetPyHome(), 'bin'); +end; + +class function TPythonLoad.GetPyHome: string; +begin + Result := TPath.Combine(GetPyRoot(), 'usr'); +end; + +class function TPythonLoad.GetPyLib: string; +begin + Result := TPath.Combine(GetPyHome(), 'lib'); +end; + +class function TPythonLoad.GetPyRoot: string; +begin + Result := TPath.Combine(TPath.GetDocumentsPath(), 'build'); +end; + +class function TPythonLoad.GetPyZip: string; +begin + Result := TPath.Combine(TPath.GetDocumentsPath(), 'build.zip'); +end; + +class function TPythonLoad.HasPythonDist: boolean; +begin + Result := TDirectory.Exists(TPythonLoad.GetPyRoot()); +end; + +class function TPythonLoad.HasPythonLib: boolean; +begin + Result := TFile.Exists(TPath.Combine(TPath.GetLibraryPath(), + PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName)); +end; + +class function TPythonLoad.HasPythonZip: boolean; +begin + Result := TFile.Exists(TPythonLoad.GetPyZip()); +end; + +class procedure TPythonLoad.Configure(const APythonEngine: TPythonEngine); +begin + APythonEngine.UseLastKnownVersion := false; + APythonEngine.ProgramName := TPythonLoad.GetPyBin(); + APythonEngine.PythonHome := TPythonLoad.GetPyHome(); + APythonEngine.RegVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].RegVersion; + APythonEngine.DllName := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName; + APythonEngine.APIVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].APIVersion; +end; + +end. diff --git a/Tests/FMX/Android/VarPythTest.pas b/Tests/FMX/Android/VarPythTest.pas index ca1e0043..f26fce2b 100644 --- a/Tests/FMX/Android/VarPythTest.pas +++ b/Tests/FMX/Android/VarPythTest.pas @@ -1,1084 +1,1084 @@ -(**************************************************************************) -(* *) -(* Module: Unit 'VarPythTest' Copyright (c) 2021 *) -(* *) -(* Lucas Moura Belo - lmbelo *) -(* lucas.belo@live.com *) -(* BH, Brazil *) -(* *) -(* PyScripter *) -(* e-mail: pyscripter@gmail.com *) -(* *) -(* Project pages: https://github.com/Embarcadero/python4delphi *) -(* https://github.com/pyscripter/python4delphi *) -(**************************************************************************) -(* Functionality: Test unit for variants *) -(* *) -(* *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(**************************************************************************) - -unit VarPythTest; - -interface - -uses - DUnitX.TestFramework, - PythonEngine, - PythonLoad; - -type - {$M+} - [TestFixture] - TVarPythTest = class - private - FPythonEngine: TPythonEngine; - public - [SetupFixture] - procedure SetupFixture; - [TearDownFixture] - procedure TearDownFixture; - [Test] - procedure TestIterator; - [Test] - procedure TestIntegers; - [Test] - procedure TestFloats; - [Test] - procedure TestStrings; - [Test] - procedure TestSequences; - [Test] - procedure TestMappings; - [Test] - procedure TestDates; - [Test] - procedure TestObjects; - end; - -implementation - -uses - SysUtils, StrUtils, - Variants, - VarPyth; - -{ TVarPythTest } - -procedure TVarPythTest.SetupFixture; -begin - FPythonEngine := TPythonEngine.Create(nil); - FPythonEngine.Name := 'PythonEngine'; - TPythonLoad.Configure(FPythonEngine); - FPythonEngine.LoadDll; -end; -procedure TVarPythTest.TearDownFixture; -begin - FPythonEngine.Free(); -end; -procedure TVarPythTest.TestDates; -var - a, b, _timeMod : Variant; - c : Variant; - _date, _date2 : TDateTime; - _year, _month, _day : Word; - _year2, _month2, _day2 : Word; - _hour, _min, _sec, _msec : Word; - _hour2, _min2, _sec2, _msec2 : Word; -begin - _timeMod := Import('time'); // get the time module of Python - _date := Now; - DecodeDate( _date, _year, _month, _day ); - DecodeTime( _date, _hour, _min, _sec, _msec ); - b := _timeMod.localtime(_timeMod.time()); // same as Now in Delphi - a := VarPythonCreate(_date); - Assert.IsTrue( a.Length = 9 ); - Assert.IsTrue( a.GetItem(0) = _year ); - Assert.IsTrue( a.GetItem(1) = _month ); - Assert.IsTrue( a.GetItem(2) = _day ); - Assert.IsTrue( a.GetItem(3) = _hour ); - Assert.IsTrue( a.GetItem(4) = _min ); - Assert.IsTrue( a.GetItem(5) = _sec ); - Assert.IsTrue( b.Length = 9 ); - Assert.IsTrue( b.GetItem(0) = a.GetItem(0) ); - Assert.IsTrue( b.GetItem(1) = a.GetItem(1) ); - Assert.IsTrue( b.GetItem(2) = a.GetItem(2) ); - Assert.IsTrue( b.GetItem(3) = a.GetItem(3) ); - Assert.IsTrue( b.GetItem(4) = a.GetItem(4) ); - Assert.IsTrue( b.GetItem(5) = a.GetItem(5) ); - Assert.IsTrue( b.GetItem(6) = a.GetItem(6) ); - Assert.IsTrue( b.GetItem(7) = a.GetItem(7) ); - // don't test the 9th item of the tuple, because it's the daylight saving, - // and it's not computed by the Python for Delphi. - //Assert.IsTrue( b.GetItem(8) = a.GetItem(8) ); - _date2 := b; - DecodeDate( _date2, _year2, _month2, _day2 ); - DecodeTime( _date2, _hour2, _min2, _sec2, _msec2 ); - Assert.IsTrue( _year2 = _year ); - Assert.IsTrue( _month2 = _month ); - Assert.IsTrue( _day2 = _day ); - Assert.IsTrue( _hour2 = _hour ); - Assert.IsTrue( _min2 = _min ); - Assert.IsTrue( _sec2 = _sec ); - // test new datetime module - _timeMod := Import('datetime'); // get the datetime module of Python - //or _timeMod := DatetimeModule; // get the datetime module of Python - a := _timeMod.datetime(2002, 12, 30, 22, 15, 38, 827738); - Assert.IsTrue(VarIsPythonDateTime(a)); - Assert.IsTrue(VarIsPythonDate(a)); - Assert.IsTrue(not VarIsPythonTime(a)); - Assert.IsTrue(not VarIsPythonDateTimeDelta(a)); - Assert.IsTrue(a.year = 2002); - Assert.IsTrue(a.month = 12); - Assert.IsTrue(a.day = 30); - Assert.IsTrue(a.hour = 22); - Assert.IsTrue(a.minute = 15); - Assert.IsTrue(a.second = 38); - Assert.IsTrue(a.microsecond = 827738); - _date := a; - DecodeDate( _date, _year, _month, _day ); - DecodeTime( _date, _hour, _min, _sec, _msec ); - Assert.IsTrue(_year = 2002); - Assert.IsTrue(_month = 12); - Assert.IsTrue(_day = 30); - Assert.IsTrue(_hour = 22); - Assert.IsTrue(_min = 15); - Assert.IsTrue(_sec = 38); - Assert.IsTrue(_msec = 827738 div 1000); - a := _timeMod.date(2002, 12, 30); - Assert.IsTrue(not VarIsPythonDateTime(a)); - Assert.IsTrue(VarIsPythonDate(a)); - Assert.IsTrue(not VarIsPythonTime(a)); - Assert.IsTrue(not VarIsPythonDateTimeDelta(a)); - _date := a; - DecodeDate( _date, _year, _month, _day ); - DecodeTime( _date, _hour, _min, _sec, _msec ); - Assert.IsTrue(_year = 2002); - Assert.IsTrue(_month = 12); - Assert.IsTrue(_day = 30); - Assert.IsTrue(_hour = 0); - Assert.IsTrue(_min = 0); - Assert.IsTrue(_sec = 0); - Assert.IsTrue(_msec = 0); - Assert.IsTrue(a.year = 2002); - Assert.IsTrue(a.month = 12); - Assert.IsTrue(a.day = 30); - a := _timeMod.time(22, 15, 38, 827738); - Assert.IsTrue(not VarIsPythonDateTime(a)); - Assert.IsTrue(not VarIsPythonDate(a)); - Assert.IsTrue(VarIsPythonTime(a)); - Assert.IsTrue(not VarIsPythonDateTimeDelta(a)); - Assert.IsTrue(a.hour = 22); - Assert.IsTrue(a.minute = 15); - Assert.IsTrue(a.second = 38); - Assert.IsTrue(a.microsecond = 827738); - _date := a; - DecodeTime( _date, _hour, _min, _sec, _msec ); - Assert.IsTrue(_hour = 22); - Assert.IsTrue(_min = 15); - Assert.IsTrue(_sec = 38); - Assert.IsTrue(_msec = 827738 div 1000); - a := DatetimeModule.datetime(2002, 12, 30, 22, 15, 38, 827738); - b := _timeMod.datetime(2002, 12, 30, 22, 16, 38, 827738); - c := b - a; - Assert.IsTrue(VarIsPythonDateTimeDelta(c)); - Assert.IsTrue(c.days = 0); - Assert.IsTrue(c.seconds = 60); - Assert.IsTrue(c.microseconds = 0); - _date := c; - Assert.IsTrue(Trunc(_date)=0); - DecodeTime( _date, _hour, _min, _sec, _msec ); - Assert.IsTrue(_hour = 0); - Assert.IsTrue(_min = 1); - Assert.IsTrue(_sec = 0); - Assert.IsTrue(_msec = 0); - c := a - b; - Assert.IsTrue(VarIsPythonDateTimeDelta(c)); - Assert.IsTrue(c.days = -1); - Assert.IsTrue(c.seconds = 86340); - Assert.IsTrue(c.microseconds = 0); - _date := c; - Assert.IsTrue(Trunc(_date)=0); - Assert.IsTrue(_date<0); - DecodeTime( _date, _hour, _min, _sec, _msec ); - Assert.IsTrue(_hour = 0); - Assert.IsTrue(_min = 1); - Assert.IsTrue(_sec = 0); - Assert.IsTrue(_msec = 0); - c := a + (b-a); - Assert.IsTrue(VarIsPythonDateTime(c)); - Assert.IsTrue(c = b); - Assert.IsTrue(c <> a); - Assert.IsTrue(a < b); - Assert.IsTrue(b > a); - GetPythonEngine.DatetimeConversionMode := dcmToDatetime; - try - _date := EncodeDate(2003, 01, 28) + EncodeTime(12, 22, 33, 450); - a := VarPythonCreate(_date); - Assert.IsTrue(VarIsPythonDateTime(c)); - _date2 := a; - DecodeDate( _date, _year, _month, _day ); - DecodeTime( _date, _hour, _min, _sec, _msec ); - DecodeDate( _date2, _year2, _month2, _day2 ); - DecodeTime( _date2, _hour2, _min2, _sec2, _msec2 ); - Assert.IsTrue( _year2 = _year ); - Assert.IsTrue( _month2 = _month ); - Assert.IsTrue( _day2 = _day ); - Assert.IsTrue( _hour2 = _hour ); - Assert.IsTrue( _min2 = _min ); - Assert.IsTrue( _sec2 = _sec ); - Assert.IsTrue( _msec2 = _msec ); - Assert.IsTrue(a.year = 2003); - Assert.IsTrue(a.month = 01); - Assert.IsTrue(a.day = 28); - Assert.IsTrue(a.hour = 12); - Assert.IsTrue(a.minute = 22); - Assert.IsTrue(a.second = 33); - Assert.IsTrue(a.microsecond = 450000); - finally - GetPythonEngine.DatetimeConversionMode := dcmToTuple; - end; -end; -procedure TVarPythTest.TestFloats; -var - a, b, c : Variant; - dbl_a, dbl_b, dbl_c : Double; - int : Integer; -begin - // initialize the operands - dbl_a := 2.5; - a := VarPythonCreate(dbl_a); - Assert.IsTrue(VarIsPython(a)); - Assert.IsTrue(VarIsPythonNumber(a)); - Assert.IsTrue(VarIsPythonFloat(a)); - Assert.IsTrue(Double(a) = 2.5); - dbl_b := 3.2; - b := VarPythonCreate(dbl_b); - Assert.IsTrue(VarIsPython(b)); - Assert.IsTrue(VarIsPythonNumber(b)); - Assert.IsTrue(VarIsPythonFloat(b)); - Assert.IsTrue(Double(b) = dbl_b); // note that Assert.IsTrue(Double(b) = 3.2) fails. - // arithmetic operations - //---------------------- - // addition - c := a + b; - // check result of operation - Assert.IsTrue( Double(c) = (dbl_a + dbl_b) ); - // check that operation did not change the content of operands. - Assert.IsTrue(Double(a) = dbl_a); - Assert.IsTrue(Double(b) = dbl_b); - // now with a litteral - c := a + b + 1; - Assert.IsTrue( Double(c) = (dbl_a+dbl_b+1) ); - c := a + 1 + b; - Assert.IsTrue( Double(c) = (dbl_a+1+dbl_b) ); - c := 1 + a + b; - Assert.IsTrue( Double(c) = (1+dbl_a+dbl_b) ); - // substraction - c := b - a; - Assert.IsTrue( Double(c) = (dbl_b - dbl_a) ); - // now with a litteral - c := b - a - 1; - Assert.IsTrue( Double(c) = (dbl_b-dbl_a-1) ); - c := b - 1 - a; - Assert.IsTrue( Double(c) = (dbl_b-1-dbl_a) ); - c := 1 - b - a; - Assert.IsTrue( Double(c) = (1-dbl_b-dbl_a) ); - // multiplication - c := a * b; - dbl_c := dbl_a * dbl_b; - Assert.IsTrue( Double(c) = dbl_c ); - // now with a litteral - c := a * b * 2; - dbl_c := dbl_a * dbl_b * 2; - Assert.IsTrue( Double(c) = dbl_c ); - c := a * 2 * b; - dbl_c := dbl_a * 2 * dbl_b; - Assert.IsTrue( Double(c) = dbl_c ); - c := 2 * a * b; - dbl_c := 2 * dbl_a * dbl_b; - Assert.IsTrue( Double(c) = dbl_c ); - // division: in Python a division between 2 integers is the same as the integer division - c := b / a; - dbl_c := dbl_b / dbl_a; - Assert.IsTrue( Double(c) = dbl_c ); - // negation - c := -a; - Assert.IsTrue( Double(c) = -dbl_a ); - // comparisons - //------------ - // equal - c := a = b; - Assert.IsTrue(c = False); - c := a = a; - Assert.IsTrue(c = True); - Assert.IsTrue( a = dbl_a); - // not equal - c := a <> b; - Assert.IsTrue(c = True); - Assert.IsTrue( not (c = b) ); - c := a <> a; - Assert.IsTrue(c = False); - Assert.IsTrue( a = dbl_a); - // greater than - c := a > b; Assert.IsTrue(c = False); - c := b > a; Assert.IsTrue(c = True); - Assert.IsTrue( a > (dbl_a-1)); - // greater or equal than - c := a >= b; Assert.IsTrue(c = False); - c := b >= a; Assert.IsTrue(c = True); - c := a >= a; Assert.IsTrue(c = True); - Assert.IsTrue( a >= dbl_a ); - // less than - c := a < b; Assert.IsTrue(c = True); - c := b < a; Assert.IsTrue(c = False); - Assert.IsTrue( a < dbl_b); - // less or equal than - c := a <= b; Assert.IsTrue(c = True); - c := b <= a; Assert.IsTrue(c = False); - c := a <= a; Assert.IsTrue(c = True); - Assert.IsTrue( a <= dbl_a); - // parenthesis - c := a * ((a * b) / b); - dbl_c := dbl_a * ((dbl_a * dbl_b) / dbl_b); - Assert.IsTrue( c = dbl_c ); - // copy - c := a; - Assert.IsTrue( c = a); - Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. - // casts - int := a; - Assert.IsTrue(int = 2); -end; -procedure TVarPythTest.TestIntegers; -var - a, b, c : Variant; - big : Int64; -begin - // initialize the operands - a := VarPythonCreate(2); - Assert.IsTrue(VarIsPython(a)); - Assert.IsTrue(VarIsPythonNumber(a)); - Assert.IsTrue(VarIsPythonInteger(a)); - Assert.IsTrue(Integer(a) = 2); - b := VarPythonCreate(3); - Assert.IsTrue(VarIsPython(b)); - Assert.IsTrue(VarIsPythonNumber(b)); - Assert.IsTrue(VarIsPythonInteger(b)); - Assert.IsTrue(Integer(b) = 3); - // arithmetic operations - //---------------------- - // addition - c := a + b; - // check result of operation - Assert.IsTrue( Integer(c) = 5 ); - // check that operation did not change the content of operands. - Assert.IsTrue(Integer(a) = 2); - Assert.IsTrue(Integer(b) = 3); - // now with a litteral - c := a + b + 1; - Assert.IsTrue( Integer(c) = 6 ); - c := a + 1 + b; - Assert.IsTrue( Integer(c) = 6 ); - c := 1 + a + b; - Assert.IsTrue( Integer(c) = 6 ); - // substraction - c := b - a; - Assert.IsTrue( Integer(c) = 1 ); - // now with a litteral - c := b - a - 1; - Assert.IsTrue( Integer(c) = 0 ); - c := b - 1 - a; - Assert.IsTrue( Integer(c) = 0 ); - c := 1 - b - a; - Assert.IsTrue( Integer(c) = -4 ); - // multiplication - c := a * b; - Assert.IsTrue( Integer(c) = 6 ); - // now with a litteral - c := a * b * 2; - Assert.IsTrue( Integer(c) = 12 ); - c := a * 2 * b; - Assert.IsTrue( Integer(c) = 12 ); - c := 2 * a * b; - Assert.IsTrue( Integer(c) = 12 ); - // integer division - c := b div a; - Assert.IsTrue( Integer(c) = 1 ); - // division: in Python a division between 2 integers is the same as the integer division - c := b / a; - Assert.IsTrue( c = 1.5 ); - Assert.IsTrue( Integer(c) = 2 ); - // modulus - c := b mod a; - Assert.IsTrue( Integer(c) = 1 ); - c := BuiltinModule.divmod(b, a); // this returns a tuple whose first item is the result of the division, - // and second item the modulo. - if VarIsPythonSequence(c) and (c.Length = 2) then - begin - Assert.IsTrue(Integer(c.GetItem(0)) = 1); // division - Assert.IsTrue(Integer(c.GetItem(1)) = 1); // modulo - end; - // power - c := BuiltinModule.pow(a, b); - Assert.IsTrue(c = 8); - // negation - c := -a; - Assert.IsTrue( Integer(c) = -2 ); - // logical operations - //------------------ - // inverse - c := not a; // in python it would be: c = ~2 - Assert.IsTrue( Integer(c) = -3 ); - // shift left (<<) - c := a shl b; - Assert.IsTrue( Integer(c) = 16 ); - c := a shl 1; - Assert.IsTrue( Integer(c) = 4 ); - // shift right (>>) - c := a shl b; - c := c shr b; - Assert.IsTrue( Integer(c) = Integer(a) ); - c := b shr 1; - Assert.IsTrue( Integer(c) = 1 ); - // and - c := a and (a*5); - Assert.IsTrue( Integer(c) = Integer(a) ); - c := a and 6; - Assert.IsTrue( Integer(c) = Integer(a) ); - // or - c := a or b; - Assert.IsTrue( Integer(c) = 3 ); - c := a or 3; - Assert.IsTrue( Integer(c) = 3 ); - // xor - c := a xor b; - Assert.IsTrue( Integer(c) = 1 ); - c := a xor 3; - Assert.IsTrue( Integer(c) = 1 ); - // comparisons - //------------ - // equal - c := a = b; - Assert.IsTrue(c = False); - c := a = a; - Assert.IsTrue(c = True); - Assert.IsTrue( a = 2); - // not equal - c := a <> b; - Assert.IsTrue(c = True); - Assert.IsTrue( not (c = b) ); - c := a <> a; - Assert.IsTrue(c = False); - Assert.IsTrue( a = 2); - // greater than - c := a > b; Assert.IsTrue(c = False); - c := b > a; Assert.IsTrue(c = True); - Assert.IsTrue( a > 1); - // greater or equal than - c := a >= b; Assert.IsTrue(c = False); - c := b >= a; Assert.IsTrue(c = True); - c := a >= a; Assert.IsTrue(c = True); - Assert.IsTrue( a >= 2 ); - // less than - c := a < b; Assert.IsTrue(c = True); - c := b < a; Assert.IsTrue(c = False); - Assert.IsTrue( a < 6); - // less or equal than - c := a <= b; Assert.IsTrue(c = True); - c := b <= a; Assert.IsTrue(c = False); - c := a <= a; Assert.IsTrue(c = True); - Assert.IsTrue( a <= 2); - // parenthesis - c := a * ((a * b) div b); - Assert.IsTrue( c = a*2 ); - // copy - c := a; - Assert.IsTrue( c = a); - Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. - // test long long (Int64) - big := Int64(MaxInt)*4; - b := VarPythonCreate(big); - Assert.IsTrue( b = big ); - Assert.IsTrue( b <> big+1 ); - Assert.IsTrue( b > MaxInt ); - Assert.IsTrue( MaxInt < b ); - Assert.IsTrue( b+1 = big+1 ); - Assert.IsTrue( b*2 = big*2 ); - Assert.IsTrue( b div 2 = big div 2 ); - c := VarPythonCreate(True); - Assert.IsTrue(VarIsBool(c)); - Assert.IsTrue(VarIsTrue(c)); - c := VarPythonCreate(False); - Assert.IsTrue(VarIsBool(c)); - Assert.IsTrue(not VarIsTrue(c)); -end; -procedure TVarPythTest.TestIterator; -var - Module: Variant; - Count: integer; -begin - Count := 0; - for Module in VarPyIterate(SysModule.modules) do begin - Count := Count + 1; - Log(Module); - end; - Assert.IsTrue(Count = len(SysModule.modules)); -end; -procedure TVarPythTest.TestMappings; -var - a, b, c, keys, values : Variant; -begin - // initialize the operands - a := NewPythonDict; - Assert.IsTrue(VarIsPython(a)); - Assert.IsTrue(VarIsPythonMapping(a)); - Assert.IsTrue(VarIsPythonDict(a)); - // There is a bug in D2010 in which Char('a') gets translated to integer parameter - a.SetItem( string('a'), 1 ); - a.SetItem( string('b'), 2 ); - a.SetItem( string('c'), 3 ); - Assert.IsTrue(a.Length = 3); // this is a special property that does the same as: len(a) in Python - Assert.IsTrue(a.Length() = 3); // this is a special method that does the same as the special property - Assert.IsTrue(len(a) = 3); - Assert.IsTrue(a.GetItem(string('a')) = 1); // this is a special method that lets you do the same as: a[0] in Python - Assert.IsTrue(a.GetItem(string('b')) = 2); - Assert.IsTrue(a.GetItem(string('c')) = 3); - - - b := NewPythonDict; - Assert.IsTrue(VarIsPython(b)); - Assert.IsTrue(VarIsPythonMapping(b)); - Assert.IsTrue(VarIsPythonDict(b)); - b.SetItem( string('d'), 4 ); - b.SetItem( string('e'), 5 ); - b.SetItem( string('f'), 6 ); - Assert.IsTrue(b.Length = 3); - Assert.IsTrue(b.Length() = 3); - Assert.IsTrue(len(b) = 3); - Assert.IsTrue(b.GetItem(string('d')) = 4); - Assert.IsTrue(b.GetItem(string('e')) = 5); - Assert.IsTrue(b.GetItem(string('f')) = 6); - - // copy - c := a; - Assert.IsTrue( c = a); - Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. - - // dict methods - Assert.IsTrue( Boolean(a.__contains__(string('a'))) ); - Assert.IsTrue( not Boolean(a.__contains__('abc')) ); - keys := BuiltinModule.list(a.keys()); - keys.sort(); - Assert.IsTrue( keys = VarPythonCreate(VarArrayOf(['a', 'b', 'c']))); - values := BuiltinModule.list(a.values()); - values.sort(); - Assert.IsTrue( values = VarPythonCreate(VarArrayOf([1, 2, 3]))); - c := a; - c.DeleteItem(string('a')); - Assert.IsTrue( not Boolean(c.__contains__(string('a'))) ); - - // test string values - a := NewPythonDict; - a.SetItem( string('a'), 'Hello'); - a.SetItem( string('b'), 'World!'); - a.SetItem( string('c'), ''); - Assert.IsTrue(a.GetItem(string('a')) = 'Hello'); - Assert.IsTrue(a.GetItem(string('b')) = 'World!'); - Assert.IsTrue(a.GetItem(string('c')) = ''); -end; - -procedure TVarPythTest.TestObjects; -var - _main, f, a, b, c : Variant; - val : Integer; - _str : String; -const - Script = - 'class XYZ(object):' + sLineBreak + - ' pass' + sLineBreak + - '' + sLineBreak + - 'class Foo:' + sLineBreak + - ' def __init__(Self, Value=0):' + sLineBreak + - ' Self.Value = Value' + sLineBreak + - ' def __del__(Self):' + sLineBreak + - ' print("delete", Self)' + sLineBreak + - ' def __add__(self, other):' + sLineBreak + - ' return Foo(self.Value + other.Value)' + sLineBreak + - ' def Inc(Self, AValue = 1):' + sLineBreak + - ' Self.Value = Self.Value + AValue' + sLineBreak + - ' def GetSelf(Self):' + sLineBreak + - ' return Self' + sLineBreak + - ' def GetValue(Self):' + sLineBreak + - ' return Self.Value' + sLineBreak + - ' def SetABC(Self, A, B, C):' + sLineBreak + - ' Self.A = A' + sLineBreak + - ' Self.B = B' + sLineBreak + - ' Self.C = C' + sLineBreak + - ' def Add(Self, AFooInst):' + sLineBreak + - ' Self.Value = Self.Value + AFooInst.Value' + sLineBreak + - 'class Bar(Foo):' + sLineBreak + - ' def Inc(Self, AValue = 1):' + sLineBreak + - ' Self.Value = Self.Value - AValue' + sLineBreak + - 'def Add(a, b):' + sLineBreak + - ' return a + b' + sLineBreak + - 'def MakeList(a, b, c, d):' + sLineBreak + - ' return [a, b, c, d]' + sLineBreak + - '' + sLineBreak + - 'f = Foo()' + sLineBreak + - 'print("Created", f)' + sLineBreak + - 'f.Inc()' + sLineBreak + - 'f.Inc(2)' + sLineBreak + - 'b = Bar()' + sLineBreak + - 'b.Inc()' + sLineBreak + - 'b.Inc(2)'; - -begin - FPythonEngine.ExecString(Script); - _main := MainModule; - Assert.IsTrue( VarIsPythonModule(_main) ); - Assert.IsTrue( VarIsPythonModule(SysModule) ); - Assert.IsTrue( Import('sys').version = SysModule.version ); - Log(SysModule.version); - Assert.IsTrue( Boolean(SysModule.modules.Contains(GetPythonEngine.ExecModule)) ); // if __main__ in sys.modules - Assert.IsTrue( VarIsSameType(_main, SysModule) ); - Assert.IsTrue( _type(_main).__name__ = 'module'); - Assert.IsTrue( BuiltinModule.type(_main).__name__ = 'module'); - - Assert.IsTrue( VarIsPythonClass(_main.Foo) ); - Assert.IsTrue( VarIsPythonClass(_main.Bar) ); - Assert.IsTrue( VarIsPythonClass(_main.XYZ) ); - Assert.IsTrue( not VarIsPythonClass(_main.Foo.__add__) ); - Assert.IsTrue( not VarIsPythonClass(_main.f) ); - Assert.IsTrue( VarIsPythonCallable(_main.Foo) ); - Assert.IsTrue( VarIsPythonCallable(_main.Foo) ); - Assert.IsTrue( VarIsTrue(BuiltinModule.callable(_main.Foo)) ); - Assert.IsTrue( VarIsSame(_main.f.__class__, _main.Foo) ); - Assert.IsTrue( VarIsPythonMethod(_main.f.Inc) ); - Assert.IsTrue( VarIsPythonCallable(_main.f.Inc) ); - Assert.IsTrue( VarIsTrue(BuiltinModule.callable(_main.f.Inc)) ); - Assert.IsTrue( VarIsPythonFunction(_main.Add) ); - Assert.IsTrue( VarIsPythonCallable(_main.Add) ); - Assert.IsTrue( VarIsInstanceOf(_main.f, _main.Foo) ); - Assert.IsTrue( VarIsTrue(BuiltinModule.isinstance(_main.f, _main.Foo)) ); - Assert.IsTrue( VarIsSubclassOf(_main.Bar, _main.Foo) ); - Assert.IsTrue( VarIsTrue(BuiltinModule.issubclass(_main.Bar, _main.Foo)) ); - Assert.IsTrue( not VarIsSubclassOf(_main.Foo, _main.Bar) ); - Assert.IsTrue( VarIsInstanceOf(_main.b, _main.Foo) ); - Assert.IsTrue( not VarIsInstanceOf(_main.f, _main.Bar) ); - Assert.IsTrue( VarIsTrue( BuiltinModule.vars(_main).__contains__(string('f')) ) ); - Assert.IsTrue( VarIsTrue( BuiltinModule.dir(_main).Contains(string('f')) ) ); - - f := _main.Foo(); // new instance of class Foo - Log('Instanciate class Foo: ' + f); - f.Inc(); // call a method without any arg, because there's a default arg. - f.Inc(2); // call a method with one arg, overriding the default arg. - Assert.IsTrue( VarIsPythonNumber(f.Value) ); - Assert.IsTrue( VarIsPythonInteger(f.Value) ); - Assert.IsTrue( f.Value = _main.f.Value ); // compare the result with what we did in the script - Assert.IsTrue( f.GetValue() = _main.f.GetValue() ); // compare the result with what we did in the script - Assert.IsTrue( VarIsPython( f.GetSelf() ) ); - Assert.IsTrue( VarIsSame( f.GetSelf(), f ) ); - Assert.IsTrue( BuiltinModule.getattr(f, 'Value') = f.Value ); - // python (+) operator overloading - a := _main.Foo(10); - b := _main.Foo(5); - c := a + b; - Assert.IsTrue(a.Value = 10); - Assert.IsTrue(b.Value = 5); - Assert.IsTrue(c.Value = 15); - Log('Test -> a, b, c : ' + a.Value + ', ' + b.Value + ', ' + c.Value); - // cascading calls - Assert.IsTrue( f.GetSelf().GetSelf().GetSelf().GetSelf().GetValue() = _main.f.GetValue() ); - Assert.IsTrue( Boolean(f.__dict__.__contains__('Value')) ); - Assert.IsTrue( VarIsTrue( BuiltinModule.hasattr(f, 'Value') ) ); - _str := 'Value'; - Assert.IsTrue( Boolean(f.__dict__.__contains__(_str)) ); // check with a string var - Assert.IsTrue( Boolean( BuiltinModule.hasattr(f, _str) ) ); - val := f.Value; - f.Add(f); // passing itself as an argument - Assert.IsTrue( f.Value = val*2 ); - // check param order - f.SetABC(1, 2, 3); - Assert.IsTrue(f.A = 1); - Assert.IsTrue(f.B = 2); - Assert.IsTrue(f.C = 3); - // add a property to an instance - f.Z := 99; - Assert.IsTrue(f.Z = 99); - // add a var to a module - _main.Z := 99; - Assert.IsTrue(_main.Z = 99); - // check none - Assert.IsTrue( VarIsNone(None) ); - Assert.IsTrue( VarIsNone(VarPythonCreate([1, Null, 3]).GetItem(1)) ); // Null is casted to None - Assert.IsTrue( VarIsNone(VarPythonCreate([1, None, 3]).GetItem(1)) ); - Assert.IsTrue( VarIsNone(f.Inc()) ); - Assert.IsTrue( f.Inc() = None ); - Assert.IsTrue( not Boolean(None) ); // if not None: - Assert.IsTrue( not VarIsTrue(None) ); // if not None: - Assert.IsTrue( Boolean(f) ); // if f: - Assert.IsTrue( VarIsTrue(f) ); // if f: - - // call a function - Assert.IsTrue( _main.Add(2, 2) = 4 ); - // call a function with a mix of regular parameters and named parameters - f := _main.MakeList(1, 2, 3, 4); - Assert.IsTrue(VarIsPythonList(f)); - Assert.IsTrue(f.Length = 4); - Assert.IsTrue(f.GetItem(0) = 1); - Assert.IsTrue(f.GetItem(1) = 2); - Assert.IsTrue(f.GetItem(2) = 3); - Assert.IsTrue(f.GetItem(3) = 4); - f := _main.MakeList(1, d:=3, c:=4, b:=2); - Assert.IsTrue(VarIsPythonList(f)); - Assert.IsTrue(f.Length = 4); - Assert.IsTrue(f.GetItem(0) = 1); - Assert.IsTrue(f.GetItem(1) = 2); - Assert.IsTrue(f.GetItem(2) = 4); - Assert.IsTrue(f.GetItem(3) = 3); - f := _main.MakeList(1, 2, d:= 3, c:=4); - Assert.IsTrue(VarIsPythonList(f)); - Assert.IsTrue(f.Length = 4); - Assert.IsTrue(f.GetItem(0) = 1); - Assert.IsTrue(f.GetItem(1) = 2); - Assert.IsTrue(f.GetItem(2) = 4); - Assert.IsTrue(f.GetItem(3) = 3); - f := _main.MakeList(1, 2, 3, d:=4); - Assert.IsTrue(VarIsPythonList(f)); - Assert.IsTrue(f.Length = 4); - Assert.IsTrue(f.GetItem(0) = 1); - Assert.IsTrue(f.GetItem(1) = 2); - Assert.IsTrue(f.GetItem(2) = 3); - Assert.IsTrue(f.GetItem(3) = 4); - f := _main.MakeList(b:=1, a:=2, d:= 3, c:=4); - Assert.IsTrue(VarIsPythonList(f)); - Assert.IsTrue(f.Length = 4); - Assert.IsTrue(f.GetItem(0) = 2); - Assert.IsTrue(f.GetItem(1) = 1); - Assert.IsTrue(f.GetItem(2) = 4); - Assert.IsTrue(f.GetItem(3) = 3); -end; -procedure TVarPythTest.TestSequences; -var - a, b, c : Variant; - iter : Variant; - cpt : Integer; -begin - // initialize the operands - // you can either use the overloaded function with an array of const - // or use the VarArrayOf function that returns an array of variants that will - // be casted to a Python list. - a := VarPythonCreate([1, 2, 3]); - Assert.IsTrue(VarIsPython(a)); - Assert.IsTrue(VarIsPythonSequence(a)); - Assert.IsTrue(VarIsPythonList(a)); - Assert.IsTrue(a.Length = 3); // this is a special property that does the same as: len(a) in Python - Assert.IsTrue(a.Length() = 3); // this is a special method that does the same as the special property - Assert.IsTrue(len(a) = 3); - Assert.IsTrue(a.GetItem(0) = 1); // this is a special method that lets you do the same as: a[0] in Python - Assert.IsTrue(a.GetItem(1) = 2); - Assert.IsTrue(a.GetItem(2) = 3); - Assert.IsTrue(string(a) = '[1, 2, 3]'); - // indexed access using brackets when the sequence is a property of an object (module, instance...) - MainModule.a := VarPythonCreate([1, 2, 3]); - Assert.IsTrue(MainModule.a[1] = 2); - - b := VarPythonCreate(VarArrayOf([4, 5, 6])); - Assert.IsTrue(VarIsPython(b)); - Assert.IsTrue(VarIsPythonSequence(b)); - Assert.IsTrue(VarIsPythonList(b)); - Assert.IsTrue(b.Length = 3); - Assert.IsTrue(b.Length() = 3); - Assert.IsTrue(len(b) = 3); - Assert.IsTrue(b.GetItem(0) = 4); - Assert.IsTrue(b.GetItem(1) = 5); - Assert.IsTrue(b.GetItem(2) = 6); - Assert.IsTrue(string(b) = '[4, 5, 6]'); - // concatenation - c := a + b; - // check result of operation - Assert.IsTrue(string(c) = '[1, 2, 3, 4, 5, 6]'); - // check that operation did not change the content of operands. - Assert.IsTrue(string(a) = '[1, 2, 3]'); - Assert.IsTrue(string(b) = '[4, 5, 6]'); - // now with a litteral: note that with D6 SP1, we can't concatenate a custom variant with an var array of variants - c := a + b + VarPythonCreate(['Hello', 'World!', 3.14]); - Assert.IsTrue( string(c) = '[1, 2, 3, 4, 5, 6, ''Hello'', ''World!'', 3.14]' ); - c := a + VarPythonCreate(['Hello', 'World!', 3.14]) + b; - Assert.IsTrue( string(c) = '[1, 2, 3, ''Hello'', ''World!'', 3.14, 4, 5, 6]' ); - c := VarPythonCreate(['Hello', 'World!', 3.14]) + a + b; - Assert.IsTrue( string(c) = '[''Hello'', ''World!'', 3.14, 1, 2, 3, 4, 5, 6]' ); - - // multiplication - c := a * 3; // in Python the multiplication of sequence concatenates n times the sequence - Assert.IsTrue( string(c) = '[1, 2, 3, 1, 2, 3, 1, 2, 3]' ); - - // comparisons - //------------ - - // equal - c := a = b; - Assert.IsTrue(c = False); - c := a = a; - Assert.IsTrue(c = True); - Assert.IsTrue( string(a) = '[1, 2, 3]'); - - // not equal - c := a <> b; - Assert.IsTrue(c = True); - Assert.IsTrue( not (c = b) ); - c := a <> a; - Assert.IsTrue(c = False); - Assert.IsTrue( string(a) = '[1, 2, 3]'); - - // greater than - c := a > b; Assert.IsTrue(c = False); - c := b > a; Assert.IsTrue(c = True); - Assert.IsTrue( string(a) > '[1, 1, 1]'); - - // greater or equal than - c := a >= b; Assert.IsTrue(c = False); - c := b >= a; Assert.IsTrue(c = True); - c := a >= a; Assert.IsTrue(c = True); - Assert.IsTrue( string(a) >= '[1, 2, 3]' ); - - // less than - c := a < b; Assert.IsTrue(c = True); - c := b < a; Assert.IsTrue(c = False); - Assert.IsTrue( string(a) < '[4, 4, 4]'); - - // less or equal than - c := a <= b; Assert.IsTrue(c = True); - c := b <= a; Assert.IsTrue(c = False); - c := a <= a; Assert.IsTrue(c = True); - Assert.IsTrue( string(a) <= '[1, 2, 3]'); - - // copy - c := a; - Assert.IsTrue( c = a); - Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. - - // sequence methods: - c := b + a; - c.sort(); // note that you must you the parenthesis to distinguish the call between a method or a property. - Assert.IsTrue( c = (a+b) ); - - c := NewPythonList; // facility for building sequences - Assert.IsTrue( not VarIsTrue(c) ); // c is false because it's an empty collection - c.append(1); - c.append(2); - c.append(3); - Assert.IsTrue( VarIsTrue(c) ); // c is true because it's not an empty collection - Assert.IsTrue(c = a); - Assert.IsTrue( c.pop() = 3 ); - Assert.IsTrue( string(c) = '[1, 2]'); - - c := NewPythonList(3); // facility for building sequences - c.SetItem(0, 1); - c.SetItem(1, 2); - c.SetItem(2, 3); - Assert.IsTrue(c = a); - c.DeleteItem(1); - Assert.IsTrue(c = VarPythonCreate([1,3])); - - Assert.IsTrue(VarPythonCreate([1,2,3,4]).GetSlice(1, 3) = VarPythonCreate([2,3])); // same as x = [1,2,3,4]; x[1:3] - Assert.IsTrue(VarPythonCreate([1,2,3,4]).GetSlice(1, Ellipsis) = VarPythonCreate([2,3,4])); // same as x = [1,2,3,4]; x[1:] - Assert.IsTrue(VarPythonCreate([1,2,3,4]).GetSlice(1, -1) = VarPythonCreate([2,3])); // same as x = [1,2,3,4]; x[1:-1] - c := VarPythonCreate([1,2,3,4]); - c.SetSlice(1, 3, VarPythonCreate([7, 8, 9])); - Assert.IsTrue( c = VarPythonCreate([1, 7, 8, 9, 4]) ); - Assert.IsTrue( Boolean(c.Contains( 7 )) ); // same as 7 in c - Assert.IsTrue( not Boolean(c.Contains( 77 )) ); - c.DelSlice(1,3); - Assert.IsTrue( c = VarPythonCreate([1,9,4]) ); - - c := VarPythonCreate([1, 2, 3, 4], stTuple); // test a tuple - Assert.IsTrue( VarIsPythonTuple(c) ); - Assert.IsTrue( VarIsPythonSequence(c) ); - Assert.IsTrue( c.GetItem(1) = 2 ); - Assert.IsTrue( c.Length = 4 ); - c := NewPythonTuple(3); - c.SetItem(0, 1); - c.SetItem(1, 2); - c.SetItem(2, 3); - Assert.IsTrue( VarIsPythonTuple(c) ); - Assert.IsTrue( VarIsPythonSequence(c) ); - Assert.IsTrue( c.GetItem(1) = 2 ); - Assert.IsTrue( c.Length = 3 ); - - // test iterator - iter := BuiltinModule.iter(VarPythonCreate([1, 2, 3, 4], stTuple)); - Assert.IsTrue(VarIsPythonIterator(iter)); - Assert.IsTrue(iter.__next__() = 1); - Assert.IsTrue(iter.__next__() = 2); - Assert.IsTrue(iter.__next__() = 3); - Assert.IsTrue(iter.__next__() = 4); - try - iter.__next__(); - except - on E: EPyStopIteration do - begin - Assert.IsTrue(True); //Ok. - end - else - Assert.IsTrue(False, 'expected stop exception'); - end; - cpt := 0; - iter := VarPyth.iter(VarPythonCreate([1, 2, 3, 4], stTuple)); - Assert.IsTrue(VarIsPythonIterator(iter)); - try - while True do - begin - a := iter.__next__(); - Inc(cpt); - Assert.IsTrue(a = cpt); - end; - except - on E: EPyStopIteration do - begin - Assert.IsTrue(True); //Ok. - end - else - Assert.IsTrue(False, 'expected stop exception'); - end; - Assert.IsTrue(cpt = 4); -end; -procedure TVarPythTest.TestStrings; -var - a, b, c : Variant; - w : WideString; - _obj : PPyObject; -begin - // initialize the operands - a := VarPythonCreate('abc'); - Assert.IsTrue(VarIsPython(a)); - Assert.IsTrue(VarIsPythonString(a)); - Assert.IsTrue(string(a) = 'abc'); - b := VarPythonCreate('def'); - Assert.IsTrue(VarIsPython(b)); - Assert.IsTrue(VarIsPythonString(b)); - Assert.IsTrue(string(b) = 'def'); - // concatenation - c := a + b; - // check result of operation - Assert.IsTrue( string(c) = 'abcdef' ); - // check that operation did not change the content of operands. - Assert.IsTrue(string(a) = 'abc'); - Assert.IsTrue(string(b) = 'def'); - // now with a litteral - c := a + b + '!'; - Assert.IsTrue( string(c) = 'abcdef!' ); - c := a + '!' + b; - Assert.IsTrue( string(c) = 'abc!def' ); - c := '!' + a + b; - Assert.IsTrue( string(c) = '!abcdef' ); - // multiplication - c := a * 3; // in Python the multiplication of string concatenates n times the string - Assert.IsTrue( string(c) = 'abcabcabc' ); - // comparisons - //------------ - // equal - c := a = b; - Assert.IsTrue(c = False); - c := a = a; - Assert.IsTrue(c = True); - Assert.IsTrue( a = 'abc'); - // not equal - c := a <> b; - Assert.IsTrue(c = True); - Assert.IsTrue( not (c = b) ); - c := a <> a; - Assert.IsTrue(c = False); - Assert.IsTrue( a = 'abc'); - // greater than - c := a > b; Assert.IsTrue(c = False); - c := b > a; Assert.IsTrue(c = True); - Assert.IsTrue( a > 'aaa'); - // greater or equal than - c := a >= b; Assert.IsTrue(c = False); - c := b >= a; Assert.IsTrue(c = True); - c := a >= a; Assert.IsTrue(c = True); - Assert.IsTrue( a >= 'abc' ); - // less than - c := a < b; Assert.IsTrue(c = True); - c := b < a; Assert.IsTrue(c = False); - Assert.IsTrue( a < 'bbb'); - // less or equal than - c := a <= b; Assert.IsTrue(c = True); - c := b <= a; Assert.IsTrue(c = False); - c := a <= a; Assert.IsTrue(c = True); - Assert.IsTrue( a <= 'abc'); - // copy - c := a; - Assert.IsTrue( c = a); - Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. - // empty strings - a := VarPythonCreate(''); - Assert.IsTrue(a.length = 0); - Assert.IsTrue(a = ''); - Assert.IsTrue(string(a) = ''); - // Unicode strings - b := VarPythonEval( 'u"Hello world!"' ); - Assert.IsTrue( VarIsPythonUnicode(b) ); - w := FPythonEngine.PyUnicodeAsString(ExtractPythonObjectFrom(b)); - Assert.IsTrue( w = 'Hello world!'); - Assert.IsTrue( b = 'Hello world!'); - Assert.IsTrue( b <> a ); - _obj := FPythonEngine.PyUnicodeFromString(w); - try - c := VarPythonCreate( _obj ); - finally - FPythonEngine.Py_XDecRef(_obj); - end; - Assert.IsTrue(b = c); - Assert.IsTrue(c = w); - Assert.IsTrue( c = 'Hello world!'); - w := b; - Assert.IsTrue( b = w); - Assert.IsTrue( w = 'Hello world!'); - Assert.IsTrue( Length(w) = 12 ); - Assert.IsTrue( Length(w) = b.Length() ); - c := FPythonEngine.PyObjectAsVariant(ExtractPythonObjectFrom(b)); - Assert.IsTrue( c = b ); - Assert.IsTrue( c = w ); - Assert.IsTrue( c = 'Hello world!'); - Assert.IsTrue( VarType(c) and VarTypeMask = varUString ); - c := VarPythonCreate(w); - Assert.IsTrue( c = 'Hello world!'); - Assert.IsTrue( c = w ); - c := VarPythonCreate([w]); - Assert.IsTrue( VarIsPythonUnicode(c.GetItem(0)) ); - Assert.IsTrue( c.GetItem(0) = 'Hello world!'); - Assert.IsTrue( c.GetItem(0) = w ); - c := w; - b := VarPythonCreate(c); - Assert.IsTrue( VarIsPythonUnicode(b) ); - Assert.IsTrue( b = c ); - Assert.IsTrue( b = w ); - // empty strings - a := VarPythonEval( 'u""' ); - Assert.IsTrue(a.length = 0); - Assert.IsTrue(a = ''); - Assert.IsTrue(string(a) = ''); - Assert.IsTrue(WideString(a) = ''); -end; - -initialization - TDUnitX.RegisterTestFixture(TVarPythTest); - -end. +(**************************************************************************) +(* *) +(* Module: Unit 'VarPythTest' Copyright (c) 2021 *) +(* *) +(* Lucas Moura Belo - lmbelo *) +(* lucas.belo@live.com *) +(* BH, Brazil *) +(* *) +(* PyScripter *) +(* e-mail: pyscripter@gmail.com *) +(* *) +(* Project pages: https://github.com/Embarcadero/python4delphi *) +(* https://github.com/pyscripter/python4delphi *) +(**************************************************************************) +(* Functionality: Test unit for variants *) +(* *) +(* *) +(**************************************************************************) +(* This source code is distributed with no WARRANTY, for no reason or use.*) +(* Everyone is allowed to use and change this code free for his own tasks *) +(* and projects, as long as this header and its copyright text is intact. *) +(* For changed versions of this code, which are public distributed the *) +(* following additional conditions have to be fullfilled: *) +(* 1) The header has to contain a comment on the change and the author of *) +(* it. *) +(* 2) A copy of the changed source has to be sent to the above E-Mail *) +(* address or my then valid address, if this is possible to the *) +(* author. *) +(* The second condition has the target to maintain an up to date central *) +(* version of the component. If this condition is not acceptable for *) +(* confidential or legal reasons, everyone is free to derive a component *) +(* or to generate a diff file to my or other original sources. *) +(**************************************************************************) + +unit VarPythTest; + +interface + +uses + DUnitX.TestFramework, + PythonEngine, + PythonLoad; + +type + {$M+} + [TestFixture] + TVarPythTest = class + private + FPythonEngine: TPythonEngine; + public + [SetupFixture] + procedure SetupFixture; + [TearDownFixture] + procedure TearDownFixture; + [Test] + procedure TestIterator; + [Test] + procedure TestIntegers; + [Test] + procedure TestFloats; + [Test] + procedure TestStrings; + [Test] + procedure TestSequences; + [Test] + procedure TestMappings; + [Test] + procedure TestDates; + [Test] + procedure TestObjects; + end; + +implementation + +uses + SysUtils, StrUtils, + Variants, + VarPyth; + +{ TVarPythTest } + +procedure TVarPythTest.SetupFixture; +begin + FPythonEngine := TPythonEngine.Create(nil); + FPythonEngine.Name := 'PythonEngine'; + TPythonLoad.Configure(FPythonEngine); + FPythonEngine.LoadDll; +end; +procedure TVarPythTest.TearDownFixture; +begin + FPythonEngine.Free(); +end; +procedure TVarPythTest.TestDates; +var + a, b, _timeMod : Variant; + c : Variant; + _date, _date2 : TDateTime; + _year, _month, _day : Word; + _year2, _month2, _day2 : Word; + _hour, _min, _sec, _msec : Word; + _hour2, _min2, _sec2, _msec2 : Word; +begin + _timeMod := Import('time'); // get the time module of Python + _date := Now; + DecodeDate( _date, _year, _month, _day ); + DecodeTime( _date, _hour, _min, _sec, _msec ); + b := _timeMod.localtime(_timeMod.time()); // same as Now in Delphi + a := VarPythonCreate(_date); + Assert.IsTrue( a.Length = 9 ); + Assert.IsTrue( a.GetItem(0) = _year ); + Assert.IsTrue( a.GetItem(1) = _month ); + Assert.IsTrue( a.GetItem(2) = _day ); + Assert.IsTrue( a.GetItem(3) = _hour ); + Assert.IsTrue( a.GetItem(4) = _min ); + Assert.IsTrue( a.GetItem(5) = _sec ); + Assert.IsTrue( b.Length = 9 ); + Assert.IsTrue( b.GetItem(0) = a.GetItem(0) ); + Assert.IsTrue( b.GetItem(1) = a.GetItem(1) ); + Assert.IsTrue( b.GetItem(2) = a.GetItem(2) ); + Assert.IsTrue( b.GetItem(3) = a.GetItem(3) ); + Assert.IsTrue( b.GetItem(4) = a.GetItem(4) ); + Assert.IsTrue( b.GetItem(5) = a.GetItem(5) ); + Assert.IsTrue( b.GetItem(6) = a.GetItem(6) ); + Assert.IsTrue( b.GetItem(7) = a.GetItem(7) ); + // don't test the 9th item of the tuple, because it's the daylight saving, + // and it's not computed by the Python for Delphi. + //Assert.IsTrue( b.GetItem(8) = a.GetItem(8) ); + _date2 := b; + DecodeDate( _date2, _year2, _month2, _day2 ); + DecodeTime( _date2, _hour2, _min2, _sec2, _msec2 ); + Assert.IsTrue( _year2 = _year ); + Assert.IsTrue( _month2 = _month ); + Assert.IsTrue( _day2 = _day ); + Assert.IsTrue( _hour2 = _hour ); + Assert.IsTrue( _min2 = _min ); + Assert.IsTrue( _sec2 = _sec ); + // test new datetime module + _timeMod := Import('datetime'); // get the datetime module of Python + //or _timeMod := DatetimeModule; // get the datetime module of Python + a := _timeMod.datetime(2002, 12, 30, 22, 15, 38, 827738); + Assert.IsTrue(VarIsPythonDateTime(a)); + Assert.IsTrue(VarIsPythonDate(a)); + Assert.IsTrue(not VarIsPythonTime(a)); + Assert.IsTrue(not VarIsPythonDateTimeDelta(a)); + Assert.IsTrue(a.year = 2002); + Assert.IsTrue(a.month = 12); + Assert.IsTrue(a.day = 30); + Assert.IsTrue(a.hour = 22); + Assert.IsTrue(a.minute = 15); + Assert.IsTrue(a.second = 38); + Assert.IsTrue(a.microsecond = 827738); + _date := a; + DecodeDate( _date, _year, _month, _day ); + DecodeTime( _date, _hour, _min, _sec, _msec ); + Assert.IsTrue(_year = 2002); + Assert.IsTrue(_month = 12); + Assert.IsTrue(_day = 30); + Assert.IsTrue(_hour = 22); + Assert.IsTrue(_min = 15); + Assert.IsTrue(_sec = 38); + Assert.IsTrue(_msec = 827738 div 1000); + a := _timeMod.date(2002, 12, 30); + Assert.IsTrue(not VarIsPythonDateTime(a)); + Assert.IsTrue(VarIsPythonDate(a)); + Assert.IsTrue(not VarIsPythonTime(a)); + Assert.IsTrue(not VarIsPythonDateTimeDelta(a)); + _date := a; + DecodeDate( _date, _year, _month, _day ); + DecodeTime( _date, _hour, _min, _sec, _msec ); + Assert.IsTrue(_year = 2002); + Assert.IsTrue(_month = 12); + Assert.IsTrue(_day = 30); + Assert.IsTrue(_hour = 0); + Assert.IsTrue(_min = 0); + Assert.IsTrue(_sec = 0); + Assert.IsTrue(_msec = 0); + Assert.IsTrue(a.year = 2002); + Assert.IsTrue(a.month = 12); + Assert.IsTrue(a.day = 30); + a := _timeMod.time(22, 15, 38, 827738); + Assert.IsTrue(not VarIsPythonDateTime(a)); + Assert.IsTrue(not VarIsPythonDate(a)); + Assert.IsTrue(VarIsPythonTime(a)); + Assert.IsTrue(not VarIsPythonDateTimeDelta(a)); + Assert.IsTrue(a.hour = 22); + Assert.IsTrue(a.minute = 15); + Assert.IsTrue(a.second = 38); + Assert.IsTrue(a.microsecond = 827738); + _date := a; + DecodeTime( _date, _hour, _min, _sec, _msec ); + Assert.IsTrue(_hour = 22); + Assert.IsTrue(_min = 15); + Assert.IsTrue(_sec = 38); + Assert.IsTrue(_msec = 827738 div 1000); + a := DatetimeModule.datetime(2002, 12, 30, 22, 15, 38, 827738); + b := _timeMod.datetime(2002, 12, 30, 22, 16, 38, 827738); + c := b - a; + Assert.IsTrue(VarIsPythonDateTimeDelta(c)); + Assert.IsTrue(c.days = 0); + Assert.IsTrue(c.seconds = 60); + Assert.IsTrue(c.microseconds = 0); + _date := c; + Assert.IsTrue(Trunc(_date)=0); + DecodeTime( _date, _hour, _min, _sec, _msec ); + Assert.IsTrue(_hour = 0); + Assert.IsTrue(_min = 1); + Assert.IsTrue(_sec = 0); + Assert.IsTrue(_msec = 0); + c := a - b; + Assert.IsTrue(VarIsPythonDateTimeDelta(c)); + Assert.IsTrue(c.days = -1); + Assert.IsTrue(c.seconds = 86340); + Assert.IsTrue(c.microseconds = 0); + _date := c; + Assert.IsTrue(Trunc(_date)=0); + Assert.IsTrue(_date<0); + DecodeTime( _date, _hour, _min, _sec, _msec ); + Assert.IsTrue(_hour = 0); + Assert.IsTrue(_min = 1); + Assert.IsTrue(_sec = 0); + Assert.IsTrue(_msec = 0); + c := a + (b-a); + Assert.IsTrue(VarIsPythonDateTime(c)); + Assert.IsTrue(c = b); + Assert.IsTrue(c <> a); + Assert.IsTrue(a < b); + Assert.IsTrue(b > a); + GetPythonEngine.DatetimeConversionMode := dcmToDatetime; + try + _date := EncodeDate(2003, 01, 28) + EncodeTime(12, 22, 33, 450); + a := VarPythonCreate(_date); + Assert.IsTrue(VarIsPythonDateTime(c)); + _date2 := a; + DecodeDate( _date, _year, _month, _day ); + DecodeTime( _date, _hour, _min, _sec, _msec ); + DecodeDate( _date2, _year2, _month2, _day2 ); + DecodeTime( _date2, _hour2, _min2, _sec2, _msec2 ); + Assert.IsTrue( _year2 = _year ); + Assert.IsTrue( _month2 = _month ); + Assert.IsTrue( _day2 = _day ); + Assert.IsTrue( _hour2 = _hour ); + Assert.IsTrue( _min2 = _min ); + Assert.IsTrue( _sec2 = _sec ); + Assert.IsTrue( _msec2 = _msec ); + Assert.IsTrue(a.year = 2003); + Assert.IsTrue(a.month = 01); + Assert.IsTrue(a.day = 28); + Assert.IsTrue(a.hour = 12); + Assert.IsTrue(a.minute = 22); + Assert.IsTrue(a.second = 33); + Assert.IsTrue(a.microsecond = 450000); + finally + GetPythonEngine.DatetimeConversionMode := dcmToTuple; + end; +end; +procedure TVarPythTest.TestFloats; +var + a, b, c : Variant; + dbl_a, dbl_b, dbl_c : Double; + int : Integer; +begin + // initialize the operands + dbl_a := 2.5; + a := VarPythonCreate(dbl_a); + Assert.IsTrue(VarIsPython(a)); + Assert.IsTrue(VarIsPythonNumber(a)); + Assert.IsTrue(VarIsPythonFloat(a)); + Assert.IsTrue(Double(a) = 2.5); + dbl_b := 3.2; + b := VarPythonCreate(dbl_b); + Assert.IsTrue(VarIsPython(b)); + Assert.IsTrue(VarIsPythonNumber(b)); + Assert.IsTrue(VarIsPythonFloat(b)); + Assert.IsTrue(Double(b) = dbl_b); // note that Assert.IsTrue(Double(b) = 3.2) fails. + // arithmetic operations + //---------------------- + // addition + c := a + b; + // check result of operation + Assert.IsTrue( Double(c) = (dbl_a + dbl_b) ); + // check that operation did not change the content of operands. + Assert.IsTrue(Double(a) = dbl_a); + Assert.IsTrue(Double(b) = dbl_b); + // now with a litteral + c := a + b + 1; + Assert.IsTrue( Double(c) = (dbl_a+dbl_b+1) ); + c := a + 1 + b; + Assert.IsTrue( Double(c) = (dbl_a+1+dbl_b) ); + c := 1 + a + b; + Assert.IsTrue( Double(c) = (1+dbl_a+dbl_b) ); + // substraction + c := b - a; + Assert.IsTrue( Double(c) = (dbl_b - dbl_a) ); + // now with a litteral + c := b - a - 1; + Assert.IsTrue( Double(c) = (dbl_b-dbl_a-1) ); + c := b - 1 - a; + Assert.IsTrue( Double(c) = (dbl_b-1-dbl_a) ); + c := 1 - b - a; + Assert.IsTrue( Double(c) = (1-dbl_b-dbl_a) ); + // multiplication + c := a * b; + dbl_c := dbl_a * dbl_b; + Assert.IsTrue( Double(c) = dbl_c ); + // now with a litteral + c := a * b * 2; + dbl_c := dbl_a * dbl_b * 2; + Assert.IsTrue( Double(c) = dbl_c ); + c := a * 2 * b; + dbl_c := dbl_a * 2 * dbl_b; + Assert.IsTrue( Double(c) = dbl_c ); + c := 2 * a * b; + dbl_c := 2 * dbl_a * dbl_b; + Assert.IsTrue( Double(c) = dbl_c ); + // division: in Python a division between 2 integers is the same as the integer division + c := b / a; + dbl_c := dbl_b / dbl_a; + Assert.IsTrue( Double(c) = dbl_c ); + // negation + c := -a; + Assert.IsTrue( Double(c) = -dbl_a ); + // comparisons + //------------ + // equal + c := a = b; + Assert.IsTrue(c = False); + c := a = a; + Assert.IsTrue(c = True); + Assert.IsTrue( a = dbl_a); + // not equal + c := a <> b; + Assert.IsTrue(c = True); + Assert.IsTrue( not (c = b) ); + c := a <> a; + Assert.IsTrue(c = False); + Assert.IsTrue( a = dbl_a); + // greater than + c := a > b; Assert.IsTrue(c = False); + c := b > a; Assert.IsTrue(c = True); + Assert.IsTrue( a > (dbl_a-1)); + // greater or equal than + c := a >= b; Assert.IsTrue(c = False); + c := b >= a; Assert.IsTrue(c = True); + c := a >= a; Assert.IsTrue(c = True); + Assert.IsTrue( a >= dbl_a ); + // less than + c := a < b; Assert.IsTrue(c = True); + c := b < a; Assert.IsTrue(c = False); + Assert.IsTrue( a < dbl_b); + // less or equal than + c := a <= b; Assert.IsTrue(c = True); + c := b <= a; Assert.IsTrue(c = False); + c := a <= a; Assert.IsTrue(c = True); + Assert.IsTrue( a <= dbl_a); + // parenthesis + c := a * ((a * b) / b); + dbl_c := dbl_a * ((dbl_a * dbl_b) / dbl_b); + Assert.IsTrue( c = dbl_c ); + // copy + c := a; + Assert.IsTrue( c = a); + Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. + // casts + int := a; + Assert.IsTrue(int = 2); +end; +procedure TVarPythTest.TestIntegers; +var + a, b, c : Variant; + big : Int64; +begin + // initialize the operands + a := VarPythonCreate(2); + Assert.IsTrue(VarIsPython(a)); + Assert.IsTrue(VarIsPythonNumber(a)); + Assert.IsTrue(VarIsPythonInteger(a)); + Assert.IsTrue(Integer(a) = 2); + b := VarPythonCreate(3); + Assert.IsTrue(VarIsPython(b)); + Assert.IsTrue(VarIsPythonNumber(b)); + Assert.IsTrue(VarIsPythonInteger(b)); + Assert.IsTrue(Integer(b) = 3); + // arithmetic operations + //---------------------- + // addition + c := a + b; + // check result of operation + Assert.IsTrue( Integer(c) = 5 ); + // check that operation did not change the content of operands. + Assert.IsTrue(Integer(a) = 2); + Assert.IsTrue(Integer(b) = 3); + // now with a litteral + c := a + b + 1; + Assert.IsTrue( Integer(c) = 6 ); + c := a + 1 + b; + Assert.IsTrue( Integer(c) = 6 ); + c := 1 + a + b; + Assert.IsTrue( Integer(c) = 6 ); + // substraction + c := b - a; + Assert.IsTrue( Integer(c) = 1 ); + // now with a litteral + c := b - a - 1; + Assert.IsTrue( Integer(c) = 0 ); + c := b - 1 - a; + Assert.IsTrue( Integer(c) = 0 ); + c := 1 - b - a; + Assert.IsTrue( Integer(c) = -4 ); + // multiplication + c := a * b; + Assert.IsTrue( Integer(c) = 6 ); + // now with a litteral + c := a * b * 2; + Assert.IsTrue( Integer(c) = 12 ); + c := a * 2 * b; + Assert.IsTrue( Integer(c) = 12 ); + c := 2 * a * b; + Assert.IsTrue( Integer(c) = 12 ); + // integer division + c := b div a; + Assert.IsTrue( Integer(c) = 1 ); + // division: in Python a division between 2 integers is the same as the integer division + c := b / a; + Assert.IsTrue( c = 1.5 ); + Assert.IsTrue( Integer(c) = 2 ); + // modulus + c := b mod a; + Assert.IsTrue( Integer(c) = 1 ); + c := BuiltinModule.divmod(b, a); // this returns a tuple whose first item is the result of the division, + // and second item the modulo. + if VarIsPythonSequence(c) and (c.Length = 2) then + begin + Assert.IsTrue(Integer(c.GetItem(0)) = 1); // division + Assert.IsTrue(Integer(c.GetItem(1)) = 1); // modulo + end; + // power + c := BuiltinModule.pow(a, b); + Assert.IsTrue(c = 8); + // negation + c := -a; + Assert.IsTrue( Integer(c) = -2 ); + // logical operations + //------------------ + // inverse + c := not a; // in python it would be: c = ~2 + Assert.IsTrue( Integer(c) = -3 ); + // shift left (<<) + c := a shl b; + Assert.IsTrue( Integer(c) = 16 ); + c := a shl 1; + Assert.IsTrue( Integer(c) = 4 ); + // shift right (>>) + c := a shl b; + c := c shr b; + Assert.IsTrue( Integer(c) = Integer(a) ); + c := b shr 1; + Assert.IsTrue( Integer(c) = 1 ); + // and + c := a and (a*5); + Assert.IsTrue( Integer(c) = Integer(a) ); + c := a and 6; + Assert.IsTrue( Integer(c) = Integer(a) ); + // or + c := a or b; + Assert.IsTrue( Integer(c) = 3 ); + c := a or 3; + Assert.IsTrue( Integer(c) = 3 ); + // xor + c := a xor b; + Assert.IsTrue( Integer(c) = 1 ); + c := a xor 3; + Assert.IsTrue( Integer(c) = 1 ); + // comparisons + //------------ + // equal + c := a = b; + Assert.IsTrue(c = False); + c := a = a; + Assert.IsTrue(c = True); + Assert.IsTrue( a = 2); + // not equal + c := a <> b; + Assert.IsTrue(c = True); + Assert.IsTrue( not (c = b) ); + c := a <> a; + Assert.IsTrue(c = False); + Assert.IsTrue( a = 2); + // greater than + c := a > b; Assert.IsTrue(c = False); + c := b > a; Assert.IsTrue(c = True); + Assert.IsTrue( a > 1); + // greater or equal than + c := a >= b; Assert.IsTrue(c = False); + c := b >= a; Assert.IsTrue(c = True); + c := a >= a; Assert.IsTrue(c = True); + Assert.IsTrue( a >= 2 ); + // less than + c := a < b; Assert.IsTrue(c = True); + c := b < a; Assert.IsTrue(c = False); + Assert.IsTrue( a < 6); + // less or equal than + c := a <= b; Assert.IsTrue(c = True); + c := b <= a; Assert.IsTrue(c = False); + c := a <= a; Assert.IsTrue(c = True); + Assert.IsTrue( a <= 2); + // parenthesis + c := a * ((a * b) div b); + Assert.IsTrue( c = a*2 ); + // copy + c := a; + Assert.IsTrue( c = a); + Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. + // test long long (Int64) + big := Int64(MaxInt)*4; + b := VarPythonCreate(big); + Assert.IsTrue( b = big ); + Assert.IsTrue( b <> big+1 ); + Assert.IsTrue( b > MaxInt ); + Assert.IsTrue( MaxInt < b ); + Assert.IsTrue( b+1 = big+1 ); + Assert.IsTrue( b*2 = big*2 ); + Assert.IsTrue( b div 2 = big div 2 ); + c := VarPythonCreate(True); + Assert.IsTrue(VarIsBool(c)); + Assert.IsTrue(VarIsTrue(c)); + c := VarPythonCreate(False); + Assert.IsTrue(VarIsBool(c)); + Assert.IsTrue(not VarIsTrue(c)); +end; +procedure TVarPythTest.TestIterator; +var + Module: Variant; + Count: integer; +begin + Count := 0; + for Module in VarPyIterate(SysModule.modules) do begin + Count := Count + 1; + Log(Module); + end; + Assert.IsTrue(Count = len(SysModule.modules)); +end; +procedure TVarPythTest.TestMappings; +var + a, b, c, keys, values : Variant; +begin + // initialize the operands + a := NewPythonDict; + Assert.IsTrue(VarIsPython(a)); + Assert.IsTrue(VarIsPythonMapping(a)); + Assert.IsTrue(VarIsPythonDict(a)); + // There is a bug in D2010 in which Char('a') gets translated to integer parameter + a.SetItem( string('a'), 1 ); + a.SetItem( string('b'), 2 ); + a.SetItem( string('c'), 3 ); + Assert.IsTrue(a.Length = 3); // this is a special property that does the same as: len(a) in Python + Assert.IsTrue(a.Length() = 3); // this is a special method that does the same as the special property + Assert.IsTrue(len(a) = 3); + Assert.IsTrue(a.GetItem(string('a')) = 1); // this is a special method that lets you do the same as: a[0] in Python + Assert.IsTrue(a.GetItem(string('b')) = 2); + Assert.IsTrue(a.GetItem(string('c')) = 3); + + + b := NewPythonDict; + Assert.IsTrue(VarIsPython(b)); + Assert.IsTrue(VarIsPythonMapping(b)); + Assert.IsTrue(VarIsPythonDict(b)); + b.SetItem( string('d'), 4 ); + b.SetItem( string('e'), 5 ); + b.SetItem( string('f'), 6 ); + Assert.IsTrue(b.Length = 3); + Assert.IsTrue(b.Length() = 3); + Assert.IsTrue(len(b) = 3); + Assert.IsTrue(b.GetItem(string('d')) = 4); + Assert.IsTrue(b.GetItem(string('e')) = 5); + Assert.IsTrue(b.GetItem(string('f')) = 6); + + // copy + c := a; + Assert.IsTrue( c = a); + Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. + + // dict methods + Assert.IsTrue( Boolean(a.__contains__(string('a'))) ); + Assert.IsTrue( not Boolean(a.__contains__('abc')) ); + keys := BuiltinModule.list(a.keys()); + keys.sort(); + Assert.IsTrue( keys = VarPythonCreate(VarArrayOf(['a', 'b', 'c']))); + values := BuiltinModule.list(a.values()); + values.sort(); + Assert.IsTrue( values = VarPythonCreate(VarArrayOf([1, 2, 3]))); + c := a; + c.DeleteItem(string('a')); + Assert.IsTrue( not Boolean(c.__contains__(string('a'))) ); + + // test string values + a := NewPythonDict; + a.SetItem( string('a'), 'Hello'); + a.SetItem( string('b'), 'World!'); + a.SetItem( string('c'), ''); + Assert.IsTrue(a.GetItem(string('a')) = 'Hello'); + Assert.IsTrue(a.GetItem(string('b')) = 'World!'); + Assert.IsTrue(a.GetItem(string('c')) = ''); +end; + +procedure TVarPythTest.TestObjects; +var + _main, f, a, b, c : Variant; + val : Integer; + _str : String; +const + Script = + 'class XYZ(object):' + sLineBreak + + ' pass' + sLineBreak + + '' + sLineBreak + + 'class Foo:' + sLineBreak + + ' def __init__(Self, Value=0):' + sLineBreak + + ' Self.Value = Value' + sLineBreak + + ' def __del__(Self):' + sLineBreak + + ' print("delete", Self)' + sLineBreak + + ' def __add__(self, other):' + sLineBreak + + ' return Foo(self.Value + other.Value)' + sLineBreak + + ' def Inc(Self, AValue = 1):' + sLineBreak + + ' Self.Value = Self.Value + AValue' + sLineBreak + + ' def GetSelf(Self):' + sLineBreak + + ' return Self' + sLineBreak + + ' def GetValue(Self):' + sLineBreak + + ' return Self.Value' + sLineBreak + + ' def SetABC(Self, A, B, C):' + sLineBreak + + ' Self.A = A' + sLineBreak + + ' Self.B = B' + sLineBreak + + ' Self.C = C' + sLineBreak + + ' def Add(Self, AFooInst):' + sLineBreak + + ' Self.Value = Self.Value + AFooInst.Value' + sLineBreak + + 'class Bar(Foo):' + sLineBreak + + ' def Inc(Self, AValue = 1):' + sLineBreak + + ' Self.Value = Self.Value - AValue' + sLineBreak + + 'def Add(a, b):' + sLineBreak + + ' return a + b' + sLineBreak + + 'def MakeList(a, b, c, d):' + sLineBreak + + ' return [a, b, c, d]' + sLineBreak + + '' + sLineBreak + + 'f = Foo()' + sLineBreak + + 'print("Created", f)' + sLineBreak + + 'f.Inc()' + sLineBreak + + 'f.Inc(2)' + sLineBreak + + 'b = Bar()' + sLineBreak + + 'b.Inc()' + sLineBreak + + 'b.Inc(2)'; + +begin + FPythonEngine.ExecString(Script); + _main := MainModule; + Assert.IsTrue( VarIsPythonModule(_main) ); + Assert.IsTrue( VarIsPythonModule(SysModule) ); + Assert.IsTrue( Import('sys').version = SysModule.version ); + Log(SysModule.version); + Assert.IsTrue( Boolean(SysModule.modules.Contains(GetPythonEngine.ExecModule)) ); // if __main__ in sys.modules + Assert.IsTrue( VarIsSameType(_main, SysModule) ); + Assert.IsTrue( _type(_main).__name__ = 'module'); + Assert.IsTrue( BuiltinModule.type(_main).__name__ = 'module'); + + Assert.IsTrue( VarIsPythonClass(_main.Foo) ); + Assert.IsTrue( VarIsPythonClass(_main.Bar) ); + Assert.IsTrue( VarIsPythonClass(_main.XYZ) ); + Assert.IsTrue( not VarIsPythonClass(_main.Foo.__add__) ); + Assert.IsTrue( not VarIsPythonClass(_main.f) ); + Assert.IsTrue( VarIsPythonCallable(_main.Foo) ); + Assert.IsTrue( VarIsPythonCallable(_main.Foo) ); + Assert.IsTrue( VarIsTrue(BuiltinModule.callable(_main.Foo)) ); + Assert.IsTrue( VarIsSame(_main.f.__class__, _main.Foo) ); + Assert.IsTrue( VarIsPythonMethod(_main.f.Inc) ); + Assert.IsTrue( VarIsPythonCallable(_main.f.Inc) ); + Assert.IsTrue( VarIsTrue(BuiltinModule.callable(_main.f.Inc)) ); + Assert.IsTrue( VarIsPythonFunction(_main.Add) ); + Assert.IsTrue( VarIsPythonCallable(_main.Add) ); + Assert.IsTrue( VarIsInstanceOf(_main.f, _main.Foo) ); + Assert.IsTrue( VarIsTrue(BuiltinModule.isinstance(_main.f, _main.Foo)) ); + Assert.IsTrue( VarIsSubclassOf(_main.Bar, _main.Foo) ); + Assert.IsTrue( VarIsTrue(BuiltinModule.issubclass(_main.Bar, _main.Foo)) ); + Assert.IsTrue( not VarIsSubclassOf(_main.Foo, _main.Bar) ); + Assert.IsTrue( VarIsInstanceOf(_main.b, _main.Foo) ); + Assert.IsTrue( not VarIsInstanceOf(_main.f, _main.Bar) ); + Assert.IsTrue( VarIsTrue( BuiltinModule.vars(_main).__contains__(string('f')) ) ); + Assert.IsTrue( VarIsTrue( BuiltinModule.dir(_main).Contains(string('f')) ) ); + + f := _main.Foo(); // new instance of class Foo + Log('Instanciate class Foo: ' + f); + f.Inc(); // call a method without any arg, because there's a default arg. + f.Inc(2); // call a method with one arg, overriding the default arg. + Assert.IsTrue( VarIsPythonNumber(f.Value) ); + Assert.IsTrue( VarIsPythonInteger(f.Value) ); + Assert.IsTrue( f.Value = _main.f.Value ); // compare the result with what we did in the script + Assert.IsTrue( f.GetValue() = _main.f.GetValue() ); // compare the result with what we did in the script + Assert.IsTrue( VarIsPython( f.GetSelf() ) ); + Assert.IsTrue( VarIsSame( f.GetSelf(), f ) ); + Assert.IsTrue( BuiltinModule.getattr(f, 'Value') = f.Value ); + // python (+) operator overloading + a := _main.Foo(10); + b := _main.Foo(5); + c := a + b; + Assert.IsTrue(a.Value = 10); + Assert.IsTrue(b.Value = 5); + Assert.IsTrue(c.Value = 15); + Log('Test -> a, b, c : ' + a.Value + ', ' + b.Value + ', ' + c.Value); + // cascading calls + Assert.IsTrue( f.GetSelf().GetSelf().GetSelf().GetSelf().GetValue() = _main.f.GetValue() ); + Assert.IsTrue( Boolean(f.__dict__.__contains__('Value')) ); + Assert.IsTrue( VarIsTrue( BuiltinModule.hasattr(f, 'Value') ) ); + _str := 'Value'; + Assert.IsTrue( Boolean(f.__dict__.__contains__(_str)) ); // check with a string var + Assert.IsTrue( Boolean( BuiltinModule.hasattr(f, _str) ) ); + val := f.Value; + f.Add(f); // passing itself as an argument + Assert.IsTrue( f.Value = val*2 ); + // check param order + f.SetABC(1, 2, 3); + Assert.IsTrue(f.A = 1); + Assert.IsTrue(f.B = 2); + Assert.IsTrue(f.C = 3); + // add a property to an instance + f.Z := 99; + Assert.IsTrue(f.Z = 99); + // add a var to a module + _main.Z := 99; + Assert.IsTrue(_main.Z = 99); + // check none + Assert.IsTrue( VarIsNone(None) ); + Assert.IsTrue( VarIsNone(VarPythonCreate([1, Null, 3]).GetItem(1)) ); // Null is casted to None + Assert.IsTrue( VarIsNone(VarPythonCreate([1, None, 3]).GetItem(1)) ); + Assert.IsTrue( VarIsNone(f.Inc()) ); + Assert.IsTrue( f.Inc() = None ); + Assert.IsTrue( not Boolean(None) ); // if not None: + Assert.IsTrue( not VarIsTrue(None) ); // if not None: + Assert.IsTrue( Boolean(f) ); // if f: + Assert.IsTrue( VarIsTrue(f) ); // if f: + + // call a function + Assert.IsTrue( _main.Add(2, 2) = 4 ); + // call a function with a mix of regular parameters and named parameters + f := _main.MakeList(1, 2, 3, 4); + Assert.IsTrue(VarIsPythonList(f)); + Assert.IsTrue(f.Length = 4); + Assert.IsTrue(f.GetItem(0) = 1); + Assert.IsTrue(f.GetItem(1) = 2); + Assert.IsTrue(f.GetItem(2) = 3); + Assert.IsTrue(f.GetItem(3) = 4); + f := _main.MakeList(1, d:=3, c:=4, b:=2); + Assert.IsTrue(VarIsPythonList(f)); + Assert.IsTrue(f.Length = 4); + Assert.IsTrue(f.GetItem(0) = 1); + Assert.IsTrue(f.GetItem(1) = 2); + Assert.IsTrue(f.GetItem(2) = 4); + Assert.IsTrue(f.GetItem(3) = 3); + f := _main.MakeList(1, 2, d:= 3, c:=4); + Assert.IsTrue(VarIsPythonList(f)); + Assert.IsTrue(f.Length = 4); + Assert.IsTrue(f.GetItem(0) = 1); + Assert.IsTrue(f.GetItem(1) = 2); + Assert.IsTrue(f.GetItem(2) = 4); + Assert.IsTrue(f.GetItem(3) = 3); + f := _main.MakeList(1, 2, 3, d:=4); + Assert.IsTrue(VarIsPythonList(f)); + Assert.IsTrue(f.Length = 4); + Assert.IsTrue(f.GetItem(0) = 1); + Assert.IsTrue(f.GetItem(1) = 2); + Assert.IsTrue(f.GetItem(2) = 3); + Assert.IsTrue(f.GetItem(3) = 4); + f := _main.MakeList(b:=1, a:=2, d:= 3, c:=4); + Assert.IsTrue(VarIsPythonList(f)); + Assert.IsTrue(f.Length = 4); + Assert.IsTrue(f.GetItem(0) = 2); + Assert.IsTrue(f.GetItem(1) = 1); + Assert.IsTrue(f.GetItem(2) = 4); + Assert.IsTrue(f.GetItem(3) = 3); +end; +procedure TVarPythTest.TestSequences; +var + a, b, c : Variant; + iter : Variant; + cpt : Integer; +begin + // initialize the operands + // you can either use the overloaded function with an array of const + // or use the VarArrayOf function that returns an array of variants that will + // be casted to a Python list. + a := VarPythonCreate([1, 2, 3]); + Assert.IsTrue(VarIsPython(a)); + Assert.IsTrue(VarIsPythonSequence(a)); + Assert.IsTrue(VarIsPythonList(a)); + Assert.IsTrue(a.Length = 3); // this is a special property that does the same as: len(a) in Python + Assert.IsTrue(a.Length() = 3); // this is a special method that does the same as the special property + Assert.IsTrue(len(a) = 3); + Assert.IsTrue(a.GetItem(0) = 1); // this is a special method that lets you do the same as: a[0] in Python + Assert.IsTrue(a.GetItem(1) = 2); + Assert.IsTrue(a.GetItem(2) = 3); + Assert.IsTrue(string(a) = '[1, 2, 3]'); + // indexed access using brackets when the sequence is a property of an object (module, instance...) + MainModule.a := VarPythonCreate([1, 2, 3]); + Assert.IsTrue(MainModule.a[1] = 2); + + b := VarPythonCreate(VarArrayOf([4, 5, 6])); + Assert.IsTrue(VarIsPython(b)); + Assert.IsTrue(VarIsPythonSequence(b)); + Assert.IsTrue(VarIsPythonList(b)); + Assert.IsTrue(b.Length = 3); + Assert.IsTrue(b.Length() = 3); + Assert.IsTrue(len(b) = 3); + Assert.IsTrue(b.GetItem(0) = 4); + Assert.IsTrue(b.GetItem(1) = 5); + Assert.IsTrue(b.GetItem(2) = 6); + Assert.IsTrue(string(b) = '[4, 5, 6]'); + // concatenation + c := a + b; + // check result of operation + Assert.IsTrue(string(c) = '[1, 2, 3, 4, 5, 6]'); + // check that operation did not change the content of operands. + Assert.IsTrue(string(a) = '[1, 2, 3]'); + Assert.IsTrue(string(b) = '[4, 5, 6]'); + // now with a litteral: note that with D6 SP1, we can't concatenate a custom variant with an var array of variants + c := a + b + VarPythonCreate(['Hello', 'World!', 3.14]); + Assert.IsTrue( string(c) = '[1, 2, 3, 4, 5, 6, ''Hello'', ''World!'', 3.14]' ); + c := a + VarPythonCreate(['Hello', 'World!', 3.14]) + b; + Assert.IsTrue( string(c) = '[1, 2, 3, ''Hello'', ''World!'', 3.14, 4, 5, 6]' ); + c := VarPythonCreate(['Hello', 'World!', 3.14]) + a + b; + Assert.IsTrue( string(c) = '[''Hello'', ''World!'', 3.14, 1, 2, 3, 4, 5, 6]' ); + + // multiplication + c := a * 3; // in Python the multiplication of sequence concatenates n times the sequence + Assert.IsTrue( string(c) = '[1, 2, 3, 1, 2, 3, 1, 2, 3]' ); + + // comparisons + //------------ + + // equal + c := a = b; + Assert.IsTrue(c = False); + c := a = a; + Assert.IsTrue(c = True); + Assert.IsTrue( string(a) = '[1, 2, 3]'); + + // not equal + c := a <> b; + Assert.IsTrue(c = True); + Assert.IsTrue( not (c = b) ); + c := a <> a; + Assert.IsTrue(c = False); + Assert.IsTrue( string(a) = '[1, 2, 3]'); + + // greater than + c := a > b; Assert.IsTrue(c = False); + c := b > a; Assert.IsTrue(c = True); + Assert.IsTrue( string(a) > '[1, 1, 1]'); + + // greater or equal than + c := a >= b; Assert.IsTrue(c = False); + c := b >= a; Assert.IsTrue(c = True); + c := a >= a; Assert.IsTrue(c = True); + Assert.IsTrue( string(a) >= '[1, 2, 3]' ); + + // less than + c := a < b; Assert.IsTrue(c = True); + c := b < a; Assert.IsTrue(c = False); + Assert.IsTrue( string(a) < '[4, 4, 4]'); + + // less or equal than + c := a <= b; Assert.IsTrue(c = True); + c := b <= a; Assert.IsTrue(c = False); + c := a <= a; Assert.IsTrue(c = True); + Assert.IsTrue( string(a) <= '[1, 2, 3]'); + + // copy + c := a; + Assert.IsTrue( c = a); + Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. + + // sequence methods: + c := b + a; + c.sort(); // note that you must you the parenthesis to distinguish the call between a method or a property. + Assert.IsTrue( c = (a+b) ); + + c := NewPythonList; // facility for building sequences + Assert.IsTrue( not VarIsTrue(c) ); // c is false because it's an empty collection + c.append(1); + c.append(2); + c.append(3); + Assert.IsTrue( VarIsTrue(c) ); // c is true because it's not an empty collection + Assert.IsTrue(c = a); + Assert.IsTrue( c.pop() = 3 ); + Assert.IsTrue( string(c) = '[1, 2]'); + + c := NewPythonList(3); // facility for building sequences + c.SetItem(0, 1); + c.SetItem(1, 2); + c.SetItem(2, 3); + Assert.IsTrue(c = a); + c.DeleteItem(1); + Assert.IsTrue(c = VarPythonCreate([1,3])); + + Assert.IsTrue(VarPythonCreate([1,2,3,4]).GetSlice(1, 3) = VarPythonCreate([2,3])); // same as x = [1,2,3,4]; x[1:3] + Assert.IsTrue(VarPythonCreate([1,2,3,4]).GetSlice(1, Ellipsis) = VarPythonCreate([2,3,4])); // same as x = [1,2,3,4]; x[1:] + Assert.IsTrue(VarPythonCreate([1,2,3,4]).GetSlice(1, -1) = VarPythonCreate([2,3])); // same as x = [1,2,3,4]; x[1:-1] + c := VarPythonCreate([1,2,3,4]); + c.SetSlice(1, 3, VarPythonCreate([7, 8, 9])); + Assert.IsTrue( c = VarPythonCreate([1, 7, 8, 9, 4]) ); + Assert.IsTrue( Boolean(c.Contains( 7 )) ); // same as 7 in c + Assert.IsTrue( not Boolean(c.Contains( 77 )) ); + c.DelSlice(1,3); + Assert.IsTrue( c = VarPythonCreate([1,9,4]) ); + + c := VarPythonCreate([1, 2, 3, 4], stTuple); // test a tuple + Assert.IsTrue( VarIsPythonTuple(c) ); + Assert.IsTrue( VarIsPythonSequence(c) ); + Assert.IsTrue( c.GetItem(1) = 2 ); + Assert.IsTrue( c.Length = 4 ); + c := NewPythonTuple(3); + c.SetItem(0, 1); + c.SetItem(1, 2); + c.SetItem(2, 3); + Assert.IsTrue( VarIsPythonTuple(c) ); + Assert.IsTrue( VarIsPythonSequence(c) ); + Assert.IsTrue( c.GetItem(1) = 2 ); + Assert.IsTrue( c.Length = 3 ); + + // test iterator + iter := BuiltinModule.iter(VarPythonCreate([1, 2, 3, 4], stTuple)); + Assert.IsTrue(VarIsPythonIterator(iter)); + Assert.IsTrue(iter.__next__() = 1); + Assert.IsTrue(iter.__next__() = 2); + Assert.IsTrue(iter.__next__() = 3); + Assert.IsTrue(iter.__next__() = 4); + try + iter.__next__(); + except + on E: EPyStopIteration do + begin + Assert.IsTrue(True); //Ok. + end + else + Assert.IsTrue(False, 'expected stop exception'); + end; + cpt := 0; + iter := VarPyth.iter(VarPythonCreate([1, 2, 3, 4], stTuple)); + Assert.IsTrue(VarIsPythonIterator(iter)); + try + while True do + begin + a := iter.__next__(); + Inc(cpt); + Assert.IsTrue(a = cpt); + end; + except + on E: EPyStopIteration do + begin + Assert.IsTrue(True); //Ok. + end + else + Assert.IsTrue(False, 'expected stop exception'); + end; + Assert.IsTrue(cpt = 4); +end; +procedure TVarPythTest.TestStrings; +var + a, b, c : Variant; + w : WideString; + _obj : PPyObject; +begin + // initialize the operands + a := VarPythonCreate('abc'); + Assert.IsTrue(VarIsPython(a)); + Assert.IsTrue(VarIsPythonString(a)); + Assert.IsTrue(string(a) = 'abc'); + b := VarPythonCreate('def'); + Assert.IsTrue(VarIsPython(b)); + Assert.IsTrue(VarIsPythonString(b)); + Assert.IsTrue(string(b) = 'def'); + // concatenation + c := a + b; + // check result of operation + Assert.IsTrue( string(c) = 'abcdef' ); + // check that operation did not change the content of operands. + Assert.IsTrue(string(a) = 'abc'); + Assert.IsTrue(string(b) = 'def'); + // now with a litteral + c := a + b + '!'; + Assert.IsTrue( string(c) = 'abcdef!' ); + c := a + '!' + b; + Assert.IsTrue( string(c) = 'abc!def' ); + c := '!' + a + b; + Assert.IsTrue( string(c) = '!abcdef' ); + // multiplication + c := a * 3; // in Python the multiplication of string concatenates n times the string + Assert.IsTrue( string(c) = 'abcabcabc' ); + // comparisons + //------------ + // equal + c := a = b; + Assert.IsTrue(c = False); + c := a = a; + Assert.IsTrue(c = True); + Assert.IsTrue( a = 'abc'); + // not equal + c := a <> b; + Assert.IsTrue(c = True); + Assert.IsTrue( not (c = b) ); + c := a <> a; + Assert.IsTrue(c = False); + Assert.IsTrue( a = 'abc'); + // greater than + c := a > b; Assert.IsTrue(c = False); + c := b > a; Assert.IsTrue(c = True); + Assert.IsTrue( a > 'aaa'); + // greater or equal than + c := a >= b; Assert.IsTrue(c = False); + c := b >= a; Assert.IsTrue(c = True); + c := a >= a; Assert.IsTrue(c = True); + Assert.IsTrue( a >= 'abc' ); + // less than + c := a < b; Assert.IsTrue(c = True); + c := b < a; Assert.IsTrue(c = False); + Assert.IsTrue( a < 'bbb'); + // less or equal than + c := a <= b; Assert.IsTrue(c = True); + c := b <= a; Assert.IsTrue(c = False); + c := a <= a; Assert.IsTrue(c = True); + Assert.IsTrue( a <= 'abc'); + // copy + c := a; + Assert.IsTrue( c = a); + Assert.IsTrue( VarIsSame(c, a) ); // checks if 2 variants share the same Python object. + // empty strings + a := VarPythonCreate(''); + Assert.IsTrue(a.length = 0); + Assert.IsTrue(a = ''); + Assert.IsTrue(string(a) = ''); + // Unicode strings + b := VarPythonEval( 'u"Hello world!"' ); + Assert.IsTrue( VarIsPythonUnicode(b) ); + w := FPythonEngine.PyUnicodeAsString(ExtractPythonObjectFrom(b)); + Assert.IsTrue( w = 'Hello world!'); + Assert.IsTrue( b = 'Hello world!'); + Assert.IsTrue( b <> a ); + _obj := FPythonEngine.PyUnicodeFromString(w); + try + c := VarPythonCreate( _obj ); + finally + FPythonEngine.Py_XDecRef(_obj); + end; + Assert.IsTrue(b = c); + Assert.IsTrue(c = w); + Assert.IsTrue( c = 'Hello world!'); + w := b; + Assert.IsTrue( b = w); + Assert.IsTrue( w = 'Hello world!'); + Assert.IsTrue( Length(w) = 12 ); + Assert.IsTrue( Length(w) = b.Length() ); + c := FPythonEngine.PyObjectAsVariant(ExtractPythonObjectFrom(b)); + Assert.IsTrue( c = b ); + Assert.IsTrue( c = w ); + Assert.IsTrue( c = 'Hello world!'); + Assert.IsTrue( VarType(c) and VarTypeMask = varUString ); + c := VarPythonCreate(w); + Assert.IsTrue( c = 'Hello world!'); + Assert.IsTrue( c = w ); + c := VarPythonCreate([w]); + Assert.IsTrue( VarIsPythonUnicode(c.GetItem(0)) ); + Assert.IsTrue( c.GetItem(0) = 'Hello world!'); + Assert.IsTrue( c.GetItem(0) = w ); + c := w; + b := VarPythonCreate(c); + Assert.IsTrue( VarIsPythonUnicode(b) ); + Assert.IsTrue( b = c ); + Assert.IsTrue( b = w ); + // empty strings + a := VarPythonEval( 'u""' ); + Assert.IsTrue(a.length = 0); + Assert.IsTrue(a = ''); + Assert.IsTrue(string(a) = ''); + Assert.IsTrue(WideString(a) = ''); +end; + +initialization + TDUnitX.RegisterTestFixture(TVarPythTest); + +end. From 3c22cb7deb7a6f071eb3715a430703e8472b8d5d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 28 Feb 2024 15:04:29 +0200 Subject: [PATCH 120/174] Deal with wrapping of Generic classes --- Source/WrapDelphi.pas | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index f6518756..aac01686 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -4005,6 +4005,7 @@ function TPyDelphiObject.SetProps(args, keywords: PPyObject): PPyObject; class procedure TPyDelphiObject.SetupType(APythonType: TPythonType); var _ContainerAccessClass : TContainerAccessClass; + TypeName: string; PyWrapper: TPyDelphiWrapper; NearestAncestorClass: TClass; RegisteredClass: TRegisteredClass; @@ -4015,7 +4016,17 @@ class procedure TPyDelphiObject.SetupType(APythonType: TPythonType); {$ENDIF EXTENDED_RTTI} begin inherited; - APythonType.TypeName := AnsiString(GetTypeName); + // Deal with generics + TypeName := GetTypeName; + if Pos('<', TypeName) > 0 then + begin + TypeName := StringReplace(TypeName, '<', '_', [rfReplaceAll]); + TypeName := StringReplace(TypeName, '>', '_', [rfReplaceAll]); + TypeName := StringReplace(TypeName, '.', '_', [rfReplaceAll]); + TypeName := StringReplace(TypeName, ',', '_', [rfReplaceAll]); + end; + + APythonType.TypeName := AnsiString(TypeName); APythonType.Name := string(APythonType.TypeName) + TPythonType.TYPE_COMP_NAME_SUFFIX; APythonType.GenerateCreateFunction := False; APythonType.DocString.Text := 'Wrapper for Pascal class ' + DelphiObjectClass.ClassName; From 1b9a71cbe4f67f946fd820e1e66c6db744d0aa33 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 1 Mar 2024 02:57:30 +0200 Subject: [PATCH 121/174] Improved handling of dynamic arrays in WrapDelphi.pas. --- Source/WrapDelphi.pas | 47 +++++++++++++++------------- Tests/FMX/Android/WrapDelphiTest.pas | 21 +++---------- Tests/WrapDelphiTest.pas | 21 +++---------- 3 files changed, 35 insertions(+), 54 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index aac01686..ba0d91e5 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1937,18 +1937,25 @@ function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; end; {$IFDEF EXTENDED_RTTI} -function DynArrayToPython(const Value: TValue): PPyObject; +function DynArrayToPython(const Value: TValue; DelphiWrapper: TPyDelphiWrapper; + out ErrMsg: string): PPyObject; var I: Integer; - V: Variant; PyEngine: TPythonEngine; + PyObj: PPyObject; begin PyEngine := GetPythonEngine(); Result := PyEngine.PyList_New(Value.GetArrayLength); for I := 0 to Value.GetArrayLength() - 1 do begin - V := Value.GetArrayElement(i).AsVariant; - PyEngine.PyList_SetItem(Result, I, PyEngine.VariantAsPyObject(V)); + PyObj := TValueToPyObject(Value.GetArrayElement(i), DelphiWrapper, ErrMsg); + if not Assigned(PyObj) then + begin + PyEngine.Py_DECREF(Result); + Result := nil; + Break; + end; + PyEngine.PyList_SetItem(Result, I, PyObj); end; end; @@ -1986,14 +1993,8 @@ function SimpleValueToPython(const Value: TValue; out ErrMsg: string): PPyObject Result := SetToPython(Value.TypeData.CompType^, PInteger(Value.GetReferenceToRawData)^); end; - tkArray, tkDynArray: - Result := DynArrayToPython(Value); - tkClass, tkMethod, - tkRecord, tkInterface, {$IFDEF MANAGED_RECORD} tkMRecord,{$ENDIF} - tkClassRef, tkPointer, tkProcedure: - ErrMsg := rs_ErrValueToPython; else - ErrMsg := rs_ErrUnexpected; + ErrMsg := rs_ErrValueToPython; end; except on E: Exception do begin @@ -2128,9 +2129,10 @@ function ValidateDynArray(PyValue: PPyObject; const RttiType: TRttiType; Arr: array of TValue; I: Integer; elType: PPTypeInfo; - V: Variant; - Num: Int64; PyEngine: TPythonEngine; + RttiContext: TRttiContext; + ElementType: TRttiType; + ArrElem: PPyObject; begin Result := False; PyEngine := GetPythonEngine; @@ -2149,18 +2151,17 @@ function ValidateDynArray(PyValue: PPyObject; const RttiType: TRttiType; if elType = nil then Exit; + ElementType := RttiContext.GetType(elType^); + if ElementType = nil then + Exit; + try SetLength(Arr, PyEngine.PySequence_Length(PyValue)); for I := 0 to PyEngine.PySequence_Length(PyValue) - 1 do begin - V := PyEngine.GetSequenceItem(PyValue, i); - if elType^.Kind = tkEnumeration then - begin - Num := TValue.FromVariant(V).Cast(TypeInfo(Int64)).AsInt64; - Arr[i] := TValue.FromOrdinal(elType^, Num); - end - else - Arr[i] := TValue.FromVariant(V).Cast(elType^); + ArrElem := PyEngine.PySequence_GetItem(PyValue, I); + if not PyObjectToTValue(ArrElem, ElementType, Arr[I], ErrMsg) then + Break; end; ParamValue := TValue.FromArray(RttiType.Handle, Arr); Result := True; @@ -2169,7 +2170,7 @@ function ValidateDynArray(PyValue: PPyObject; const RttiType: TRttiType; end; end; -function PyObjectToTValue(PyArg : PPyObject; ArgType: TRttiType; +function PyObjectToTValue(PyArg: PPyObject; ArgType: TRttiType; out Arg: TValue; out ErrMsg: string): Boolean; var Obj: TObject; @@ -2245,6 +2246,8 @@ function TValueToPyObject(const Value: TValue; tkInterface: Result := DelphiWrapper.WrapInterface(Value); tkRecord{$IFDEF MANAGED_RECORD},tkMRecord{$ENDIF}: Result := DelphiWrapper.WrapRecord(Value); + tkArray, tkDynArray: + Result := DynArrayToPython(Value, DelphiWrapper, ErrMsg); else Result := SimpleValueToPython(Value, ErrMsg); end; diff --git a/Tests/FMX/Android/WrapDelphiTest.pas b/Tests/FMX/Android/WrapDelphiTest.pas index 6e73312e..ff4f03c9 100644 --- a/Tests/FMX/Android/WrapDelphiTest.pas +++ b/Tests/FMX/Android/WrapDelphiTest.pas @@ -425,25 +425,14 @@ procedure TTestWrapDelphi.TestStringField; end; procedure TTestWrapDelphi.TestDynArrayParameters; -{var - rc: TRttiContext; - rt: TRttiType; - rm: TRttiMethod; - rp: TArray; - ra: TArray;} -begin -{ rc := TRttiContext.Create; - rt := rc.GetType(TypeInfo(TTestRttiAccess)); - rm := rt.GetMethod('SellFruitsInt'); - rp := rm.GetParameters; - SetLength(ra, 1); - ra[0] := TValue.FromArray(TypeInfo(TIntegerDynArray), [TValue.From(0)]); - rm.Invoke(TestRttiAccess, ra);} +begin + // Integer dynamic array parameter TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; - Rtti_Var.SellFruitsInt(VarPythonCreate([0, 1], stList)); + Rtti_Var.SellFruitsInt(VarPythonCreate([Ord(TFruit.Apple), Ord(TFruit.Banana)], stList)); Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); + // Enumeration dynamic array parameter TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; - Rtti_Var.SellFruits(VarPythonCreate([Ord(TFruit.Apple), Ord(TFruit.Banana)], stList)); + Rtti_Var.SellFruits(VarPythonCreate(['Apple', 'Banana'], stList)); Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); end; diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 941d24bb..ba7ff43e 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -506,25 +506,14 @@ procedure TTestWrapDelphi.TestVarArgs; end; procedure TTestWrapDelphi.TestDynArrayParameters; -{var - rc: TRttiContext; - rt: TRttiType; - rm: TRttiMethod; - rp: TArray; - ra: TArray;} -begin -{ rc := TRttiContext.Create; - rt := rc.GetType(TypeInfo(TTestRttiAccess)); - rm := rt.GetMethod('SellFruitsInt'); - rp := rm.GetParameters; - SetLength(ra, 1); - ra[0] := TValue.FromArray(TypeInfo(TIntegerDynArray), [TValue.From(0)]); - rm.Invoke(TestRttiAccess, ra);} +begin + // Integer dynamic array parameter TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; - Rtti_Var.SellFruitsInt(VarPythonCreate([0, 1], stList)); + Rtti_Var.SellFruitsInt(VarPythonCreate([Ord(TFruit.Apple), Ord(TFruit.Banana)], stList)); Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); + // Enumeration dynamic array parameter TestRttiAccess.Fruits := [TFruit.Apple, TFruit.Banana, TFruit.Orange]; - Rtti_Var.SellFruits(VarPythonCreate([Ord(TFruit.Apple), Ord(TFruit.Banana)], stList)); + Rtti_Var.SellFruits(VarPythonCreate(['Apple', 'Banana'], stList)); Assert.IsTrue(TestRttiAccess.Fruits = [Orange]); end; From a6a8b2978ee5a229c8cc4454dda57a506019f594 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 8 Mar 2024 21:14:57 +0200 Subject: [PATCH 122/174] TPyEngineAnGIL fields should be declared private. --- Source/PythonEngine.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 6d9ef18a..47dc6eda 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -9829,10 +9829,10 @@ function PyStatus_Exception(const APyStatus: PyStatus): Boolean; type TPyEngineAndGIL = class(TInterfacedObject, IPyEngineAndGIL) - fPythonEngine: TPythonEngine; - fThreadState: PPyThreadState; - fGILState: PyGILstate_STATE; private + fPythonEngine: TPythonEngine; + fThreadState: PPyThreadState; + fGILState: PyGILstate_STATE; function GetPyEngine: TPythonEngine; function GetThreadState: PPyThreadState; public From 46e0bf78018d2feaaf8d3cfbd32cdf09fe84c191 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 13 Mar 2024 17:41:56 +0100 Subject: [PATCH 123/174] Fix reference counting in ProcessSystemExit. See https://en.delphipraxis.net/topic/11182-tpydelphiwrapper-memory-leaks/. --- Source/PythonEngine.pas | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 47dc6eda..23e23eb8 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -6425,15 +6425,19 @@ procedure TPythonEngine.ListToSet( List : PPyObject; data : Pointer; size : Inte end; procedure TPythonEngine.CheckError(ACatchStopEx : Boolean = False); + procedure ProcessSystemExit; var errtype, errvalue, errtraceback: PPyObject; SErrValue: string; begin + // PyErr_Fetch clears the error. The returned python objects are new references PyErr_Fetch(errtype, errvalue, errtraceback); Traceback.Refresh(errtraceback); SErrValue := PyObjectAsString(errvalue); - PyErr_Clear; + Py_XDECREF(errtype); + Py_XDECREF(errvalue); + Py_XDECREF(errtraceback); raise EPySystemExit.CreateResFmt(@SPyExcSystemError, [SErrValue]); end; From 2e6faa3faec473dd0cba340b63633c9973024552 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 19 Mar 2024 17:33:27 +0000 Subject: [PATCH 124/174] Fix #464 --- Source/WrapDelphi.pas | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index ba0d91e5..6ec11c1f 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1511,11 +1511,14 @@ function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyO begin Result := nil; if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, LOutMsg) then - begin + try if FRttiMember is TRttiProperty then Result := GetRttiProperty(Obj, TRttiProperty(FRttiMember), FPyDelphiWrapper, LOutMsg) else if FRttiMember is TRttiField then Result := GetRttiField(Obj, TRttiField(FRttiMember), FPyDelphiWrapper, LOutMsg); + except + on E: Exception do + LOutMsg := E.Message; end; if not Assigned(Result) then @@ -1531,13 +1534,16 @@ function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer begin Result := -1; if ValidateClassProperty(AObj, FParentRtti.Handle, Obj, ErrMsg) then - begin + try if ((FRttiMember is TRttiProperty) and SetRttiProperty(Obj, TRttiProperty(FRttiMember), AValue, FPyDelphiWrapper, ErrMsg)) or ((FRttiMember is TRttiField) and SetRttiField(Obj, TRttiField(FRttiMember), AValue, FPyDelphiWrapper, ErrMsg)) then Result := 0 + except + on E: Exception do + ErrMsg := E.Message; end; if Result <> 0 then From 46cd7a66dd9a249b3bc6bac9c2be611f2bde2069 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 28 Mar 2024 15:31:52 +0000 Subject: [PATCH 125/174] TPythonEngine.ExecFile should use utf8 encoding in reading the file. --- Source/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 23e23eb8..7bd52c93 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -5182,7 +5182,7 @@ procedure TPythonEngine.ExecFile(const FileName: string; locals, begin SL := TStringList.Create; try - SL.LoadFromFile(FileName); + SL.LoadFromFile(FileName, TEncoding.UTF8); ExecStrings(SL, locals, globals, FileName); finally SL.Free; From 9d4a980e3f6985a6d89fcfc03ef4b4898b098901 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 1 Apr 2024 16:53:13 +0300 Subject: [PATCH 126/174] Implement PEP587 Python Initialzation Configuration. (necessary for python 3.13 support) Support python 3.13 (incomplete) Drop support for python for python 3.3-3.7 (do not contain support for PEP587) --- Source/PythonEngine.pas | 261 ++++++++++++++++++++++++++-------------- 1 file changed, 174 insertions(+), 87 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 7bd52c93..b124f59d 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -73,59 +73,47 @@ TPythonVersionProp = record end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = ( - (DllName: 'python33.dll'; RegVersion: '3.3'; APIVersion: 1013), - (DllName: 'python34.dll'; RegVersion: '3.4'; APIVersion: 1013), - (DllName: 'python35.dll'; RegVersion: '3.5'; APIVersion: 1013), - (DllName: 'python36.dll'; RegVersion: '3.6'; APIVersion: 1013), - (DllName: 'python37.dll'; RegVersion: '3.7'; APIVersion: 1013), (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'python39.dll'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'python310.dll'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'python311.dll'; RegVersion: '3.11'; APIVersion: 1013), - (DllName: 'python312.dll'; RegVersion: '3.12'; APIVersion: 1013) + (DllName: 'python312.dll'; RegVersion: '3.12'; APIVersion: 1013), + (DllName: 'python313.dll'; RegVersion: '3.13'; APIVersion: 1013) ); {$ENDIF} {$IFDEF _so_files} - PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = ( - (DllName: 'libpython3.3m.so'; RegVersion: '3.3'; APIVersion: 1013), - (DllName: 'libpython3.4m.so'; RegVersion: '3.4'; APIVersion: 1013), - (DllName: 'libpython3.5m.so'; RegVersion: '3.5'; APIVersion: 1013), - (DllName: 'libpython3.6m.so'; RegVersion: '3.6'; APIVersion: 1013), - (DllName: 'libpython3.7m.so'; RegVersion: '3.7'; APIVersion: 1013), (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013), - (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013) + (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013), + (DllName: 'libpython3.13.so'; RegVersion: '3.13'; APIVersion: 1013) ); {$ENDIF} {$IFDEF DARWIN} - PYTHON_KNOWN_VERSIONS: array[1..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = ( - (DllName: 'libpython3.3.dylib'; RegVersion: '3.3'; APIVersion: 1013), - (DllName: 'libpython3.4.dylib'; RegVersion: '3.4'; APIVersion: 1013), - (DllName: 'libpython3.5.dylib'; RegVersion: '3.5'; APIVersion: 1013), - (DllName: 'libpython3.6.dylib'; RegVersion: '3.6'; APIVersion: 1013), - (DllName: 'libpython3.7.dylib'; RegVersion: '3.7'; APIVersion: 1013), (DllName: 'libpython3.8.dylib'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.dylib'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.dylib'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'libpython3.11.dylib'; RegVersion: '3.11'; APIVersion: 1013), - (DllName: 'libpython3.12.dylib'; RegVersion: '3.12'; APIVersion: 1013) + (DllName: 'libpython3.12.dylib'; RegVersion: '3.12'; APIVersion: 1013), + (DllName: 'libpython3.13.dylib'; RegVersion: '3.13'; APIVersion: 1013) ); {$ENDIF} {$IFDEF ANDROID} - PYTHON_KNOWN_VERSIONS: array[5..10] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = ( - (DllName: 'libpython3.7m.so'; RegVersion: '3.7'; APIVersion: 1013), (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013), (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013) + (DllName: 'libpython3.13.so'; RegVersion: '3.13'; APIVersion: 1013) ); {$ENDIF} @@ -966,6 +954,7 @@ PyBufferProcs = record end; //initconfig.h + //See https://docs.python.org/3/c-api/init_config.html const _PyStatus_TYPE_OK = 0; @@ -982,6 +971,92 @@ PyBufferProcs = record exitcode: Integer; end; + PPyWideStringList = ^PyWideStringList; + PyWideStringList = {$IFDEF CPUX86}packed{$ENDIF} record + length: Py_ssize_t; + items: PPWCharT; + end; + + PPyConfig = ^PyConfig; + PyConfig = record + _config_init: Integer; + isolated: Integer; + use_environment: Integer; + dev_mode: Integer; + install_signal_handlers: Integer; + use_hash_seed: Integer; + hash_seed: C_ULong; + faulthandler: Integer; + tracemalloc: Integer; + perf_profiling: Integer; + import_time: Integer; + code_debug_ranges: Integer; + show_ref_count: Integer; + dump_refs: Integer; + dump_refs_file: PWCharT; + malloc_stats: Integer; + filesystem_encoding: PWCharT; + filesystem_errors: PWCharT; + pycache_prefix: PWCharT; + parse_argv: Integer; + orig_argv: PyWideStringList; + argv: PyWideStringList; + xoptions: PyWideStringList; + warnoptions: PyWideStringList ; + site_import: Integer; + bytes_warning: Integer; + warn_default_encoding: Integer; + inspect: Integer; + interactive: Integer; + optimization_level: Integer; + parser_debug: Integer; + write_bytecode: Integer; + verbose: Integer; + quiet: Integer; + user_site_directory: Integer; + configure_c_stdio: Integer; + buffered_stdio: Integer; + stdio_encoding: PWCharT; + stdio_errors: PWCharT; + {$IFDEF MSWINDOWS} + legacy_windows_stdio: Integer; + {$ENDIF} + check_hash_pycs_mode: PWCharT; + use_frozen_modules: Integer; + safe_path: Integer; + int_max_str_digits: Integer; + + (* --- Path configuration inputs ------------ *) + pathconfig_warnings: Integer; + program_name: PWCharT; + pythonpath_env: PWCharT; + home: PWCharT; + platlibdir: PWCharT; + + (* --- Path configuration outputs ----------- *) + module_search_paths_set: Integer; + module_search_paths: PyWideStringList; + stdlib_dir: PWCharT; + executable: PWCharT; + base_executable: PWCharT; + prefix: PWCharT; + base_prefix: PWCharT; + exec_prefix: PWCharT; + base_exec_prefix: PWCharT; + + (* --- Parameter only used by Py_Main() ---------- *) + kip_source_first_line: Integer; + un_command: PWCharT; + un_module: PWCharT; + un_filename: PWCharT; + + (* --- Private fields ---------------------------- *) + install_importlib: Integer; + init_main: Integer; + is_python_build: Integer; +end; + + //####################################################### //## ## //## GIL related ## @@ -1355,15 +1430,6 @@ TPythonInterface=class(TDynamicDll) procedure CheckPython; public - // define Python flags. See file pyDebug.h - Py_DebugFlag: PInteger; - Py_VerboseFlag: PInteger; - Py_InteractiveFlag: PInteger; - Py_OptimizeFlag: PInteger; - Py_NoSiteFlag: PInteger; - Py_FrozenFlag: PInteger; - Py_IgnoreEnvironmentFlag: PInteger; - PyImport_FrozenModules: PP_frozen; Py_None: PPyObject; @@ -1771,6 +1837,18 @@ TPythonInterface=class(TDynamicDll) PyGILState_Ensure : function() : PyGILstate_STATE; cdecl; PyGILState_Release : procedure(gilstate : PyGILState_STATE); cdecl; + // Initialization functions + PyWideStringList_Append : function(var list: PyWideStringList; item: PWCharT): PyStatus; cdecl; + PyWideStringList_Insert : function(var list: PyWideStringList; index: Py_ssize_t; item: PWCharT): PyStatus; cdecl; + PyConfig_InitPythonConfig : procedure(var config: PyConfig); cdecl; + PyConfig_InitIsolatedConfig : procedure(var config: PyConfig); cdecl; + PyConfig_Clear : procedure(var config: PyConfig); cdecl; + PyConfig_SetString : function(var config: PyConfig; config_str: PPWCharT; str: PWCharT): PyStatus; cdecl; + PyConfig_Read : function(var config: PyConfig): PyStatus; cdecl; + PyConfig_SetArgv : function(var config: PyConfig; argc: Py_ssize_t; argv: PPWCharT): PyStatus; cdecl; + PyConfig_SetWideStringList : function(var config: PyConfig; list: PPyWideStringList; length: Py_ssize_t; items: PPWCharT): PyStatus; cdecl; + Py_InitializeFromConfig : function({$IFDEF FPC}constref{$ELSE}[Ref] const{$ENDIF} config: PyConfig): PyStatus; cdecl; + // Not exported in Python 3.8 and implemented as functions - this has been fixed // TODO - deal with the following: // the PyParser_* functions are deprecated in python 3.9 and will be removed in @@ -1887,7 +1965,7 @@ TEngineClient = class; TPathInitializationEvent = procedure ( Sender : TObject; var Path : string ) of Object; TSysPathInitEvent = procedure ( Sender : TObject; PathList : PPyObject ) of Object; TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, - pfFrozenFlag, pfIgnoreEnvironmentFlag); + pfFrozenFlag, pfIgnoreEnvironmentFlag, pfIsolated); TPythonFlags = set of TPythonFlag; @@ -1974,14 +2052,14 @@ TPythonEngine = class(TPythonInterface) procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure CheckRegistry; - procedure SetProgramArgs; + procedure SetProgramArgs(var Config: PyConfig); procedure InitWinConsole; procedure SetUseWindowsConsole( const Value : Boolean ); procedure SetGlobalVars(const Value: PPyObject); procedure SetLocalVars(const Value: PPyObject); procedure SetPyFlags(const Value: TPythonFlags); procedure SetIO(InputOutput: TPythonInputOutput); - procedure AssignPyFlags; + procedure AssignPyFlags(var Config: PyConfig); public // Constructors & Destructors @@ -3647,15 +3725,6 @@ procedure TPythonInterface.CheckPython; procedure TPythonInterface.MapDll; begin - Py_DebugFlag := Import('Py_DebugFlag'); - Py_VerboseFlag := Import('Py_VerboseFlag'); - Py_InteractiveFlag := Import('Py_InteractiveFlag'); - Py_OptimizeFlag := Import('Py_OptimizeFlag'); - Py_NoSiteFlag := Import('Py_NoSiteFlag'); - Py_FrozenFlag := Import('Py_FrozenFlag'); - - Py_IgnoreEnvironmentFlag := Import('Py_IgnoreEnvironmentFlag'); - Py_None := Import('_Py_NoneStruct'); Py_Ellipsis := Import('_Py_EllipsisObject'); Py_False := Import('_Py_FalseStruct'); @@ -4060,6 +4129,17 @@ procedure TPythonInterface.MapDll; PyErr_SetInterrupt := Import('PyErr_SetInterrupt'); PyGILState_Ensure := Import('PyGILState_Ensure'); PyGILState_Release := Import('PyGILState_Release'); + + PyWideStringList_Append := Import('PyWideStringList_Append'); + PyWideStringList_Insert := Import('PyWideStringList_Insert'); + PyConfig_InitPythonConfig := Import('PyConfig_InitPythonConfig'); + PyConfig_InitIsolatedConfig := Import('PyConfig_InitIsolatedConfig'); + PyConfig_Clear := Import('PyConfig_Clear'); + PyConfig_SetString := Import('PyConfig_SetString'); + PyConfig_Read := Import('PyConfig_Read'); + PyConfig_SetArgv := Import('PyConfig_SetArgv'); + PyConfig_SetWideStringList := Import('PyConfig_SetWideStringList'); + Py_InitializeFromConfig := Import('Py_InitializeFromConfig'); end; function TPythonInterface.Py_CompileString(str,filename:PAnsiChar;start:integer):PPyObject; @@ -4596,25 +4676,15 @@ procedure TPythonEngine.DoOpenDll(const aDllName : string); end; end; -procedure TPythonEngine.AssignPyFlags; - - procedure SetFlag( AFlag: PInteger; AValue : Boolean ); - begin - if AValue then - AFlag^ := 1 - else - AFlag^ := 0; - end; - +procedure TPythonEngine.AssignPyFlags(var Config: PyConfig); begin - // define each Python flag. See file pyDebug.h - SetFlag(Py_DebugFlag, pfDebug in FPyFlags); - SetFlag(Py_VerboseFlag, pfVerbose in FPyFlags); - SetFlag(Py_InteractiveFlag, pfInteractive in FPyFlags); - SetFlag(Py_OptimizeFlag, pfOptimize in FPyFlags); - SetFlag(Py_NoSiteFlag, pfNoSite in FPyFlags); - SetFlag(Py_FrozenFlag, pfFrozenFlag in FPyFlags); - SetFlag(Py_IgnoreEnvironmentFlag, pfIgnoreEnvironmentFlag in FPyFlags); + Config.parser_debug := IfThen(pfDebug in FPyFlags, 1, 0); + Config.verbose := IfThen(pfVerbose in FPyFlags, 1, 0); + Config.interactive := IfThen(pfInteractive in FPyFlags, 1, 0); + Config.optimization_level := IfThen(pfOptimize in FPyFlags, 1, 0); + Config.site_import := IfThen(pfNoSite in FPyFlags, 0, 1); + Config.pathconfig_warnings := IfThen(pfFrozenFlag in FPyFlags, 1, 0); + Config.use_environment := IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1); end; procedure TPythonEngine.Initialize; @@ -4689,6 +4759,7 @@ procedure TPythonEngine.Initialize; var i : Integer; + Config: PyConfig; begin if Assigned(gPythonEngine) then raise Exception.Create('There is already one instance of TPythonEngine running' ); @@ -4700,19 +4771,41 @@ procedure TPythonEngine.Initialize; FInitialized := True else begin - CheckRegistry; - if Assigned(Py_SetProgramName) and (Length(FProgramName) > 0) then - Py_SetProgramName(PWCharT(FProgramName)); - AssignPyFlags; - if Length(FPythonHome) > 0 then - Py_SetPythonHome(PWCharT(FPythonHome)); - Py_Initialize; +// CheckRegistry; +// if Assigned(Py_SetProgramName) and (Length(FProgramName) > 0) then +// Py_SetProgramName(PWCharT(FProgramName)); +// AssignPyFlags; +// if Length(FPythonHome) > 0 then +// Py_SetPythonHome(PWCharT(FPythonHome)); +// Py_Initialize; + + // Fills Config with zeros and then sets some default values + if pfIsolated in FPyFlags then + PyConfig_InitIsolatedConfig(Config) + else + PyConfig_InitPythonConfig(Config); + try + AssignPyFlags(Config); + + // Set programname and pythonhome if available + if Length(FProgramName) > 0 then + PyConfig_SetString(Config, @Config.program_name, PWCharT(FProgramName)); + if Length(FPythonHome) > 0 then + PyConfig_SetString(Config, @Config.program_name, PWCharT(FPythonHome)); + + // Set program arguments (sys.argv) + SetProgramArgs(Config); + + Py_InitializeFromConfig(Config); + finally + PyConfig_Clear(Config); + end; + if Assigned(Py_IsInitialized) then FInitialized := Py_IsInitialized() <> 0 else FInitialized := True; InitSysPath; - SetProgramArgs; if InitThreads and Assigned(PyEval_InitThreads) then PyEval_InitThreads; if RedirectIO and Assigned(FIO) then @@ -4842,20 +4935,16 @@ procedure TPythonEngine.CheckRegistry; {$ENDIF} end; -procedure TPythonEngine.SetProgramArgs; +procedure TPythonEngine.SetProgramArgs(var Config: PyConfig); var - I, argc : Integer; - wargv : array of PWCharT; - WL : array of WCharTString; + I: Integer; TempS: UnicodeString; + Str: WCharTString; + begin - // we build a string list of the arguments, because ParamStr returns a volatile string - // and we want to build an array of PWCharT, pointing to valid strings. - argc := ParamCount; - SetLength(wargv, argc + 1); - // build the PWCharT array - SetLength(WL, argc+1); - for I := 0 to argc do begin + Config.parse_argv := 0; // do not parse + for I := 0 to ParamCount do + begin { ... the first entry should refer to the script file to be executed rather than the executable hosting the Python interpreter. If there isn’t a @@ -4866,14 +4955,12 @@ procedure TPythonEngine.SetProgramArgs; else TempS := ParamStr(I); {$IFDEF POSIX} - WL[I] := UnicodeStringToUCS4String(TempS); + Str := UnicodeStringToUCS4String(TempS); {$ELSE} - WL[I] := UnicodeString(TempS); + Str := TempS; {$ENDIF} - wargv[I] := PWCharT(WL[I]); - end; - // set the argv list of the sys module with the application arguments - PySys_SetArgv( argc + 1, PPWCharT(wargv) ); + PyWideStringList_Append(Config.argv, PWCharT(Str)); + end; end; procedure TPythonEngine.InitWinConsole; From d26ede5cfe71cc80992ebccea6d6d4cb47396379 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 1 Apr 2024 18:41:12 +0300 Subject: [PATCH 127/174] Set VenvPythonExe using PyConfig PythonHome and ProgramName no longer need to be stored as WCharTString --- Source/PythonEngine.pas | 74 +++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index b124f59d..3af53848 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2011,8 +2011,8 @@ TPythonEngine = class(TPythonInterface) FClients: TList; FExecModule: AnsiString; FAutoFinalize: Boolean; - FProgramName: WCharTString; - FPythonHome: WCharTString; + FProgramName: UnicodeString; + FPythonHome: UnicodeString; FPythonPath: WCharTString; FInitThreads: Boolean; FOnPathInitialization: TPathInitializationEvent; @@ -2033,8 +2033,6 @@ TPythonEngine = class(TPythonInterface) FPyDateTime_TZInfoType: PPyObject; FPyDateTime_TimeTZType: PPyObject; FPyDateTime_DateTimeTZType: PPyObject; - function GetPythonHome: UnicodeString; - function GetProgramName: UnicodeString; function GetPythonPath: UnicodeString; procedure SetPythonPath(const Value: UnicodeString); @@ -2074,7 +2072,6 @@ TPythonEngine = class(TPythonInterface) function Run_CommandAsObjectWithDict(const command: AnsiString; mode: Integer; locals, globals: PPyObject; const FileName: string = ''): PPyObject; function EncodeString (const str: UnicodeString): AnsiString; {$IFDEF FPC}overload;{$ENDIF} {$IFDEF FPC} - overload; function EncodeString (const str: AnsiString): AnsiString; overload; {$ENDIF} function EncodeWindowsFilePath(const str: string): AnsiString; @@ -2157,8 +2154,8 @@ TPythonEngine = class(TPythonInterface) property LocalVars : PPyObject read FLocalVars Write SetLocalVars; property GlobalVars : PPyObject read FGlobalVars Write SetGlobalVars; property IOPythonModule: TObject read FIOPythonModule; {TPythonModule} - property PythonHome: UnicodeString read GetPythonHome write SetPythonHome; - property ProgramName: UnicodeString read GetProgramName write SetProgramName; + property PythonHome: UnicodeString read FPythonHome write SetPythonHome; + property ProgramName: UnicodeString read FProgramName write SetProgramName; property PythonPath: UnicodeString read GetPythonPath write SetPythonPath; published property AutoFinalize: Boolean read FAutoFinalize write FAutoFinalize default True; @@ -2992,6 +2989,7 @@ procedure PythonVersionFromDLLName(LibName: string; out MajorVersion, MinorVersi function PythonVersionFromRegVersion(const ARegVersion: string; out AMajorVersion, AMinorVersion: integer): boolean; function PyStatus_Exception(const APyStatus: PyStatus): Boolean; +function StringToWCharTString(Str: string): WcharTString; //####################################################### //## ## @@ -4692,19 +4690,7 @@ procedure TPythonEngine.Initialize; procedure InitSysPath; var _path : PPyObject; - const Script = - 'import sys' + sLineBreak + - 'sys.executable = r"%s"' + sLineBreak + - 'path = sys.path' + sLineBreak + - 'for i in range(len(path)-1, -1, -1):' + sLineBreak + - ' if path[i].find("site-packages") > 0:' + sLineBreak + - ' path.pop(i)' + sLineBreak + - 'import site' + sLineBreak + - 'site.main()' + sLineBreak + - 'del sys, path, i, site'; begin - if VenvPythonExe <> '' then - ExecString(AnsiString(Format(Script, [VenvPythonExe]))); _path := PySys_GetObject('path'); if Assigned(FOnSysPathInit) then FOnSysPathInit(Self, _path); @@ -4788,11 +4774,18 @@ procedure TPythonEngine.Initialize; AssignPyFlags(Config); // Set programname and pythonhome if available - if Length(FProgramName) > 0 then - PyConfig_SetString(Config, @Config.program_name, PWCharT(FProgramName)); - if Length(FPythonHome) > 0 then - PyConfig_SetString(Config, @Config.program_name, PWCharT(FPythonHome)); - + if FProgramName <> '' then + PyConfig_SetString(Config, @Config.program_name, + PWCharT(StringToWCharTString(FProgramName))); + if FPythonHome <> '' then + PyConfig_SetString(Config, @Config.program_name, + PWCharT(StringToWCharTString(FPythonHome))); + // Set venv executable if available + if FVenvPythonExe <> '' then + PyConfig_SetString(Config, @Config.program_name, + PWCharT(StringToWCharTString(FVenvPythonExe))); + + PyConfig_Read(Config); // Set program arguments (sys.argv) SetProgramArgs(Config); @@ -5025,18 +5018,6 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); end; // of if end; -function TPythonEngine.GetPythonHome: UnicodeString; -begin -{$IFDEF POSIX} - if Length(FPythonHome) = 0 then - Result := '' - else - Result := UCS4StringToUnicodeString(FPythonHome); -{$ELSE} - Result := FPythonHome; -{$ENDIF} -end; - function TPythonEngine.GetPythonPath: UnicodeString; begin {$IFDEF POSIX} @@ -5062,18 +5043,6 @@ function TPythonEngine.GetSequenceItem(sequence: PPyObject; end; end; -function TPythonEngine.GetProgramName: UnicodeString; -begin -{$IFDEF POSIX} - if Length(FProgramName) = 0 then - Result := '' - else - Result := UCS4StringToUnicodeString(FProgramName); -{$ELSE} - Result := FProgramName; -{$ENDIF} -end; - procedure TPythonEngine.SetPythonHome(const PythonHome: UnicodeString); begin {$IFDEF POSIX} @@ -9916,6 +9885,15 @@ function PyStatus_Exception(const APyStatus: PyStatus): Boolean; Result := APyStatus._type <> _PyStatus_TYPE_OK; end; +function StringToWCharTString(Str: string): WcharTString; +begin + {$IFDEF POSIX} + Result := UnicodeStringToUCS4String(UnicodeString(Str)); + {$ELSE} + Result := Str; + {$ENDIF} +end; + { TPyEngineAndGIL - Internal class for SafePythonEngine } type From 6cd46ca269fc6d8f3fbe9970ebce0e188b7fa0e5 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 1 Apr 2024 18:46:23 +0300 Subject: [PATCH 128/174] Removed CheckRegistry and associated OnPathInitialization event. It was a bad way to change the python path by modifying the Windows Registry. --- Source/PythonEngine.pas | 76 ----------------------------------------- 1 file changed, 76 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 3af53848..13aa5d06 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1962,7 +1962,6 @@ TPythonInterface=class(TDynamicDll) DEFAULT_DATETIME_CONVERSION_MODE = dcmToTuple; type TEngineClient = class; - TPathInitializationEvent = procedure ( Sender : TObject; var Path : string ) of Object; TSysPathInitEvent = procedure ( Sender : TObject; PathList : PPyObject ) of Object; TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, pfFrozenFlag, pfIgnoreEnvironmentFlag, pfIsolated); @@ -2015,7 +2014,6 @@ TPythonEngine = class(TPythonInterface) FPythonHome: UnicodeString; FPythonPath: WCharTString; FInitThreads: Boolean; - FOnPathInitialization: TPathInitializationEvent; FOnSysPathInit: TSysPathInitEvent; FTraceback: TPythonTraceback; FUseWindowsConsole: Boolean; @@ -2049,7 +2047,6 @@ TPythonEngine = class(TPythonInterface) function GetClients( idx : Integer ) : TEngineClient; procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure CheckRegistry; procedure SetProgramArgs(var Config: PyConfig); procedure InitWinConsole; procedure SetUseWindowsConsole( const Value : Boolean ); @@ -2168,7 +2165,6 @@ TPythonEngine = class(TPythonInterface) property RedirectIO: Boolean read FRedirectIO write FRedirectIO default True; property UseWindowsConsole: Boolean read FUseWindowsConsole write FUseWindowsConsole default False; property OnAfterInit: TNotifyEvent read FOnAfterInit write FOnAfterInit; - property OnPathInitialization: TPathInitializationEvent read FOnPathInitialization write FOnPathInitialization; property OnSysPathInit: TSysPathInitEvent read FOnSysPathInit write FOnSysPathInit; end; @@ -4757,14 +4753,6 @@ procedure TPythonEngine.Initialize; FInitialized := True else begin -// CheckRegistry; -// if Assigned(Py_SetProgramName) and (Length(FProgramName) > 0) then -// Py_SetProgramName(PWCharT(FProgramName)); -// AssignPyFlags; -// if Length(FPythonHome) > 0 then -// Py_SetPythonHome(PWCharT(FPythonHome)); -// Py_Initialize; - // Fills Config with zeros and then sets some default values if pfIsolated in FPyFlags then PyConfig_InitIsolatedConfig(Config) @@ -4872,62 +4860,6 @@ procedure TPythonEngine.Notification( AComponent: TComponent; IO := nil end; -procedure TPythonEngine.CheckRegistry; -{$IFDEF MSWINDOWS} -var - key : string; - Path : string; - NewPath : string; -{$IFDEF CPUX86} - LMajorVersion : integer; - LMinorVersion : integer; -{$ENDIF} - VersionSuffix: string; -{$ENDIF} -begin -{$IFDEF MSWINDOWS} - if Assigned( FOnPathInitialization ) then - try - with TRegistry.Create(KEY_ALL_ACCESS and not KEY_NOTIFY) do - try - VersionSuffix := ''; -{$IFDEF CPUX86} - PythonVersionFromRegVersion(RegVersion, LMajorVersion, LMinorVersion); - if (LMajorVersion > 3) or ((LMajorVersion = 3) and (LMinorVersion >= 5)) then - VersionSuffix := '-32'; -{$ENDIF} - key := Format('\Software\Python\PythonCore\%s%s\PythonPath', [RegVersion, VersionSuffix]); - - RootKey := HKEY_LOCAL_MACHINE; - if not KeyExists( key ) then - begin - // try a current user installation - RootKey := HKEY_CURRENT_USER; - if not KeyExists( key ) then Exit; - end; - // Key found - OpenKey( key, True ); - try - Path := ReadString(''); - NewPath := Path; - FOnPathInitialization( Self, NewPath ); - if NewPath <> Path then - begin - WriteString( '', NewPath ); - end; - finally - CloseKey; - end; - finally - Free; - end; - except - // under WinNT, with a user without admin rights, the access to the - // LocalMachine keys would raise an exception. - end; -{$ENDIF} -end; - procedure TPythonEngine.SetProgramArgs(var Config: PyConfig); var I: Integer; @@ -5045,11 +4977,7 @@ function TPythonEngine.GetSequenceItem(sequence: PPyObject; procedure TPythonEngine.SetPythonHome(const PythonHome: UnicodeString); begin -{$IFDEF POSIX} - FPythonHome := UnicodeStringToUCS4String(PythonHome); -{$ELSE} FPythonHome := PythonHome; -{$ENDIF} end; procedure TPythonEngine.SetPythonPath(const Value: UnicodeString); @@ -5063,11 +4991,7 @@ procedure TPythonEngine.SetPythonPath(const Value: UnicodeString); procedure TPythonEngine.SetProgramName(const ProgramName: UnicodeString); begin -{$IFDEF POSIX} - FProgramName := UnicodeStringToUCS4String(ProgramName); -{$ELSE} FProgramName := ProgramName; -{$ENDIF} end; function TPythonEngine.EvalPyFunction(pyfunc, pyargs:PPyObject): Variant; From 603a9f638f87eda0e71ca323d40ae611eea1676d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 1 Apr 2024 19:02:48 +0300 Subject: [PATCH 129/174] Removed InitThreads property and deprecated PyEval_InitThreads which does nothing since python 3.7. --- Demos/Demo11/ThSort.dfm | 1 - Demos/Demo33/ThSort.dfm | 1 - Source/PythonEngine.pas | 18 ------------------ Tests/AutoWrapEventHandlerTest.pas | 1 - Tests/NumberServicesTest.pas | 1 - Tests/VarPythTest.pas | 1 - Tests/WrapDelphiEventHandlerTest.pas | 1 - Tests/WrapDelphiTest.pas | 1 - .../Webinar II/AnalyticsDemo/MainFormSVG.dfm | 1 - 9 files changed, 26 deletions(-) diff --git a/Demos/Demo11/ThSort.dfm b/Demos/Demo11/ThSort.dfm index 2f5f2710..f0c50c0d 100644 --- a/Demos/Demo11/ThSort.dfm +++ b/Demos/Demo11/ThSort.dfm @@ -165,7 +165,6 @@ object ThreadSortForm: TThreadSortForm OnClick = SaveBtnClick end object PythonEngine1: TPythonEngine - InitThreads = True RedirectIO = False Left = 16 Top = 32 diff --git a/Demos/Demo33/ThSort.dfm b/Demos/Demo33/ThSort.dfm index fa04fa71..3b4c41e6 100644 --- a/Demos/Demo33/ThSort.dfm +++ b/Demos/Demo33/ThSort.dfm @@ -171,7 +171,6 @@ object ThreadSortForm: TThreadSortForm OnClick = StopBtnClick end object PythonEngine1: TPythonEngine - InitThreads = True PyFlags = [pfDebug, pfInteractive, pfVerbose] RedirectIO = False Left = 16 diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 13aa5d06..34824c6c 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1605,7 +1605,6 @@ TPythonInterface=class(TDynamicDll) PyEval_GetGlobals:function :PPyObject; cdecl; PyEval_GetLocals:function :PPyObject; cdecl; - PyEval_InitThreads:procedure; cdecl; PyEval_RestoreThread:procedure( tstate: PPyThreadState); cdecl; PyEval_SaveThread:function :PPyThreadState; cdecl; @@ -2013,7 +2012,6 @@ TPythonEngine = class(TPythonInterface) FProgramName: UnicodeString; FPythonHome: UnicodeString; FPythonPath: WCharTString; - FInitThreads: Boolean; FOnSysPathInit: TSysPathInitEvent; FTraceback: TPythonTraceback; FUseWindowsConsole: Boolean; @@ -2042,7 +2040,6 @@ TPythonEngine = class(TPythonInterface) procedure DoOpenDll(const aDllName : string); override; procedure SetInitScript(Value: TStrings); function GetThreadState: PPyThreadState; - procedure SetInitThreads(Value: Boolean); function GetClientCount : Integer; function GetClients( idx : Integer ) : TEngineClient; procedure Notification(AComponent: TComponent; @@ -2159,7 +2156,6 @@ TPythonEngine = class(TPythonInterface) property VenvPythonExe: string read FVenvPythonExe write FVenvPythonExe; property DatetimeConversionMode: TDatetimeConversionMode read FDatetimeConversionMode write FDatetimeConversionMode default DEFAULT_DATETIME_CONVERSION_MODE; property InitScript: TStrings read FInitScript write SetInitScript; - property InitThreads: Boolean read FInitThreads write SetInitThreads default False; property IO: TPythonInputOutput read FIO write SetIO; property PyFlags: TPythonFlags read FPyFlags write SetPyFlags default []; property RedirectIO: Boolean read FRedirectIO write FRedirectIO default True; @@ -3880,7 +3876,6 @@ procedure TPythonInterface.MapDll; PyEval_GetFrame := Import('PyEval_GetFrame'); PyEval_GetGlobals := Import('PyEval_GetGlobals'); PyEval_GetLocals := Import('PyEval_GetLocals'); - PyEval_InitThreads := Import('PyEval_InitThreads'); PyEval_RestoreThread := Import('PyEval_RestoreThread'); PyEval_SaveThread := Import('PyEval_SaveThread'); PyFile_GetLine := Import('PyFile_GetLine'); @@ -4555,7 +4550,6 @@ constructor TPythonEngine.Create(AOwner: TComponent); FRedirectIO := True; FExecModule := '__main__'; FAutoFinalize := True; - FInitThreads := False; FTraceback := TPythonTraceback.Create; FUseWindowsConsole := False; FPyFlags := []; @@ -4787,8 +4781,6 @@ procedure TPythonEngine.Initialize; else FInitialized := True; InitSysPath; - if InitThreads and Assigned(PyEval_InitThreads) then - PyEval_InitThreads; if RedirectIO and Assigned(FIO) then DoRedirectIO; end; @@ -4820,16 +4812,6 @@ function TPythonEngine.GetThreadState: PPyThreadState; Result := nil; end; -procedure TPythonEngine.SetInitThreads(Value: Boolean); -begin - if Value <> FInitThreads then - begin - if Value and Assigned(PyEval_InitThreads) then - PyEval_InitThreads; - FInitThreads := Value; - end; -end; - procedure TPythonEngine.SetIO(InputOutput: TPythonInputOutput); begin if InputOutput <> fIO then diff --git a/Tests/AutoWrapEventHandlerTest.pas b/Tests/AutoWrapEventHandlerTest.pas index feb9656d..173794c2 100644 --- a/Tests/AutoWrapEventHandlerTest.pas +++ b/Tests/AutoWrapEventHandlerTest.pas @@ -71,7 +71,6 @@ procedure TTestAutoWrapEventHandlers.SetupFixture; PythonEngine.FatalMsgDlg := True; PythonEngine.UseLastKnownVersion := True; PythonEngine.AutoFinalize := True; - PythonEngine.InitThreads := True; PythonEngine.PyFlags := [pfInteractive]; DelphiModule := TPythonModule.Create(nil); DelphiModule.Name := 'DelphiModule'; diff --git a/Tests/NumberServicesTest.pas b/Tests/NumberServicesTest.pas index d1e1a3cf..ca1bdb1a 100644 --- a/Tests/NumberServicesTest.pas +++ b/Tests/NumberServicesTest.pas @@ -176,7 +176,6 @@ procedure TTestNumberServices.SetupFixture; PythonEngine.UseLastKnownVersion := True; PythonEngine.AutoFinalize := True; - PythonEngine.InitThreads := True; PythonEngine.PyFlags := [pfInteractive]; PythonEngine.LoadDll; diff --git a/Tests/VarPythTest.pas b/Tests/VarPythTest.pas index 34e68f0a..f32fa7de 100644 --- a/Tests/VarPythTest.pas +++ b/Tests/VarPythTest.pas @@ -74,7 +74,6 @@ procedure TTestVarPyth.SetupFixture; PythonEngine.UseLastKnownVersion := True; PythonEngine.AutoFinalize := True; - PythonEngine.InitThreads := True; PythonEngine.PyFlags := [pfInteractive]; PythonEngine.LoadDll; end; diff --git a/Tests/WrapDelphiEventHandlerTest.pas b/Tests/WrapDelphiEventHandlerTest.pas index c6cda4ce..efaf5b44 100644 --- a/Tests/WrapDelphiEventHandlerTest.pas +++ b/Tests/WrapDelphiEventHandlerTest.pas @@ -215,7 +215,6 @@ procedure TTestWrapDelphiEventHandlers.SetupFixture; PythonEngine.FatalMsgDlg := True; PythonEngine.UseLastKnownVersion := True; PythonEngine.AutoFinalize := True; - PythonEngine.InitThreads := True; PythonEngine.PyFlags := [pfInteractive]; DelphiModule := TPythonModule.Create(nil); DelphiModule.Name := 'DelphiModule'; diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index ba7ff43e..384584fa 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -202,7 +202,6 @@ procedure TTestWrapDelphi.SetupFixture; PythonEngine.UseLastKnownVersion := True; PythonEngine.AutoFinalize := True; - PythonEngine.InitThreads := True; PythonEngine.PyFlags := [pfInteractive]; DelphiModule := TPythonModule.Create(nil); diff --git a/Tutorials/Webinar II/AnalyticsDemo/MainFormSVG.dfm b/Tutorials/Webinar II/AnalyticsDemo/MainFormSVG.dfm index 15464024..1642832f 100644 --- a/Tutorials/Webinar II/AnalyticsDemo/MainFormSVG.dfm +++ b/Tutorials/Webinar II/AnalyticsDemo/MainFormSVG.dfm @@ -254,7 +254,6 @@ object Form1: TForm1 Top = 89 end object PythonEngine1: TPythonEngine - InitThreads = True IO = PythonGUIInputOutput1 Left = 632 Top = 136 From 5b2a7bdebdfe788d86a7f4691a37e5d5dfbeeeea Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 1 Apr 2024 20:11:32 +0300 Subject: [PATCH 130/174] The public PythonPath property can be used to initialize sys.path. --- Source/PythonEngine.pas | 49 +++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 34824c6c..e0d886e9 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2011,7 +2011,7 @@ TPythonEngine = class(TPythonInterface) FAutoFinalize: Boolean; FProgramName: UnicodeString; FPythonHome: UnicodeString; - FPythonPath: WCharTString; + FPythonPath: UnicodeString; FOnSysPathInit: TSysPathInitEvent; FTraceback: TPythonTraceback; FUseWindowsConsole: Boolean; @@ -2029,8 +2029,6 @@ TPythonEngine = class(TPythonInterface) FPyDateTime_TZInfoType: PPyObject; FPyDateTime_TimeTZType: PPyObject; FPyDateTime_DateTimeTZType: PPyObject; - function GetPythonPath: UnicodeString; - procedure SetPythonPath(const Value: UnicodeString); protected procedure Initialize; @@ -2150,7 +2148,10 @@ TPythonEngine = class(TPythonInterface) property IOPythonModule: TObject read FIOPythonModule; {TPythonModule} property PythonHome: UnicodeString read FPythonHome write SetPythonHome; property ProgramName: UnicodeString read FProgramName write SetProgramName; - property PythonPath: UnicodeString read GetPythonPath write SetPythonPath; + // List of paths separated with the path delimiter + // If used with pfNoSite, it completely overwrites the pyhon path on initialization! + // For adding directories to sys.path use the OnSysPathInit event instead. + property PythonPath: UnicodeString read FPythonPath write FPythonPath; published property AutoFinalize: Boolean read FAutoFinalize write FAutoFinalize default True; property VenvPythonExe: string read FVenvPythonExe write FVenvPythonExe; @@ -4686,6 +4687,21 @@ procedure TPythonEngine.Initialize; FOnSysPathInit(Self, _path); end; + procedure SetPythonPath(var Config: PyConfig); + var + Paths: TArray; + I: Integer; + begin + if FPythonPath = '' then Exit; + + Paths := FPythonPath.Split([PathSep], TStringSplitOptions.ExcludeLastEmpty); + for I := 0 to Length(Paths) - 1 do + PyWideStringList_Append(Config.module_search_paths, + PWCharT(StringToWCharTString(Paths[I]))); + if Config.module_search_paths.length > 0 then + Config.module_search_paths_set := 1; + end; + function GetVal(AModule : PPyObject; AVarName : AnsiString) : PPyObject; begin Result := PyObject_GetAttrString(AModule, PAnsiChar(AVarName)); @@ -4767,10 +4783,12 @@ procedure TPythonEngine.Initialize; PyConfig_SetString(Config, @Config.program_name, PWCharT(StringToWCharTString(FVenvPythonExe))); - PyConfig_Read(Config); // Set program arguments (sys.argv) SetProgramArgs(Config); + // PythonPath + SetPythonPath(Config); + Py_InitializeFromConfig(Config); finally PyConfig_Clear(Config); @@ -4932,18 +4950,6 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); end; // of if end; -function TPythonEngine.GetPythonPath: UnicodeString; -begin -{$IFDEF POSIX} - if (Length(FPythonPath) > 0) then - Result := UCS4StringToUnicodeString(FPythonPath) - else - Result := ''; -{$ELSE} - Result := FPythonPath; -{$ENDIF} -end; - function TPythonEngine.GetSequenceItem(sequence: PPyObject; idx: Integer): Variant; var @@ -4962,15 +4968,6 @@ procedure TPythonEngine.SetPythonHome(const PythonHome: UnicodeString); FPythonHome := PythonHome; end; -procedure TPythonEngine.SetPythonPath(const Value: UnicodeString); -begin -{$IFDEF POSIX} - FPythonPath := UnicodeStringToUCS4String(Value); -{$ELSE} - FPythonPath := Value; -{$ENDIF} -end; - procedure TPythonEngine.SetProgramName(const ProgramName: UnicodeString); begin FProgramName := ProgramName; From a7ea765319d077310f20a927548154906fb89f7c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 1 Apr 2024 20:16:50 +0300 Subject: [PATCH 131/174] Added OnConfigInit event. --- Source/PythonEngine.pas | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index e0d886e9..afaa7842 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1961,7 +1961,8 @@ TPythonInterface=class(TDynamicDll) DEFAULT_DATETIME_CONVERSION_MODE = dcmToTuple; type TEngineClient = class; - TSysPathInitEvent = procedure ( Sender : TObject; PathList : PPyObject ) of Object; + TSysPathInitEvent = procedure(Sender: TObject; PathList: PPyObject) of object; + TConfigInitEvent = procedure(Sender: TObject; var Config: PyConfig) of object; TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, pfFrozenFlag, pfIgnoreEnvironmentFlag, pfIsolated); TPythonFlags = set of TPythonFlag; @@ -2013,6 +2014,7 @@ TPythonEngine = class(TPythonInterface) FPythonHome: UnicodeString; FPythonPath: UnicodeString; FOnSysPathInit: TSysPathInitEvent; + FOnConfigInit: TConfigInitEvent; FTraceback: TPythonTraceback; FUseWindowsConsole: Boolean; FGlobalVars: PPyObject; @@ -2163,6 +2165,8 @@ TPythonEngine = class(TPythonInterface) property UseWindowsConsole: Boolean read FUseWindowsConsole write FUseWindowsConsole default False; property OnAfterInit: TNotifyEvent read FOnAfterInit write FOnAfterInit; property OnSysPathInit: TSysPathInitEvent read FOnSysPathInit write FOnSysPathInit; + property OnConfigInit: TConfigInitEvent read FOnConfigInit write FOnConfigInit; + end; @@ -4789,6 +4793,10 @@ procedure TPythonEngine.Initialize; // PythonPath SetPythonPath(Config); + // Fine tune Config + if Assigned(FOnConfigInit) then + FOnConfigInit(Self, Config); + Py_InitializeFromConfig(Config); finally PyConfig_Clear(Config); From 862db52ff979664b631e96a83045c4f725ba854d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Wed, 3 Apr 2024 01:35:13 +0300 Subject: [PATCH 132/174] Fix #466 Python 3.13 support implemented and tested (preliminary since 3.13 is still in alpha) Since the PyConfig structure is python version dependent it was made opaque. --- Demos/Demo29/Unit1.dfm | 2 - Demos/Demo29/Unit1.pas | 2 +- Source/PythonEngine.pas | 259 +++++++++++++++++----------------------- Source/VarPyth.pas | 2 +- 4 files changed, 109 insertions(+), 156 deletions(-) diff --git a/Demos/Demo29/Unit1.dfm b/Demos/Demo29/Unit1.dfm index c149398f..c151b511 100644 --- a/Demos/Demo29/Unit1.dfm +++ b/Demos/Demo29/Unit1.dfm @@ -10,11 +10,9 @@ object Form1: TForm1 Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] - OldCreateOrder = False DesignSize = ( 668 701) - PixelsPerInch = 96 TextHeight = 13 object Image1: TImage Left = 8 diff --git a/Demos/Demo29/Unit1.pas b/Demos/Demo29/Unit1.pas index 025c5cd1..b969d646 100644 --- a/Demos/Demo29/Unit1.pas +++ b/Demos/Demo29/Unit1.pas @@ -86,7 +86,7 @@ procedure TForm1.Button2Click(Sender: TObject); with GetPythonEngine do begin pargs := MakePyTuple([ExtractPythonObjectFrom(_im)]); try - presult := PyEval_CallObjectWithKeywords( + presult := PyObject_Call( ExtractPythonObjectFrom(MainModule.ImageToBytes), pargs, nil); try if PyBytes_AsStringAndSize(presult, P, Len) < 0 then begin diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index afaa7842..968452a6 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -979,83 +979,68 @@ PyBufferProcs = record PPyConfig = ^PyConfig; PyConfig = record - _config_init: Integer; - isolated: Integer; - use_environment: Integer; - dev_mode: Integer; - install_signal_handlers: Integer; - use_hash_seed: Integer; - hash_seed: C_ULong; - faulthandler: Integer; - tracemalloc: Integer; - perf_profiling: Integer; - import_time: Integer; - code_debug_ranges: Integer; - show_ref_count: Integer; - dump_refs: Integer; - dump_refs_file: PWCharT; - malloc_stats: Integer; - filesystem_encoding: PWCharT; - filesystem_errors: PWCharT; - pycache_prefix: PWCharT; - parse_argv: Integer; - orig_argv: PyWideStringList; - argv: PyWideStringList; - xoptions: PyWideStringList; - warnoptions: PyWideStringList ; - site_import: Integer; - bytes_warning: Integer; - warn_default_encoding: Integer; - inspect: Integer; - interactive: Integer; - optimization_level: Integer; - parser_debug: Integer; - write_bytecode: Integer; - verbose: Integer; - quiet: Integer; - user_site_directory: Integer; - configure_c_stdio: Integer; - buffered_stdio: Integer; - stdio_encoding: PWCharT; - stdio_errors: PWCharT; + // The definition of PyConfig has been changing in every python version + // So we make this structure opaque and we access its fields through + // the ConfigOffsets below + Filler: array [0..1000] of Byte; + end; + +{$SCOPEDENUMS ON} + TConfigFields = ( + use_environment, + parse_argv, + argv, + site_import, + interactive, + optimization_level, + parser_debug, + verbose, + pathconfig_warnings, + program_name, + home, + module_search_paths_set, + module_search_paths, + executable); +{$SCOPEDENUMS OFF} + + TConfigOffsets = array [8..13] of array [TConfigFields] of Integer; + + // The followng needs updating when new versions are added + const + ConfigOffests: TConfigOffsets = {$IFDEF MSWINDOWS} - legacy_windows_stdio: Integer; + {$IFDEF CPU64BITS} + ((8, 80, 88, 144, 156, 160, 164, 172, 216, 104, 232, 240, 248, 264), + (8, 80, 88, 144, 156, 160, 164, 172, 216, 104, 232, 240, 248, 264), + (8, 80, 104, 152, 168, 172, 176, 184, 232, 240, 256, 272, 280, 296), + (8, 96, 120, 168, 184, 188, 192, 200, 264, 272, 288, 304, 312, 336), + (8, 96, 120, 168, 184, 188, 192, 200, 268, 272, 288, 304, 312, 336), + (8, 96, 120, 168, 184, 188, 192, 200, 272, 280, 296, 312, 320, 344)); + {$ELSE} + ((8, 68, 72, 100, 112, 116, 120, 128, 164, 80, 172, 176, 180, 188), + (8, 68, 72, 100, 112, 116, 120, 128, 164, 80, 172, 176, 180, 188), + (8, 64, 76, 100, 116, 120, 124, 132, 168, 172, 180, 188, 192, 200), + (8, 72, 84, 108, 124, 128, 132, 140, 184, 188, 196, 204, 208, 220), + (8, 76, 88, 112, 128, 132, 136, 144, 192, 196, 204, 212, 216, 228), + (8, 76, 88, 112, 128, 132, 136, 144, 196, 200, 208, 216, 220, 232)); + {$ENDIF} + {$ELSE} + {$IFDEF CPU64BITS} + ((8, 88, 96, 152, 164, 168, 172, 180, 224, 112, 240, 248, 256, 272), + (8, 88, 96, 152, 164, 168, 172, 180, 224, 112, 240, 248, 256, 272), + (8, 80, 104, 152, 168, 172, 176, 184, 232, 240, 256, 272, 280, 296), + (8, 96, 120, 168, 184, 188, 192, 200, 256, 264, 280, 296, 304, 328), + (8, 104, 128, 176, 192, 196, 200, 208, 268, 272, 288, 304, 312, 336), + (8, 104, 128, 176, 192, 196, 200, 208, 272, 280, 296, 312, 320, 344)); + {$ELSE} + ((8, 68, 72, 100, 112, 116, 120, 128, 160, 80, 168, 172, 176, 184), + (8, 68, 72, 100, 112, 116, 120, 128, 160, 80, 168, 172, 176, 184), + (8, 64, 76, 100, 116, 120, 124, 132, 164, 168, 176, 184, 188, 196), + (8, 72, 84, 108, 124, 128, 132, 140, 180, 184, 192, 200, 204, 216), + (8, 76, 88, 112, 128, 132, 136, 144, 188, 192, 200, 208, 212, 224), + (8, 76, 88, 112, 128, 132, 136, 144, 192, 196, 204, 212, 216, 228)); + {$ENDIF} {$ENDIF} - check_hash_pycs_mode: PWCharT; - use_frozen_modules: Integer; - safe_path: Integer; - int_max_str_digits: Integer; - - (* --- Path configuration inputs ------------ *) - pathconfig_warnings: Integer; - program_name: PWCharT; - pythonpath_env: PWCharT; - home: PWCharT; - platlibdir: PWCharT; - - (* --- Path configuration outputs ----------- *) - module_search_paths_set: Integer; - module_search_paths: PyWideStringList; - stdlib_dir: PWCharT; - executable: PWCharT; - base_executable: PWCharT; - prefix: PWCharT; - base_prefix: PWCharT; - exec_prefix: PWCharT; - base_exec_prefix: PWCharT; - - (* --- Parameter only used by Py_Main() ---------- *) - kip_source_first_line: Integer; - un_command: PWCharT; - un_module: PWCharT; - un_filename: PWCharT; - - (* --- Private fields ---------------------------- *) - install_importlib: Integer; - init_main: Integer; - is_python_build: Integer; -end; - //####################################################### //## ## @@ -1583,7 +1568,6 @@ TPythonInterface=class(TDynamicDll) PyBytes_AsString: function( ob: PPyObject): PAnsiChar; cdecl; PyBytes_AsStringAndSize: function( ob: PPyObject; var buffer: PAnsiChar; var size: NativeInt): integer; cdecl; PyByteArray_AsString: function(ob: PPyObject): PAnsiChar; cdecl; - PySys_SetArgv: procedure( argc: Integer; argv: PPWCharT); cdecl; PyCFunction_NewEx: function(md:PPyMethodDef;self, ob:PPyObject):PPyObject; cdecl; @@ -1598,9 +1582,6 @@ TPythonInterface=class(TDynamicDll) len: Py_ssize_t; readonly: Integer; flags: Integer): Integer; cdecl; PyBuffer_Release: procedure(view: PPy_buffer); cdecl; - // Removed. Use PyEval_CallObjectWithKeywords with third argument nil - // PyEval_CallObject: function(callable_obj, args:PPyObject):PPyObject; cdecl; - PyEval_CallObjectWithKeywords:function (callable_obj, args, kw:PPyObject):PPyObject; cdecl; PyEval_GetFrame:function :PPyObject; cdecl; PyEval_GetGlobals:function :PPyObject; cdecl; PyEval_GetLocals:function :PPyObject; cdecl; @@ -1760,7 +1741,6 @@ TPythonInterface=class(TDynamicDll) PySet_Size: function(anyset: PPyObject): Py_ssize_t; cdecl; PySys_GetObject:function (s:PAnsiChar):PPyObject; cdecl; PySys_SetObject:function (s:PAnsiChar;ob:PPyObject):integer; cdecl; - PySys_SetPath:procedure(path:PAnsiChar); cdecl; PyTraceBack_Here:function (p:pointer):integer; cdecl; PyTraceBack_Print:function (ob1,ob2:PPyObject):integer; cdecl; PyTuple_GetItem:function (ob:PPyObject;i:NativeInt):PPyObject; cdecl; @@ -1803,25 +1783,18 @@ TPythonInterface=class(TDynamicDll) Py_GetCopyright : function : PAnsiChar; cdecl; Py_GetExecPrefix : function : PWCharT; cdecl; Py_GetPath : function : PWCharT; cdecl; - Py_SetPath : procedure (path: PWCharT); cdecl; - Py_SetPythonHome : procedure (home : PWCharT); cdecl; Py_GetPythonHome : function : PWCharT; cdecl; Py_GetPrefix : function : PWCharT; cdecl; Py_GetProgramName : function : PWCharT; cdecl; - PyParser_SimpleParseStringFlags : function ( str : PAnsiChar; start, flags : Integer) : PNode; cdecl; - PyNode_Free : procedure( n : PNode ); cdecl; PyErr_NewException : function ( name : PAnsiChar; base, dict : PPyObject ) : PPyObject; cdecl; PyMem_Malloc : function ( size : NativeUInt ) : Pointer; - Py_SetProgramName : procedure( name: PWCharT); cdecl; Py_IsInitialized : function : integer; cdecl; Py_GetProgramFullPath : function : PAnsiChar; cdecl; Py_NewInterpreter : function : PPyThreadState; cdecl; Py_NewInterpreterFromConfig : function( tstate: PPyThreadState; config: PPyInterpreterConfig): PyStatus; cdecl; Py_EndInterpreter : procedure( tstate: PPyThreadState); cdecl; - PyEval_AcquireLock : procedure; cdecl; - PyEval_ReleaseLock : procedure; cdecl; PyEval_AcquireThread : procedure( tstate: PPyThreadState); cdecl; PyEval_ReleaseThread : procedure( tstate: PPyThreadState); cdecl; PyInterpreterState_New : function : PPyInterpreterState; cdecl; @@ -1837,8 +1810,8 @@ TPythonInterface=class(TDynamicDll) PyGILState_Release : procedure(gilstate : PyGILState_STATE); cdecl; // Initialization functions - PyWideStringList_Append : function(var list: PyWideStringList; item: PWCharT): PyStatus; cdecl; - PyWideStringList_Insert : function(var list: PyWideStringList; index: Py_ssize_t; item: PWCharT): PyStatus; cdecl; + PyWideStringList_Append : function(list: PPyWideStringList; item: PWCharT): PyStatus; cdecl; + PyWideStringList_Insert : function(list: PPyWideStringList; index: Py_ssize_t; item: PWCharT): PyStatus; cdecl; PyConfig_InitPythonConfig : procedure(var config: PyConfig); cdecl; PyConfig_InitIsolatedConfig : procedure(var config: PyConfig); cdecl; PyConfig_Clear : procedure(var config: PyConfig); cdecl; @@ -1848,11 +1821,6 @@ TPythonInterface=class(TDynamicDll) PyConfig_SetWideStringList : function(var config: PyConfig; list: PPyWideStringList; length: Py_ssize_t; items: PPWCharT): PyStatus; cdecl; Py_InitializeFromConfig : function({$IFDEF FPC}constref{$ELSE}[Ref] const{$ENDIF} config: PyConfig): PyStatus; cdecl; - // Not exported in Python 3.8 and implemented as functions - this has been fixed - // TODO - deal with the following: - // the PyParser_* functions are deprecated in python 3.9 and will be removed in - // Python 3.10 - function PyParser_SimpleParseString(str : PAnsiChar; start : Integer) : PNode; cdecl; function Py_CompileString(str,filename:PAnsiChar;start:integer) : PPyObject; cdecl; // functions redefined in Delphi @@ -3862,7 +3830,6 @@ procedure TPythonInterface.MapDll; PyRun_String := Import('PyRun_String'); PyRun_SimpleString := Import('PyRun_SimpleString'); PyDict_GetItemString := Import('PyDict_GetItemString'); - PySys_SetArgv := Import('PySys_SetArgv'); Py_Exit := Import('Py_Exit'); PyCFunction_NewEx := Import('PyCFunction_NewEx'); @@ -3877,7 +3844,6 @@ procedure TPythonInterface.MapDll; if (FMajorVersion > 3) or (FMinorVersion > 9) then PyBuffer_SizeFromFormat := Import('PyBuffer_SizeFromFormat'); - PyEval_CallObjectWithKeywords:= Import('PyEval_CallObjectWithKeywords'); PyEval_GetFrame := Import('PyEval_GetFrame'); PyEval_GetGlobals := Import('PyEval_GetGlobals'); PyEval_GetLocals := Import('PyEval_GetLocals'); @@ -4040,7 +4006,6 @@ procedure TPythonInterface.MapDll; PySet_Size := Import('PySet_Size'); PySys_GetObject := Import('PySys_GetObject'); PySys_SetObject := Import('PySys_SetObject'); - PySys_SetPath := Import('PySys_SetPath'); PyTraceBack_Here := Import('PyTraceBack_Here'); PyTraceBack_Print := Import('PyTraceBack_Print'); PyTuple_GetItem := Import('PyTuple_GetItem'); @@ -4083,24 +4048,15 @@ procedure TPythonInterface.MapDll; Py_GetCopyright := Import('Py_GetCopyright'); Py_GetExecPrefix := Import('Py_GetExecPrefix'); Py_GetPath := Import('Py_GetPath'); - Py_SetPath := Import('Py_SetPath'); - Py_SetPythonHome := Import('Py_SetPythonHome'); Py_GetPythonHome := Import('Py_GetPythonHome'); Py_GetPrefix := Import('Py_GetPrefix'); Py_GetProgramName := Import('Py_GetProgramName'); - if (FMajorVersion = 3) and (FMinorVersion < 10) then - begin - PyParser_SimpleParseStringFlags := Import('PyParser_SimpleParseStringFlags'); - PyNode_Free := Import('PyNode_Free'); - end; - PyErr_NewException := Import('PyErr_NewException'); try PyMem_Malloc := Import ('PyMem_Malloc'); except end; - Py_SetProgramName := Import('Py_SetProgramName'); Py_IsInitialized := Import('Py_IsInitialized'); Py_GetProgramFullPath := Import('Py_GetProgramFullPath'); Py_GetBuildInfo := Import('Py_GetBuildInfo'); @@ -4108,8 +4064,6 @@ procedure TPythonInterface.MapDll; if (FMajorVersion > 3) or (FMinorVersion >= 12) then Py_NewInterpreterFromConfig := Import('Py_NewInterpreterFromConfig'); Py_EndInterpreter := Import('Py_EndInterpreter'); - PyEval_AcquireLock := Import('PyEval_AcquireLock'); - PyEval_ReleaseLock := Import('PyEval_ReleaseLock'); PyEval_AcquireThread := Import('PyEval_AcquireThread'); PyEval_ReleaseThread := Import('PyEval_ReleaseThread'); PyInterpreterState_New := Import('PyInterpreterState_New'); @@ -4141,11 +4095,6 @@ function TPythonInterface.Py_CompileString(str,filename:PAnsiChar;start:integer) Result := Py_CompileStringExFlags(str, filename, start, nil, -1); end; -function TPythonInterface.PyParser_SimpleParseString( str : PAnsiChar; start : integer) : PNode; cdecl; -begin - Result := PyParser_SimpleParseStringFlags(str, start, 0); -end; - class procedure TPythonInterface.Py_INCREF(op: PPyObject); begin Inc(op^.ob_refcnt); @@ -4671,13 +4620,20 @@ procedure TPythonEngine.DoOpenDll(const aDllName : string); procedure TPythonEngine.AssignPyFlags(var Config: PyConfig); begin - Config.parser_debug := IfThen(pfDebug in FPyFlags, 1, 0); - Config.verbose := IfThen(pfVerbose in FPyFlags, 1, 0); - Config.interactive := IfThen(pfInteractive in FPyFlags, 1, 0); - Config.optimization_level := IfThen(pfOptimize in FPyFlags, 1, 0); - Config.site_import := IfThen(pfNoSite in FPyFlags, 0, 1); - Config.pathconfig_warnings := IfThen(pfFrozenFlag in FPyFlags, 1, 0); - Config.use_environment := IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.parser_debug])^ := + IfThen(pfDebug in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.verbose])^ := + IfThen(pfVerbose in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.interactive])^ := + IfThen(pfInteractive in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.optimization_level])^ := + IfThen(pfOptimize in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.site_import])^ := + IfThen(pfNoSite in FPyFlags, 0, 1); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.pathconfig_warnings])^ := + IfThen(pfFrozenFlag in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.use_environment])^ := + IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1); end; procedure TPythonEngine.Initialize; @@ -4695,15 +4651,23 @@ procedure TPythonEngine.Initialize; var Paths: TArray; I: Integer; + PWSL: PPyWideStringList; begin if FPythonPath = '' then Exit; - Paths := FPythonPath.Split([PathSep], TStringSplitOptions.ExcludeLastEmpty); + PWSL := PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, + TConfigFields.module_search_paths]); + Paths := FPythonPath.Split([PathSep]); for I := 0 to Length(Paths) - 1 do - PyWideStringList_Append(Config.module_search_paths, - PWCharT(StringToWCharTString(Paths[I]))); - if Config.module_search_paths.length > 0 then - Config.module_search_paths_set := 1; + begin + if (Paths[I] = '') and (I > 0) then + Continue; + PyWideStringList_Append(PWSL, PWCharT(StringToWCharTString(Paths[I]))); + end; + + if PWSL^.length > 0 then + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, + TConfigFields.module_search_paths_set])^ := 1; end; function GetVal(AModule : PPyObject; AVarName : AnsiString) : PPyObject; @@ -4777,14 +4741,17 @@ procedure TPythonEngine.Initialize; // Set programname and pythonhome if available if FProgramName <> '' then - PyConfig_SetString(Config, @Config.program_name, + PyConfig_SetString(Config, + PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.program_name]), PWCharT(StringToWCharTString(FProgramName))); if FPythonHome <> '' then - PyConfig_SetString(Config, @Config.program_name, + PyConfig_SetString(Config, + PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.home]), PWCharT(StringToWCharTString(FPythonHome))); // Set venv executable if available if FVenvPythonExe <> '' then - PyConfig_SetString(Config, @Config.program_name, + PyConfig_SetString(Config, + PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.executable]), PWCharT(StringToWCharTString(FVenvPythonExe))); // Set program arguments (sys.argv) @@ -4875,7 +4842,8 @@ procedure TPythonEngine.SetProgramArgs(var Config: PyConfig); Str: WCharTString; begin - Config.parse_argv := 0; // do not parse + // do not parse further + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.parse_argv])^ := 0; for I := 0 to ParamCount do begin { @@ -4892,7 +4860,9 @@ procedure TPythonEngine.SetProgramArgs(var Config: PyConfig); {$ELSE} Str := TempS; {$ENDIF} - PyWideStringList_Append(Config.argv, PWCharT(Str)); + PyWideStringList_Append( + PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.argv]), + PWCharT(Str)); end; end; @@ -4988,7 +4958,7 @@ function TPythonEngine.EvalPyFunction(pyfunc, pyargs:PPyObject): Variant; Result := -1; if pyfunc = nil then exit; try - presult := PyEval_CallObjectWithKeywords(pyfunc,pyargs, nil); + presult := PyObject_Call(pyfunc,pyargs, nil); CheckError(False); if presult = nil then // should not happen since an exception would have been raised @@ -5200,22 +5170,11 @@ function TPythonEngine.CheckExecSyntax( const str : AnsiString ) : Boolean; function TPythonEngine.CheckSyntax( const str : AnsiString; mode : Integer ) : Boolean; var - n : PNode; PyCode: PPyObject; begin - if (FMajorVersion = 3) and (MinorVersion < 10) then - begin - n := PyParser_SimpleParseString( PAnsiChar(str), mode ); - result := Assigned(n); - if Assigned( n ) then - PyNode_Free(n); - end - else - begin - PyCode := Py_CompileString(PAnsiChar(str), '', mode); - Result := Assigned(PyCode); - Py_XDECREF(PyCode); - end; + PyCode := Py_CompileString(PAnsiChar(str), '', mode); + Result := Assigned(PyCode); + Py_XDECREF(PyCode); end; procedure TPythonEngine.RaiseError; @@ -5741,7 +5700,7 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; raise EPythonError.Create('dcmToDatetime DatetimeConversionMode cannot be used with this version of python. Missing module datetime'); args := ArrayToPyTuple([y, m, d, h, mi, sec, ms*1000]); try - Result := PyEval_CallObjectWithKeywords(FPyDateTime_DateTimeType, args, nil); + Result := PyObject_Call(FPyDateTime_DateTimeType, args, nil); CheckError(False); finally Py_DecRef(args); @@ -7225,11 +7184,7 @@ procedure TError.RaiseErrorObj( const msg : AnsiString; obj : PPyObject ); // instance. if PyDict_Check( obj ) then begin - args := PyTuple_New(0); - if not Assigned(args) then - raise Exception.Create('TError.RaiseErrorObj: Could not create an empty tuple'); - res := PyEval_CallObjectWithKeywords(Error, args, nil); - Py_DECREF(args); + res := PyObject_CallObject(Error, nil); if not Assigned(res) then raise Exception.CreateFmt('TError.RaiseErrorObj: Could not create an instance of "%s"', [Self.Name]); if PyObject_TypeCheck(res, PPyTypeObject(PyExc_Exception^)) then @@ -7239,7 +7194,7 @@ procedure TError.RaiseErrorObj( const msg : AnsiString; obj : PPyObject ); raise Exception.Create('TError.RaiseErrorObj: Could not create an empty tuple'); str := PyUnicodeFromString(msg); PyTuple_SetItem(args, 0, str); - res := PyEval_CallObjectWithKeywords(Error, args, nil); + res := PyObject_Call(Error, args, nil); Py_DECREF(args); if not Assigned(res) then raise Exception.CreateFmt('TError.RaiseErrorObj: Could not create an instance of "%s"', [Self.Name]); diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index fd69085f..b16f91b8 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -1604,7 +1604,7 @@ function TPythonVariantType.EvalPython(const V: TVarData; PyDict_SetItemString(_KW, LNamedParams[i].Name, ArgAsPythonObject(LNamedParams[i].Index)); // call the func or method, with or without named parameters (KW) - Result := PyEval_CallObjectWithKeywords(_obj, _Args, _KW); + Result := PyObject_Call(_obj, _Args, _KW); CheckError(True); finally Py_XDecRef(_Args); From 7b485c1d612c1b516b283a19e584cf61ae65aa2d Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 8 Apr 2024 08:27:17 +0300 Subject: [PATCH 133/174] Fix #469 --- Source/WrapDelphi.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 6ec11c1f..79e626f6 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1021,8 +1021,8 @@ implementation rs_ErrCheckBound = 'Delphi wrapper %s is not bound'; rs_ErrSequence = 'Wrapper %s does not support sequences'; rs_ErrInvalidArgs = '"%s" called with invalid arguments.'#$A'Error: %s'; - rs_ErrInvalidRet = 'Call "%s" returned a value that could not be coverted to Python'#$A'Error: %s'; - rs_IncompatibleArguments = 'Expected and actual arguements are incompatible'; + rs_ErrInvalidRet = 'Call "%s" returned a value that could not be converted to Python'#$A'Error: %s'; + rs_IncompatibleArguments = 'Expected and actual arguments are incompatible'; rs_ErrAttrGet = 'Error in getting property "%s".'#$A'Error: %s'; rs_UnknownAttribute = 'Unknown attribute'; rs_ErrIterSupport = 'Wrapper %s does not support iterators'; From b3e051cb254ef77eecde76e13dd82c62f1586323 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 8 Apr 2024 14:47:44 +0300 Subject: [PATCH 134/174] Wrap methods with parameters and/or return values PPyObjects. --- Source/WrapDelphi.pas | 40 +++++++++++++++++++++++++++++++++++----- Tests/WrapDelphiTest.pas | 22 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 79e626f6..04ecc415 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1038,6 +1038,7 @@ implementation rs_ExpectedNil = 'In static methods Self should be nil'; rs_ExpectedInterface = 'Expected a Pascal interface'; rs_ExpectedSequence = 'Expected a python sequence'; + rsExpectedPPyObject = 'Expected a PPyObject'; rs_InvalidClass = 'Invalid class'; rs_ErrEventNotReg = 'No Registered EventHandler for events of type "%s'; rs_ErrEventNoSuport = 'Class %s does not support events because it must '+ @@ -2176,6 +2177,25 @@ function ValidateDynArray(PyValue: PPyObject; const RttiType: TRttiType; end; end; +function ValidatePPyObject(PyValue: PPyObject; const RttiType: TRttiType; + out ParamValue: TValue; out ErrMsg: string): Boolean; +var + RefType: TRttiType; +begin + Result := False; + if (RTTIType is TRttiPointerType) then + begin + RefType := TRttiPointerType(RTTIType).ReferredType; + if Assigned(RefType) and (RefType.Name = 'PyObject') then + begin + Result := True; + ParamValue := TValue.From(PyValue); + end; + end; + if not Result then + ErrMsg := rsExpectedPPyObject; +end; + function PyObjectToTValue(PyArg: PPyObject; ArgType: TRttiType; out Arg: TValue; out ErrMsg: string): Boolean; var @@ -2205,7 +2225,9 @@ function PyObjectToTValue(PyArg: PPyObject; ArgType: TRttiType; tkRecord{$IFDEF MANAGED_RECORD}, tkMRecord{$ENDIF}: Result := ValidateRecordProperty(PyArg, ArgType.Handle, Arg, ErrMsg); tkDynArray: - Result := ValidateDynArray(PyArg, ArgType, Arg, ErrMsg) + Result := ValidateDynArray(PyArg, ArgType, Arg, ErrMsg); + tkPointer: + Result := ValidatePPyObject(PyArg, ArgType, Arg, ErrMsg); else Result := SimplePythonToValue(PyArg, ArgType.Handle, Arg, ErrMsg); end; @@ -2254,6 +2276,14 @@ function TValueToPyObject(const Value: TValue; Result := DelphiWrapper.WrapRecord(Value); tkArray, tkDynArray: Result := DynArrayToPython(Value, DelphiWrapper, ErrMsg); + tkPointer: + if Value.IsType then + Result := Value.AsType + else + begin + Result := nil; + ErrMsg := rs_ErrValueToPython; + end; else Result := SimpleValueToPython(Value, ErrMsg); end; @@ -4127,7 +4157,7 @@ class procedure TPyDelphiObject.ExposeMethods(AClass: TClass; // Ignore methods with unhandled return type if Assigned(LRttiMethod.ReturnType) and (LRttiMethod.ReturnType.TypeKind - in [tkUnknown, tkMethod, tkPointer, tkProcedure]) + in [tkUnknown, tkMethod, tkProcedure]) then Continue; @@ -4229,7 +4259,7 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; Continue; // Skip if the type cannot be handled - if LRttiField.FieldType.TypeKind in [tkUnknown, tkMethod, tkPointer, tkProcedure] then + if LRttiField.FieldType.TypeKind in [tkUnknown, tkMethod, tkProcedure] then Continue; AddedFields := AddedFields + [LRttiField.Name]; @@ -4315,7 +4345,7 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; else begin // Skip if the type cannot be handled - if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkMethod, tkProcedure] then + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkMethod, tkProcedure] then Continue; // Create the exposed property @@ -4399,7 +4429,7 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; Continue; // Skip if the type cannot be handled - if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkPointer, tkMethod, tkProcedure] then + if LRttiProperty.PropertyType.TypeKind in [tkUnknown, tkMethod, tkProcedure] then Continue; AddedProperties := AddedProperties + [LRttiProperty.Name]; diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 384584fa..350b0bb2 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -71,6 +71,7 @@ TTestRttiAccess = class procedure VarArgsProc1(var I: Integer); function VarArgsFunc1(var I: Integer): Integer; procedure VarArgsProc2(var I: Integer; var S: string); + function PlaceInNewList(PyObj: PPyObject): PPyObject; property Indexed[I: Integer]: Integer read GetIndexed write SetIndexed; property Indexed2[S1, S2: string]: string read GetIndexed2 write SetIndexed2; default; class var ClassField: string; @@ -157,6 +158,8 @@ TTestWrapDelphi = class(TObject) procedure TestIndexedProperties; [Test] procedure TestVarArgs; + [Test] + procedure TestPPyObjects; end; implementation @@ -427,6 +430,15 @@ procedure TTestWrapDelphi.TestPassVariantArray; Assert.Pass; end; +procedure TTestWrapDelphi.TestPPyObjects; +var + List: Variant; +begin + List := rtti_var.PlaceInNewList('abc'); + Assert.IsTrue(VarIsPythonList(List)); + Assert.AreEqual(List.GetItem(0), 'abc'); +end; + procedure TTestWrapDelphi.TestRecord; begin Rtti_rec.StringField := 'abcd'; @@ -615,6 +627,16 @@ procedure TTestRttiAccess.PassVariantArray(const Value: Variant); Assert.IsTrue(VarIsArray(Value) and (VarArrayHighBound(Value, 1) = 9)); end; +function TTestRttiAccess.PlaceInNewList(PyObj: PPyObject): PPyObject; +begin + with GetPythonEngine do + begin + Result := PyList_New(1); + Py_XIncRef(PyObj); + PyList_SetItem(Result, 0, PyObj); + end; +end; + procedure TTestRttiAccess.SellFruits(const AFruits: TFruitDynArray); var Fruit: TFruit; From b2512c6334e9495c0b178e1c07866220dac71c3e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 13 Apr 2024 05:57:41 +0100 Subject: [PATCH 135/174] Improve the handling of python bytes and AnsiStrings --- Source/PythonEngine.pas | 19 ++++++++----------- Source/WrapDelphi.pas | 12 ++++++++++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 968452a6..c3e7745e 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -5414,25 +5414,22 @@ procedure TPythonEngine.RaiseError; function TPythonEngine.PyObjectAsString( obj : PPyObject ) : string; var S : PPyObject; - W : UnicodeString; begin Result := ''; if not Assigned( obj ) then Exit; if PyUnicode_Check(obj) then + Result := string(PyUnicodeAsString(obj)) + else if PyBytes_Check(obj) then + Result := string(UTF8ToString(PyBytesAsAnsiString(obj))) + else begin - W := PyUnicodeAsString(obj); - Result := string(W); - Exit; - end; - S := PyObject_Str( obj ); - if Assigned(S) and PyUnicode_Check(S) then - begin - W := PyUnicodeAsString(S); - Result := string(W); + S := PyObject_Str( obj ); + if Assigned(S) and PyUnicode_Check(S) then + Result := string(PyUnicodeAsString(S)); + Py_XDECREF(S); end; - Py_XDECREF(S); end; procedure TPythonEngine.DoRedirectIO; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 04ecc415..b2cea15e 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -2033,8 +2033,16 @@ function SimplePythonToValue(PyValue: PPyObject; TypeInfo: PTypeInfo; end else ErrMsg := rs_ErrPythonToValue; - tkString, tkWString, tkUString, - tkLString, tkChar, tkWChar: + tkString, tkLString, tkChar: + begin + if GetPythonEngine.PyBytes_Check(PyValue) then + V := TValue.From(GetPythonEngine.PyBytesAsAnsiString(PyValue)) + else + V := GetPythonEngine.PyObjectAsString(PyValue); + Value := V.Cast(TypeInfo); + Result := True; + end; + tkWString, tkUString, tkWChar: begin V := GetPythonEngine.PyObjectAsString(PyValue); Value := V.Cast(TypeInfo); From bddf7c8460ee4ee084a3fffdc3bad82f37dc94e9 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 17 May 2024 21:55:15 +0300 Subject: [PATCH 136/174] Fix Initialization for python versions 3.8 and 3.9. Added error handling for initialization errors. --- Source/PythonEngine.pas | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index c3e7745e..fa92d7be 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1010,8 +1010,8 @@ PyConfig = record ConfigOffests: TConfigOffsets = {$IFDEF MSWINDOWS} {$IFDEF CPU64BITS} - ((8, 80, 88, 144, 156, 160, 164, 172, 216, 104, 232, 240, 248, 264), - (8, 80, 88, 144, 156, 160, 164, 172, 216, 104, 232, 240, 248, 264), + ((8, 80, 88, 144, 156, 160, 164, 172, 224, 104, 240, 248, 256, 272), + (8, 80, 88, 144, 156, 160, 164, 172, 224, 104, 240, 248, 256, 272), (8, 80, 104, 152, 168, 172, 176, 184, 232, 240, 256, 272, 280, 296), (8, 96, 120, 168, 184, 188, 192, 200, 264, 272, 288, 304, 312, 336), (8, 96, 120, 168, 184, 188, 192, 200, 268, 272, 288, 304, 312, 336), @@ -3036,6 +3036,8 @@ implementation SPyConvertionError = 'Conversion Error: %s expects a %s Python object'; SPyExcStopIteration = 'Stop Iteration'; SPyExcSystemError = 'Unhandled SystemExit exception. Code: %s'; +SPyInitFailed = 'Python initialization failed: %s'; +SPyInitFailedUnknown = 'Unknown initialization error'; (*******************************************************) (** **) @@ -4720,6 +4722,8 @@ procedure TPythonEngine.Initialize; var i : Integer; Config: PyConfig; + Status: PyStatus; + ErrMsg: string; begin if Assigned(gPythonEngine) then raise Exception.Create('There is already one instance of TPythonEngine running' ); @@ -4764,15 +4768,30 @@ procedure TPythonEngine.Initialize; if Assigned(FOnConfigInit) then FOnConfigInit(Self, Config); - Py_InitializeFromConfig(Config); + Status := Py_InitializeFromConfig(Config); + FInitialized := Py_IsInitialized() <> 0 finally PyConfig_Clear(Config); end; - if Assigned(Py_IsInitialized) then - FInitialized := Py_IsInitialized() <> 0 - else - FInitialized := True; + if not FInitialized then + begin + if PyStatus_Exception(Status) then + ErrMsg := Format(SPyInitFailed, [string(Status.err_msg)]) + else + ErrMsg := Format(SPyInitFailed, [SPyInitFailedUnknown]); + if FatalMsgDlg then + {$IFDEF MSWINDOWS} + MessageBox( GetActiveWindow, PChar(ErrMsg), 'Error', MB_TASKMODAL or MB_ICONSTOP ); + {$ELSE} + WriteLn(ErrOutput, ErrMsg); + {$ENDIF} + if FatalAbort then + Quit + else + raise Exception.Create(ErrMsg); + end; + InitSysPath; if RedirectIO and Assigned(FIO) then DoRedirectIO; From 0599a8851ee2176c0fb01e17f7b889ce7b3cfdda Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 19 May 2024 01:16:41 +0300 Subject: [PATCH 137/174] Corrected the definition of PyModuleDef. --- Source/PythonEngine.pas | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index fa92d7be..0e0969a7 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -611,6 +611,15 @@ TPythonVersionProp = record m_copy : PPyObject; end; + // Slots are used for two phase module initialization + // which is not yet implemented + + PPyModuleDef_Slot = ^PyModuleDef_Slot; + PyModuleDef_Slot = {$IFDEF CPUX86}packed{$ENDIF} record + slot: integer; + value: Pointer; + end; + PPyModuleDef = ^PyModuleDef; PyModuleDef = {$IFDEF CPUX86}packed{$ENDIF} record m_base : PyModuleDef_Base; @@ -618,7 +627,7 @@ TPythonVersionProp = record m_doc : PAnsiChar; m_size : NativeInt; m_methods : PPyMethodDef; - m_reload : inquiry; + m_slots : PPyModuleDef_Slot; m_traverse : traverseproc; m_clear : inquiry; m_free : inquiry; From c113a4ffaef3738019c1726575908dff9a4b87b4 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 25 May 2024 07:45:46 +0100 Subject: [PATCH 138/174] Check for DelphiObject = nil immediately in TPyDelphiObject.SetAttrO and TPyDelphiObject.GetAttrO --- Source/WrapDelphi.pas | 62 ++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index b2cea15e..970bcb48 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1026,7 +1026,8 @@ implementation rs_ErrAttrGet = 'Error in getting property "%s".'#$A'Error: %s'; rs_UnknownAttribute = 'Unknown attribute'; rs_ErrIterSupport = 'Wrapper %s does not support iterators'; - rs_ErrAttrSetr = 'Error in setting property %s'#$A'Error: %s'; + rs_ErrAttrSet = 'Error in setting property %s'#$A'Error: %s'; + rs_ErrObjectDestroyed = 'Trying to access a destroyed pascal object'; rs_IncompatibleClasses = 'Incompatible classes'; rs_IncompatibleRecords = 'Incompatible record types'; rs_IncompatibleInterfaces = 'Incompatible interfaces'; @@ -1550,7 +1551,7 @@ function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer if Result <> 0 then with GetPythonEngine do PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrSetr, [FRttiMember.Name, ErrMsg]))); + PyUnicodeFromString(Format(rs_ErrAttrSet, [FRttiMember.Name, ErrMsg]))); end; { TExposedField } @@ -1646,7 +1647,7 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) if Result <> 0 then with GetPythonEngine do PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrSetr, [FRttiMember.Name, ErrMsg]))); + PyUnicodeFromString(Format(rs_ErrAttrSet, [FRttiMember.Name, ErrMsg]))); end; { TExposedIndexedProperty } @@ -3434,7 +3435,7 @@ function TPyRttiObject.SetAttrO(key, value: PPyObject): Integer; if Result <> 0 then with GetPythonEngine do PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString( - Format(rs_ErrAttrSetr, [KeyName, ErrMsg]))); + Format(rs_ErrAttrSet, [KeyName, ErrMsg]))); end; function TPyRttiObject.SetProps(args, keywords: PPyObject): PPyObject; @@ -3543,6 +3544,7 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; var KeyName: string; ErrMsg : string; + PyEngine: TPythonEngine; {$IFNDEF EXTENDED_RTTI} {$IFNDEF FPC} Info: PMethodInfoHeader; @@ -3554,16 +3556,24 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; RttiType: TRttiStructuredType; {$ENDIF} begin - Result := inherited GetAttrO(key); - if GetPythonEngine.PyErr_Occurred = nil then Exit; // We found what we wanted + Result := nil; + PyEngine := GetPythonEngine; - // should not happen - if not (Assigned(DelphiObject) and - CheckStrAttribute(Key, 'GetAttrO key parameter', KeyName)) - then + // If DelphiObject is nil Exit immediately with an error + if not Assigned(DelphiObject) then + begin + PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^, + PyEngine.PyUnicodeFromString(rs_ErrObjectDestroyed)); Exit; + end; + + if not CheckStrAttribute(Key, 'GetAttrO key parameter', KeyName) then + Exit; // should not happen + + Result := inherited GetAttrO(key); + if PyEngine.PyErr_Occurred = nil then Exit; // We found what we wanted - GetPythonEngine.PyErr_Clear; + PyEngine.PyErr_Clear; {$IFDEF EXTENDED_RTTI} // Use RTTI if Assigned(DelphiObject) then begin @@ -3620,17 +3630,17 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; {$ELSE FPC} if GetTypeData(PropInfo^.PropType^)^.BaseType^ = TypeInfo(Boolean) then {$ENDIF FPC} - Result := GetPythonEngine.VariantAsPyObject(Boolean(GetOrdProp(Self.DelphiObject, PropInfo))) + Result := PyEngine.VariantAsPyObject(Boolean(GetOrdProp(Self.DelphiObject, PropInfo))) else {$IFDEF FPC} - Result := GetPythonEngine.PyUnicodeFromString(GetEnumName(PropInfo^.PropType, + Result := PyEngine.PyUnicodeFromString(GetEnumName(PropInfo^.PropType, {$ELSE FPC} - Result := GetPythonEngine.PyUnicodeFromString(GetEnumName(PropInfo^.PropType^, + Result := PyEngine.PyUnicodeFromString(GetEnumName(PropInfo^.PropType^, {$ENDIF FPC} GetOrdProp(Self.DelphiObject, PropInfo))); end end else - Result := GetPythonEngine.VariantAsPyObject(GetPropValue(DelphiObject, PropInfo)); + Result := PyEngine.VariantAsPyObject(GetPropValue(DelphiObject, PropInfo)); end; except on E: Exception do begin @@ -3640,9 +3650,8 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; end; {$ENDIF} if not Assigned(Result) then - with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrGet,[KeyName, ErrMsg]))); + PyEngine.PyErr_SetObject (PyEngine.PyExc_AttributeError^, + PyEngine.PyUnicodeFromString(Format(rs_ErrAttrGet,[KeyName, ErrMsg]))); end; function TPyDelphiObject.GetContainerAccess: TContainerAccess; @@ -3944,11 +3953,16 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; Result := -1; PyEngine := GetPythonEngine; - // should not happen - if not (Assigned(DelphiObject) and - CheckStrAttribute(Key, 'SetAttrO key parameter', KeyName)) - then + // If DelphiObject is nil Exit immediately with an error + if not Assigned(DelphiObject) then + begin + PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^, + PyEngine.PyUnicodeFromString(rs_ErrObjectDestroyed)); Exit; + end; + + if not CheckStrAttribute(Key, 'SetAttrO key parameter', KeyName) then + Exit; // should not happen // Only call the inherited method at this stage if the attribute exists PyObj := PyEngine.PyObject_GenericGetAttr(GetSelf, key); @@ -3989,8 +4003,8 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; Result := inherited SetAttrO(key, value); if Result <> 0 then with PyEngine do - PyErr_SetObject(PyEngine.PyExc_AttributeError^, PyUnicodeFromString( - Format(rs_ErrAttrSetr, [KeyName, ErrMsg]))); + PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString( + Format(rs_ErrAttrSet, [KeyName, ErrMsg]))); end; procedure TPyDelphiObject.SetDelphiObject(const Value: TObject); From 7eb051e1f708f492fef50cda796bcb5000f2cad1 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sat, 25 May 2024 07:56:14 +0100 Subject: [PATCH 139/174] GenericSetAttrO raises the AttributeError on failure. No need to raise it again. --- Source/WrapDelphi.pas | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 970bcb48..96bc881b 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3559,7 +3559,7 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; Result := nil; PyEngine := GetPythonEngine; - // If DelphiObject is nil Exit immediately with an error + // If DelphiObject is nil exit immediately with an error if not Assigned(DelphiObject) then begin PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^, @@ -3953,7 +3953,7 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; Result := -1; PyEngine := GetPythonEngine; - // If DelphiObject is nil Exit immediately with an error + // If DelphiObject is nil exit immediately with an error if not Assigned(DelphiObject) then begin PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^, @@ -4001,10 +4001,6 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; // Subclasses have a __dict__ and can set extra fields if Result <> 0 then Result := inherited SetAttrO(key, value); - if Result <> 0 then - with PyEngine do - PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString( - Format(rs_ErrAttrSet, [KeyName, ErrMsg]))); end; procedure TPyDelphiObject.SetDelphiObject(const Value: TObject); From 4426ae3fdfb302cd048110d92a2dc6d1aeda99bf Mon Sep 17 00:00:00 2001 From: pyscripter Date: Tue, 28 May 2024 13:35:10 +0300 Subject: [PATCH 140/174] Changed then __owned__ docstring to reflect that it is now a read/write property. --- Source/WrapDelphi.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 96bc881b..2ea65440 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -3835,7 +3835,7 @@ class procedure TPyDelphiObject.RegisterGetSets(PythonType: TPythonType); PythonType.AddGetSet('__bound__', @TPyDelphiObject.Get_Bound, nil, 'Returns True if the wrapper is still bound to the Delphi instance.', nil); PythonType.AddGetSet('__owned__', @TPyDelphiObject.Get_Owned, @TPyDelphiObject.Set_Owned, - 'Returns True if the wrapper owns the Delphi instance.', nil); + 'Boolean read/write property that determines weather the wrapper owns the Delphi instance.', nil); end; class procedure TPyDelphiObject.RegisterMethods(PythonType: TPythonType); From 38b228f7fd5c91510642f9d1ab9800965b468369 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 31 May 2024 22:05:03 +0300 Subject: [PATCH 141/174] Use LoadDLLinExtensionModule instead of LoadDLL in RttiModule/uMain.pas --- Modules/DemoModule/uMain.pas | 1 - Modules/RttiModule/uMain.pas | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Modules/DemoModule/uMain.pas b/Modules/DemoModule/uMain.pas index 89ef3d22..8df2b082 100644 --- a/Modules/DemoModule/uMain.pas +++ b/Modules/DemoModule/uMain.pas @@ -49,7 +49,6 @@ function PyInit_DemoModule: PPyObject; try gEngine := TPythonEngine.Create(nil); gEngine.AutoFinalize := False; - gEngine.UseLastKnownVersion := False; gEngine.UseLastKnownVersion := True; gModule := TPythonModule.Create(nil); diff --git a/Modules/RttiModule/uMain.pas b/Modules/RttiModule/uMain.pas index 5afc2b19..386b522f 100644 --- a/Modules/RttiModule/uMain.pas +++ b/Modules/RttiModule/uMain.pas @@ -34,10 +34,7 @@ function PyInit_DemoModule: PPyObject; try gEngine := TPythonEngine.Create(nil); gEngine.AutoFinalize := False; - gEngine.UseLastKnownVersion := False; - // Adapt to the desired python version - gEngine.RegVersion := '3.8'; - gEngine.DllName := 'python38.dll'; + gEngine.UseLastKnownVersion := True; gModule := TPythonModule.Create(nil); gModule.Engine := gEngine; @@ -47,7 +44,7 @@ function PyInit_DemoModule: PPyObject; gDelphiWrapper.Engine := gEngine; gDelphiWrapper.Module := gModule; - gEngine.LoadDll; + gEngine.LoadDllInExtensionModule; Py := gDelphiWrapper.Wrap(DelphiFunctions, TObjectOwnership.soReference); gModule.SetVar('delphi_funcs', Py); gEngine.Py_DecRef(Py); From b402379ff9cda88dbc612af8a28352e44cd32418 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 20 Jun 2024 11:52:34 +0300 Subject: [PATCH 142/174] Fix backward compatibility --- Source/WrapDelphi.pas | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 2ea65440..638e524a 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -553,16 +553,16 @@ TPyDelphiObject = class (TPyInterfacedObject, IFreeNotificationSubscriber) class function ExcludedExposedMembers(APythonType: TPythonType): TArray; virtual; class procedure ExposeMethods(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedMethodNames: TArray = []); + AExcludedMethodNames: TArray = nil); class procedure ExposeFields(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedFieldNames: TArray = []); + AExcludedFieldNames: TArray = nil); class procedure ExposeProperties(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedPropertyNames: TArray = []); + AExcludedPropertyNames: TArray = nil); class procedure ExposeIndexedProperties(AClass: TClass; NearestAncestorClass: TClass; APythonType: TPythonType; APyDelphiWrapper: TPyDelphiWrapper; - AExcludedPropertyNames: TArray = []); + AExcludedPropertyNames: TArray = nil); {$ENDIF EXTENDED_RTTI} public PyDelphiWrapper : TPyDelphiWrapper; From ec485c100453c8d9d2029cef9574e935c822edfe Mon Sep 17 00:00:00 2001 From: pyscripter Date: Thu, 20 Jun 2024 23:43:52 +0300 Subject: [PATCH 143/174] TPythonTread.Execute should be protected. --- Source/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 0e0969a7..d16b814c 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2906,9 +2906,9 @@ TPythonThread = class(TThread) private class threadvar f_savethreadstate: PPyThreadState; + protected // Do not overwrite Execute! Use ExecuteWithPython instead! procedure Execute; override; - protected procedure ExecuteWithPython; virtual; abstract; function InterpreterConfig: PyInterpreterConfig; virtual; public From ad3d8c7140812ea36924cb862e1598a4828aab20 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 23 Jun 2024 11:59:48 +0300 Subject: [PATCH 144/174] Utf8 encoding of docstrings. See https://github.com/Embarcadero/DelphiVCL4Python/issues/84 --- Source/WrapDelphi.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 638e524a..0a863e3f 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -4290,7 +4290,7 @@ class procedure TPyDelphiObject.ExposeFields(AClass: TClass; if Assigned(PyDocServer) and PyDocServer.Initialized and PyDocServer.ReadMemberDocStr(LRttiField, LDocStr) then - LExposedField.DocString := AnsiString(LDocStr); + LExposedField.DocString := Utf8Encode(LDocStr); // Keep it alive until the Wrapper is Finalized APyDelphiWrapper.fExposedMembers.Add(LExposedField); @@ -4377,7 +4377,7 @@ class procedure TPyDelphiObject.ExposeProperties(AClass: TClass; if Assigned(PyDocServer) and PyDocServer.Initialized and PyDocServer.ReadMemberDocStr(LRttiProperty, LDocStr) then - LExposedProperty.DocString := AnsiString(LDocStr); + LExposedProperty.DocString := Utf8Encode(LDocStr); // Keep it alive until the Wrapper is Finalized APyDelphiWrapper.fExposedMembers.Add(LExposedProperty); @@ -4460,7 +4460,7 @@ class procedure TPyDelphiObject.ExposeIndexedProperties(AClass: TClass; if Assigned(PyDocServer) and PyDocServer.Initialized and PyDocServer.ReadMemberDocStr(LRttiProperty, LDocStr) then - LExposedProperty.DocString := AnsiString(LDocStr); + LExposedProperty.DocString := Utf8Encode(LDocStr); // Keep it alive until the Wrapper is Finalized APyDelphiWrapper.fExposedMembers.Add(LExposedProperty); From e7b3a0a541e04fa7ea638fd21dedc1a6255dc8cd Mon Sep 17 00:00:00 2001 From: pyscripter Date: Sun, 23 Jun 2024 18:14:08 +0300 Subject: [PATCH 145/174] Fix Screen.Realign docstring See https://github.com/Embarcadero/DelphiVCL4Python/issues/84 --- Source/vcl/WrapVclForms.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index 0a373dfa..fd0799c3 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -1072,7 +1072,7 @@ class procedure TPyDelphiScreen.RegisterMethods(PythonType: TPythonType); 'Allows forms to be aligned in the screen.'); PythonType.AddMethod('Realign', @TPyDelphiScreen.Realign_Wrapper, 'TScreen.Realign()'#10 + - 'Realigns the screen’s forms according to their Align properties.'); + 'Realigns the screen''s forms according to their Align properties.'); PythonType.AddMethod('ResetFonts', @TPyDelphiScreen.ResetFonts_Wrapper, 'TScreen.ResetFonts()'#10 + 'Reinitializes the fonts listed in the Fonts property.'); From 6b2cc0eb1eb48aa6d823da5c8b3353ac672fe56e Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 28 Jun 2024 19:52:49 +0300 Subject: [PATCH 146/174] Fix #477 --- Source/PythonEngine.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index d16b814c..d2ec67df 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4668,7 +4668,7 @@ procedure TPythonEngine.Initialize; PWSL := PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.module_search_paths]); - Paths := FPythonPath.Split([PathSep]); + Paths := string(FPythonPath).Split([PathSep]); for I := 0 to Length(Paths) - 1 do begin if (Paths[I] = '') and (I > 0) then @@ -9781,7 +9781,7 @@ function StringToWCharTString(Str: string): WcharTString; {$IFDEF POSIX} Result := UnicodeStringToUCS4String(UnicodeString(Str)); {$ELSE} - Result := Str; + Result := WcharTString(Str); {$ENDIF} end; From 847039615dab9146239414367430b09c43987e3c Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 8 Jul 2024 22:41:59 +0300 Subject: [PATCH 147/174] Fix #478 --- Source/vcl/WrapVclComCtrls.pas | 50 ++++++++++++---------------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index 18c161e8..c7b90fac 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -731,7 +731,8 @@ TPyDelphiListView = class(TPyDelphiCustomListView) function CustomDrawTargetToPython(const ACustomDrawTarget: TCustomDrawTarget): PPyObject; function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyObject; - function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState): PPyObject; + function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState; + DelphiWrapper: TPyDelphiWrapper): PPyObject; function ItemChangeToPython(const AItemChange: TItemChange): PPyObject; function ItemStateToPython(const AItemState: TItemState): PPyObject; @@ -742,8 +743,10 @@ TPyDelphiListView = class(TPyDelphiCustomListView) implementation uses - WrapDelphiTypes, WrapDelphiWindows, - Vcl.ExtCtrls; + System.Rtti, + Vcl.ExtCtrls, + WrapDelphiTypes, + WrapDelphiWindows; { Register the wrappers, the globals and the constants } type @@ -780,31 +783,14 @@ function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyO Ord(ACustomDrawStage))); end; -function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState): PPyObject; - - procedure Append(const AList: PPyObject; const AString: string); - var - LItem: PPyObject; - begin - with GetPythonEngine do begin - LItem := PyUnicodeFromString(AString); - PyList_Append(AList, LItem); - Py_XDecRef(LItem); - end; - end; - +function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState; + DelphiWrapper: TPyDelphiWrapper): PPyObject; var - LCompType: PTypeInfo; - LMin: integer; - LMax: integer; - LState: integer; + ErrMsg: string; + Value: TValue; begin - Result := GetPythonEngine().PyList_New(0); - LCompType := GetTypeData(TypeInfo(TCustomDrawState)).CompType^; - LMin := LCompType^.TypeData^.MinValue; - LMax := LCompType^.TypeData^.MaxValue; - for LState := LMin to LMax do - Append(Result, GetEnumName(LCompType, LState)); + Value := TValue.From(ACustomDrawState); + Result := TValueToPyObject(Value, DelphiWrapper, ErrMsg); end; function ItemChangeToPython(const AItemChange: TItemChange): PPyObject; @@ -2203,7 +2189,7 @@ procedure TTVCustomDrawItemEventHandler.DoEvent(Sender: TCustomTreeView; LPyTuple := PyTuple_New(4); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyNode); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); try LPyResult := PyObject_CallObject(Callable, LPyTuple); @@ -2306,7 +2292,7 @@ procedure TTVAdvancedCustomDrawItemEventHandler.DoEvent(Sender: TCustomTreeView; LPyTuple := PyTuple_New(6); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyNode); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); PyTuple_SetItem(LPyTuple, 3, CustomDrawStageToPython(Stage)); PyTuple_SetItem(LPyTuple, 4, LPyPaintImages); PyTuple_SetItem(LPyTuple, 5, LPyDefaultDraw); @@ -3098,7 +3084,7 @@ procedure TLVCustomDrawItemEventHandler.DoEvent(Sender: TCustomListView; LPyTuple := PyTuple_New(4); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); try LPyResult := PyObject_CallObject(Callable, LPyTuple); @@ -3150,7 +3136,7 @@ procedure TLVCustomDrawSubItemEventHandler.DoEvent(Sender: TCustomListView; PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(SubItem)); - PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State, PyDelphiWrapper)); PyTuple_SetItem(LPyTuple, 4, LPyDefaultDraw); try LPyResult := PyObject_CallObject(Callable, LPyTuple); @@ -3251,7 +3237,7 @@ procedure TLVAdvancedCustomDrawItemEventHandler.DoEvent(Sender: TCustomListView; LPyTuple := PyTuple_New(5); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); PyTuple_SetItem(LPyTuple, 3, CustomDrawStageToPython(Stage)); PyTuple_SetItem(LPyTuple, 4, LPyDefaultDraw); try @@ -3304,7 +3290,7 @@ procedure TLVAdvancedCustomDrawSubItemEventHandler.DoEvent( PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(SubItem)); - PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State, PyDelphiWrapper)); PyTuple_SetItem(LPyTuple, 4, CustomDrawStageToPython(Stage)); PyTuple_SetItem(LPyTuple, 5, LPyDefaultDraw); try From fc96036b96f6504f07c9be917f28ad14c6cc5fb4 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Mon, 8 Jul 2024 22:56:26 +0300 Subject: [PATCH 148/174] Improve previous commit. --- Source/WrapDelphi.pas | 2 ++ Source/vcl/WrapVclComCtrls.pas | 20 +++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 0a863e3f..70b5b837 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -991,6 +991,8 @@ TPyDelphiWrapper = class(TEngineClient, IFreeNotificationSubscriber) {$IFDEF EXTENDED_RTTI} function CreateVarParam(PyDelphiWrapper : TPyDelphiWrapper; const AValue: TValue) : PPyObject; overload; + function SimpleValueToPython(const Value: TValue; + out ErrMsg: string): PPyObject; function TValueToPyObject(const Value: TValue; DelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; function PyObjectToTValue(PyArg : PPyObject; ArgType: TRttiType; diff --git a/Source/vcl/WrapVclComCtrls.pas b/Source/vcl/WrapVclComCtrls.pas index c7b90fac..aff247eb 100644 --- a/Source/vcl/WrapVclComCtrls.pas +++ b/Source/vcl/WrapVclComCtrls.pas @@ -731,8 +731,7 @@ TPyDelphiListView = class(TPyDelphiCustomListView) function CustomDrawTargetToPython(const ACustomDrawTarget: TCustomDrawTarget): PPyObject; function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyObject; - function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState; - DelphiWrapper: TPyDelphiWrapper): PPyObject; + function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState): PPyObject; function ItemChangeToPython(const AItemChange: TItemChange): PPyObject; function ItemStateToPython(const AItemState: TItemState): PPyObject; @@ -783,14 +782,13 @@ function CustomDrawStageToPython(const ACustomDrawStage: TCustomDrawStage): PPyO Ord(ACustomDrawStage))); end; -function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState; - DelphiWrapper: TPyDelphiWrapper): PPyObject; +function CustomDrawStateToPython(const ACustomDrawState: TCustomDrawState): PPyObject; var ErrMsg: string; Value: TValue; begin Value := TValue.From(ACustomDrawState); - Result := TValueToPyObject(Value, DelphiWrapper, ErrMsg); + Result := SimpleValueToPython(Value, ErrMsg); end; function ItemChangeToPython(const AItemChange: TItemChange): PPyObject; @@ -2189,7 +2187,7 @@ procedure TTVCustomDrawItemEventHandler.DoEvent(Sender: TCustomTreeView; LPyTuple := PyTuple_New(4); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyNode); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); try LPyResult := PyObject_CallObject(Callable, LPyTuple); @@ -2292,7 +2290,7 @@ procedure TTVAdvancedCustomDrawItemEventHandler.DoEvent(Sender: TCustomTreeView; LPyTuple := PyTuple_New(6); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyNode); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); PyTuple_SetItem(LPyTuple, 3, CustomDrawStageToPython(Stage)); PyTuple_SetItem(LPyTuple, 4, LPyPaintImages); PyTuple_SetItem(LPyTuple, 5, LPyDefaultDraw); @@ -3084,7 +3082,7 @@ procedure TLVCustomDrawItemEventHandler.DoEvent(Sender: TCustomListView; LPyTuple := PyTuple_New(4); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); PyTuple_SetItem(LPyTuple, 3, LPyDefaultDraw); try LPyResult := PyObject_CallObject(Callable, LPyTuple); @@ -3136,7 +3134,7 @@ procedure TLVCustomDrawSubItemEventHandler.DoEvent(Sender: TCustomListView; PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(SubItem)); - PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State, PyDelphiWrapper)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State)); PyTuple_SetItem(LPyTuple, 4, LPyDefaultDraw); try LPyResult := PyObject_CallObject(Callable, LPyTuple); @@ -3237,7 +3235,7 @@ procedure TLVAdvancedCustomDrawItemEventHandler.DoEvent(Sender: TCustomListView; LPyTuple := PyTuple_New(5); PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); - PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State, PyDelphiWrapper)); + PyTuple_SetItem(LPyTuple, 2, CustomDrawStateToPython(State)); PyTuple_SetItem(LPyTuple, 3, CustomDrawStageToPython(Stage)); PyTuple_SetItem(LPyTuple, 4, LPyDefaultDraw); try @@ -3290,7 +3288,7 @@ procedure TLVAdvancedCustomDrawSubItemEventHandler.DoEvent( PyTuple_SetItem(LPyTuple, 0, LPyObject); PyTuple_SetItem(LPyTuple, 1, LPyItem); PyTuple_SetItem(LPyTuple, 2, PyLong_FromLong(SubItem)); - PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State, PyDelphiWrapper)); + PyTuple_SetItem(LPyTuple, 3, CustomDrawStateToPython(State)); PyTuple_SetItem(LPyTuple, 4, CustomDrawStageToPython(Stage)); PyTuple_SetItem(LPyTuple, 5, LPyDefaultDraw); try From b2f9224922f6fbbc3360410827466556c13a3788 Mon Sep 17 00:00:00 2001 From: pyscripter Date: Fri, 12 Jul 2024 14:13:12 +0300 Subject: [PATCH 149/174] Added FPC Demo35 --- Demos/FPC/Demo35/project1.lpi | 71 ++++++++++++ Demos/FPC/Demo35/project1.lpr | 144 +++++++++++++++++++++++++ Demos/FPC/Demo35/stopwatch.pas | 191 +++++++++++++++++++++++++++++++++ 3 files changed, 406 insertions(+) create mode 100644 Demos/FPC/Demo35/project1.lpi create mode 100644 Demos/FPC/Demo35/project1.lpr create mode 100644 Demos/FPC/Demo35/stopwatch.pas diff --git a/Demos/FPC/Demo35/project1.lpi b/Demos/FPC/Demo35/project1.lpi new file mode 100644 index 00000000..ff71647f --- /dev/null +++ b/Demos/FPC/Demo35/project1.lpi @@ -0,0 +1,71 @@ + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="P4DLaz"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="project1.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="stopwatch.pas"/> + <IsPartOfProject Value="True"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="project1"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + </Debugging> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/Demos/FPC/Demo35/project1.lpr b/Demos/FPC/Demo35/project1.lpr new file mode 100644 index 00000000..0856f9f4 --- /dev/null +++ b/Demos/FPC/Demo35/project1.lpr @@ -0,0 +1,144 @@ +program project1; + +{$mode delphi}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + Classes, SysUtils, CustApp, + { you can add units after this } + Variants, + PythonEngine, + VarPyth, + stopwatch; + +var + PyEngine: TPythonEngine; + +procedure CreatePyEngine; +begin + MaskFPUExceptions(True, True); + PyEngine := TPythonEngine.Create(nil); + PyEngine.Name := 'PythonEngine'; + PyEngine.UseLastKnownVersion := False; + PyEngine.RegVersion:= '3.12'; + PyEngine.DllName:= 'python312.dll'; + PyEngine.LoadDll; +end; + +procedure DestroyEngine; +begin + PyEngine.Free; +end; + +const + N = 100000; + +type + PIntArray = ^TIntArray; + TIntArray = array[0..N - 1] of Integer; + + { TBufferProtocol } + + TBufferProtocol = class(TCustomApplication) + protected + procedure DoRun; override; + public + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + end; + +{ TBufferProtocol } + +procedure TBufferProtocol.DoRun; +var + SW: TStopwatch; + Sum: Int64; + np: Variant; + arr: Variant; + np_arr: PPyObject; + PyBuffer: Py_buffer; + V: Variant; + I: Integer; + Count: Integer; + ArrItem: Variant; +begin + try + CreatePyEngine; + try + // Import numpy and create an array + np := Import('numpy'); + arr := np.&array(BuiltinModule.range(N)); + + // This is the slow way to iterate the array + WriteLn('Lazy but slow:'); + SW := TStopwatch.StartNew; + Sum := 0; + Count := VarPythonToVariant(arr.Length); + for I := 0 to Count - 1 do + begin + ArrItem := BuiltinModule.int(arr.GetItem(I)); + Sum := Sum + Int64(VarPythonToVariant(ArrItem)); + end; + + //for V in VarPyIterate(arr) do + // Sum := Sum + Int64(VarPythonToVariant(BuiltinModule.int(V))); + SW.Stop; + WriteLn(Format('Sum from 0 to %d = %d', [N, Sum])); + WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); + WriteLn; + + WriteLn('Using Py_Buffer:'); + SW := TStopwatch.StartNew; + np_arr := ExtractPythonObjectFrom(arr); + PyEngine.PyObject_GetBuffer(np_arr, @PyBuffer, PyBUF_CONTIG); + PyEngine.CheckError; + try + Sum := 0; + for I := 0 to N - 1 do + Sum := Sum + PIntArray(PyBuffer.buf)^[I]; + SW.Stop; + WriteLn(Format('Sum from 0 to %d = %d', [N, Sum])); + finally + PyEngine.PyBuffer_Release(@PyBuffer); + end; + WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); + WriteLn; + + // test write access + PIntArray(PyBuffer.buf)^[0] := 999; + if VarPythonToVariant(BuiltinModule.int(arr.GetItem(0))) = 999 then + WriteLn('Successfully modified the numpy array using Py_buffer'); + finally + DestroyEngine; + end; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; + Readln; + // stop program loop + Terminate; +end; + +constructor TBufferProtocol.Create(TheOwner: TComponent); +begin + inherited Create(TheOwner); + StopOnException:=True; +end; + +destructor TBufferProtocol.Destroy; +begin + inherited Destroy; +end; + +var + Application: TBufferProtocol; +begin + Application:=TBufferProtocol.Create(nil); + Application.Title:='BufferProtocol'; + Application.Run; + Application.Free; +end. + diff --git a/Demos/FPC/Demo35/stopwatch.pas b/Demos/FPC/Demo35/stopwatch.pas new file mode 100644 index 00000000..d2ef8baf --- /dev/null +++ b/Demos/FPC/Demo35/stopwatch.pas @@ -0,0 +1,191 @@ +{ High frequency stop watch implemntation. + Copyright (c) 2012 by Inoussa OUEDRAOGO + + This source code is distributed under the Library GNU General Public License + with the following modification: + + - object files and libraries linked into an application may be + distributed without source code. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + +{$IFDEF FPC} + {$mode objfpc}{$H+} + {$modeswitch advancedrecords} +{$ENDIF} + +{$IFDEF MSWINDOWS} + {$IFNDEF WINDOWS} + {$DEFINE WINDOWS} + {$ENDIF WINDOWS} +{$ENDIF MSWINDOWS} + +unit stopwatch; + +interface +uses + SysUtils + {$IFDEF LINUX} + ,unixtype, linux + {$ENDIF LINUX} + ; + +type + + { TStopWatch } + + TStopWatch = record + private + const + C_THOUSAND = 1000; + C_MILLION = C_THOUSAND * C_THOUSAND; + C_BILLION = C_THOUSAND * C_THOUSAND * C_THOUSAND; + TicksPerNanoSecond = 100; + TicksPerMilliSecond = 10000; + TicksPerSecond = C_BILLION div 100; + Type + TBaseMesure = + {$IFDEF WINDOWS} + Int64; + {$ENDIF WINDOWS} + {$IFDEF LINUX} + TTimeSpec; + {$ENDIF LINUX} + strict private + class var FFrequency : Int64; + class var FIsHighResolution : Boolean; + strict private + FElapsed : Int64; + FRunning : Boolean; + FStartPosition : TBaseMesure; + strict private + procedure CheckInitialization();inline; + function GetElapsedMilliseconds: Int64; + function GetElapsedTicks: Int64; + public + class function Create() : TStopWatch;static; + class function StartNew() : TStopWatch;static; + class property Frequency : Int64 read FFrequency; + class property IsHighResolution : Boolean read FIsHighResolution; + procedure Reset(); + procedure Start(); + procedure Stop(); + property ElapsedMilliseconds : Int64 read GetElapsedMilliseconds; + property ElapsedTicks : Int64 read GetElapsedTicks; + property IsRunning : Boolean read FRunning; + end; + +resourcestring + sStopWatchNotInitialized = 'The StopWatch is not initialized.'; + +implementation +{$IFDEF WINDOWS} +uses + Windows; +{$ENDIF WINDOWS} + +{ TStopWatch } + +class function TStopWatch.Create(): TStopWatch; +{$IFDEF LINUX} +var + r : TBaseMesure; +{$ENDIF LINUX} +begin + if (FFrequency = 0) then begin +{$IFDEF WINDOWS} + FIsHighResolution := QueryPerformanceFrequency(FFrequency); +{$ENDIF WINDOWS} +{$IFDEF LINUX} + FIsHighResolution := (clock_getres(CLOCK_MONOTONIC,@r) = 0); + FIsHighResolution := FIsHighResolution and (r.tv_nsec <> 0); + if (r.tv_nsec <> 0) then + FFrequency := C_BILLION div r.tv_nsec; +{$ENDIF LINUX} + end; + FillChar(Result,SizeOf(Result),0); +end; + +class function TStopWatch.StartNew() : TStopWatch; +begin + Result := TStopWatch.Create(); + Result.Start(); +end; + +procedure TStopWatch.CheckInitialization(); +begin + if (FFrequency = 0) then + raise Exception.Create(sStopWatchNotInitialized); +end; + +function TStopWatch.GetElapsedMilliseconds: Int64; +begin + {$IFDEF WINDOWS} + Result := ElapsedTicks * TicksPerMilliSecond; + {$ENDIF WINDOWS} + {$IFDEF LINUX} + Result := FElapsed div C_MILLION; + {$ENDIF LINUX} +end; + +function TStopWatch.GetElapsedTicks: Int64; +begin + CheckInitialization(); +{$IFDEF WINDOWS} + Result := (FElapsed * TicksPerSecond) div FFrequency; +{$ENDIF WINDOWS} +{$IFDEF LINUX} + Result := FElapsed div TicksPerNanoSecond; +{$ENDIF LINUX} +end; + +procedure TStopWatch.Reset(); +begin + Stop(); + FElapsed := 0; + FillChar(FStartPosition,SizeOf(FStartPosition),0); +end; + +procedure TStopWatch.Start(); +begin + if FRunning then + exit; + FRunning := True; +{$IFDEF WINDOWS} + QueryPerformanceCounter(FStartPosition); +{$ENDIF WINDOWS} +{$IFDEF LINUX} + clock_gettime(CLOCK_MONOTONIC,@FStartPosition); +{$ENDIF LINUX} +end; + +procedure TStopWatch.Stop(); +var + locEnd : TBaseMesure; + s, n : Int64; +begin + if not FRunning then + exit; + FRunning := False; +{$IFDEF WINDOWS} + QueryPerformanceCounter(locEnd); + FElapsed := FElapsed + (UInt64(locEnd) - UInt64(FStartPosition)); +{$ENDIF WINDOWS} +{$IFDEF LINUX} + clock_gettime(CLOCK_MONOTONIC,@locEnd); + if (locEnd.tv_nsec < FStartPosition.tv_nsec) then begin + s := locEnd.tv_sec - FStartPosition.tv_sec - 1; + n := C_BILLION + locEnd.tv_nsec - FStartPosition.tv_nsec; + end else begin + s := locEnd.tv_sec - FStartPosition.tv_sec; + n := locEnd.tv_nsec - FStartPosition.tv_nsec; + end; + FElapsed := FElapsed + (s * C_BILLION) + n; +{$ENDIF LINUX} +end; + +end. From a90a14f1b29aee7c7540abb6fccf49418ad40107 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Fri, 12 Jul 2024 14:44:05 +0300 Subject: [PATCH 150/174] Fix for Linux and other non-Windows platforms. --- Demos/FPC/Demo35/project1.lpr | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Demos/FPC/Demo35/project1.lpr b/Demos/FPC/Demo35/project1.lpr index 0856f9f4..bb83f928 100644 --- a/Demos/FPC/Demo35/project1.lpr +++ b/Demos/FPC/Demo35/project1.lpr @@ -36,9 +36,13 @@ procedure DestroyEngine; N = 100000; type - PIntArray = ^TIntArray; - TIntArray = array[0..N - 1] of Integer; - + PIntArray = ^TIntArray; + {$IFDEF MSWINDOWS} + TIntArray = array[0..N - 1] of Integer; + {$ELSE} + TIntArray = array[0..N - 1] of NativeInt; + {$ENDIF} + { TBufferProtocol } TBufferProtocol = class(TCustomApplication) From b8d57195402040a7825fa81b0673537569896408 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sat, 13 Jul 2024 04:33:26 +0300 Subject: [PATCH 151/174] _PyInterpreterConfig_INIT is now a variable. --- Source/PythonEngine.pas | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index d2ec67df..83c924f8 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1068,7 +1068,7 @@ PyConfig = record PyInterpreterConfig_SHARED_GIL = 1; PyInterpreterConfig_OWN_GIL = 2; - type +type PPyInterpreterConfig = ^PyInterpreterConfig; PyInterpreterConfig = {$IFDEF CPUX86}packed{$ENDIF} record use_main_obmalloc: Integer; @@ -1080,7 +1080,7 @@ PyConfig = record gil: Integer; end; -const +var _PyInterpreterConfig_INIT: PyInterpreterConfig = ( use_main_obmalloc: 0; allow_fork: 0; @@ -9305,7 +9305,7 @@ procedure TPythonThread.Execute; finally PyGILState_Release(gilstate); end; - end else {fThreadExecMode} + end else begin gilstate := PyGILState_Ensure(); global_state := PyThreadState_Get; @@ -9328,8 +9328,8 @@ procedure TPythonThread.Execute; PyThreadState_Swap(global_state); PyGILState_Release(gilstate); end else - raise EPythonError.Create( 'Could not create a new thread state'); - end; {withinterp} + raise EPythonError.Create('Could not create a new thread state'); + end; end; end; From e57e2feffb926d624834b67955517c6b5e36a52c Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Thu, 18 Jul 2024 20:52:29 +0300 Subject: [PATCH 152/174] Fix #481 --- Source/PythonEngine.pas | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 83c924f8..90cfca3b 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -8373,7 +8373,6 @@ function TPythonType.NewSubtypeInst( aType: PPyTypeObject; args, kwds : PPyObje begin Engine.Py_DECREF(Result); Result := nil; - obj.Free; end; end; end; From a650ee79b838d9d0574af9a677350d4fb8d0649c Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Wed, 18 Sep 2024 01:40:44 +0300 Subject: [PATCH 153/174] #483 --- Source/PythonEngine.pas | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 90cfca3b..50c5f8a6 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -3021,9 +3021,8 @@ function CleanString(const s : UnicodeString; AppendLF : Boolean = True) : Unico implementation uses -{$IFDEF FPC} StrUtils, -{$ELSE} +{$IFNDEF FPC} AnsiStrings, {$ENDIF} {$IFDEF MSWINDOWS} @@ -4660,7 +4659,7 @@ procedure TPythonEngine.Initialize; procedure SetPythonPath(var Config: PyConfig); var - Paths: TArray<string>; + Paths: TStringDynArray; I: Integer; PWSL: PPyWideStringList; begin @@ -4668,7 +4667,7 @@ procedure TPythonEngine.Initialize; PWSL := PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.module_search_paths]); - Paths := string(FPythonPath).Split([PathSep]); + Paths := SplitString(string(FPythonPath), PathSep); for I := 0 to Length(Paths) - 1 do begin if (Paths[I] = '') and (I > 0) then From c32596f9b8bc9cc0fb80f4c4a44657fc2c2049b3 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Mon, 23 Sep 2024 17:46:42 +0300 Subject: [PATCH 154/174] Expose EncodeString (const str: AnsiString) to Delphi and correct its implementation. --- Source/PythonEngine.pas | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 50c5f8a6..13604e26 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2041,10 +2041,8 @@ TPythonEngine = class(TPythonInterface) function Run_CommandAsString(const command: AnsiString; mode: Integer; const FileName: string = '<string>'): string; function Run_CommandAsObject(const command: AnsiString; mode: Integer; const FileName: string = '<string>'): PPyObject; function Run_CommandAsObjectWithDict(const command: AnsiString; mode: Integer; locals, globals: PPyObject; const FileName: string = '<string>'): PPyObject; - function EncodeString (const str: UnicodeString): AnsiString; {$IFDEF FPC}overload;{$ENDIF} - {$IFDEF FPC} - function EncodeString (const str: AnsiString): AnsiString; overload; - {$ENDIF} + function EncodeString(const str: UnicodeString): AnsiString; overload; + function EncodeString(const str: AnsiString): AnsiString; overload; function EncodeWindowsFilePath(const str: string): AnsiString; procedure ExecString(const command: AnsiString; const FileName: string = '<string>'); overload; procedure ExecStrings(strings: TStrings; const FileName: string = '<string>'); overload; @@ -5538,17 +5536,15 @@ function TPythonEngine.FindClient( const aName : string ) : TEngineClient; end; end; -function TPythonEngine.EncodeString(const str: UnicodeString): AnsiString; {$IFDEF FPC}overload;{$ENDIF} +function TPythonEngine.EncodeString(const str: UnicodeString): AnsiString; begin - Result := UTF8Encode(str) + Result := UTF8Encode(str); end; -{$IFDEF FPC} -function TPythonEngine.EncodeString (const str: AnsiString): AnsiString; overload; +function TPythonEngine.EncodeString(const str: AnsiString): AnsiString; begin - Result := str; + Result := UTF8Encode(str); end; -{$ENDIF} function TPythonEngine.EncodeWindowsFilePath(const str: string): AnsiString; {PEP 529} From 311860e766683435bee7147ad7f3d5972716c0ab Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Mon, 23 Sep 2024 18:43:17 +0300 Subject: [PATCH 155/174] Fix #485 --- Source/PythonEngine.pas | 7 +- Source/WrapDelphi.pas | 137 ++++++++++++++++++++-------------------- 2 files changed, 71 insertions(+), 73 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 13604e26..a0a72e0d 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -7234,10 +7234,11 @@ procedure TError.RaiseErrorObj( const msg : AnsiString; obj : PPyObject ); end else raise Exception.Create('TError.RaiseErrorObj: I didn''t get an instance' ); - PyErr_SetObject( Error, res ); + PyErr_SetObject(Error, res); + Py_XDECREF(res); end else - PyErr_SetObject( Error, obj ); + PyErr_SetObject(Error, obj); end; function TError.Owner : TErrors; @@ -7735,7 +7736,7 @@ function TPyObject.GetBuffer(view: PPy_buffer; flags: Integer): Integer; begin view^.obj := nil; with GetPythonEngine do - PyErr_SetObject(PyExc_BufferError^, PyUnicodeFromString('')); + PyErr_SetString(PyExc_BufferError^, ''); Result := -1; end; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 70b5b837..67d0535c 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1527,8 +1527,8 @@ function TExposedGetSet.GetterWrapper(AObj: PPyObject; AContext : Pointer): PPyO if not Assigned(Result) then with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrGet, [FRttiMember.Name, LOutMsg]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrAttrGet, [FRttiMember.Name, LOutMsg])))); end; function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer): Integer; cdecl; @@ -1552,8 +1552,8 @@ function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer if Result <> 0 then with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrSet, [FRttiMember.Name, ErrMsg]))); + PyErr_SetString (PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrAttrSet, [FRttiMember.Name, ErrMsg])))); end; { TExposedField } @@ -1648,8 +1648,8 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer) if Result <> 0 then with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrSet, [FRttiMember.Name, ErrMsg]))); + PyErr_SetString (PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrAttrSet, [FRttiMember.Name, ErrMsg])))); end; { TExposedIndexedProperty } @@ -1745,7 +1745,7 @@ function TPyIndexedProperty.MpAssSubscript(obj1, obj2: PPyObject) : Integer; if not FProperty.IsWritable then begin with Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString(rs_NotWritable)); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString(rs_NotWritable))); Exit; end; @@ -1869,8 +1869,8 @@ class procedure TRttiEventHandler.ImplCallback(UserData: Pointer; if Assigned(PyResult) and (EventHandler.MethodType.ReturnType <> nil) and not PyObjectToTValue(PyResult, EventHandler.MethodType.ReturnType, Result, ErrMsg) then - Engine.PyErr_SetObject(Engine.PyExc_TypeError^, Engine.PyUnicodeFromString( - Format(rs_ErrInvalidRet, [string(EventHandler.PropertyInfo.Name), ErrMsg]))); + Engine.PyErr_SetString(Engine.PyExc_TypeError^, PAnsiChar(Engine.EncodeString( + Format(rs_ErrInvalidRet, [string(EventHandler.PropertyInfo.Name), ErrMsg])))); Engine.Py_XDECREF(PyResult); finally Engine.Py_XDECREF(PyArgs); @@ -1904,9 +1904,8 @@ function GlobalDelphiWrapper: TPyDelphiWrapper; procedure InvalidArguments(const MethName, ErrMsg : string); begin with GetPythonEngine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidArgs, - [MethName, ErrMsg]))); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString( + Format(rs_ErrInvalidArgs, [MethName, ErrMsg])))); end; function ValidateClassRef(PyValue: PPyObject; RefClass: TClass; @@ -2354,8 +2353,8 @@ function CheckIndex(AIndex, ACount : Integer; const AIndexName : string = 'Index with GetPythonEngine do begin Result := False; - PyErr_SetObject (PyExc_IndexError^, PyUnicodeFromString( - Format(rs_ErrCheckIndex,[AIndexName, AIndex]))); + PyErr_SetString(PyExc_IndexError^, PAnsiChar(EncodeString( + Format(rs_ErrCheckIndex,[AIndexName, AIndex])))); end else Result := True; @@ -2372,8 +2371,8 @@ function CheckIntAttribute(AAttribute : PPyObject; const AAttributeName : string begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckInt, [AAttributeName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckInt, [AAttributeName])))); end; end; @@ -2388,8 +2387,8 @@ function CheckFloatAttribute(AAttribute : PPyObject; const AAttributeName : stri begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckFloat, [AAttributeName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckFloat, [AAttributeName])))); end; end; @@ -2410,8 +2409,8 @@ function CheckStrAttribute(AAttribute : PPyObject; const AAttributeName : string begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckStr, [AAttributeName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckStr, [AAttributeName])))); end; end; @@ -2423,8 +2422,8 @@ function CheckCallableAttribute(AAttribute : PPyObject; const AAttributeName : s begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckCallable, [AAttributeName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckCallable, [AAttributeName])))); end; end; @@ -2436,9 +2435,9 @@ function CheckEnum(const AEnumName : string; AValue, AMinValue, AMaxValue : Int begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckEnum, - [AEnumName, AMinValue, AMaxValue, AValue]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckEnum, + [AEnumName, AMinValue, AMaxValue, AValue])))); end; end; @@ -2461,8 +2460,8 @@ function CheckObjAttribute(AAttribute : PPyObject; const AAttributeName : string begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckObjOfType, [AAttributeName, AExpectedClass.ClassName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckObjOfType, [AAttributeName, AExpectedClass.ClassName])))); end else begin @@ -2474,8 +2473,8 @@ function CheckObjAttribute(AAttribute : PPyObject; const AAttributeName : string begin Result := False; with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckObj, [AAttributeName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckObj, [AAttributeName])))); end; end; @@ -2815,8 +2814,8 @@ function TPyDelphiContainer.SqAssItem(idx: NativeInt; begin Result := -1; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrSqAss, [fContainerAccess.Name])) ); + PyErr_SetString( PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrSqAss, [fContainerAccess.Name])))); end; end; @@ -2833,8 +2832,8 @@ function TPyDelphiContainer.SqContains(obj: PPyObject): integer; begin Result := -1; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrSqContains, [fContainerAccess.Name])) ); + PyErr_SetString(PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrSqContains, [fContainerAccess.Name])))); end; end; @@ -2928,8 +2927,8 @@ function TPyDelphiObject.CheckBound: Boolean; Result := Assigned(DelphiObject); if not Result then with GetPythonEngine do - PyErr_SetObject(PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrCheckBound, [ClassName]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrCheckBound, [ClassName])))); end; function TPyDelphiObject.Compare(obj: PPyObject): Integer; @@ -2959,8 +2958,8 @@ constructor TPyDelphiObject.Create(APythonType: TPythonType); constructor TPyDelphiObject.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin with APythonType.Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_CannotCreate, [APythonType.TypeName]))); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString( + Format(rs_CannotCreate, [APythonType.TypeName])))); end; function TPyDelphiObject.CreateContainerAccess: TContainerAccess; @@ -3189,8 +3188,8 @@ function RttiCall(ParentAddress: pointer; DelphiWrapper: TPyDelphiWrapper; if Result = nil then with DelphiWrapper.Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidRet, [Method.Name, ErrMsg]))); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString( + Format(rs_ErrInvalidRet, [Method.Name, ErrMsg])))); except on E: Exception do begin Result := nil; @@ -3405,8 +3404,8 @@ function TPyRttiObject.GetAttrO(key: PPyObject): PPyObject; Result := GetRttiAttr(fAddr, RttiType, KeyName, PyDelphiWrapper, ErrMsg); if not Assigned(Result) then with GetPythonEngine do - PyErr_SetObject (PyExc_AttributeError^, - PyUnicodeFromString(Format(rs_ErrAttrGet,[KeyName, ErrMsg]))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format(rs_ErrAttrGet,[KeyName, ErrMsg])))); end; class procedure TPyRttiObject.RegisterMethods(PythonType: TPythonType); @@ -3436,8 +3435,8 @@ function TPyRttiObject.SetAttrO(key, value: PPyObject): Integer; if Result <> 0 then with GetPythonEngine do - PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString( - Format(rs_ErrAttrSet, [KeyName, ErrMsg]))); + PyErr_SetString(PyExc_AttributeError^, PAnsiChar(EncodeString( + Format(rs_ErrAttrSet, [KeyName, ErrMsg])))); end; function TPyRttiObject.SetProps(args, keywords: PPyObject): PPyObject; @@ -3564,8 +3563,8 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; // If DelphiObject is nil exit immediately with an error if not Assigned(DelphiObject) then begin - PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^, - PyEngine.PyUnicodeFromString(rs_ErrObjectDestroyed)); + PyEngine.PyErr_SetString(PyEngine.PyExc_AttributeError^, + PAnsiChar(PyEngine.EncodeString(rs_ErrObjectDestroyed))); Exit; end; @@ -3652,8 +3651,8 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject; end; {$ENDIF} if not Assigned(Result) then - PyEngine.PyErr_SetObject (PyEngine.PyExc_AttributeError^, - PyEngine.PyUnicodeFromString(Format(rs_ErrAttrGet,[KeyName, ErrMsg]))); + PyEngine.PyErr_SetString(PyEngine.PyExc_AttributeError^, + PAnsiChar(PyEngine.EncodeString(Format(rs_ErrAttrGet,[KeyName, ErrMsg])))); end; function TPyDelphiObject.GetContainerAccess: TContainerAccess; @@ -3816,9 +3815,9 @@ function TPyDelphiObject.Iter: PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrIterSupport, - [Self.ClassName])) ); + PyErr_SetString(PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrIterSupport, + [Self.ClassName])))); end; end; @@ -3958,8 +3957,8 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer; // If DelphiObject is nil exit immediately with an error if not Assigned(DelphiObject) then begin - PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^, - PyEngine.PyUnicodeFromString(rs_ErrObjectDestroyed)); + PyEngine.PyErr_SetString(PyEngine.PyExc_AttributeError^, + PAnsiChar(PyEngine.EncodeString(rs_ErrObjectDestroyed))); Exit; end; @@ -4528,7 +4527,7 @@ function TPyDelphiObject.MpAssSubscript(obj1, obj2: PPyObject) : Integer; if not Prop.IsWritable then begin with Engine do - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString(rs_NotWritable)); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString(rs_NotWritable))); Exit; end; @@ -4595,8 +4594,8 @@ function TPyDelphiObject.SqAssItem(idx: NativeInt; obj: PPyObject): integer; begin Result := -1; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrSqAss, [Self.ClassName])) ); + PyErr_SetString( PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrSqAss, [Self.ClassName])))); end; end; @@ -4626,8 +4625,8 @@ function TPyDelphiObject.SqItem(idx: NativeInt): PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrSequence, [Self.ClassName])) ); + PyErr_SetString(PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrSequence, [Self.ClassName])))); end; end; @@ -4658,8 +4657,8 @@ function TPyDelphiObject.ToList_Wrapper(args: PPyObject): PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrSequence, [Self.ClassName])) ); + PyErr_SetString(PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrSequence, [Self.ClassName])))); end else if GetPythonEngine.PyArg_ParseTuple( args, ':ToList' ) <> 0 then with GetPythonEngine do @@ -4682,8 +4681,8 @@ function TPyDelphiObject.ToTuple_Wrapper(args: PPyObject): PPyObject; begin Result := nil; with GetPythonEngine do - PyErr_SetObject( PyExc_SystemError^, - PyUnicodeFromString(Format(rs_ErrSequence, [Self.ClassName])) ); + PyErr_SetString( PyExc_SystemError^, + PAnsiChar(EncodeString(Format(rs_ErrSequence, [Self.ClassName])))); end else if GetPythonEngine.PyArg_ParseTuple( args, ':ToTuple' ) <> 0 then with GetPythonEngine do @@ -4749,9 +4748,9 @@ function TPyDelphiMethodObject.Call(ob1, ob2: PPyObject): PPyObject; on E: Exception do begin Result := nil; - PyErr_SetObject (PyExc_TypeError^, - PyUnicodeFromString(Format(rs_ErrInvalidArgs, - [MethodInfo.Name, E.Message]))); + PyErr_SetString(PyExc_TypeError^, + PAnsiChar(EncodeString(Format(rs_ErrInvalidArgs, + [MethodInfo.Name, E.Message])))); end; end; end; @@ -5227,9 +5226,8 @@ function TPyDelphiWrapper.CreateComponent(pself, args: PPyObject): PPyObject; Klass := nil; end; if (Klass = nil) or not Klass.InheritsFrom(TComponent) then begin - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidArgs, - ['CreateComponent', rs_InvalidClass]))); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString( + Format(rs_ErrInvalidArgs, ['CreateComponent', rs_InvalidClass])))); Exit; end; @@ -5244,9 +5242,8 @@ function TPyDelphiWrapper.CreateComponent(pself, args: PPyObject): PPyObject; Ownership := soOwned; Result := Self.Wrap(Component, Ownership); end else - PyErr_SetObject(PyExc_TypeError^, PyUnicodeFromString( - Format(rs_ErrInvalidArgs, - ['CreateComponent', '']))); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(EncodeString( + Format(rs_ErrInvalidArgs, ['CreateComponent', ''])))); end; end; From 01b73d4b5a99430574de41151b627b41ef6f2302 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Mon, 23 Sep 2024 20:04:43 +0300 Subject: [PATCH 156/174] PyErr_SetString should be called with utf8 encoded strings --- Demos/Demo07/Unit1.dfm | 3 --- Demos/Demo07/Unit1.pas | 8 ++++---- Source/PythonAction.pas | 14 +++++++------- Source/PythonEngine.pas | 14 +++++++------- Source/WrapDelphiClasses.pas | 14 +++++++------- Source/WrapDelphiTypes.pas | 12 ++++++------ Source/WrapFireDAC.pas | 20 ++++++++++---------- Source/fmx/WrapFmxForms.pas | 2 +- Source/fmx/WrapFmxTypes.pas | 8 ++++---- Source/vcl/WrapVclForms.pas | 2 +- Source/vcl/WrapVclGraphics.pas | 14 +++++++------- Tests/FMX/Android/NumberServicesTest.pas | 2 +- Tests/NumberServicesTest.pas | 2 +- 13 files changed, 56 insertions(+), 59 deletions(-) diff --git a/Demos/Demo07/Unit1.dfm b/Demos/Demo07/Unit1.dfm index 51b77e56..500ec0e6 100644 --- a/Demos/Demo07/Unit1.dfm +++ b/Demos/Demo07/Unit1.dfm @@ -13,8 +13,6 @@ object Form1: TForm1 Font.Name = 'MS Sans Serif' Font.Pitch = fpVariable Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -23,7 +21,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alTop - ExplicitWidth = 536 end object Memo1: TMemo Left = 0 diff --git a/Demos/Demo07/Unit1.pas b/Demos/Demo07/Unit1.pas index 012507af..67e672b0 100644 --- a/Demos/Demo07/Unit1.pas +++ b/Demos/Demo07/Unit1.pas @@ -205,7 +205,7 @@ function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; // Else check for a method Result := PyObject_GenericGetAttr(obj, PyUnicodeFromString(key)); if not Assigned(Result) then - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown attribute "%s"',[key])))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); end; end; end; @@ -226,7 +226,7 @@ function PyPoint_setattrfunc(obj : PPyObject; key : PAnsiChar; value : PPyObjec Result := 0; end else - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Attribute "%s" needs an integer',[key])))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Attribute "%s" needs an integer',[key])))); // Check for attribute y end else if key = 'y' then begin if PyLong_Check(value) then @@ -235,9 +235,9 @@ function PyPoint_setattrfunc(obj : PPyObject; key : PAnsiChar; value : PPyObjec Result := 0; end else - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Attribute "%s" needs an integer',[key])))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Attribute "%s" needs an integer',[key])))); end else - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown attribute "%s"',[key])))); + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); end; end; diff --git a/Source/PythonAction.pas b/Source/PythonAction.pas index 60af65e5..d94d610e 100644 --- a/Source/PythonAction.pas +++ b/Source/PythonAction.pas @@ -17,7 +17,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ActnList, PythonEngine; + Actions, ActnList, PythonEngine; type TPythonAction = class(TAction) @@ -114,21 +114,21 @@ function TPythonAction.HandlesTarget(Target: TObject): Boolean; procedure TPythonAction.InitializeAction; var - docString: string; + docString: string; begin if not (csDesigning in ComponentState) and Assigned(PythonModule) then begin fClearname := 'Clear' + Name; docString := 'Claer all events of "' + Owner.Name + '.' + Name + '" action'; - PythonModule.AddDelphiMethod(PChar(fClearname), PythonClear, PChar(docString)); + PythonModule.AddDelphiMethod(PAnsiChar(fClearname), PythonClear, PAnsiChar(docString)); fRegistername := 'Register' + Name; docString := 'Register an event againt the "' + Owner.Name + '.' + Name + '" action'; - PythonModule.AddDelphiMethod(PChar(fRegistername), PythonRegister, PChar(docString)); + PythonModule.AddDelphiMethod(PAnsiChar(fRegistername), PythonRegister, PAnsiChar(docString)); fUnregistername := 'Unregister' + Name; docString := 'Unregister an event againt the "' + Owner.Name + '.' + Name + '" action'; - PythonModule.AddDelphiMethod(PChar(fUnregistername), PythonUnregister, PChar(docString)); + PythonModule.AddDelphiMethod(PAnsiChar(fUnregistername), PythonUnregister, PAnsiChar(docString)); end; end; @@ -152,7 +152,7 @@ function TPythonAction.PythonRegister(pself, args: PPyObject): PPyObject; ( not PyFunction_Check(func)) then begin s := fRegistername + '(function)'; - PyErr_SetString(PyExc_TypeError^,PChar(s)); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(Utf8Encode(s))); end else with RegisteredMethods do @@ -174,7 +174,7 @@ function TPythonAction.PythonUnregister(pself, args: PPyObject): PPyObject; (RegisteredMethods.IndexOf(func) = -1) then begin s := fUnregistername + '(function)'; - PyErr_SetString(PyExc_TypeError^,PChar(s)); + PyErr_SetString(PyExc_TypeError^, PAnsiChar(Utf8Encode(s))); end else with RegisteredMethods do diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index a0a72e0d..c08ea1dc 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2419,8 +2419,8 @@ TError = class(TCollectionItem) destructor Destroy; override; procedure Assign(Source: TPersistent); override; procedure BuildError( const ModuleName : AnsiString ); - procedure RaiseError( const msg : AnsiString ); - procedure RaiseErrorObj( const msg : AnsiString; obj : PPyObject ); + procedure RaiseError(const msg : AnsiString); + procedure RaiseErrorObj(const msg : AnsiString; obj : PPyObject); function Owner : TErrors; property Error : PPyObject read FError write FError; published @@ -7183,14 +7183,14 @@ procedure TError.BuildError( const ModuleName : AnsiString ); raise Exception.CreateFmt( 'Could not create error "%s"', [Name] ); end; -procedure TError.RaiseError( const msg : AnsiString ); +procedure TError.RaiseError(const msg : AnsiString); begin Owner.Owner.CheckEngine; with Owner.Owner.Engine do - PyErr_SetString( Error, PAnsiChar(msg) ); + PyErr_SetString(Error, PAnsiChar(EncodeString(msg))); end; -procedure TError.RaiseErrorObj( const msg : AnsiString; obj : PPyObject ); +procedure TError.RaiseErrorObj(const msg : AnsiString; obj : PPyObject); var args, res, str : PPyObject; i : Integer; @@ -7698,8 +7698,8 @@ function TPyObject.SetAttr(key : PAnsiChar; value : PPyObject) : Integer; with GetPythonEngine do begin Result := -1; - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('Unknown attribute "%s"',[key])))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format('Unknown attribute "%s"',[key])))); end; end; diff --git a/Source/WrapDelphiClasses.pas b/Source/WrapDelphiClasses.pas index bfee8aa3..f7f57a86 100644 --- a/Source/WrapDelphiClasses.pas +++ b/Source/WrapDelphiClasses.pas @@ -1221,13 +1221,13 @@ function TPyDelphiComponent.MpSubscript(obj: PPyObject): PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_KeyError^, PAnsiChar(AnsiString(_name))); + PyErr_SetString(PyExc_KeyError^, PAnsiChar(EncodeString(_name))); end; end else begin Result := nil; - PyErr_SetString (PyExc_KeyError^, 'Key must be a string'); + PyErr_SetString(PyExc_KeyError^, 'Key must be a string'); end; end; end; @@ -1329,7 +1329,7 @@ function TStringsAccess.SetItem(AIndex: Integer; AValue: PPyObject): Boolean; else begin Result := False; - PyErr_SetString (PyExc_AttributeError^, 'You can only assign strings to TStrings items'); + PyErr_SetString(PyExc_AttributeError^, 'You can only assign strings to TStrings items'); end; end end; @@ -1393,7 +1393,7 @@ function TStringsObjectsAccess.SetItem(AIndex: Integer; AValue: PPyObject): Bool else begin Result := False; - PyErr_SetString (PyExc_AttributeError^, 'You can only assign Delphi wrappers to Objects items'); + PyErr_SetString(PyExc_AttributeError^, 'You can only assign Delphi wrappers to Objects items'); end; end end; @@ -1617,11 +1617,11 @@ function TPyDelphiStrings.MpSubscript(obj: PPyObject): PPyObject; else Result := GetPythonEngine.ReturnNone; end else with GetPythonEngine do begin - PyErr_SetString (PyExc_KeyError^, PAnsiChar(AnsiString(S))); + PyErr_SetString(PyExc_KeyError^, PAnsiChar(EncodeString(S))); Result := nil; end; end else with GetPythonEngine do begin - PyErr_SetString (PyExc_KeyError^, '<Empty String>'); + PyErr_SetString(PyExc_KeyError^, '<Empty String>'); Result := nil; end; end; @@ -2445,7 +2445,7 @@ TResourceStreamClass = class of TResourceStream; except on E: Exception do with GetPythonEngine do - PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(EncodeString(E.Message))); end; //Maybe it was created on the next attempt... diff --git a/Source/WrapDelphiTypes.pas b/Source/WrapDelphiTypes.pas index e572b851..86f00e22 100644 --- a/Source/WrapDelphiTypes.pas +++ b/Source/WrapDelphiTypes.pas @@ -229,8 +229,8 @@ function CheckPointAttribute(AAttribute : PPyObject; const AAttributeName : stri begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only Point objects', [AAttributeName])))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format('%s receives only Point objects', [AAttributeName])))); end; end; end; @@ -248,8 +248,8 @@ function CheckRectAttribute(AAttribute : PPyObject; const AAttributeName : strin begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only Rect objects', [AAttributeName])))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format('%s receives only Rect objects', [AAttributeName])))); end; end; end; @@ -267,8 +267,8 @@ function CheckSizeAttribute(AAttribute : PPyObject; const AAttributeName : strin begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only Size objects', [AAttributeName])))); + PyErr_SetString(PyExc_AttributeError^, + PAnsiChar(EncodeString(Format('%s receives only Size objects', [AAttributeName])))); end; end; end; diff --git a/Source/WrapFireDAC.pas b/Source/WrapFireDAC.pas index eefa7af9..76e64aec 100644 --- a/Source/WrapFireDAC.pas +++ b/Source/WrapFireDAC.pas @@ -597,7 +597,7 @@ function TPyDBField.CheckField : Boolean; if not Assigned(DelphiObject) then begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('No field defined !') ); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar('No field defined !') ); end else Result := True; @@ -978,7 +978,7 @@ function TPyDBDataset.Do_Fields( args : PPyObject ): PPyObject; Result := PyDelphiWrapper.Wrap(l_oDataset.Fields[idx]) else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Value out of range : %d', [idx])))); + PyErr_SetString(PyExc_AttributeError^, PAnsiChar(EncodeString(Format('Value out of range : %d', [idx])))); end; end else @@ -1011,7 +1011,7 @@ function TPyDBDataset.Do_FieldByName( args : PPyObject ) : PPyObject; Result := PyDelphiWrapper.Wrap(fld) else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown field "%s"', [String(s)]))) ); + PyErr_SetString(PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown field "%s"', [String(s)]))) ); end; end else @@ -1191,7 +1191,7 @@ function TPyDBDataset.Do_Locate( args : PPyObject ) : PPyObject; try if PyArg_ParseTuple( args, 'sOO:DBDataset.Locate',@keyFields, @keyValues, @options ) <> 0 then begin if PySequence_Check(options) = 0 then - PyErr_SetString (PyExc_AttributeError^, 'Third argument of Locate must be a sequence.') + PyErr_SetString(PyExc_AttributeError^, 'Third argument of Locate must be a sequence.') else begin // Prepare the locate options ListToSet( options, @opt, sizeof(opt) ); @@ -1391,14 +1391,14 @@ function TPyDBTable.CheckActiveDBTable(aMustOpen: Boolean): Boolean; if not aMustOpen then begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBTable is open!') ); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar('DBTable is open!') ); end; end else begin if aMustOpen then begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBTable is not open!') ); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar('DBTable is not open!') ); end; end; end; @@ -1838,10 +1838,10 @@ function TPyDBTable.Do_SetRange( args : PPyObject ) : PPyObject; if l_oTable.Active and (PyArg_ParseTuple( args, 'OO:FDTable.SetRange',@l_oPyStartValues, @l_oPyEndValues ) <> 0) then begin if PySequence_Check(l_oPyStartValues) = 0 then begin - PyErr_SetString (PyExc_AttributeError^, 'First argument of SetRange must be a sequence.'); + PyErr_SetString(PyExc_AttributeError^, 'First argument of SetRange must be a sequence.'); end else if PySequence_Check(l_oPyEndValues) = 0 then begin - PyErr_SetString (PyExc_AttributeError^, 'Second argument of SetRange must be a sequence.'); + PyErr_SetString(PyExc_AttributeError^, 'Second argument of SetRange must be a sequence.'); end else begin l_oTable.SetRangeStart; @@ -1952,14 +1952,14 @@ function TPyDBQuery.CheckActiveDBQuery(aMustOpen: Boolean): Boolean; if not aMustOpen then begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBQuery is open!') ); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar('DBQuery is open!') ); end; end else begin if aMustOpen then begin Result := False; with GetPythonEngine do - PyErr_SetString (PyExc_RuntimeError^, PAnsiChar('DBQuery is not open!') ); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar('DBQuery is not open!') ); end; end; end; diff --git a/Source/fmx/WrapFmxForms.pas b/Source/fmx/WrapFmxForms.pas index f3a2b68e..906f14b5 100644 --- a/Source/fmx/WrapFmxForms.pas +++ b/Source/fmx/WrapFmxForms.pas @@ -466,7 +466,7 @@ function TPyDelphiCommonCustomForm.LoadProps_Wrapper( except on E: Exception do with GetPythonEngine do - PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(Utf8Encode(E.Message))); end; Result := nil; end; diff --git a/Source/fmx/WrapFmxTypes.pas b/Source/fmx/WrapFmxTypes.pas index 53e36d9f..b7bbb8d5 100644 --- a/Source/fmx/WrapFmxTypes.pas +++ b/Source/fmx/WrapFmxTypes.pas @@ -505,7 +505,7 @@ function CheckPointFAttribute(AAttribute : PPyObject; const AAttributeName : str Result := False; with GetPythonEngine do PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only PointF objects', [AAttributeName])))); + PAnsiChar(Utf8Encode(Format('%s receives only PointF objects', [AAttributeName])))); end; end; end; @@ -524,7 +524,7 @@ function CheckSizeFAttribute(AAttribute : PPyObject; const AAttributeName : stri Result := False; with GetPythonEngine do PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only SizeF objects', [AAttributeName])))); + PAnsiChar(Utf8Encode(Format('%s receives only SizeF objects', [AAttributeName])))); end; end; end; @@ -543,7 +543,7 @@ function CheckRectFAttribute(AAttribute: PPyObject; const AAttributeName: string Result := False; with GetPythonEngine do PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only RectF objects', [AAttributeName])))); + PAnsiChar(Utf8Encode(Format('%s receives only RectF objects', [AAttributeName])))); end; end; end; @@ -562,7 +562,7 @@ function CheckTouchAttribute(AAttribute: PPyObject; const AAttributeName: string Result := False; with GetPythonEngine do PyErr_SetString (PyExc_AttributeError^, - PAnsiChar(AnsiString(Format('%s receives only Touch objects', [AAttributeName])))); + PAnsiChar(Utf8Encode(Format('%s receives only Touch objects', [AAttributeName])))); end; end; end; diff --git a/Source/vcl/WrapVclForms.pas b/Source/vcl/WrapVclForms.pas index fd0799c3..b3d77bec 100644 --- a/Source/vcl/WrapVclForms.pas +++ b/Source/vcl/WrapVclForms.pas @@ -572,7 +572,7 @@ function TPyDelphiCustomForm.LoadProps_Wrapper(args: PPyObject): PPyObject; except on E: Exception do with GetPythonEngine() do - PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(AnsiString(E.Message))); + PyErr_SetString(PyExc_RuntimeError^, PAnsiChar(EncodeString(E.Message))); end; Result := nil; end; diff --git a/Source/vcl/WrapVclGraphics.pas b/Source/vcl/WrapVclGraphics.pas index 1479d5f6..21a54013 100644 --- a/Source/vcl/WrapVclGraphics.pas +++ b/Source/vcl/WrapVclGraphics.pas @@ -1057,7 +1057,7 @@ function TPyDelphiBitmap.Set_HandleType(AValue: PPyObject; else begin with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown THandleType value "%s"', [_value])))); + PyErr_SetString(PyExc_AttributeError^, PAnsiChar(EncodeString(Format('Unknown THandleType value "%s"', [_value])))); Result := -1; Exit; end; @@ -1143,7 +1143,7 @@ function TPyDelphiBitmap.Set_PixelFormat(AValue: PPyObject; DelphiObject.PixelFormat := pfCustom else begin - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown TPixelFormat value "%s"', [_value])))); + PyErr_SetString(PyExc_AttributeError^, PAnsiChar(EncodeString(Format('Unknown TPixelFormat value "%s"', [_value])))); Result := -1; Exit; end; @@ -1184,7 +1184,7 @@ function TPyDelphiBitmap.Set_TransparentMode(AValue: PPyObject; else begin with GetPythonEngine do - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(AnsiString(Format('Unknown TTransparentMode value "%s"', [_value])))); + PyErr_SetString(PyExc_AttributeError^, PAnsiChar(EncodeString(Format('Unknown TTransparentMode value "%s"', [_value])))); Result := -1; Exit; end; @@ -1615,7 +1615,7 @@ function TPyDelphiCanvas.PolyBezier_Wrapper(args: PPyObject): PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, 'PolyBezier accepts only a sequence of points as single parameter'); + PyErr_SetString(PyExc_AttributeError^, 'PolyBezier accepts only a sequence of points as single parameter'); end; end else @@ -1662,7 +1662,7 @@ function TPyDelphiCanvas.PolyBezierTo_Wrapper(args: PPyObject): PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, 'PolyBezierTo accepts only a sequence of points as single parameter'); + PyErr_SetString(PyExc_AttributeError^, 'PolyBezierTo accepts only a sequence of points as single parameter'); end; end else @@ -1709,7 +1709,7 @@ function TPyDelphiCanvas.Polygon_Wrapper(args: PPyObject): PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, 'Polygon accepts only a sequence of points as single parameter'); + PyErr_SetString(PyExc_AttributeError^, 'Polygon accepts only a sequence of points as single parameter'); end; end else @@ -1755,7 +1755,7 @@ function TPyDelphiCanvas.Polyline_Wrapper(args: PPyObject): PPyObject; else begin Result := nil; - PyErr_SetString (PyExc_AttributeError^, 'Polyline accepts only a sequence of points as single parameter'); + PyErr_SetString(PyExc_AttributeError^, 'Polyline accepts only a sequence of points as single parameter'); end; end else diff --git a/Tests/FMX/Android/NumberServicesTest.pas b/Tests/FMX/Android/NumberServicesTest.pas index 115ba066..3aee6737 100644 --- a/Tests/FMX/Android/NumberServicesTest.pas +++ b/Tests/FMX/Android/NumberServicesTest.pas @@ -288,7 +288,7 @@ constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, FRandomInteger.Value := PythonToTRandomInteger(val1).Value; except on e: Exception do - PyErr_SetString(PyExc_Exception^, PAnsiChar(AnsiString(e.Message))); + PyErr_SetString(PyExc_Exception^, PAnsiChar(EncodeString(e.Message))); end; end; end; diff --git a/Tests/NumberServicesTest.pas b/Tests/NumberServicesTest.pas index ca1bdb1a..0b100950 100644 --- a/Tests/NumberServicesTest.pas +++ b/Tests/NumberServicesTest.pas @@ -291,7 +291,7 @@ constructor PyTRandomInteger.CreateWith(PythonType: TPythonType; args, FRandomInteger.Value := PythonToTRandomInteger(val1).Value; except on e: Exception do - PyErr_SetString(PyExc_Exception^, PAnsiChar(AnsiString(e.Message))); + PyErr_SetString(PyExc_Exception^, PAnsiChar(EncodeString(e.Message))); end; end; end; From 70bc12a9801be2101c6ea080220de5193e32cdbf Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Mon, 23 Sep 2024 20:39:50 +0300 Subject: [PATCH 157/174] Fix reference counting error in demos 6 and 7. --- Demos/Demo06/Unit1.dfm | 3 --- Demos/Demo06/Unit1.pas | 13 ++++++++++--- Demos/Demo07/Unit1.pas | 13 ++++++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Demos/Demo06/Unit1.dfm b/Demos/Demo06/Unit1.dfm index 19538b07..c3a31c64 100644 --- a/Demos/Demo06/Unit1.dfm +++ b/Demos/Demo06/Unit1.dfm @@ -10,8 +10,6 @@ object Form1: TForm1 Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] - OldCreateOrder = True - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 0 @@ -20,7 +18,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alTop - ExplicitWidth = 536 end object Memo1: TMemo Left = 0 diff --git a/Demos/Demo06/Unit1.pas b/Demos/Demo06/Unit1.pas index df25433d..e038b4fa 100644 --- a/Demos/Demo06/Unit1.pas +++ b/Demos/Demo06/Unit1.pas @@ -151,6 +151,8 @@ procedure PyPoint_dealloc(obj : PPyObject); cdecl; // object.value // object.method(args) function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; +var + Py_Key: PPyObject; begin with GetPythonEngine, PPyPoint(obj)^ do begin @@ -163,9 +165,14 @@ function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; else begin // Else check for a method - Result := PyObject_GenericGetAttr(obj, PyUnicodeFromString(key)); - if not Assigned(Result) then - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); + Py_Key := PyUnicodeFromString(key); + try + Result := PyObject_GenericGetAttr(obj, Py_key); + if not Assigned(Result) then + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); + finally + Py_DECREF(Py_Key); + end; end; end; end; diff --git a/Demos/Demo07/Unit1.pas b/Demos/Demo07/Unit1.pas index 67e672b0..f33b8817 100644 --- a/Demos/Demo07/Unit1.pas +++ b/Demos/Demo07/Unit1.pas @@ -191,6 +191,8 @@ procedure PyPoint_dealloc(obj : PPyObject); cdecl; // object.value // object.method(args) function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; +var + Py_Key: PPyObject; begin with GetPythonEngine, PPyPoint(obj)^ do begin @@ -203,9 +205,14 @@ function PyPoint_getattr(obj : PPyObject; key : PAnsiChar) : PPyObject; cdecl; else begin // Else check for a method - Result := PyObject_GenericGetAttr(obj, PyUnicodeFromString(key)); - if not Assigned(Result) then - PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); + Py_Key := PyUnicodeFromString(key); + try + Result := PyObject_GenericGetAttr(obj, Py_Key); + if not Assigned(Result) then + PyErr_SetString (PyExc_AttributeError^, PAnsiChar(Utf8Encode(Format('Unknown attribute "%s"',[key])))); + finally + Py_DECREF(Py_Key); + end; end; end; end; From 53c24628f24f460e1805d7fd33f37cca5a1d45d6 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sun, 29 Sep 2024 00:54:56 -0400 Subject: [PATCH 158/174] Fix issue reported in https://en.delphipraxis.net/topic/12281-python4delphi-crash-immediately-after-launch --- Demos/Demo36/ParallelPython.dpr | 1 + 1 file changed, 1 insertion(+) diff --git a/Demos/Demo36/ParallelPython.dpr b/Demos/Demo36/ParallelPython.dpr index 00883f7a..abcfb0fa 100644 --- a/Demos/Demo36/ParallelPython.dpr +++ b/Demos/Demo36/ParallelPython.dpr @@ -109,6 +109,7 @@ begin WriteLn('Elapsed ms: ' + SW.ElapsedMilliseconds.ToString); WriteLn; finally + Sleep(1000); // allow some time for the threads to terminate DestroyEngine; end; except From d1951c18d614cc8931cc7b9edda019bcb7cb13ad Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 1 Oct 2024 00:24:22 -0400 Subject: [PATCH 159/174] TPyClassWrapper methods declared private. Documentation improved. --- Source/WrapDelphi.pas | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index 67d0535c..bed385ea 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -616,25 +616,26 @@ TPyDelphiObjectClass = class of TPyDelphiObject; Generic wrapper for pascal classes Can be used from unit wrappers as follows: - APyDelphiWrapper.RegisterDelphiWrapper(TPyClassWrapper<TMyClass>); + PyDelphiWrapper1.RegisterDelphiWrapper(TPyClassWrapper<TMyClass>); or at runtime (e.g. inside the FormCreate handler: PyDelphiWrapper1.RegisterDelphiWrapper(TPyClassWrapper<TMyClass>).Initialize; if you want your class to capable of being instantiated from python then do: - TTestWrapper = class(TPyClassWrapper<TTest>) + TMyClassWrapper = class(TPyClassWrapper<TMyClass>) constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); overload; override; end; - constuctor TTestWrapper.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); + constuctor TMyClassWrapper.CreateWith(APythonType: TPythonType; args, kwds: PPyObject); begin Create(APythonType); - DelphiObject := TTest.Create; + DelphiObject := TMyClass.Create; end; - PyDelphiWrapper1.RegisterDelphiWrapper(TTestWrapper).Initialize; + PyDelphiWrapper1.RegisterDelphiWrapper(TMyClassWrapper).Initialize; } TPyClassWrapper<T: class> = class(TPyDelphiObject) + private function GetDelphiObject: T; procedure SetDelphiObject(const Value: T); public From 6afe08111fe099609a445e8b6346e0c03bdf9c18 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sun, 8 Dec 2024 23:38:28 +0200 Subject: [PATCH 160/174] Support for Python 3.14. Implemented PEP741 initialization. --- Source/PythonEngine.pas | 427 +++++++++++++++++++++++++++------------- 1 file changed, 292 insertions(+), 135 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index c08ea1dc..93cfa6d2 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -73,47 +73,51 @@ TPythonVersionProp = record end; const {$IFDEF MSWINDOWS} - PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..7] of TPythonVersionProp = ( (DllName: 'python38.dll'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'python39.dll'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'python310.dll'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'python311.dll'; RegVersion: '3.11'; APIVersion: 1013), (DllName: 'python312.dll'; RegVersion: '3.12'; APIVersion: 1013), - (DllName: 'python313.dll'; RegVersion: '3.13'; APIVersion: 1013) + (DllName: 'python313.dll'; RegVersion: '3.13'; APIVersion: 1013), + (DllName: 'python314.dll'; RegVersion: '3.14'; APIVersion: 1013) ); {$ENDIF} {$IFDEF _so_files} - PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..7] of TPythonVersionProp = ( (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013), (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013), - (DllName: 'libpython3.13.so'; RegVersion: '3.13'; APIVersion: 1013) + (DllName: 'libpython3.13.so'; RegVersion: '3.13'; APIVersion: 1013), + (DllName: 'libpython3.14.so'; RegVersion: '3.14'; APIVersion: 1013) ); {$ENDIF} {$IFDEF DARWIN} - PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..7] of TPythonVersionProp = ( (DllName: 'libpython3.8.dylib'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.dylib'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.dylib'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'libpython3.11.dylib'; RegVersion: '3.11'; APIVersion: 1013), (DllName: 'libpython3.12.dylib'; RegVersion: '3.12'; APIVersion: 1013), - (DllName: 'libpython3.13.dylib'; RegVersion: '3.13'; APIVersion: 1013) + (DllName: 'libpython3.13.dylib'; RegVersion: '3.13'; APIVersion: 1013), + (DllName: 'libpython3.14.dylib'; RegVersion: '3.14'; APIVersion: 1013) ); {$ENDIF} {$IFDEF ANDROID} - PYTHON_KNOWN_VERSIONS: array[1..6] of TPythonVersionProp = + PYTHON_KNOWN_VERSIONS: array[1..7] of TPythonVersionProp = ( (DllName: 'libpython3.8.so'; RegVersion: '3.8'; APIVersion: 1013), (DllName: 'libpython3.9.so'; RegVersion: '3.9'; APIVersion: 1013), (DllName: 'libpython3.10.so'; RegVersion: '3.10'; APIVersion: 1013), (DllName: 'libpython3.11.so'; RegVersion: '3.11'; APIVersion: 1013), - (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013) - (DllName: 'libpython3.13.so'; RegVersion: '3.13'; APIVersion: 1013) + (DllName: 'libpython3.12.so'; RegVersion: '3.12'; APIVersion: 1013), + (DllName: 'libpython3.13.so'; RegVersion: '3.13'; APIVersion: 1013), + (DllName: 'libpython3.14.so'; RegVersion: '3.14'; APIVersion: 1013) ); {$ENDIF} @@ -176,8 +180,8 @@ TPythonVersionProp = record WCharTString = UnicodeString; {$ENDIF} - PPy_ssize_t = PNativeInt; - Py_ssize_t = NativeInt; + PPy_ssize_t = PNativeUInt; + Py_ssize_t = NativeUInt; const { @@ -994,6 +998,9 @@ PyConfig = record Filler: array [0..1000] of Byte; end; + // Opaque structure PEP 741 + PPyInitConfig = Pointer; + {$SCOPEDENUMS ON} TConfigFields = ( use_environment, @@ -1796,8 +1803,9 @@ TPythonInterface=class(TDynamicDll) Py_GetPrefix : function : PWCharT; cdecl; Py_GetProgramName : function : PWCharT; cdecl; - PyErr_NewException : function ( name : PAnsiChar; base, dict : PPyObject ) : PPyObject; cdecl; - PyMem_Malloc : function ( size : NativeUInt ) : Pointer; + PyErr_NewException : function (name : PAnsiChar; base, dict : PPyObject): PPyObject; cdecl; + PyMem_Malloc : function (size: NativeUInt): Pointer; cdecl; + PyMem_Free : procedure (P: Pointer); cdecl; Py_IsInitialized : function : integer; cdecl; Py_GetProgramFullPath : function : PAnsiChar; cdecl; @@ -1818,7 +1826,7 @@ TPythonInterface=class(TDynamicDll) PyGILState_Ensure : function() : PyGILstate_STATE; cdecl; PyGILState_Release : procedure(gilstate : PyGILState_STATE); cdecl; - // Initialization functions + // PEP 587 Initialization functions PyWideStringList_Append : function(list: PPyWideStringList; item: PWCharT): PyStatus; cdecl; PyWideStringList_Insert : function(list: PPyWideStringList; index: Py_ssize_t; item: PWCharT): PyStatus; cdecl; PyConfig_InitPythonConfig : procedure(var config: PyConfig); cdecl; @@ -1830,6 +1838,17 @@ TPythonInterface=class(TDynamicDll) PyConfig_SetWideStringList : function(var config: PyConfig; list: PPyWideStringList; length: Py_ssize_t; items: PPWCharT): PyStatus; cdecl; Py_InitializeFromConfig : function({$IFDEF FPC}constref{$ELSE}[Ref] const{$ENDIF} config: PyConfig): PyStatus; cdecl; + // PEP 741 Initialization functions - python 3.14+ + PyInitConfig_Create : function(): PPyInitConfig; cdecl; + PyInitConfig_Free : procedure(config: PPyInitConfig); cdecl; + Py_InitializeFromInitConfig : function(config: PPyInitConfig): Integer; cdecl; + PyInitConfig_SetInt : function(config: PPyInitConfig; name: PAnsiChar; value: Int64): Integer; cdecl; + PyInitConfig_SetStr : function(config: PPyInitConfig; name: PAnsiChar; value: PAnsiChar): Integer; cdecl; + PyInitConfig_SetStrList : function(config: PPyInitConfig; name: PAnsiChar; Lenght: Py_ssize_t; value: PPAnsiChar): Integer; cdecl; + PyInitConfig_GetError : function(config: PPyInitConfig; err_msg: PPAnsiChar): integer; cdecl; + PyConfig_Get : function(name: PAnsiChar): PPyObject; cdecl; + PyConfig_Set : function(name: PAnsiChar; value: PPyObject): Integer; cdecl; + function Py_CompileString(str,filename:PAnsiChar;start:integer) : PPyObject; cdecl; // functions redefined in Delphi @@ -1939,7 +1958,8 @@ TPythonInterface=class(TDynamicDll) type TEngineClient = class; TSysPathInitEvent = procedure(Sender: TObject; PathList: PPyObject) of object; - TConfigInitEvent = procedure(Sender: TObject; var Config: PyConfig) of object; + // Config will be either PPyConfig if version < 3.14 or PPyInitConfig + TConfigInitEvent = procedure(Sender: TObject; Config: Pointer) of object; TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, pfFrozenFlag, pfIgnoreEnvironmentFlag, pfIsolated); TPythonFlags = set of TPythonFlag; @@ -2021,14 +2041,12 @@ TPythonEngine = class(TPythonInterface) function GetClients( idx : Integer ) : TEngineClient; procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure SetProgramArgs(var Config: PyConfig); procedure InitWinConsole; procedure SetUseWindowsConsole( const Value : Boolean ); procedure SetGlobalVars(const Value: PPyObject); procedure SetLocalVars(const Value: PPyObject); procedure SetPyFlags(const Value: TPythonFlags); procedure SetIO(InputOutput: TPythonInputOutput); - procedure AssignPyFlags(var Config: PyConfig); public // Constructors & Destructors @@ -4060,11 +4078,10 @@ procedure TPythonInterface.MapDll; Py_GetPrefix := Import('Py_GetPrefix'); Py_GetProgramName := Import('Py_GetProgramName'); - PyErr_NewException := Import('PyErr_NewException'); - try - PyMem_Malloc := Import ('PyMem_Malloc'); - except - end; + PyErr_NewException := Import('PyErr_NewException'); + PyMem_Malloc := Import ('PyMem_Malloc'); + PyMem_Free := Import ('PyMem_Free'); + Py_IsInitialized := Import('Py_IsInitialized'); Py_GetProgramFullPath := Import('Py_GetProgramFullPath'); Py_GetBuildInfo := Import('Py_GetBuildInfo'); @@ -4096,6 +4113,20 @@ procedure TPythonInterface.MapDll; PyConfig_SetArgv := Import('PyConfig_SetArgv'); PyConfig_SetWideStringList := Import('PyConfig_SetWideStringList'); Py_InitializeFromConfig := Import('Py_InitializeFromConfig'); + + // PEP 741 + if (MajorVersion > 3) or (MinorVersion >= 14) then + begin + PyInitConfig_Create := Import('PyInitConfig_Create'); + PyInitConfig_Free := Import('PyInitConfig_Free'); + Py_InitializeFromInitConfig := Import('Py_InitializeFromInitConfig'); + PyInitConfig_SetInt := Import('PyInitConfig_SetInt'); + PyInitConfig_SetStr := Import('PyInitConfig_SetStr'); + PyInitConfig_SetStrList := Import('PyInitConfig_SetStrList'); + PyInitConfig_GetError := Import('PyInitConfig_GetError'); + PyConfig_Get := Import('PyConfig_Get'); + PyConfig_Set := Import('PyConfig_Set'); + end; end; function TPythonInterface.Py_CompileString(str,filename:PAnsiChar;start:integer):PPyObject; @@ -4626,56 +4657,253 @@ procedure TPythonEngine.DoOpenDll(const aDllName : string); end; end; -procedure TPythonEngine.AssignPyFlags(var Config: PyConfig); -begin - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.parser_debug])^ := - IfThen(pfDebug in FPyFlags, 1, 0); - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.verbose])^ := - IfThen(pfVerbose in FPyFlags, 1, 0); - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.interactive])^ := - IfThen(pfInteractive in FPyFlags, 1, 0); - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.optimization_level])^ := - IfThen(pfOptimize in FPyFlags, 1, 0); - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.site_import])^ := - IfThen(pfNoSite in FPyFlags, 0, 1); - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.pathconfig_warnings])^ := - IfThen(pfFrozenFlag in FPyFlags, 1, 0); - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.use_environment])^ := - IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1); -end; - procedure TPythonEngine.Initialize; - procedure InitSysPath; + procedure ConfgigPEP587(var ErrMsg: string); + // Initialize according to PEP587 available since python 3.8 + + procedure AssignPyFlags(var Config: PyConfig); + begin + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.parser_debug])^ := + IfThen(pfDebug in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.verbose])^ := + IfThen(pfVerbose in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.interactive])^ := + IfThen(pfInteractive in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.optimization_level])^ := + IfThen(pfOptimize in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.site_import])^ := + IfThen(pfNoSite in FPyFlags, 0, 1); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.pathconfig_warnings])^ := + IfThen(pfFrozenFlag in FPyFlags, 1, 0); + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.use_environment])^ := + IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1); + end; + + procedure SetProgramArgs(var Config: PyConfig); + var + I: Integer; + TempS: UnicodeString; + Str: WCharTString; + + begin + // do not parse further + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.parse_argv])^ := 0; + for I := 0 to ParamCount do + begin + { + ... the first entry should refer to the script file to be executed rather + than the executable hosting the Python interpreter. If there isn’t a + script that will be run, the first entry in argv can be an empty string. + } + if I = 0 then + TempS := '' + else + TempS := ParamStr(I); + {$IFDEF POSIX} + Str := UnicodeStringToUCS4String(TempS); + {$ELSE} + Str := TempS; + {$ENDIF} + PyWideStringList_Append( + PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.argv]), + PWCharT(Str)); + end; + end; + + procedure SetPythonPath(var Config: PyConfig); + var + Paths: TStringDynArray; + I: Integer; + PWSL: PPyWideStringList; + begin + if FPythonPath = '' then Exit; + + PWSL := PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, + TConfigFields.module_search_paths]); + Paths := SplitString(string(FPythonPath), PathSep); + for I := 0 to Length(Paths) - 1 do + begin + if (Paths[I] = '') and (I > 0) then + Continue; + PyWideStringList_Append(PWSL, PWCharT(StringToWCharTString(Paths[I]))); + end; + + if PWSL^.length > 0 then + PInteger(PByte(@Config) + ConfigOffests[MinorVersion, + TConfigFields.module_search_paths_set])^ := 1; + end; + var - _path : PPyObject; + Config: PyConfig; + Status: PyStatus; begin - _path := PySys_GetObject('path'); - if Assigned(FOnSysPathInit) then - FOnSysPathInit(Self, _path); + // Fills Config with zeros and then sets some default values + if pfIsolated in FPyFlags then + PyConfig_InitIsolatedConfig(Config) + else + PyConfig_InitPythonConfig(Config); + try + AssignPyFlags(Config); + + // Set programname and pythonhome if available + if FProgramName <> '' then + PyConfig_SetString(Config, + PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.program_name]), + PWCharT(StringToWCharTString(FProgramName))); + if FPythonHome <> '' then + PyConfig_SetString(Config, + PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.home]), + PWCharT(StringToWCharTString(FPythonHome))); + // Set venv executable if available + if FVenvPythonExe <> '' then + PyConfig_SetString(Config, + PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.executable]), + PWCharT(StringToWCharTString(FVenvPythonExe))); + + // Set program arguments (sys.argv) + SetProgramArgs(Config); + + // PythonPath + SetPythonPath(Config); + + // Fine tune Config + if Assigned(FOnConfigInit) then + FOnConfigInit(Self, @Config); + + Status := Py_InitializeFromConfig(Config); + FInitialized := Py_IsInitialized() <> 0; + + if PyStatus_Exception(Status) then + ErrMsg := Format(SPyInitFailed, [string(Status.err_msg)]) + else if not FInitialized then + ErrMsg := Format(SPyInitFailed, [SPyInitFailedUnknown]); + + finally + PyConfig_Clear(Config); + end; end; - procedure SetPythonPath(var Config: PyConfig); + procedure ConfgigPEP741(var ErrMsg: string); + // Initialize according to PEP587 available since python 3.8 + + procedure AssignPyFlags(Config: PPyInitConfig); + begin + PyInitConfig_SetInt(Config, 'parser_debug', IfThen(pfDebug in FPyFlags, 1, 0)); + PyInitConfig_SetInt(Config, 'verbose', IfThen(pfVerbose in FPyFlags, 1, 0)); + PyInitConfig_SetInt(Config, 'interactive', IfThen(pfInteractive in FPyFlags, 1, 0)); + PyInitConfig_SetInt(Config, 'optimization_level', IfThen(pfOptimize in FPyFlags, 1, 0)); + PyInitConfig_SetInt(Config, 'site_import', IfThen(pfNoSite in FPyFlags, 0, 1)); + PyInitConfig_SetInt(Config, 'user_site_directory', IfThen(pfNoSite in FPyFlags, 0, 1)); + PyInitConfig_SetInt(Config, 'pathconfig_warnings', IfThen(pfFrozenFlag in FPyFlags, 1, 0)); + PyInitConfig_SetInt(Config, 'use_environment', IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1)); + end; + + procedure SetProgramArgs(Config: PPyInitConfig); + var + I: Integer; + Params: TArray<AnsiString>; + PParams: TArray<PAnsiChar>; + begin + // do not parse further + PyInitConfig_SetInt(Config, 'parse_argv', 0); + + SetLength(Params, ParamCount + 1); + SetLength(PParams, ParamCount + 1); + for I := 0 to ParamCount do + begin + { + ... the first entry should refer to the script file to be executed rather + than the executable hosting the Python interpreter. If there isn’t a + script that will be run, the first entry in argv can be an empty string. + } + if I = 0 then + Params[I] := '' + else + Params[I] := EncodeString(ParamStr(I)); + PParams[I] := PAnsiChar(Params[I]) + end; + PyInitConfig_SetStrList(Config, 'argv', ParamCount + 1, @PParams[0]); + end; + + procedure SetPythonPath(Config: PPyInitConfig); + var + Paths: TStringDynArray; + I: Integer; + Utf8Paths: TArray<AnsiString>; + PUtf8Paths: TArray<PAnsiChar>; + begin + if FPythonPath = '' then Exit; + + Paths := SplitString(string(FPythonPath), PathSep); + + if Length(Paths) = 0 then Exit; + + SetLength(Utf8Paths, Length(Paths)); + SetLength(PUtf8Paths, Length(Paths)); + + for I := 0 to Length(Paths) - 1 do + begin + Utf8Paths[I] := EncodeString(Paths[I]); + PUtf8Paths[I] := PAnsiChar(Utf8Paths[I]); + end; + + // The following Also sets module_search_paths_set + PyInitConfig_SetStrList(Config, 'module_search_paths', Length(Paths), @PUtf8Paths[0]); + end; + var - Paths: TStringDynArray; - I: Integer; - PWSL: PPyWideStringList; + Config: PPyInitConfig; + PErrMsg: PAnsiChar; begin - if FPythonPath = '' then Exit; + Config := PyInitConfig_Create; + try + PyInitConfig_SetInt(Config, 'isolated', IfThen(pfIsolated in FPyFlags, 1, 0)); - PWSL := PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, - TConfigFields.module_search_paths]); - Paths := SplitString(string(FPythonPath), PathSep); - for I := 0 to Length(Paths) - 1 do - begin - if (Paths[I] = '') and (I > 0) then - Continue; - PyWideStringList_Append(PWSL, PWCharT(StringToWCharTString(Paths[I]))); + AssignPyFlags(Config); + + // Set programname and pythonhome if available + if FProgramName <> '' then + PyInitConfig_SetStr(Config, 'program_name', PAnsiChar(EncodeString(FProgramName))); + if FPythonHome <> '' then + PyInitConfig_SetStr(Config, 'home', PAnsiChar(EncodeString(FPythonHome))); + // Set venv executable if available + if FVenvPythonExe <> '' then + PyInitConfig_SetStr(Config, 'executable', PAnsiChar(EncodeString(FPythonHome))); + + // Set program arguments (sys.argv) + SetProgramArgs(Config); + + // PythonPath + SetPythonPath(Config); + + // Fine tune Config + if Assigned(FOnConfigInit) then + FOnConfigInit(Self, Config); + + if Py_InitializeFromInitConfig(Config) <> 0 then + begin + FInitialized := False; + PyInitConfig_GetError(Config, @PErrMsg); + if PErrMsg <> nil then + ErrMsg := Format(SPyInitFailed, [UTF8ToString(AnsiString(PErrMsg))]); + end + else + FInitialized := Py_IsInitialized() <> 0; + if not FInitialized and (ErrMsg = '') then + ErrMsg := Format(SPyInitFailed, [SPyInitFailedUnknown]); + finally + PyInitConfig_Free(Config); end; + end; - if PWSL^.length > 0 then - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, - TConfigFields.module_search_paths_set])^ := 1; + procedure InitSysPath; + var + _path : PPyObject; + begin + _path := PySys_GetObject('path'); + if Assigned(FOnSysPathInit) then + FOnSysPathInit(Self, _path); end; function GetVal(AModule : PPyObject; AVarName : AnsiString) : PPyObject; @@ -4727,8 +4955,6 @@ procedure TPythonEngine.Initialize; var i : Integer; - Config: PyConfig; - Status: PyStatus; ErrMsg: string; begin if Assigned(gPythonEngine) then @@ -4741,51 +4967,13 @@ procedure TPythonEngine.Initialize; FInitialized := True else begin - // Fills Config with zeros and then sets some default values - if pfIsolated in FPyFlags then - PyConfig_InitIsolatedConfig(Config) + if (MajorVersion > 3) or (MinorVersion >= 14) then + ConfgigPEP741(ErrMsg) else - PyConfig_InitPythonConfig(Config); - try - AssignPyFlags(Config); - - // Set programname and pythonhome if available - if FProgramName <> '' then - PyConfig_SetString(Config, - PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.program_name]), - PWCharT(StringToWCharTString(FProgramName))); - if FPythonHome <> '' then - PyConfig_SetString(Config, - PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.home]), - PWCharT(StringToWCharTString(FPythonHome))); - // Set venv executable if available - if FVenvPythonExe <> '' then - PyConfig_SetString(Config, - PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.executable]), - PWCharT(StringToWCharTString(FVenvPythonExe))); - - // Set program arguments (sys.argv) - SetProgramArgs(Config); - - // PythonPath - SetPythonPath(Config); - - // Fine tune Config - if Assigned(FOnConfigInit) then - FOnConfigInit(Self, Config); - - Status := Py_InitializeFromConfig(Config); - FInitialized := Py_IsInitialized() <> 0 - finally - PyConfig_Clear(Config); - end; + ConfgigPEP587(ErrMsg); if not FInitialized then begin - if PyStatus_Exception(Status) then - ErrMsg := Format(SPyInitFailed, [string(Status.err_msg)]) - else - ErrMsg := Format(SPyInitFailed, [SPyInitFailedUnknown]); if FatalMsgDlg then {$IFDEF MSWINDOWS} MessageBox( GetActiveWindow, PChar(ErrMsg), 'Error', MB_TASKMODAL or MB_ICONSTOP ); @@ -4860,37 +5048,6 @@ procedure TPythonEngine.Notification( AComponent: TComponent; IO := nil end; -procedure TPythonEngine.SetProgramArgs(var Config: PyConfig); -var - I: Integer; - TempS: UnicodeString; - Str: WCharTString; - -begin - // do not parse further - PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.parse_argv])^ := 0; - for I := 0 to ParamCount do - begin - { - ... the first entry should refer to the script file to be executed rather - than the executable hosting the Python interpreter. If there isn’t a - script that will be run, the first entry in argv can be an empty string. - } - if I = 0 then - TempS := '' - else - TempS := ParamStr(I); - {$IFDEF POSIX} - Str := UnicodeStringToUCS4String(TempS); - {$ELSE} - Str := TempS; - {$ENDIF} - PyWideStringList_Append( - PPyWideStringList(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.argv]), - PWCharT(Str)); - end; -end; - procedure TPythonEngine.InitWinConsole; begin {$IFDEF MSWINDOWS} From f9ab2dca4978778ca1277ff6265556f579268b4c Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 10 Dec 2024 02:00:45 +0200 Subject: [PATCH 161/174] Merged downstream from embarcadero/python4Delphi --- Packages/Delphi/Delphi 10.4+/Python.dproj | 25 +- Packages/Delphi/Delphi 10.4+/PythonFmx.dproj | 26 +- .../Delphi/Delphi 10.4+/PythonFmxLinux.dpk | 63 -- .../Delphi/Delphi 10.4+/PythonFmxLinux.dproj | 968 ------------------ Packages/Delphi/Delphi 10.4+/PythonVcl.dproj | 8 +- Packages/Delphi/Delphi 10.4+/dclPython.dproj | 4 +- .../Delphi/Delphi 10.4+/dclPythonFmx.dproj | 4 +- .../Delphi/Delphi 10.4+/dclPythonVcl.dproj | 4 +- .../Delphi/P4DLinuxComponentSuite.groupproj | 108 -- Source/PythonEngine.pas | 14 +- Source/fmx/WrapDelphiFmx.pas | 2 - 11 files changed, 59 insertions(+), 1167 deletions(-) delete mode 100644 Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk delete mode 100644 Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj delete mode 100644 Packages/Delphi/P4DLinuxComponentSuite.groupproj diff --git a/Packages/Delphi/Delphi 10.4+/Python.dproj b/Packages/Delphi/Delphi 10.4+/Python.dproj index c41368d4..568730b8 100644 --- a/Packages/Delphi/Delphi 10.4+/Python.dproj +++ b/Packages/Delphi/Delphi 10.4+/Python.dproj @@ -7,8 +7,9 @@ <MainSource>Python.dpk</MainSource> <Platform Condition="'$(Platform)'==''">Win32</Platform> <ProjectGuid>{018AAA56-F5BD-4A04-BCCA-A0043EAAA5CE}</ProjectGuid> - <ProjectVersion>19.5</ProjectVersion> - <TargetedPlatforms>168083</TargetedPlatforms> + <ProjectVersion>20.1</ProjectVersion> + <TargetedPlatforms>693395</TargetedPlatforms> + <ProjectName Condition="'$(ProjectName)'==''">Python</ProjectName> </PropertyGroup> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <Base>true</Base> @@ -54,6 +55,12 @@ <Cfg_1>true</Cfg_1> <Base>true</Base> </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Cfg_1)'=='true') or '$(Cfg_1_iOSDevice64)'!=''"> + <Cfg_1_iOSDevice64>true</Cfg_1_iOSDevice64> + <CfgParent>Cfg_1</CfgParent> + <Cfg_1>true</Cfg_1> + <Base>true</Base> + </PropertyGroup> <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''"> <Cfg_1_Win64>true</Cfg_1_Win64> <CfgParent>Cfg_1</CfgParent> @@ -88,7 +95,7 @@ <DCC_DcuOutput>..\..\..\lib\$(Platform)\$(Config)</DCC_DcuOutput> <DCC_Description>Python4Delphi - Run-time Engine Package</DCC_Description> <DCC_ImageBase>00400000</DCC_ImageBase> - <DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;DUnitX.Loggers.GUI;Winapi;System.Win;$(DCC_Namespace)</DCC_Namespace> + <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;DUnitX.Loggers.GUI;Winapi;System.Win;$(DCC_Namespace)</DCC_Namespace> <DllSuffix>$(Auto)</DllSuffix> <GenDll>true</GenDll> <GenPackage>true</GenPackage> @@ -109,11 +116,11 @@ </PropertyGroup> <PropertyGroup Condition="'$(Base_OSX64)'!=''"> <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false</VerInfo_Keys> + <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface</VerInfo_Keys> </PropertyGroup> <PropertyGroup Condition="'$(Base_OSXARM64)'!=''"> <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false</VerInfo_Keys> + <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface</VerInfo_Keys> </PropertyGroup> <PropertyGroup Condition="'$(Base_Win32)'!=''"> <BT_BuildType>Debug</BT_BuildType> @@ -136,6 +143,9 @@ <VerInfo_Build>1</VerInfo_Build> <VerInfo_Keys>package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=</VerInfo_Keys> </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1_iOSDevice64)'!=''"> + <BT_BuildType>Debug</BT_BuildType> + </PropertyGroup> <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''"> <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> @@ -204,13 +214,14 @@ <Platforms> <Platform value="Android">True</Platform> <Platform value="Android64">True</Platform> + <Platform value="iOSDevice64">True</Platform> + <Platform value="iOSSimARM64">True</Platform> <Platform value="Linux64">True</Platform> <Platform value="OSX64">True</Platform> <Platform value="OSXARM64">True</Platform> <Platform value="Win32">True</Platform> <Platform value="Win64">True</Platform> - <Platform value="iOSDevice64">False</Platform> - <Platform value="iOSSimARM64">False</Platform> + <Platform value="Win64x">False</Platform> </Platforms> </BorlandProject> <ProjectFileVersion>12</ProjectFileVersion> diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj index 224e44cc..e45231c0 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonFmx.dproj @@ -7,8 +7,9 @@ <MainSource>PythonFmx.dpk</MainSource> <Platform Condition="'$(Platform)'==''">Win32</Platform> <ProjectGuid>{513BF750-373D-4C95-A672-78CA8DDF3F63}</ProjectGuid> - <ProjectVersion>19.5</ProjectVersion> - <TargetedPlatforms>167955</TargetedPlatforms> + <ProjectVersion>20.1</ProjectVersion> + <TargetedPlatforms>693395</TargetedPlatforms> + <ProjectName Condition="'$(ProjectName)'==''">PythonFmx</ProjectName> </PropertyGroup> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <Base>true</Base> @@ -59,9 +60,14 @@ <CfgParent>Base</CfgParent> <Base>true</Base> </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Cfg_2)'=='true') or '$(Cfg_2_iOSDevice64)'!=''"> + <Cfg_2_iOSDevice64>true</Cfg_2_iOSDevice64> + <CfgParent>Cfg_2</CfgParent> + <Cfg_2>true</Cfg_2> + <Base>true</Base> + </PropertyGroup> <PropertyGroup Condition="'$(Base)'!=''"> <SanitizedProjectName>PythonFmx</SanitizedProjectName> - <DCC_CBuilderOutput>All</DCC_CBuilderOutput> <DCC_DcuOutput>..\..\..\lib\$(Platform)\$(Config)</DCC_DcuOutput> <DCC_Description>Python4Delphi - Run-time Engine Package for FMX</DCC_Description> <DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput> @@ -87,11 +93,11 @@ </PropertyGroup> <PropertyGroup Condition="'$(Base_OSX64)'!=''"> <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false</VerInfo_Keys> + <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface</VerInfo_Keys> </PropertyGroup> <PropertyGroup Condition="'$(Base_OSXARM64)'!=''"> <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false</VerInfo_Keys> + <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface</VerInfo_Keys> </PropertyGroup> <PropertyGroup Condition="'$(Base_Win32)'!=''"> <BT_BuildType>Debug</BT_BuildType> @@ -127,6 +133,9 @@ <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2_iOSDevice64)'!=''"> + <BT_BuildType>Debug</BT_BuildType> + </PropertyGroup> <ItemGroup> <DelphiCompile Include="$(MainSource)"> <MainSource>MainSource</MainSource> @@ -185,13 +194,14 @@ <Platforms> <Platform value="Android">True</Platform> <Platform value="Android64">True</Platform> - <Platform value="Linux64">False</Platform> + <Platform value="iOSDevice64">True</Platform> + <Platform value="iOSSimARM64">True</Platform> + <Platform value="Linux64">True</Platform> <Platform value="OSX64">True</Platform> <Platform value="OSXARM64">True</Platform> <Platform value="Win32">True</Platform> <Platform value="Win64">True</Platform> - <Platform value="iOSDevice64">False</Platform> - <Platform value="iOSSimARM64">False</Platform> + <Platform value="Win64x">False</Platform> </Platforms> </BorlandProject> <ProjectFileVersion>12</ProjectFileVersion> diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk deleted file mode 100644 index 9525324e..00000000 --- a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dpk +++ /dev/null @@ -1,63 +0,0 @@ -package PythonFmxLinux; - -{$R *.res} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO OFF} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS OFF} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO OFF} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$DEFINE RELEASE} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'Python4Delphi - Run-time Engine Package for FMXLinux'} -{$LIBSUFFIX AUTO} -{$RUNONLY} -{$IMPLICITBUILD ON} - -requires - rtl, - python, - fmx; - -contains - FMX.PythonGUIInputOutput in '..\..\..\Source\fmx\FMX.PythonGUIInputOutput.pas', - WrapDelphiFmx in '..\..\..\Source\fmx\WrapDelphiFmx.pas', - WrapFmxActnList in '..\..\..\Source\fmx\WrapFmxActnList.pas', - WrapFmxColors in '..\..\..\Source\fmx\WrapFmxColors.pas', - WrapFmxComCtrls in '..\..\..\Source\fmx\WrapFmxComCtrls.pas', - WrapFmxControls in '..\..\..\Source\fmx\WrapFmxControls.pas', - WrapFmxDialogs in '..\..\..\Source\fmx\WrapFmxDialogs.pas', - WrapFmxEdit in '..\..\..\Source\fmx\WrapFmxEdit.pas', - WrapFmxForms in '..\..\..\Source\fmx\WrapFmxForms.pas', - WrapFmxGrids in '..\..\..\Source\fmx\WrapFmxGrids.pas', - WrapFmxLayouts in '..\..\..\Source\fmx\WrapFmxLayouts.pas', - WrapFmxListBox in '..\..\..\Source\fmx\WrapFmxListBox.pas', - WrapFmxListView in '..\..\..\Source\fmx\WrapFmxListView.pas', - WrapFmxMedia in '..\..\..\Source\fmx\WrapFmxMedia.pas', - WrapFmxMemo in '..\..\..\Source\fmx\WrapFmxMemo.pas', - WrapFmxMenus in '..\..\..\Source\fmx\WrapFmxMenus.pas', - WrapFmxScrollBox in '..\..\..\Source\fmx\WrapFmxScrollBox.pas', - WrapFmxShapes in '..\..\..\Source\fmx\WrapFmxShapes.pas', - WrapFmxStdActns in '..\..\..\Source\fmx\WrapFmxStdActns.pas', - WrapFmxStdCtrls in '..\..\..\Source\fmx\WrapFmxStdCtrls.pas', - WrapFmxStyles in '..\..\..\Source\fmx\WrapFmxStyles.pas', - WrapFmxTypes in '..\..\..\Source\fmx\WrapFmxTypes.pas', - WrapFmxDateTime in '..\..\..\Source\fmx\WrapFmxDateTime.pas'; - -end. - diff --git a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj b/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj deleted file mode 100644 index 445f21ac..00000000 --- a/Packages/Delphi/Delphi 10.4+/PythonFmxLinux.dproj +++ /dev/null @@ -1,968 +0,0 @@ -<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <ProjectGuid>{B0F48139-24FB-42F3-93E8-05DA2E142904}</ProjectGuid> - <MainSource>PythonFmxLinux.dpk</MainSource> - <Base>True</Base> - <Config Condition="'$(Config)'==''">Release</Config> - <TargetedPlatforms>128</TargetedPlatforms> - <AppType>Package</AppType> - <FrameworkType>FMX</FrameworkType> - <ProjectVersion>19.5</ProjectVersion> - <Platform Condition="'$(Platform)'==''">Linux64</Platform> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''"> - <Base_Android>true</Base_Android> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''"> - <Base_Android64>true</Base_Android64> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Base)'=='true') or '$(Base_iOSDevice64)'!=''"> - <Base_iOSDevice64>true</Base_iOSDevice64> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> - <Base_Win32>true</Base_Win32> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''"> - <Cfg_1>true</Cfg_1> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Linux64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Linux64)'!=''"> - <Cfg_1_Linux64>true</Cfg_1_Linux64> - <CfgParent>Cfg_1</CfgParent> - <Cfg_1>true</Cfg_1> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''"> - <Cfg_2>true</Cfg_2> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Android64)'!=''"> - <Cfg_2_Android64>true</Cfg_2_Android64> - <CfgParent>Cfg_2</CfgParent> - <Cfg_2>true</Cfg_2> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Cfg_2)'=='true') or '$(Cfg_2_iOSDevice64)'!=''"> - <Cfg_2_iOSDevice64>true</Cfg_2_iOSDevice64> - <CfgParent>Cfg_2</CfgParent> - <Cfg_2>true</Cfg_2> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='OSX64' and '$(Cfg_2)'=='true') or '$(Cfg_2_OSX64)'!=''"> - <Cfg_2_OSX64>true</Cfg_2_OSX64> - <CfgParent>Cfg_2</CfgParent> - <Cfg_2>true</Cfg_2> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='OSXARM64' and '$(Cfg_2)'=='true') or '$(Cfg_2_OSXARM64)'!=''"> - <Cfg_2_OSXARM64>true</Cfg_2_OSXARM64> - <CfgParent>Cfg_2</CfgParent> - <Cfg_2>true</Cfg_2> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Base)'!=''"> - <DCC_E>false</DCC_E> - <DCC_F>false</DCC_F> - <DCC_K>false</DCC_K> - <DCC_N>false</DCC_N> - <DCC_S>false</DCC_S> - <DCC_ImageBase>00400000</DCC_ImageBase> - <GenDll>true</GenDll> - <GenPackage>true</GenPackage> - <SanitizedProjectName>PythonFmxLinux</SanitizedProjectName> - <DCC_Description>Python4Delphi - Run-time Engine Package for FMXLinux</DCC_Description> - <DllSuffix>$(Auto)</DllSuffix> - <RuntimeOnlyPackage>true</RuntimeOnlyPackage> - <VerInfo_Locale>1046</VerInfo_Locale> - <VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName=</VerInfo_Keys> - <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;REST.Authenticator.OAuth.WebForm;$(DCC_Namespace)</DCC_Namespace> - <DCC_UnitSearchPath>$(BDSCatalogRepositoryAllUsers)\FmxLinux-1.71\redist;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Android)'!=''"> - <VerInfo_Keys>package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=</VerInfo_Keys> - <BT_BuildType>Debug</BT_BuildType> - <Android_LauncherIcon192>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png</Android_LauncherIcon192> - <EnabledSysJars>annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar</EnabledSysJars> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Android64)'!=''"> - <Android_LauncherIcon192>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png</Android_LauncherIcon192> - <EnabledSysJars>annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar</EnabledSysJars> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_iOSDevice64)'!=''"> - <iOS_AppStore1024>$(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png</iOS_AppStore1024> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Win32)'!=''"> - <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> - <BT_BuildType>Debug</BT_BuildType> - <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> - <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys> - <VerInfo_Locale>1033</VerInfo_Locale> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_1)'!=''"> - <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> - <DCC_DebugInformation>0</DCC_DebugInformation> - <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> - <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_1_Linux64)'!=''"> - <Debugger_Launcher>/usr/bin/gnome-terminal -- "%debuggee%"</Debugger_Launcher> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2)'!=''"> - <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> - <DCC_Optimize>false</DCC_Optimize> - <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> - <DCC_RangeChecking>true</DCC_RangeChecking> - <DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2_Android64)'!=''"> - <BT_BuildType>Debug</BT_BuildType> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2_iOSDevice64)'!=''"> - <BT_BuildType>Debug</BT_BuildType> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2_OSX64)'!=''"> - <BT_BuildType>Debug</BT_BuildType> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2_OSXARM64)'!=''"> - <BT_BuildType>Debug</BT_BuildType> - </PropertyGroup> - <ItemGroup> - <DelphiCompile Include="$(MainSource)"> - <MainSource>MainSource</MainSource> - </DelphiCompile> - <DCCReference Include="rtl.dcp"/> - <DCCReference Include="python.dcp"/> - <DCCReference Include="fmx.dcp"/> - <DCCReference Include="..\..\..\Source\fmx\FMX.PythonGUIInputOutput.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapDelphiFmx.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxActnList.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxColors.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxComCtrls.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxControls.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxDialogs.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxEdit.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxForms.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxGrids.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxLayouts.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxListBox.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxListView.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxMedia.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxMemo.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxMenus.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxScrollBox.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxShapes.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxStdActns.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxStdCtrls.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxStyles.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxTypes.pas"/> - <DCCReference Include="..\..\..\Source\fmx\WrapFmxDateTime.pas"/> - <BuildConfiguration Include="Base"> - <Key>Base</Key> - </BuildConfiguration> - <BuildConfiguration Include="Release"> - <Key>Cfg_1</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - <BuildConfiguration Include="Debug"> - <Key>Cfg_2</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - </ItemGroup> - <ProjectExtensions> - <Borland.Personality>Delphi.Personality.12</Borland.Personality> - <Borland.ProjectType>Package</Borland.ProjectType> - <BorlandProject> - <Delphi.Personality> - <Source> - <Source Name="MainSource">PythonFmxLinux.dpk</Source> - </Source> - <Excluded_Packages> - <Excluded_Packages Name="$(BDSBIN)\bcboffice2k280.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages> - <Excluded_Packages Name="$(BDSBIN)\bcbofficexp280.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages> - <Excluded_Packages Name="$(BDSBIN)\dcloffice2k280.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages> - <Excluded_Packages Name="$(BDSBIN)\dclofficexp280.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages> - </Excluded_Packages> - </Delphi.Personality> - <Platforms> - <Platform value="Android">False</Platform> - <Platform value="Android64">False</Platform> - <Platform value="iOSDevice64">False</Platform> - <Platform value="iOSSimARM64">False</Platform> - <Platform value="Linux64">True</Platform> - <Platform value="OSX64">False</Platform> - <Platform value="OSXARM64">False</Platform> - <Platform value="Win32">False</Platform> - <Platform value="Win64">False</Platform> - </Platforms> - <Deployment Version="4"> - <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule"> - <Platform Name="iOSSimulator"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"> - <Platform Name="iOSSimulator"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"> - <Platform Name="OSX32"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\Linux64\bplPythonFmxLinux280.so" Configuration="Release" Class="ProjectOutput"> - <Platform Name="Linux64"> - <RemoteName>bplPythonFmxLinux.so</RemoteName> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\PythonFmxLinux280.bpl" Configuration="Debug" Class="ProjectOutput"> - <Platform Name="Win32"> - <RemoteName>PythonFmxLinux.bpl</RemoteName> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployClass Name="AdditionalDebugSymbols"> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidClasses"> - <Platform Name="Android"> - <RemoteDir>classes</RemoteDir> - <Operation>64</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>classes</RemoteDir> - <Operation>64</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidFileProvider"> - <Platform Name="Android"> - <RemoteDir>res\xml</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\xml</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidGDBServer"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeArmeabiFile"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeMipsFile"> - <Platform Name="Android"> - <RemoteDir>library\lib\mips</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\mips</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidServiceOutput"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\arm64-v8a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidServiceOutput_Android32"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashImageDef"> - <Platform Name="Android"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashStyles"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashStylesV21"> - <Platform Name="Android"> - <RemoteDir>res\values-v21</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values-v21</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_Colors"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_DefaultAppIcon"> - <Platform Name="Android"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon144"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon192"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon36"> - <Platform Name="Android"> - <RemoteDir>res\drawable-ldpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-ldpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon48"> - <Platform Name="Android"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon72"> - <Platform Name="Android"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon96"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon24"> - <Platform Name="Android"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon36"> - <Platform Name="Android"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon48"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon72"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon96"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage426"> - <Platform Name="Android"> - <RemoteDir>res\drawable-small</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-small</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage470"> - <Platform Name="Android"> - <RemoteDir>res\drawable-normal</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-normal</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage640"> - <Platform Name="Android"> - <RemoteDir>res\drawable-large</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-large</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage960"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xlarge</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xlarge</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_Strings"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DebugSymbols"> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DependencyFramework"> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DependencyModule"> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - <Extensions>.dll;.bpl</Extensions> - </Platform> - </DeployClass> - <DeployClass Required="true" Name="DependencyPackage"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="iOSSimARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - <Extensions>.bpl</Extensions> - </Platform> - </DeployClass> - <DeployClass Name="File"> - <Platform Name="Android"> - <Operation>0</Operation> - </Platform> - <Platform Name="Android64"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSDevice32"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSX64"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSXARM64"> - <Operation>0</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iOS_AppStore1024"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_AppIcon152"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_AppIcon167"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_LaunchDark2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Notification40"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Setting58"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_SpotLight80"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_AppIcon120"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_AppIcon180"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch3x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_LaunchDark2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_LaunchDark3x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Notification40"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Notification60"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Setting58"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Setting87"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Spotlight120"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Spotlight80"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectAndroidManifest"> - <Platform Name="Android"> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectiOSDeviceDebug"> - <Platform Name="iOSDevice32"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectiOSEntitlements"/> - <DeployClass Name="ProjectiOSInfoPList"/> - <DeployClass Name="ProjectiOSLaunchScreen"/> - <DeployClass Name="ProjectiOSResource"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectOSXDebug"/> - <DeployClass Name="ProjectOSXEntitlements"/> - <DeployClass Name="ProjectOSXInfoPList"/> - <DeployClass Name="ProjectOSXResource"> - <Platform Name="OSX32"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX64"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="OSXARM64"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Required="true" Name="ProjectOutput"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\arm64-v8a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimARM64"> - <Operation>1</Operation> - </Platform> - <Platform Name="Linux64"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectOutput_Android32"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectUWPManifest"> - <Platform Name="Win32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="UWP_DelphiLogo150"> - <Platform Name="Win32"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="UWP_DelphiLogo44"> - <Platform Name="Win32"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="iOSSimARM64" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> - </Deployment> - </BorlandProject> - <ProjectFileVersion>12</ProjectFileVersion> - </ProjectExtensions> - <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> - <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> - <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> -</Project> diff --git a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj index 3f40f175..9ccee1e3 100644 --- a/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/PythonVcl.dproj @@ -7,7 +7,8 @@ <MainSource>PythonVcl.dpk</MainSource> <Platform Condition="'$(Platform)'==''">Win32</Platform> <ProjectGuid>{D8908301-393C-4CFA-8842-4948A9935E21}</ProjectGuid> - <ProjectVersion>19.5</ProjectVersion> + <ProjectName Condition="'$(ProjectName)'==''">PythonVcl</ProjectName> + <ProjectVersion>20.1</ProjectVersion> <TargetedPlatforms>3</TargetedPlatforms> </PropertyGroup> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> @@ -144,13 +145,14 @@ <Platforms> <Platform value="Android">False</Platform> <Platform value="Android64">False</Platform> + <Platform value="iOSDevice64">False</Platform> + <Platform value="iOSSimARM64">False</Platform> <Platform value="Linux64">False</Platform> <Platform value="OSX64">False</Platform> <Platform value="OSXARM64">False</Platform> <Platform value="Win32">True</Platform> <Platform value="Win64">True</Platform> - <Platform value="iOSDevice64">False</Platform> - <Platform value="iOSSimARM64">False</Platform> + <Platform value="Win64x">False</Platform> </Platforms> </BorlandProject> <ProjectFileVersion>12</ProjectFileVersion> diff --git a/Packages/Delphi/Delphi 10.4+/dclPython.dproj b/Packages/Delphi/Delphi 10.4+/dclPython.dproj index a2f01927..749430a6 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPython.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPython.dproj @@ -7,7 +7,8 @@ <MainSource>dclPython.dpk</MainSource> <Platform Condition="'$(Platform)'==''">Win32</Platform> <ProjectGuid>{D9AB994C-54A3-4E76-81C8-6D0BB035A091}</ProjectGuid> - <ProjectVersion>19.5</ProjectVersion> + <ProjectName Condition="'$(ProjectName)'==''">dclPython</ProjectName> + <ProjectVersion>20.1</ProjectVersion> <TargetedPlatforms>1</TargetedPlatforms> </PropertyGroup> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> @@ -149,6 +150,7 @@ <Platform value="OSXARM64">False</Platform> <Platform value="Win32">True</Platform> <Platform value="Win64">False</Platform> + <Platform value="Win64x">False</Platform> <Platform value="iOSDevice64">False</Platform> <Platform value="iOSSimARM64">False</Platform> </Platforms> diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj index 9fed4132..1104549c 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPythonFmx.dproj @@ -7,7 +7,8 @@ <MainSource>dclPythonFmx.dpk</MainSource> <Platform Condition="'$(Platform)'==''">Win32</Platform> <ProjectGuid>{E057921E-25DB-426E-8090-FE3F428894FF}</ProjectGuid> - <ProjectVersion>19.5</ProjectVersion> + <ProjectName Condition="'$(ProjectName)'==''">dclPythonFmx</ProjectName> + <ProjectVersion>20.1</ProjectVersion> <TargetedPlatforms>1</TargetedPlatforms> </PropertyGroup> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> @@ -125,6 +126,7 @@ <Platform value="OSXARM64">False</Platform> <Platform value="Win32">True</Platform> <Platform value="Win64">False</Platform> + <Platform value="Win64x">False</Platform> <Platform value="iOSDevice64">False</Platform> <Platform value="iOSSimARM64">False</Platform> </Platforms> diff --git a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj index 3944b8d3..7a1e1ec3 100644 --- a/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj +++ b/Packages/Delphi/Delphi 10.4+/dclPythonVcl.dproj @@ -7,7 +7,8 @@ <MainSource>dclPythonVcl.dpk</MainSource> <Platform Condition="'$(Platform)'==''">Win32</Platform> <ProjectGuid>{48DDC28A-E154-4CA0-864A-30EB8C4CCBB3}</ProjectGuid> - <ProjectVersion>19.5</ProjectVersion> + <ProjectName Condition="'$(ProjectName)'==''">dclPythonVcl</ProjectName> + <ProjectVersion>20.1</ProjectVersion> <TargetedPlatforms>1</TargetedPlatforms> </PropertyGroup> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> @@ -125,6 +126,7 @@ <Platform value="OSXARM64">False</Platform> <Platform value="Win32">True</Platform> <Platform value="Win64">False</Platform> + <Platform value="Win64x">False</Platform> <Platform value="iOSDevice64">False</Platform> <Platform value="iOSSimARM64">False</Platform> </Platforms> diff --git a/Packages/Delphi/P4DLinuxComponentSuite.groupproj b/Packages/Delphi/P4DLinuxComponentSuite.groupproj deleted file mode 100644 index 544e8812..00000000 --- a/Packages/Delphi/P4DLinuxComponentSuite.groupproj +++ /dev/null @@ -1,108 +0,0 @@ -<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <ProjectGuid>{8BE1193B-E609-445D-9BA3-F57DBEA042F5}</ProjectGuid> - </PropertyGroup> - <ItemGroup> - <Projects Include="Delphi 10.4+\Python.dproj"> - <Dependencies/> - </Projects> - <Projects Include="Delphi 10.4+\dclPython.dproj"> - <Dependencies>Delphi 10.4+\Python.dproj</Dependencies> - </Projects> - <Projects Include="Delphi 10.4+\PythonVcl.dproj"> - <Dependencies>Delphi 10.4+\Python.dproj</Dependencies> - </Projects> - <Projects Include="Delphi 10.4+\dclPythonVcl.dproj"> - <Dependencies>Delphi 10.4+\PythonVcl.dproj</Dependencies> - </Projects> - <Projects Include="Delphi 10.4+\PythonFmx.dproj"> - <Dependencies/> - </Projects> - <Projects Include="Delphi 10.4+\PythonFmxLinux.dproj"> - <Dependencies/> - </Projects> - <Projects Include="Delphi 10.4+\dclPythonFmx.dproj"> - <Dependencies/> - </Projects> - </ItemGroup> - <ProjectExtensions> - <Borland.Personality>Default.Personality.12</Borland.Personality> - <Borland.ProjectType/> - <BorlandProject> - <Default.Personality/> - </BorlandProject> - </ProjectExtensions> - <Target Name="Python"> - <MSBuild Projects="Delphi 10.4+\Python.dproj"/> - </Target> - <Target Name="Python:Clean"> - <MSBuild Projects="Delphi 10.4+\Python.dproj" Targets="Clean"/> - </Target> - <Target Name="Python:Make"> - <MSBuild Projects="Delphi 10.4+\Python.dproj" Targets="Make"/> - </Target> - <Target Name="dclPython" DependsOnTargets="Python"> - <MSBuild Projects="Delphi 10.4+\dclPython.dproj"/> - </Target> - <Target Name="dclPython:Clean" DependsOnTargets="Python:Clean"> - <MSBuild Projects="Delphi 10.4+\dclPython.dproj" Targets="Clean"/> - </Target> - <Target Name="dclPython:Make" DependsOnTargets="Python:Make"> - <MSBuild Projects="Delphi 10.4+\dclPython.dproj" Targets="Make"/> - </Target> - <Target Name="PythonVcl" DependsOnTargets="Python"> - <MSBuild Projects="Delphi 10.4+\PythonVcl.dproj"/> - </Target> - <Target Name="PythonVcl:Clean" DependsOnTargets="Python:Clean"> - <MSBuild Projects="Delphi 10.4+\PythonVcl.dproj" Targets="Clean"/> - </Target> - <Target Name="PythonVcl:Make" DependsOnTargets="Python:Make"> - <MSBuild Projects="Delphi 10.4+\PythonVcl.dproj" Targets="Make"/> - </Target> - <Target Name="dclPythonVcl" DependsOnTargets="PythonVcl"> - <MSBuild Projects="Delphi 10.4+\dclPythonVcl.dproj"/> - </Target> - <Target Name="dclPythonVcl:Clean" DependsOnTargets="PythonVcl:Clean"> - <MSBuild Projects="Delphi 10.4+\dclPythonVcl.dproj" Targets="Clean"/> - </Target> - <Target Name="dclPythonVcl:Make" DependsOnTargets="PythonVcl:Make"> - <MSBuild Projects="Delphi 10.4+\dclPythonVcl.dproj" Targets="Make"/> - </Target> - <Target Name="PythonFmx"> - <MSBuild Projects="Delphi 10.4+\PythonFmx.dproj"/> - </Target> - <Target Name="PythonFmx:Clean"> - <MSBuild Projects="Delphi 10.4+\PythonFmx.dproj" Targets="Clean"/> - </Target> - <Target Name="PythonFmx:Make"> - <MSBuild Projects="Delphi 10.4+\PythonFmx.dproj" Targets="Make"/> - </Target> - <Target Name="PythonFmxLinux"> - <MSBuild Projects="Delphi 10.4+\PythonFmxLinux.dproj"/> - </Target> - <Target Name="PythonFmxLinux:Clean"> - <MSBuild Projects="Delphi 10.4+\PythonFmxLinux.dproj" Targets="Clean"/> - </Target> - <Target Name="PythonFmxLinux:Make"> - <MSBuild Projects="Delphi 10.4+\PythonFmxLinux.dproj" Targets="Make"/> - </Target> - <Target Name="dclPythonFmx"> - <MSBuild Projects="Delphi 10.4+\dclPythonFmx.dproj"/> - </Target> - <Target Name="dclPythonFmx:Clean"> - <MSBuild Projects="Delphi 10.4+\dclPythonFmx.dproj" Targets="Clean"/> - </Target> - <Target Name="dclPythonFmx:Make"> - <MSBuild Projects="Delphi 10.4+\dclPythonFmx.dproj" Targets="Make"/> - </Target> - <Target Name="Build"> - <CallTarget Targets="Python;dclPython;PythonVcl;dclPythonVcl;PythonFmx;PythonFmxLinux;dclPythonFmx"/> - </Target> - <Target Name="Clean"> - <CallTarget Targets="Python:Clean;dclPython:Clean;PythonVcl:Clean;dclPythonVcl:Clean;PythonFmx:Clean;PythonFmxLinux:Clean;dclPythonFmx:Clean"/> - </Target> - <Target Name="Make"> - <CallTarget Targets="Python:Make;dclPython:Make;PythonVcl:Make;dclPythonVcl:Make;PythonFmx:Make;PythonFmxLinux:Make;dclPythonFmx:Make"/> - </Target> - <Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/> -</Project> diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 93cfa6d2..6102ed35 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1953,16 +1953,20 @@ TPythonInterface=class(TDynamicDll) //-------------------------------------------------------- type TDatetimeConversionMode = (dcmToTuple, dcmToDatetime); + TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, + pfFrozenFlag, pfIgnoreEnvironmentFlag, + pfDontWriteBytecodeFlag, pfIsolated); + TPythonFlags = set of TPythonFlag; + const DEFAULT_DATETIME_CONVERSION_MODE = dcmToTuple; + DEFAULT_FLAGS = {$IFDEF IOS}[pfIsolated, pfDontWriteBytecodeFlag]{$ELSE}[]{$ENDIF IOS}; + type TEngineClient = class; TSysPathInitEvent = procedure(Sender: TObject; PathList: PPyObject) of object; // Config will be either PPyConfig if version < 3.14 or PPyInitConfig TConfigInitEvent = procedure(Sender: TObject; Config: Pointer) of object; - TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, - pfFrozenFlag, pfIgnoreEnvironmentFlag, pfIsolated); - TPythonFlags = set of TPythonFlag; TTracebackItem = class @@ -2153,7 +2157,7 @@ TPythonEngine = class(TPythonInterface) property DatetimeConversionMode: TDatetimeConversionMode read FDatetimeConversionMode write FDatetimeConversionMode default DEFAULT_DATETIME_CONVERSION_MODE; property InitScript: TStrings read FInitScript write SetInitScript; property IO: TPythonInputOutput read FIO write SetIO; - property PyFlags: TPythonFlags read FPyFlags write SetPyFlags default []; + property PyFlags: TPythonFlags read FPyFlags write SetPyFlags default DEFAULT_FLAGS; property RedirectIO: Boolean read FRedirectIO write FRedirectIO default True; property UseWindowsConsole: Boolean read FUseWindowsConsole write FUseWindowsConsole default False; property OnAfterInit: TNotifyEvent read FOnAfterInit write FOnAfterInit; @@ -4545,7 +4549,7 @@ constructor TPythonEngine.Create(AOwner: TComponent); FAutoFinalize := True; FTraceback := TPythonTraceback.Create; FUseWindowsConsole := False; - FPyFlags := []; + FPyFlags := DEFAULT_FLAGS; FDatetimeConversionMode := DEFAULT_DATETIME_CONVERSION_MODE; if csDesigning in ComponentState then begin diff --git a/Source/fmx/WrapDelphiFmx.pas b/Source/fmx/WrapDelphiFmx.pas index 0bcc5f45..92f11120 100644 --- a/Source/fmx/WrapDelphiFmx.pas +++ b/Source/fmx/WrapDelphiFmx.pas @@ -24,9 +24,7 @@ implementation WrapDelphiWindows, {$ENDIF MSWINDOWS} WrapDelphiDataBind, - {$IFNDEF LINUX} WrapFmxDataBind, - {$ENDIF LINUX} WrapFmxTypes, WrapFmxImgList, WrapFmxControls, From 29aafb1ffde4c16d090c483ad7a25ca04ee1aad9 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 10 Dec 2024 02:08:08 +0200 Subject: [PATCH 162/174] Renamed VENVPythonExe to PythonExecutable --- Source/PythonEngine.pas | 12 ++++++------ Source/PythonVersions.pas | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 6102ed35..72a91647 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -2003,7 +2003,7 @@ TPythonType = class; //forward declaration {$IFEND} TPythonEngine = class(TPythonInterface) private - FVenvPythonExe: string; + FPythonExecutable: string; FInitScript: TStrings; FIO: TPythonInputOutput; FRedirectIO: Boolean; @@ -2153,7 +2153,7 @@ TPythonEngine = class(TPythonInterface) property PythonPath: UnicodeString read FPythonPath write FPythonPath; published property AutoFinalize: Boolean read FAutoFinalize write FAutoFinalize default True; - property VenvPythonExe: string read FVenvPythonExe write FVenvPythonExe; + property PythonExecutable: string read FPythonExecutable write FPythonExecutable; property DatetimeConversionMode: TDatetimeConversionMode read FDatetimeConversionMode write FDatetimeConversionMode default DEFAULT_DATETIME_CONVERSION_MODE; property InitScript: TStrings read FInitScript write SetInitScript; property IO: TPythonInputOutput read FIO write SetIO; @@ -4760,10 +4760,10 @@ procedure TPythonEngine.Initialize; PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.home]), PWCharT(StringToWCharTString(FPythonHome))); // Set venv executable if available - if FVenvPythonExe <> '' then + if FPythonExecutable <> '' then PyConfig_SetString(Config, PPWcharT(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.executable]), - PWCharT(StringToWCharTString(FVenvPythonExe))); + PWCharT(StringToWCharTString(FPythonExecutable))); // Set program arguments (sys.argv) SetProgramArgs(Config); @@ -4872,8 +4872,8 @@ procedure TPythonEngine.Initialize; if FPythonHome <> '' then PyInitConfig_SetStr(Config, 'home', PAnsiChar(EncodeString(FPythonHome))); // Set venv executable if available - if FVenvPythonExe <> '' then - PyInitConfig_SetStr(Config, 'executable', PAnsiChar(EncodeString(FPythonHome))); + if FPythonExecutable <> '' then + PyInitConfig_SetStr(Config, 'executable', PAnsiChar(EncodeString(FPythonExecutable))); // Set program arguments (sys.argv) SetProgramArgs(Config); diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 569ba52f..71d38a84 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -127,7 +127,7 @@ procedure TPythonVersion.AssignTo(PythonEngine: TPersistent); TPythonEngine(PythonEngine).DllPath := DLLPath; TPythonEngine(PythonEngine).APIVersion := ApiVersion; if Is_venv then begin - TPythonEngine(PythonEngine).VenvPythonExe := PythonExecutable; + TPythonEngine(PythonEngine).PythonExecutable := PythonExecutable; TPythonEngine(PythonEngine).SetPythonHome(DLLPath); end else { From 4025534d9bcbda7e7af691b154bb706290e731dc Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 10 Dec 2024 02:46:24 +0200 Subject: [PATCH 163/174] Consistent naming of python flags --- Source/PythonEngine.pas | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 72a91647..9aad17bd 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1954,13 +1954,19 @@ TPythonInterface=class(TDynamicDll) type TDatetimeConversionMode = (dcmToTuple, dcmToDatetime); TPythonFlag = (pfDebug, pfInteractive, pfNoSite, pfOptimize, pfVerbose, - pfFrozenFlag, pfIgnoreEnvironmentFlag, - pfDontWriteBytecodeFlag, pfIsolated); + pfFrozen, pfIgnoreEnvironment, pfNoUserSiteDirectory, + pfDontWriteBytecode, pfIsolated); TPythonFlags = set of TPythonFlag; const DEFAULT_DATETIME_CONVERSION_MODE = dcmToTuple; - DEFAULT_FLAGS = {$IFDEF IOS}[pfIsolated, pfDontWriteBytecodeFlag]{$ELSE}[]{$ENDIF IOS}; + DEFAULT_FLAGS = + {$IFDEF IOS} + [pfIsolated, pfNoUserSiteDirectory, pfIgnoreEnvironment, + pfDontWriteBytecodeFlag] + {$ELSE} + [] + {$ENDIF IOS}; type TEngineClient = class; @@ -4679,9 +4685,9 @@ procedure TPythonEngine.Initialize; PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.site_import])^ := IfThen(pfNoSite in FPyFlags, 0, 1); PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.pathconfig_warnings])^ := - IfThen(pfFrozenFlag in FPyFlags, 1, 0); + IfThen(pfFrozen in FPyFlags, 1, 0); PInteger(PByte(@Config) + ConfigOffests[MinorVersion, TConfigFields.use_environment])^ := - IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1); + IfThen(pfIgnoreEnvironment in FPyFlags, 0, 1); end; procedure SetProgramArgs(var Config: PyConfig); @@ -4793,14 +4799,16 @@ procedure TPythonEngine.Initialize; procedure AssignPyFlags(Config: PPyInitConfig); begin + PyInitConfig_SetInt(Config, 'isolated', IfThen(pfIsolated in FPyFlags, 1, 0)); PyInitConfig_SetInt(Config, 'parser_debug', IfThen(pfDebug in FPyFlags, 1, 0)); PyInitConfig_SetInt(Config, 'verbose', IfThen(pfVerbose in FPyFlags, 1, 0)); PyInitConfig_SetInt(Config, 'interactive', IfThen(pfInteractive in FPyFlags, 1, 0)); PyInitConfig_SetInt(Config, 'optimization_level', IfThen(pfOptimize in FPyFlags, 1, 0)); PyInitConfig_SetInt(Config, 'site_import', IfThen(pfNoSite in FPyFlags, 0, 1)); - PyInitConfig_SetInt(Config, 'user_site_directory', IfThen(pfNoSite in FPyFlags, 0, 1)); - PyInitConfig_SetInt(Config, 'pathconfig_warnings', IfThen(pfFrozenFlag in FPyFlags, 1, 0)); - PyInitConfig_SetInt(Config, 'use_environment', IfThen(pfIgnoreEnvironmentFlag in FPyFlags, 0, 1)); + PyInitConfig_SetInt(Config, 'pathconfig_warnings', IfThen(pfFrozen in FPyFlags, 1, 0)); + PyInitConfig_SetInt(Config, 'use_environment', IfThen(pfIgnoreEnvironment in FPyFlags, 0, 1)); + PyInitConfig_SetInt(Config, 'user_site_directory', IfThen(pfNoUserSiteDirectory in FPyFlags, 0, 1)); + PyInitConfig_SetInt(Config, 'write_bytecode', IfThen(pfDontWriteBytecode in FPyFlags, 0, 1)); end; procedure SetProgramArgs(Config: PPyInitConfig); @@ -4862,8 +4870,6 @@ procedure TPythonEngine.Initialize; begin Config := PyInitConfig_Create; try - PyInitConfig_SetInt(Config, 'isolated', IfThen(pfIsolated in FPyFlags, 1, 0)); - AssignPyFlags(Config); // Set programname and pythonhome if available From 7b9ada223b5779e8739591d25e15eda3c69df952 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 10 Dec 2024 03:15:44 +0200 Subject: [PATCH 164/174] ob_refcnt should be unsigned integer (NativeUInt) --- Demos/Demo06/Unit1.pas | 2 +- Demos/Demo07/Unit1.pas | 2 +- Demos/FPC/Demo06/Unit1.pas | 2 +- Source/PythonEngine.pas | 46 +++++++++++++++++++------------------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Demos/Demo06/Unit1.pas b/Demos/Demo06/Unit1.pas index e038b4fa..cf6e6faf 100644 --- a/Demos/Demo06/Unit1.pas +++ b/Demos/Demo06/Unit1.pas @@ -42,7 +42,7 @@ TForm1 = class(TForm) end; PyPointRec = record - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; po_x : Integer; po_y : Integer; diff --git a/Demos/Demo07/Unit1.pas b/Demos/Demo07/Unit1.pas index f33b8817..3514b6a3 100644 --- a/Demos/Demo07/Unit1.pas +++ b/Demos/Demo07/Unit1.pas @@ -48,7 +48,7 @@ TForm1 = class(TForm) end; PyPointRec = record - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; po_x : Integer; po_y : Integer; diff --git a/Demos/FPC/Demo06/Unit1.pas b/Demos/FPC/Demo06/Unit1.pas index 34c8a901..75e705bb 100644 --- a/Demos/FPC/Demo06/Unit1.pas +++ b/Demos/FPC/Demo06/Unit1.pas @@ -47,7 +47,7 @@ TForm1 = class(TForm) end; PyPointRec = record - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; po_x : Integer; po_y : Integer; diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 9aad17bd..f579a420 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -474,7 +474,7 @@ TPythonVersionProp = record end; PyObject = {$IFDEF CPUX86}packed{$ENDIF} record - ob_refcnt: NativeInt; + ob_refcnt: NativeUInt; ob_type: PPyTypeObject; end; @@ -485,7 +485,7 @@ TPythonVersionProp = record end; PySliceObject = {$IFDEF CPUX86}packed{$ENDIF} record - ob_refcnt: NativeInt; + ob_refcnt: NativeUInt; ob_type: PPyTypeObject; start, stop, step: PPyObject; end; @@ -544,7 +544,7 @@ TPythonVersionProp = record PPyDescrObject = ^PyDescrObject; PyDescrObject = {$IFDEF CPUX86}packed{$ENDIF} record // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object d_type : PPyTypeObject; @@ -555,7 +555,7 @@ TPythonVersionProp = record PyMethodDescrObject = {$IFDEF CPUX86}packed{$ENDIF} record // Start of PyDescr_COMMON // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object d_type : PPyTypeObject; @@ -568,7 +568,7 @@ TPythonVersionProp = record PyMemberDescrObject = {$IFDEF CPUX86}packed{$ENDIF} record // Start of PyDescr_COMMON // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object d_type : PPyTypeObject; @@ -581,7 +581,7 @@ TPythonVersionProp = record PyGetSetDescrObject = {$IFDEF CPUX86}packed{$ENDIF} record // Start of PyDescr_COMMON // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object d_type : PPyTypeObject; @@ -594,7 +594,7 @@ TPythonVersionProp = record PyWrapperDescrObject = {$IFDEF CPUX86}packed{$ENDIF} record // Start of PyDescr_COMMON // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object d_type : PPyTypeObject; @@ -607,7 +607,7 @@ TPythonVersionProp = record PPyModuleDef_Base = ^PyModuleDef_Base; PyModuleDef_Base = {$IFDEF CPUX86}packed{$ENDIF} record // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object m_init : function( ) : PPyObject; cdecl; @@ -667,7 +667,7 @@ PyBufferProcs = record // object.h PyTypeObject = {$IFDEF CPUX86}packed{$ENDIF} record - ob_refcnt: NativeInt; + ob_refcnt: NativeUInt; ob_type: PPyTypeObject; ob_size: NativeInt; // Number of items in variable part tp_name: PAnsiChar; // For printing @@ -814,7 +814,7 @@ PyBufferProcs = record type PyDateTime_Delta = {$IFDEF CPUX86}packed{$ENDIF} record // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : NativeInt; // -1 when unknown @@ -826,7 +826,7 @@ PyBufferProcs = record PyDateTime_TZInfo = {$IFDEF CPUX86}packed{$ENDIF} record // a pure abstract base clase // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object end; @@ -849,7 +849,7 @@ PyBufferProcs = record _PyDateTime_BaseTZInfo = {$IFDEF CPUX86}packed{$ENDIF} record // Start of _PyTZINFO_HEAD // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : Integer; @@ -873,7 +873,7 @@ PyBufferProcs = record // Start of _PyDateTime_TIMEHEAD // Start of _PyTZINFO_HEAD // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : Integer; @@ -888,7 +888,7 @@ PyBufferProcs = record // Start of _PyDateTime_TIMEHEAD // Start of _PyTZINFO_HEAD // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : Integer; @@ -910,7 +910,7 @@ PyBufferProcs = record PyDateTime_Date = {$IFDEF CPUX86}packed{$ENDIF} record // Start of _PyTZINFO_HEAD // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : Integer; @@ -929,7 +929,7 @@ PyBufferProcs = record _PyDateTime_BaseDateTime = {$IFDEF CPUX86}packed{$ENDIF} record // hastzinfo false // Start of _PyTZINFO_HEAD // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : Integer; @@ -943,7 +943,7 @@ PyBufferProcs = record // Start of _PyDateTime_DATETIMEHEAD // Start of _PyTZINFO_HEAD // Start of the Head of an object - ob_refcnt : NativeInt; + ob_refcnt : NativeUInt; ob_type : PPyTypeObject; // End of the Head of an object hashcode : Integer; @@ -958,7 +958,7 @@ PyBufferProcs = record //bytearrayobject.h PyByteArrayObject = {$IFDEF CPUX86}packed{$ENDIF} record - ob_refcnt: NativeInt; + ob_refcnt: NativeUInt; ob_type: PPyTypeObject; ob_alloc: Py_ssize_t; ob_bytes: PAnsiChar; @@ -2576,9 +2576,9 @@ TPythonModule = class(TMethodsContainer) // The base class of all new Python types TPyObject = class private - function Get_ob_refcnt: NativeInt; + function Get_ob_refcnt: NativeUInt; function Get_ob_type: PPyTypeObject; - procedure Set_ob_refcnt(const Value: NativeInt); + procedure Set_ob_refcnt(const Value: NativeUInt); procedure Set_ob_type(const Value: PPyTypeObject); public PythonType : TPythonType; @@ -2599,7 +2599,7 @@ TPyObject = class procedure Adjust(PyPointer: Pointer); function GetModule : TPythonModule; - property ob_refcnt : NativeInt read Get_ob_refcnt write Set_ob_refcnt; + property ob_refcnt : NativeUInt read Get_ob_refcnt write Set_ob_refcnt; property ob_type : PPyTypeObject read Get_ob_type write Set_ob_type; // Type services @@ -7816,7 +7816,7 @@ function TPyObject.GetModule : TPythonModule; Result := nil; end; -function TPyObject.Get_ob_refcnt: NativeInt; +function TPyObject.Get_ob_refcnt: NativeUInt; begin Result := GetSelf^.ob_refcnt; end; @@ -7826,7 +7826,7 @@ function TPyObject.Get_ob_type: PPyTypeObject; Result := GetSelf^.ob_type; end; -procedure TPyObject.Set_ob_refcnt(const Value: NativeInt); +procedure TPyObject.Set_ob_refcnt(const Value: NativeUInt); begin GetSelf^.ob_refcnt := Value; end; From abbaeee55759277aa5c867a82dea1d1aad52935f Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Fri, 13 Dec 2024 18:12:04 +0200 Subject: [PATCH 165/174] Detect free-threaded python presence. --- Source/PythonVersions.pas | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Source/PythonVersions.pas b/Source/PythonVersions.pas index 71d38a84..ea79ed84 100644 --- a/Source/PythonVersions.pas +++ b/Source/PythonVersions.pas @@ -33,7 +33,7 @@ TPythonVersion = record function GetDisplayName: string; function GetApiVersion: integer; function GetSysArchitecture: string; - function GetPythonExecutable: string; + function GetPythonExecutable(Index: Integer): string; public IsRegistered: Boolean; IsAllUsers: Boolean; @@ -46,7 +46,8 @@ TPythonVersion = record function Is_virtualenv: Boolean; function Is_conda: Boolean; procedure AssignTo(PythonEngine: TPersistent); - property PythonExecutable: string read GetPythonExecutable; + property PythonExecutable: string index 0 read GetPythonExecutable; + property PythonFreeThreadedExecutable: string index 1 read GetPythonExecutable; property DLLName: string read GetDLLName; property SysArchitecture: string read GetSysArchitecture; property IsPython3K: Boolean read GetIsPython3K; @@ -204,11 +205,18 @@ function TPythonVersion.GetIsPython3K: Boolean; end; end; -function TPythonVersion.GetPythonExecutable: string; +function TPythonVersion.GetPythonExecutable(Index: Integer): string; +var + ExeName: string; begin - Result := IncludeTrailingPathDelimiter(InstallPath) + 'python.exe'; + if Index = 0 then + ExeName := 'python.exe' + else + ExeName := Format('python%st.exe', [SysVersion]); + + Result := IncludeTrailingPathDelimiter(InstallPath) + ExeName; if not FileExists(Result) then begin - Result := IncludeTrailingPathDelimiter(InstallPath) + 'Scripts' + PathDelim + 'python.exe'; + Result := IncludeTrailingPathDelimiter(InstallPath) + 'Scripts' + PathDelim + ExeName; if not FileExists(Result) then Result := ''; end; end; From a1471e2b98cad83bb05a693373e6dc8496505fff Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 17 Dec 2024 01:55:40 +0200 Subject: [PATCH 166/174] Fix spelling --- Source/PythonEngine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index f579a420..27c510a3 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -4436,7 +4436,7 @@ procedure TPythonTraceback.Clear; * This method is automatically called by the Exec/Eval methods of * TPythonEngine. But if you use the Python core API, then don't * forget to refresh the traceback yourself. Or much better, - * simply use the method CheckError wich will call PyErr_Print, + * simply use the method CheckError which will call PyErr_Print, * Traceback.Refresh and RaiseError for you. } procedure TPythonTraceback.Refresh(pytraceback: PPyObject); From eac8094f7211dc88791bf7e3ce7014e95a47afe9 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sun, 29 Dec 2024 01:07:50 +0200 Subject: [PATCH 167/174] Refactored error messages as resource strings --- Source/PythonEngine.pas | 193 ++++++++++++++++++++++++++-------------- 1 file changed, 124 insertions(+), 69 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 27c510a3..18928cfa 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -3072,6 +3072,59 @@ implementation SPyExcSystemError = 'Unhandled SystemExit exception. Code: %s'; SPyInitFailed = 'Python initialization failed: %s'; SPyInitFailedUnknown = 'Unknown initialization error'; +SCannotCreateMain = 'Run_CommandAsObject: can''t create __main__'; +SRaiseError = 'RaiseError: couldn''t fetch last exception'; +SMissingModuleDateTime = 'dcmToDatetime DatetimeConversionMode cannot be used with this version of python. Missing module datetime'; +SInvalidDateTimeConvMode = 'Invalid DatetimeConversionMode'; +SUnexpectedTypeInTimeObject = 'Unexpected type found in member %s of a time_struct object'; +SArguementTypeNotAllowed = 'Argument type not allowed'; +SCouldNotCreateTuple = 'Could not create a new tuple object'; +SCouldNotCreateList = 'Could not create a new list object'; +SCouldNotCreateDict = 'Could not create a new dict object'; +SArgumemntsShouldBeEven = 'You must provide an even number of arguments'; +SExpectedList = 'The python object is not a list'; +SExpectedTuple = 'The python object is not a tuple'; +SCouldNotSetVar = 'Could not set var "%s" in module "%s"'; +SCannotSetVarNoInit = 'Can''t set var "%s" in module "%s", because it is not yet initialized'; +SCannotGetDict = 'Can''t get __dict__ of module "%s"'; +SCannotDelVarNoInit = 'Can''t delete var "%s" in module "%s", because it is not yet initialized'; +SExpectedDelphiClass = 'Pytho;n object "%s" is not a Delphi class'; +SCannotCreateModule = 'CreateVar: can''t create module "%s"'; +SVarNotCreated = 'No variable was created'; +SVarExists = 'A variable "%s" already exists in the module "%s"'; +SCannotCreateThreadState = 'Could not create a new thread state'; +SCannotCreatePythonEngine = 'No Python engine was created'; +SCannotInitPythonEngine = 'The Python engine is not properly initialized'; +SThreadPythonExec = 'ThreadPythonExec should only be called from the main thread'; +SQuitMessage = 'Dll %s could not be loaded. We must quit.'; +SPythonQuitMessage = 'Python DLL %s could not be initialized. We must quit.'; +SErrCannotOpenDLL = 'Error %d: Could not open Dll "%s"'; +SPythonNoInit = 'Python is not initialized'; +SOnlyOnePythonEngine = 'You canott have more than one TPythonEngine component'; +SMoreThanOnePythonEngine = 'There is already one instance of TPythonEngine running'; +SGlobalVarsShouldBeDict = 'You must set a Python dictionary in the GlobalVars property'; +SLocalVarsShouldBeDict = 'You must set a Python dictionary in the LocalVars property'; +SCannotModifyFlags = 'You can''t modify Python flags after it has been initialized'; +SCannotFindType = 'Could not find type: %s'; +SCannotFindModule = 'Could not find module: %s'; +SCannotFindComponent = 'Could not find component: %s'; +SCannotHandleMoreThan3Dim = 'Can''t convert a variant array of more than 3 dimensions to a Python sequence'; +SNoEngineForComponent = 'No Engine defined for component "%s"'; +SIndexOutOfRange = '%s: Index %d out of range'; +SUnknownMemberType = 'Unknown member type'; +SUnknownMemberFlag = 'Unknown member flag'; +SDuplicateErrorName = 'In module "%s", there''s already an error named "%s"'; +SNoModuleWithParentClass = 'Could not find module containing the parent class of error "%s"'; +SCannotFindParentClass = 'Could not find the parent class "%s" of error "%s"'; +SObjectNotClass = 'The object "%s" in module "%s" is not a class'; +SErrorNotClass = 'Error without name in module "%s"'; +SCouldNotCreateError = 'Could not create error "%s"'; +STErrorCouldNotCreateInstance = 'TError.RaiseErrorObj: Could not create an instance of "%s"'; +STErrorCouldNotCreateTuple = 'TError.RaiseErrorObj: Could not create an empty tuple'; +STErrorNoInstance = 'TError.RaiseErrorObj: I didn''t get an instance'; +SCouldNotFindError = 'Could not find error "%s"'; +SCouldNotMapSymbol = 'Error %d: could not map symbol "%s"'; +SUndeterminedPythonVersion = 'Undetermined Python version'; (*******************************************************) (** **) @@ -3423,7 +3476,7 @@ procedure TDynamicDll.OpenDll(const aDllName : string); if not IsHandleValid then begin {$IFDEF MSWINDOWS} - s := Format('Error %d: Could not open Dll "%s"',[GetLastError, DllName]); + s := Format(SErrCannotOpenDLL, [GetLastError, DllName]); {$ELSE} s := Format('Error: Could not open Dll "%s"',[DllName]); {$ENDIF} @@ -3471,7 +3524,7 @@ function TDynamicDll.Import(const funcname: AnsiString; canFail : Boolean = True {$IFEND} if (Result = nil) and canFail then begin {$IFDEF MSWINDOWS} - E := EDllImportError.CreateFmt('Error %d: could not map symbol "%s"', [GetLastError, funcname]); + E := EDllImportError.CreateFmt(SCouldNotMapSymbol, [GetLastError, funcname]); E.ErrorCode := GetLastError; {$ELSE} E := EDllImportError.CreateFmt('Error: could not map symbol "%s"', [funcname]); @@ -3566,7 +3619,7 @@ procedure TDynamicDll.LoadPythonInfoFromModule; end; if not LFound then - raise EDLLLoadError.Create('Undetermined Python version from loaded module.'); + raise EDLLLoadError.Create(SUndeterminedPythonVersion); end; procedure TDynamicDll.LoadDll; @@ -3619,7 +3672,7 @@ procedure TDynamicDll.BeforeUnload; function TDynamicDll.GetQuitMessage : string; begin - Result := Format( 'Dll %s could not be loaded. We must quit.', [DllName]); + Result := Format(SQuitMessage, [DllName]); end; function TDynamicDll.HasPythonSymbolsInLibrary: boolean; @@ -3692,7 +3745,7 @@ procedure TPythonInterface.AfterLoad; if not FInExtensionModule then PythonVersionFromDLLName(DLLName, FMajorVersion, FMinorVersion) else if not PythonVersionFromRegVersion(RegVersion, FMajorVersion, FMinorVersion) then - raise EDLLLoadError.Create('Undetermined Python version.'); + raise EDLLLoadError.Create(SUndeterminedPythonVersion); FBuiltInModuleName := 'builtins'; @@ -3713,13 +3766,13 @@ procedure TPythonInterface.AfterLoad; function TPythonInterface.GetQuitMessage : string; begin - Result := Format( 'Python could not be properly initialized. We must quit.', [DllName]); + Result := Format(SPythonQuitMessage, [DllName]); end; procedure TPythonInterface.CheckPython; begin if not Initialized then - raise Exception.Create('Python is not properly initialized' ); + raise Exception.Create(SPythonNoInit); end; procedure TPythonInterface.MapDll; @@ -4562,7 +4615,7 @@ constructor TPythonEngine.Create(AOwner: TComponent); for i := 0 to AOwner.ComponentCount - 1 do if (AOwner.Components[i] is TPythonEngine) and (AOwner.Components[i] <> Self) then - raise Exception.Create('You can''t drop more than one TPythonEngine component'); + raise Exception.Create(SOnlyOnePythonEngine); end; end; @@ -4968,7 +5021,7 @@ procedure TPythonEngine.Initialize; ErrMsg: string; begin if Assigned(gPythonEngine) then - raise Exception.Create('There is already one instance of TPythonEngine running' ); + raise Exception.Create(SMoreThanOnePythonEngine); gPythonEngine := Self; @@ -5085,7 +5138,7 @@ procedure TPythonEngine.SetGlobalVars(const Value: PPyObject); else begin FGlobalVars := nil; - raise Exception.Create('You must set a Python dictionary in the GlobalVars property'); + raise Exception.Create(SGlobalVarsShouldBeDict); end else FGlobalVars := nil; @@ -5103,7 +5156,7 @@ procedure TPythonEngine.SetLocalVars(const Value: PPyObject); else begin FLocalVars := nil; - raise Exception.Create('You must set a Python dictionary in the LocalVars property'); + raise Exception.Create(SLocalVarsShouldBeDict); end else FLocalVars := nil; @@ -5115,7 +5168,7 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags); if FPyFlags <> Value then begin if Initialized then - raise Exception.Create('You can''t modify Python flags after it has been initialized'); + raise Exception.Create(SCannotModifyFlags); FPyFlags := Value; end; // of if end; @@ -5256,7 +5309,7 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command: AnsiString; m := GetMainModule; if m = nil then - raise EPythonError.Create('Run_CommandAsObject: can''t create __main__'); + raise EPythonError.Create(SCannotCreateMain); if Assigned(locals) then _locals := locals @@ -5600,7 +5653,7 @@ procedure TPythonEngine.RaiseError; raise Define( EPyExecError.Create(''), s_type, s_value ); end else - raise EPythonError.Create('RaiseError: couldn''t fetch last exception'); + raise EPythonError.Create(SRaiseError); end; function TPythonEngine.PyObjectAsString( obj : PPyObject ) : string; @@ -5734,7 +5787,7 @@ function TPythonEngine.TypeByName( const aTypeName : AnsiString ) : PPyTypeObjec Result := TheTypePtr; Exit; end; - raise Exception.CreateFmt('Could not find type: %s', [aTypeName]); + raise Exception.CreateFmt(SCannotFindType, [aTypeName]); end; function TPythonEngine.ModuleByName( const aModuleName : AnsiString ) : PPyObject; @@ -5749,7 +5802,7 @@ function TPythonEngine.ModuleByName( const aModuleName : AnsiString ) : PPyObj Result := Module; Exit; end; - raise Exception.CreateFmt('Could not find module: %s', [aModuleName]); + raise Exception.CreateFmt(SCannotFindModule, [aModuleName]); end; function TPythonEngine.MethodsByName( const aMethodsContainer: string ) : PPyMethodDef; @@ -5764,7 +5817,7 @@ function TPythonEngine.MethodsByName( const aMethodsContainer: string ) : PPyMet Result := MethodsData; Exit; end; - raise Exception.CreateFmt('Could not find component: %s', [aMethodsContainer]); + raise Exception.CreateFmt(SCannotFindComponent, [aMethodsContainer]); end; function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; @@ -5884,7 +5937,7 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; else if (DatetimeConversionMode = dcmToDatetime) then begin if not Assigned(FPyDateTime_DateTimeType) then - raise EPythonError.Create('dcmToDatetime DatetimeConversionMode cannot be used with this version of python. Missing module datetime'); + raise EPythonError.Create(SMissingModuleDateTime); args := ArrayToPyTuple([y, m, d, h, mi, sec, ms*1000]); try Result := PyObject_Call(FPyDateTime_DateTimeType, args, nil); @@ -5894,7 +5947,7 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; end; end else - raise EPythonError.Create('Invalid DatetimeConversionMode'); + raise EPythonError.Create(SInvalidDateTimeConvMode); end; varOleStr: begin @@ -5922,7 +5975,7 @@ function TPythonEngine.VariantAsPyObject( const V : Variant ) : PPyObject; 2: Result := ArrayVarDim2; 3: Result := ArrayVarDim3; else - raise Exception.Create('Can''t convert a variant array of more than 3 dimensions to a Python sequence'); + raise Exception.Create(SCannotHandleMoreThan3Dim); end; end else if VarIsNull(DeRefV) or VarIsEmpty(DeRefV) then @@ -5948,7 +6001,7 @@ function TPythonEngine.PyObjectAsVariant( obj : PPyObject ) : Variant; if PyLong_Check(member) then Result := PyLong_AsLong(member) else - raise EPythonError.CreateFmt('Unexpected type found in member %s of a time_struct object', [AMember]); + raise EPythonError.CreateFmt(SUnexpectedTypeInTimeObject, [AMember]); Py_XDecRef(member); end; @@ -6138,7 +6191,7 @@ function TPythonEngine.VarRecAsPyObject( const v : TVarRec ) : PPyObject; Result := PyUnicodeFromString(''); end; else - Raise Exception.Create('Argument type not allowed'); + Raise Exception.Create(SArguementTypeNotAllowed); end; end; @@ -6151,7 +6204,7 @@ function TPythonEngine.MakePyTuple( const objects : array of PPyObject ) : PPyOb begin Result := PyTuple_New( High(objects)+1 ); if not Assigned(Result) then - raise EPythonError.Create('Could not create a new tuple object'); + raise EPythonError.Create(SCouldNotCreateTuple); for i := Low(objects) to High(objects) do begin Py_XINCREF( objects[i] ); @@ -6168,7 +6221,7 @@ function TPythonEngine.MakePyList( const objects : array of PPyObject ) : PPyObj begin Result := PyList_New( High(objects)+1 ); if not Assigned(Result) then - raise EPythonError.Create('Could not create a new list object'); + raise EPythonError.Create(SCouldNotCreateList); for i := Low(objects) to High(objects) do begin Py_XIncRef( objects[i] ); @@ -6182,7 +6235,7 @@ function TPythonEngine.ArrayToPyTuple( const items : array of const) : PPyObject begin Result := PyTuple_New( High(items)+1 ); if not Assigned(Result) then - raise EPythonError.Create('Could not create a new tuple object'); + raise EPythonError.Create(SCouldNotCreateTuple); for i := Low(items) to High(items) do PyTuple_SetItem( Result, i, VarRecAsPyObject( items[i] ) ); end; @@ -6193,7 +6246,7 @@ function TPythonEngine.ArrayToPyList( const items : array of const) : PPyObject; begin Result := PyList_New( High(items)+1 ); if not Assigned(Result) then - raise EPythonError.Create('Could not create a new list object'); + raise EPythonError.Create(SCouldNotCreateList); for i := Low(items) to High(items) do PyList_SetItem( Result, i, VarRecAsPyObject( items[i] ) ); end; @@ -6249,7 +6302,7 @@ function TPythonEngine.ArrayToPyDict( const items : array of const) : PPyObject; Result := ''; end; else - Raise Exception.Create('Argument type not allowed'); + Raise Exception.Create(SArguementTypeNotAllowed); end; end; @@ -6259,10 +6312,10 @@ function TPythonEngine.ArrayToPyDict( const items : array of const) : PPyObject; obj : PPyObject; begin if ((High(items)+1) mod 2) <> 0 then - raise Exception.Create('You must provide an even number of arguments'); + raise Exception.Create(SArgumemntsShouldBeEven); Result := PyDict_New; if not Assigned(Result) then - raise EPythonError.Create('Could not create a new dict object'); + raise EPythonError.Create(SCouldNotCreateDict); i := Low(items); try while i <= High(items) do @@ -6287,7 +6340,7 @@ function TPythonEngine.StringsToPyList( strings : TStrings ) : PPyObject; begin Result := PyList_New( strings.Count ); if not Assigned(Result) then - raise EPythonError.Create('Could not create a new list object'); + raise EPythonError.Create(SCouldNotCreateList); for i := 0 to strings.Count - 1 do PyList_SetItem( Result, i, PyUnicodeFromString(strings.Strings[i])); @@ -6299,7 +6352,7 @@ function TPythonEngine.StringsToPyTuple( strings : TStrings ) : PPyObject; begin Result := PyTuple_New( strings.Count ); if not Assigned(Result) then - raise EPythonError.Create('Could not create a new tuple object'); + raise EPythonError.Create(SCouldNotCreateTuple); for i := 0 to strings.Count - 1 do PyTuple_SetItem( Result, i, PyUnicodeFromString(strings.Strings[i])); @@ -6311,7 +6364,7 @@ procedure TPythonEngine.PyListToStrings(list: PPyObject; Strings: TStrings; i : Integer; begin if not PyList_Check(list) then - raise EPythonError.Create('the python object is not a list'); + raise EPythonError.Create(SExpectedList); if ClearStrings then Strings.Clear; for i := 0 to PyList_Size( list ) - 1 do @@ -6323,7 +6376,7 @@ procedure TPythonEngine.PyTupleToStrings( tuple: PPyObject; strings : TStrings ) i : Integer; begin if not PyTuple_Check(tuple) then - raise EPythonError.Create('the python object is not a tuple'); + raise EPythonError.Create(SExpectedTuple); strings.Clear; for i := 0 to PyTuple_Size( tuple ) - 1 do strings.Add( PyObjectAsString( PyTuple_GetItem( tuple, i ) ) ); @@ -6725,7 +6778,7 @@ procedure TEngineClient.ClearEngine; procedure TEngineClient.CheckEngine; begin if not Assigned(FEngine) then - raise Exception.CreateFmt('No Engine defined for component "%s"', [Name]); + raise Exception.CreateFmt(SNoEngineForComponent, [Name]); end; @@ -6871,7 +6924,7 @@ procedure TMethodsContainer.ReallocMethods; function TMethodsContainer.GetMethods( idx : Integer ) : PPyMethodDef; begin if (idx < 0) or (idx > MethodCount) then - raise Exception.CreateFmt('%s: Index %d out of range', [ClassName, idx]); + raise Exception.CreateFmt(SIndexOutOfRange, [ClassName, idx]); Result := @( FMethods[idx] ); end; @@ -7004,7 +7057,7 @@ procedure TMembersContainer.AddMember(MemberName: PAnsiChar; MemberType : TPyMe mtStringInplace: _type := T_STRING_INPLACE; mtObjectEx: _type := T_OBJECT_EX; else - raise Exception.Create('Unknown member type'); + raise Exception.Create(SUnknownMemberType); end; offset := MemberOffset + GetMembersStartOffset; case MemberFlags of @@ -7014,9 +7067,9 @@ procedure TMembersContainer.AddMember(MemberName: PAnsiChar; MemberType : TPyMe mfWriteRestricted: flags := PY_WRITE_RESTRICTED; mfRestricted: flags := RESTRICTED; else - raise Exception.Create('Unknown member flag'); + raise Exception.Create(SUnknownMemberFlag); end; - doc := MemberDoc; + doc := MemberDoc; end; Inc( FMemberCount ); end; @@ -7067,7 +7120,7 @@ procedure TMembersContainer.FreeMembers; function TMembersContainer.GetMembers(idx: Integer): PPyMemberDef; begin if (idx < 0) or (idx > MemberCount) then - raise Exception.CreateFmt('%s: Index %d out of range', [ClassName, idx]); + raise Exception.CreateFmt(SIndexOutOfRange, [ClassName, idx]); Result := @( FMembers[idx] ); end; @@ -7144,7 +7197,7 @@ procedure TGetSetContainer.FreeGetSets; function TGetSetContainer.GetGetSet(idx: Integer): PPyGetSetDef; begin if (idx < 0) or (idx > GetSetCount) then - raise Exception.CreateFmt('%s: Index %d out of range', [ClassName, idx]); + raise Exception.CreateFmt(SIndexOutOfRange, [ClassName, idx]); Result := @( FGetSets[idx] ); end; @@ -7181,7 +7234,8 @@ procedure TParentClassError.AssignTo( Dest: TPersistent ); function TError.GetDisplayName: string; begin Result := string(Name); - if Result = '' then Result := inherited GetDisplayName; + if Result = '' then + Result := inherited GetDisplayName; end; procedure TError.SetName( const Value : AnsiString ); @@ -7199,8 +7253,8 @@ procedure TError.SetName( const Value : AnsiString ); for i := 0 to Count - 1 do with Items[i] do if Name = Value then - raise Exception.CreateFmt( 'In module "%s", there''s already an error named "%s"', - [m.ModuleName, Value]); + raise Exception.CreateFmt(SDuplicateErrorName, + [m.ModuleName, Value]); end; end; @@ -7310,13 +7364,13 @@ procedure TError.BuildError( const ModuleName : AnsiString ); else m := FindModule( ModuleName ); if not Assigned(m) then - raise Exception.CreateFmt('Could not find module containing the parent class of error "%s"', [Self.Name]); + raise Exception.CreateFmt(SNoModuleWithParentClass, [Self.Name]); d := PyModule_GetDict(m); Result := PyDict_GetItemString( d, PAnsiChar(ParentClass.Name) ); if not Assigned(Result) then - raise Exception.CreateFmt('Could not find the parent class "%s" of error "%s"', [ParentClass.Name, Self.Name]); + raise Exception.CreateFmt(SCannotFindParentClass, [ParentClass.Name, Self.Name]); if not PyClass_Check( Result ) and not PyType_CheckExact( Result ) then - raise Exception.CreateFmt('The object "%s" in module "%s" is not a class', [ParentClass.Name, ParentClass.Module] ); + raise Exception.CreateFmt(SObjectNotClass, [ParentClass.Name, ParentClass.Module] ); end; end; @@ -7327,7 +7381,7 @@ procedure TError.BuildError( const ModuleName : AnsiString ); Exit; if Name = '' then with GetOwner as TPythonModule do - raise Exception.CreateFmt( 'Error without name in module "%s"', [ModuleName] ); + raise Exception.CreateFmt(SErrorNotClass, [ModuleName] ); if Text = '' then Text := Name; Owner.Owner.CheckEngine; @@ -7347,7 +7401,7 @@ procedure TError.BuildError( const ModuleName : AnsiString ); end; end; if not Assigned(Error) then - raise Exception.CreateFmt( 'Could not create error "%s"', [Name] ); + raise Exception.CreateFmt(SCouldNotCreateError, [Name]); end; procedure TError.RaiseError(const msg : AnsiString); @@ -7373,18 +7427,18 @@ procedure TError.RaiseErrorObj(const msg : AnsiString; obj : PPyObject); begin res := PyObject_CallObject(Error, nil); if not Assigned(res) then - raise Exception.CreateFmt('TError.RaiseErrorObj: Could not create an instance of "%s"', [Self.Name]); + raise Exception.CreateFmt(STErrorCouldNotCreateInstance, [Self.Name]); if PyObject_TypeCheck(res, PPyTypeObject(PyExc_Exception^)) then begin args := PyTuple_New(1); if not Assigned(args) then - raise Exception.Create('TError.RaiseErrorObj: Could not create an empty tuple'); + raise Exception.Create(STErrorCouldNotCreateTuple); str := PyUnicodeFromString(msg); PyTuple_SetItem(args, 0, str); res := PyObject_Call(Error, args, nil); Py_DECREF(args); if not Assigned(res) then - raise Exception.CreateFmt('TError.RaiseErrorObj: Could not create an instance of "%s"', [Self.Name]); + raise Exception.CreateFmt(STErrorCouldNotCreateInstance, [Self.Name]); keys := PyDict_Keys(obj); for i := 0 to PySequence_Length(keys)-1 do begin @@ -7400,7 +7454,7 @@ procedure TError.RaiseErrorObj(const msg : AnsiString; obj : PPyObject); Py_XDECREF(keys); end else - raise Exception.Create('TError.RaiseErrorObj: I didn''t get an instance' ); + raise Exception.Create(STErrorNoInstance); PyErr_SetObject(Error, res); Py_XDECREF(res); end @@ -7600,7 +7654,7 @@ function TPythonModule.ErrorByName( const AName : AnsiString ) : TError; Result := Errors.Items[i]; Exit; end; - raise Exception.CreateFmt( 'Could not find error "%s"', [AName] ); + raise Exception.CreateFmt(SCouldNotFindError, [AName] ); end; procedure TPythonModule.RaiseError( const error, msg : AnsiString ); @@ -7652,10 +7706,10 @@ procedure TPythonModule.SetVar( const varName : AnsiString; value : PPyObject ); if Assigned(FEngine) and Assigned( FModule ) then begin if Engine.PyObject_SetAttrString(Module, PAnsiChar(varName), value ) <> 0 then - raise EPythonError.CreateFmt( 'Could not set var "%s" in module "%s"', [varName, ModuleName] ); + raise EPythonError.CreateFmt(SCouldNotSetVar, [varName, ModuleName]); end else - raise EPythonError.CreateFmt( 'Can''t set var "%s" in module "%s", because it is not yet initialized', [varName, ModuleName] ); + raise EPythonError.CreateFmt(SCannotSetVarNoInit, [varName, ModuleName]); end; // warning, this function will increase the refcount of value, @@ -7669,7 +7723,7 @@ function TPythonModule.GetVar( const varName : AnsiString ) : PPyObject; Engine.PyErr_Clear; end else - raise EPythonError.CreateFmt( 'Can''t get var "%s" in module "%s", because it is not yet initialized', [varName, ModuleName] ); + raise EPythonError.CreateFmt(SCannotSetVarNoInit, [varName, ModuleName]); end; procedure TPythonModule.DeleteVar( const varName : AnsiString ); @@ -7680,11 +7734,12 @@ procedure TPythonModule.DeleteVar( const varName : AnsiString ); with Engine do begin dict := PyModule_GetDict( Module ); - if not Assigned(dict) then raise EPythonError.CreateFmt( 'Can''t get __dict__ of module "%s"', [ModuleName] ); + if not Assigned(dict) then + raise EPythonError.CreateFmt(SCannotGetDict, [ModuleName] ); PyDict_DelItemString( dict, PAnsiChar(varName) ); end else - raise EPythonError.CreateFmt( 'Can''t delete var "%s" in module "%s", because it is not yet initialized', [varName, ModuleName] ); + raise EPythonError.CreateFmt(SCannotDelVarNoInit, [varName, ModuleName]); end; procedure TPythonModule.ClearVars; @@ -8252,7 +8307,7 @@ function PythonToDelphi( obj : PPyObject ) : TPyObject; if IsDelphiObject( obj ) then Result := TPyObject(PAnsiChar(obj)+Sizeof(PyObject)) else - raise EPythonError.CreateFmt( 'Python object "%s" is not a Delphi class', [GetPythonEngine.PyObjectAsString(obj)] ); + raise EPythonError.CreateFmt(SExpectedDelphiClass, [GetPythonEngine.PyObjectAsString(obj)]); end; procedure PyObjectDestructor( pSelf : PPyObject); cdecl; @@ -9103,7 +9158,7 @@ procedure TPythonDelphiVar.CreateVar; // Add a reference to this var in the module m := PyImport_AddModule(PAnsiChar(Module)); if m = nil then - raise EPythonError.CreateFmt('CreateVar: can''t create module "%s"', [Module]); + raise EPythonError.CreateFmt(SCannotCreateModule, [Module]); d := PyModule_GetDict(m); if @PyDict_SetItemString = nil then raise Exception.Create('nil'); @@ -9117,7 +9172,7 @@ function TPythonDelphiVar.GetValue : Variant; with TPyVar(PythonToDelphi(FVarObject)) do Result := GetValueAsVariant else - raise Exception.Create('No variable was created' ); + raise Exception.Create(SVarNotCreated); end; procedure TPythonDelphiVar.SetValue( const val : Variant ); @@ -9126,7 +9181,7 @@ procedure TPythonDelphiVar.SetValue( const val : Variant ); with TPyVar(PythonToDelphi(FVarObject)) do SetValueFromVariant(val) else - raise Exception.Create('No variable was created' ); + raise Exception.Create(SVarNotCreated); end; // Warning: GetValueAsPyObject returns a preincremented object ! @@ -9136,7 +9191,7 @@ function TPythonDelphiVar.GetValueAsPyObject : PPyObject; with TPyVar(PythonToDelphi(FVarObject)) do Result := GetValue else - raise Exception.Create('No variable was created' ); + raise Exception.Create(SVarNotCreated); end; procedure TPythonDelphiVar.SetValueFromPyObject( val : PPyObject ); @@ -9145,7 +9200,7 @@ procedure TPythonDelphiVar.SetValueFromPyObject( val : PPyObject ); with TPyVar(PythonToDelphi(FVarObject)) do SetValue(val) else - raise Exception.Create('No variable was created' ); + raise Exception.Create(SVarNotCreated); end; function TPythonDelphiVar.IsVariantOk( const v : Variant ) : Boolean; @@ -9198,7 +9253,7 @@ procedure TPythonDelphiVar.SetVarName( const val : AnsiString ); if Owner.Components[i] is TPythonDelphiVar then with TPythonDelphiVar(Owner.Components[i]) do if (VarName = val) and (Module = Self.Module) then - raise Exception.CreateFmt('A variable "%s" already exists in the module "%s"',[val, Module]); + raise Exception.CreateFmt(SVarExists, [val, Module]); end; begin @@ -9490,7 +9545,7 @@ procedure TPythonThread.Execute; PyThreadState_Swap(global_state); PyGILState_Release(gilstate); end else - raise EPythonError.Create('Could not create a new thread state'); + raise EPythonError.Create(SCannotCreateThreadState); end; end; end; @@ -9698,9 +9753,9 @@ function pyio_GetTypesStats(self, args : PPyObject) : PPyObject; function GetPythonEngine : TPythonEngine; begin if not Assigned( gPythonEngine ) then - raise Exception.Create( 'No Python engine was created' ); + raise Exception.Create(SCannotCreatePythonEngine); if not gPythonEngine.Finalizing and not gPythonEngine.Initialized then - raise Exception.Create( 'The Python engine is not properly initialized' ); + raise Exception.Create(SCannotInitPythonEngine); Result := gPythonEngine; end; @@ -10053,7 +10108,7 @@ procedure ThreadPythonExec(ExecuteProc : TProc; TerminateProc : TProc; Thread: TAnonymousPythonThread; begin if GetCurrentThreadId <> MainThreadID then - raise Exception.Create('ThreadPythonExec should only be called from the main thread'); + raise Exception.Create(SThreadPythonExec); Thread := TAnonymousPythonThread.Create(ExecuteProc, TerminateProc, WaitToFinish, ThreadExecMode); if WaitToFinish then begin From 189fb29322bdd95b492468cde0141368024ccdca Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Tue, 7 Jan 2025 13:20:47 +0200 Subject: [PATCH 168/174] Fix #493 --- Source/PythonEngine.pas | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index 18928cfa..dd43d6eb 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -538,7 +538,8 @@ TPythonVersionProp = record {#define PyDescr_COMMON \ PyObject_HEAD \ PyTypeObject *d_type; \ - PyObject *d_name + PyObject *d_name \ + PyObject *d_qualname } PPyDescrObject = ^PyDescrObject; @@ -549,6 +550,7 @@ TPythonVersionProp = record // End of the Head of an object d_type : PPyTypeObject; d_name : PPyObject; + d_qualname : PPyObject; end; PPyMethodDescrObject = ^PyMethodDescrObject; @@ -560,6 +562,7 @@ TPythonVersionProp = record // End of the Head of an object d_type : PPyTypeObject; d_name : PPyObject; + d_qualname : PPyObject; // End of PyDescr_COMMON d_method : PPyMethodDef; end; @@ -573,6 +576,7 @@ TPythonVersionProp = record // End of the Head of an object d_type : PPyTypeObject; d_name : PPyObject; + d_qualname : PPyObject; // End of PyDescr_COMMON d_member : PPyMemberDef; end; @@ -586,6 +590,7 @@ TPythonVersionProp = record // End of the Head of an object d_type : PPyTypeObject; d_name : PPyObject; + d_qualname : PPyObject; // End of PyDescr_COMMON d_getset : PPyGetSetDef; end; @@ -599,6 +604,7 @@ TPythonVersionProp = record // End of the Head of an object d_type : PPyTypeObject; d_name : PPyObject; + d_qualname : PPyObject; // End of PyDescr_COMMON d_base : pwrapperbase; d_wrapped : Pointer; // This can be any function pointer @@ -1513,6 +1519,7 @@ TPythonInterface=class(TDynamicDll) PySuper_Type: PPyTypeObject; PyTraceBack_Type: PPyTypeObject; PyUnicode_Type: PPyTypeObject; + PyGetSetDescr_Type: PPyTypeObject; PyWrapperDescr_Type: PPyTypeObject; _PyWeakref_RefType: PPyTypeObject; _PyWeakref_ProxyType: PPyTypeObject; @@ -3859,6 +3866,7 @@ procedure TPythonInterface.MapDll; PyStaticMethod_Type := Import('PyStaticMethod_Type'); PySuper_Type := Import('PySuper_Type'); PyTraceBack_Type := Import('PyTraceBack_Type'); + PyGetSetDescr_Type := Import('PyGetSetDescr_Type'); PyWrapperDescr_Type := Import('PyWrapperDescr_Type'); _PyWeakref_RefType := Import('_PyWeakref_RefType'); _PyWeakref_ProxyType := Import('_PyWeakref_ProxyType'); From 4c42c6c636d97a9e72b012f3ec1338be2f547fbc Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sat, 8 Mar 2025 00:54:27 +0200 Subject: [PATCH 169/174] Fix #495 --- Source/PythonEngine.pas | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index dd43d6eb..ec974172 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1034,7 +1034,7 @@ PyConfig = record {$IFDEF CPU64BITS} ((8, 80, 88, 144, 156, 160, 164, 172, 224, 104, 240, 248, 256, 272), (8, 80, 88, 144, 156, 160, 164, 172, 224, 104, 240, 248, 256, 272), - (8, 80, 104, 152, 168, 172, 176, 184, 232, 240, 256, 272, 280, 296), + (8, 80, 104, 152, 168, 172, 176, 184, 240, 248, 264, 280, 288, 304), (8, 96, 120, 168, 184, 188, 192, 200, 264, 272, 288, 304, 312, 336), (8, 96, 120, 168, 184, 188, 192, 200, 268, 272, 288, 304, 312, 336), (8, 96, 120, 168, 184, 188, 192, 200, 272, 280, 296, 312, 320, 344)); @@ -4730,7 +4730,7 @@ procedure TPythonEngine.DoOpenDll(const aDllName : string); procedure TPythonEngine.Initialize; - procedure ConfgigPEP587(var ErrMsg: string); + procedure ConfigPEP587(var ErrMsg: string); // Initialize according to PEP587 available since python 3.8 procedure AssignPyFlags(var Config: PyConfig); @@ -4855,7 +4855,7 @@ procedure TPythonEngine.Initialize; end; end; - procedure ConfgigPEP741(var ErrMsg: string); + procedure ConfigPEP741(var ErrMsg: string); // Initialize according to PEP587 available since python 3.8 procedure AssignPyFlags(Config: PPyInitConfig); @@ -5039,9 +5039,9 @@ procedure TPythonEngine.Initialize; else begin if (MajorVersion > 3) or (MinorVersion >= 14) then - ConfgigPEP741(ErrMsg) + ConfigPEP741(ErrMsg) else - ConfgigPEP587(ErrMsg); + ConfigPEP587(ErrMsg); if not FInitialized then begin From e0164565660d44ca623cb08eccf2d5aa5ff8fa90 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Wed, 9 Apr 2025 17:28:47 +0300 Subject: [PATCH 170/174] Added PyLong_AsVoidPtr --- Source/PythonEngine.pas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ec974172..ff16be8d 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1649,6 +1649,7 @@ TPythonInterface=class(TDynamicDll) PyLong_FromLongLong:function(val:Int64): PPyObject; cdecl; PyLong_FromUnsignedLongLong:function(val:UInt64) : PPyObject; cdecl; PyLong_AsLongLong:function(ob:PPyObject): Int64; cdecl; + PyLong_AsVoidPtr:function(ob:PPyObject): Pointer; PyLong_FromVoidPtr:function(p: Pointer): PPyObject; cdecl; PyMapping_Check:function (ob:PPyObject):integer; cdecl; PyMapping_GetItemString:function (ob:PPyObject;key:PAnsiChar):PPyObject; cdecl; @@ -3984,6 +3985,7 @@ procedure TPythonInterface.MapDll; PyLong_FromLongLong := Import('PyLong_FromLongLong'); PyLong_FromUnsignedLongLong := Import('PyLong_FromUnsignedLongLong'); PyLong_AsLongLong := Import('PyLong_AsLongLong'); + PyLong_AsVoidPtr := Import('PyLong_AsVoidPtr'); PyLong_FromVoidPtr := Import('PyLong_FromVoidPtr'); PyMapping_Check := Import('PyMapping_Check'); PyMapping_GetItemString := Import('PyMapping_GetItemString'); From 83f6b5ee3e24d35a27c73bb3fbe433a78a391d15 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Thu, 10 Apr 2025 05:23:15 +0300 Subject: [PATCH 171/174] Handle Pointer fields, properties and parameters - stored as python integers. --- Source/PythonEngine.pas | 2 +- Source/WrapDelphi.pas | 32 ++++++++++++++++++++++---------- Tests/WrapDelphiTest.pas | 9 +++++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index ff16be8d..c15fbf48 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -1649,7 +1649,7 @@ TPythonInterface=class(TDynamicDll) PyLong_FromLongLong:function(val:Int64): PPyObject; cdecl; PyLong_FromUnsignedLongLong:function(val:UInt64) : PPyObject; cdecl; PyLong_AsLongLong:function(ob:PPyObject): Int64; cdecl; - PyLong_AsVoidPtr:function(ob:PPyObject): Pointer; + PyLong_AsVoidPtr:function(ob:PPyObject): Pointer; cdecl; PyLong_FromVoidPtr:function(p: Pointer): PPyObject; cdecl; PyMapping_Check:function (ob:PPyObject):integer; cdecl; PyMapping_GetItemString:function (ob:PPyObject;key:PAnsiChar):PPyObject; cdecl; diff --git a/Source/WrapDelphi.pas b/Source/WrapDelphi.pas index bed385ea..a19bc718 100644 --- a/Source/WrapDelphi.pas +++ b/Source/WrapDelphi.pas @@ -1042,7 +1042,7 @@ implementation rs_ExpectedNil = 'In static methods Self should be nil'; rs_ExpectedInterface = 'Expected a Pascal interface'; rs_ExpectedSequence = 'Expected a python sequence'; - rsExpectedPPyObject = 'Expected a PPyObject'; + rsExpectedPointer = 'Expected a Pointer'; rs_InvalidClass = 'Invalid class'; rs_ErrEventNotReg = 'No Registered EventHandler for events of type "%s'; rs_ErrEventNoSuport = 'Class %s does not support events because it must '+ @@ -2188,12 +2188,16 @@ function ValidateDynArray(PyValue: PPyObject; const RttiType: TRttiType; end; end; -function ValidatePPyObject(PyValue: PPyObject; const RttiType: TRttiType; +function ValidatePointer(PyValue: PPyObject; const RttiType: TRttiType; out ParamValue: TValue; out ErrMsg: string): Boolean; var RefType: TRttiType; + PyEngine: TPythonEngine; + P: Pointer; begin Result := False; + PyEngine := GetPythonEngine; + if (RTTIType is TRttiPointerType) then begin RefType := TRttiPointerType(RTTIType).ReferredType; @@ -2201,10 +2205,21 @@ function ValidatePPyObject(PyValue: PPyObject; const RttiType: TRttiType; begin Result := True; ParamValue := TValue.From<PPyObject>(PyValue); + end + else if PyEngine.PyLong_Check(PyValue) then + begin + P := PyEngine.PyLong_AsVoidPtr(PyValue); + if PyEngine.PyErr_Occurred = nil then + begin + Result := True; + ParamValue := TValue.From<Pointer>(P); + end + else + PyEngine.PyErr_Clear; end; end; if not Result then - ErrMsg := rsExpectedPPyObject; + ErrMsg := rsExpectedPointer; end; function PyObjectToTValue(PyArg: PPyObject; ArgType: TRttiType; @@ -2238,7 +2253,7 @@ function PyObjectToTValue(PyArg: PPyObject; ArgType: TRttiType; tkDynArray: Result := ValidateDynArray(PyArg, ArgType, Arg, ErrMsg); tkPointer: - Result := ValidatePPyObject(PyArg, ArgType, Arg, ErrMsg); + Result := ValidatePointer(PyArg, ArgType, Arg, ErrMsg); else Result := SimplePythonToValue(PyArg, ArgType.Handle, Arg, ErrMsg); end; @@ -2277,7 +2292,7 @@ function TValueToPyObject(const Value: TValue; DelphiWrapper: TPyDelphiWrapper; out ErrMsg: string): PPyObject; begin if Value.IsEmpty then - Result := GetPythonEngine.ReturnNone + Result := DelphiWrapper.Engine.ReturnNone else case Value.Kind of tkClass: Result := DelphiWrapper.Wrap(Value.AsObject); @@ -2288,13 +2303,10 @@ function TValueToPyObject(const Value: TValue; tkArray, tkDynArray: Result := DynArrayToPython(Value, DelphiWrapper, ErrMsg); tkPointer: - if Value.IsType<PPyObject> then + if Value.TypeInfo = TypeInfo(PPyObject) then Result := Value.AsType<PPyObject> else - begin - Result := nil; - ErrMsg := rs_ErrValueToPython; - end; + Result := DelphiWrapper.Engine.PyLong_FromVoidPtr(Value.AsType<Pointer>); else Result := SimpleValueToPython(Value, ErrMsg); end; diff --git a/Tests/WrapDelphiTest.pas b/Tests/WrapDelphiTest.pas index 350b0bb2..d320f53a 100644 --- a/Tests/WrapDelphiTest.pas +++ b/Tests/WrapDelphiTest.pas @@ -55,6 +55,7 @@ TTestRttiAccess = class ObjectField: TObject; RecordField: TTestRecord; InterfaceField: ITestInterface; + PointerField: Pointer; ClassRef: TClass; function GetData: TObject; procedure BuyFruits(AFruits: TFruits); @@ -160,6 +161,8 @@ TTestWrapDelphi = class(TObject) procedure TestVarArgs; [Test] procedure TestPPyObjects; + [Test] + procedure TestPointers; end; implementation @@ -439,6 +442,12 @@ procedure TTestWrapDelphi.TestPPyObjects; Assert.AreEqual<string>(List.GetItem(0), 'abc'); end; +procedure TTestWrapDelphi.TestPointers; +begin + rtti_var.PointerField := $FFFF; + Assert.AreEqual<NativeUInt>(rtti_var.PointerField, $FFFF); +end; + procedure TTestWrapDelphi.TestRecord; begin Rtti_rec.StringField := 'abcd'; From 92717b84a747285b5cb932f71ec454317329239d Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sun, 13 Apr 2025 02:15:28 +0300 Subject: [PATCH 172/174] Fix #497 --- Source/VarPyth.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/VarPyth.pas b/Source/VarPyth.pas index b16f91b8..52607cf0 100644 --- a/Source/VarPyth.pas +++ b/Source/VarPyth.pas @@ -2154,7 +2154,7 @@ procedure VarPyToStrings(const AValue : Variant; const AStrings: TStrings); V: Variant; begin for V in VarPyIterate(AValue) do - AStrings.Add(V) + AStrings.Add(VarPythonAsString(V)) end; initialization From 179b7a666d3b2d765b0014681e2cc757097e1876 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Thu, 1 May 2025 16:15:52 +0300 Subject: [PATCH 173/174] Made python code compatible with recent versions of numpy and matplotlib. --- Tutorials/Webinar II/VizDemo/MainFormSVG.dfm | 42 +++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/Tutorials/Webinar II/VizDemo/MainFormSVG.dfm b/Tutorials/Webinar II/VizDemo/MainFormSVG.dfm index cda1daa9..0d78949a 100644 --- a/Tutorials/Webinar II/VizDemo/MainFormSVG.dfm +++ b/Tutorials/Webinar II/VizDemo/MainFormSVG.dfm @@ -10,17 +10,12 @@ object Form1: TForm1 Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] - OldCreateOrder = False OnCreate = FormCreate - PixelsPerInch = 96 TextHeight = 13 object Splitter1: TSplitter Left = 489 Top = 0 Height = 613 - ExplicitLeft = 528 - ExplicitTop = 280 - ExplicitHeight = 100 end object SVGIconImage1: TSVGIconImage Left = 960 @@ -35,8 +30,6 @@ object Form1: TForm1 Width = 543 Height = 613 AutoSize = False - ParentDoubleBuffered = False - DoubleBuffered = True Align = alClient end object PageControl1: TPageControl @@ -46,7 +39,7 @@ object Form1: TForm1 Height = 613 ActivePage = TabSheet1 Align = alLeft - TabOrder = 2 + TabOrder = 0 object TabSheet1: TTabSheet Caption = 'matplotlib' object Panel1: TPanel @@ -63,8 +56,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alBottom - ExplicitTop = 10 - ExplicitWidth = 492 end object SynEdit1: TSynEdit Left = 1 @@ -72,6 +63,7 @@ object Form1: TForm1 Width = 479 Height = 444 Align = alClient + CaseSensitive = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 @@ -85,6 +77,8 @@ object Form1: TForm1 Gutter.Font.Height = -11 Gutter.Font.Name = 'Consolas' Gutter.Font.Style = [] + Gutter.Font.Quality = fqClearTypeNatural + Gutter.Bands = <> Highlighter = SynPythonSyn1 Lines.Strings = ( 'from delphi_module import svg_image' @@ -102,10 +96,16 @@ object Form1: TForm1 '# stores the date as an np.datetime64 with a day unit ('#39'D'#39') in t' + 'he date column.' - - 'price_data = (cbook.get_sample_data('#39'goog.npz'#39', np_load=True)['#39'p' + - 'rice_data'#39']' - ' .view(np.recarray))' + '# Load Google stock price data from Matplotlib'#39's sample data' + 'data = cbook.get_sample_data('#39'goog.npz'#39')' + '' + '# Handle different return types from get_sample_data' + 'if isinstance(data, np.lib.npyio.NpzFile):' + ' # Already an NpzFile, access price_data directly' + ' price_data = data['#39'price_data'#39'].view(np.recarray)' + 'else:' + ' # Assume data is a path or file-like object, use np.load' + ' price_data = np.load(data)['#39'price_data'#39'].view(np.recarray)' 'price_data = price_data[-250:] # get the most recent 250 tradin' + 'g days' @@ -138,6 +138,7 @@ object Form1: TForm1 'svg_image.SvgText = figdata_svg' '' '#plt.show()') + ScrollbarAnnotations = <> end object Panel2: TPanel Left = 1 @@ -183,8 +184,6 @@ object Form1: TForm1 Height = 3 Cursor = crVSplit Align = alBottom - ExplicitTop = 151 - ExplicitWidth = 433 end object SynEdit2: TSynEdit Left = 1 @@ -192,6 +191,7 @@ object Form1: TForm1 Width = 479 Height = 376 Align = alClient + CaseSensitive = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 @@ -205,6 +205,8 @@ object Form1: TForm1 Gutter.Font.Height = -11 Gutter.Font.Name = 'Consolas' Gutter.Font.Style = [] + Gutter.Font.Quality = fqClearTypeNatural + Gutter.Bands = <> Highlighter = SynPythonSyn1 Lines.Strings = ( 'from delphi_module import svg_image' @@ -222,6 +224,7 @@ object Form1: TForm1 '' '#plt.show()' '') + ScrollbarAnnotations = <> end object Panel6: TPanel Left = 1 @@ -252,9 +255,6 @@ object Form1: TForm1 end end object SynPythonSyn1: TSynPythonSyn - Options.AutoDetectEnabled = False - Options.AutoDetectLineLimit = 0 - Options.Visible = False Left = 632 Top = 40 end @@ -264,6 +264,10 @@ object Form1: TForm1 Top = 89 end object PythonEngine1: TPythonEngine + DllName = 'python313.dll' + APIVersion = 1013 + RegVersion = '3.13' + UseLastKnownVersion = False IO = PythonGUIInputOutput1 Left = 632 Top = 136 From 8b4a78f5b6d62822db65fae543b61ce99a208007 Mon Sep 17 00:00:00 2001 From: pyscripter <pyscripter@gmail.com> Date: Sat, 21 Jun 2025 23:17:48 +0300 Subject: [PATCH 174/174] EPySystemExit was not fully specified. --- Source/PythonEngine.pas | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Source/PythonEngine.pas b/Source/PythonEngine.pas index c15fbf48..422146b0 100644 --- a/Source/PythonEngine.pas +++ b/Source/PythonEngine.pas @@ -5570,9 +5570,7 @@ procedure TPythonEngine.RaiseError; s_type := GetTypeAsString(err_type); s_value := PyObjectAsString(err_value); - if (PyErr_GivenExceptionMatches(err_type, PyExc_SystemExit^) <> 0) then - raise Define( EPySystemExit.Create(''), s_type, s_value ) - else if (PyErr_GivenExceptionMatches(err_type, PyExc_StopIteration^) <> 0) then + if (PyErr_GivenExceptionMatches(err_type, PyExc_StopIteration^) <> 0) then raise Define( EPyStopIteration.Create(''), s_type, s_value ) else if (PyErr_GivenExceptionMatches(err_type, PyExc_KeyboardInterrupt^) <> 0) then raise Define( EPyKeyboardInterrupt.Create(''), s_type, s_value ) @@ -6606,6 +6604,7 @@ procedure TPythonEngine.CheckError(ACatchStopEx : Boolean = False); var errtype, errvalue, errtraceback: PPyObject; SErrValue: string; + SystemExit: EPySystemExit; begin // PyErr_Fetch clears the error. The returned python objects are new references PyErr_Fetch(errtype, errvalue, errtraceback); @@ -6614,7 +6613,11 @@ procedure TPythonEngine.CheckError(ACatchStopEx : Boolean = False); Py_XDECREF(errtype); Py_XDECREF(errvalue); Py_XDECREF(errtraceback); - raise EPySystemExit.CreateResFmt(@SPyExcSystemError, [SErrValue]); + + SystemExit := EPySystemExit.CreateResFmt(@SPyExcSystemError, [SErrValue]); + SystemExit.EValue := SErrValue; + SystemExit.EName := 'SystemExit'; + raise SystemExit; end; var <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> <html xmlns='http://www.w3.org/1999/xhtml'> <head> <title>pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy

    Alternative Proxy

7goEz52 z4;yoDGZMDmnJ*e`(0j)EN``AL@_6Vp=fQnyU?2;Kf+seBNSN0dKq;oFB z#7$68)T4c+x&vFv$01VcXot8H>0}5n(TwgJE^j!?OQ<_0kg2M^C8XDIut5VlH zTGU0}FtpxOA01Yi#d73iaiC8z>!7!d_! zTX`Ib_-ky6#;rQg^I5y5eDba-qguY0t^rm=WhOx62r9n;hai&6aCe9%c4-W;yD-=@BOWN%v^d)RUrg4JXc>JP@4N~BH%&a|@y^ns z4js#X7A<6X+9(gqJciAG1NI@!t%VhcYu;h%_1XCrKU0bQDr*|NAXTLqY&Bq}+b7(2 z&|v}k!5lvpb>mqir^uX>&MtG&2e8_UPT2kp5@2DCpDAg62Jl`6iZrFbEu=8g5+8au z)W(_Zr%9V1Yt zml7T3z^3bt%S%Xg!jmz>`&KYw&2uaQ`i%rVWOA?qdcXM?NGb)sj2Bo|f`Mzfzcdk= z9~NxD+vo>yAz}-Qao>{Yr3TF5YFa=%qDAX{rL@#w#@6d;zQ{M4%zpP0F?Y7+6Vfam5e6 z7Tx)55tQ`1Jfaphmo+wJzVal!(8ePVX%6EemD_1Tbtm0UYXBJPY14zY?=X>IMYb&4 z+j@pwi2;7(&R^ICK1OCp^D#P3ESrzPEUx(0@_mt{x4G>->b$Nsmmd}g`S%kq%Y{*< z{-`s%bm0L%&b^nm_d#D_pf951+=UAe@eP=-v$6^of;!BuUFmQ67uFea=|X1D*0>gA zxfWLXYj`wR5gu*}!pFuHe|2%W!qVu9JUFDv*x3k1pf#+5!AkM%nI{&f*Jd-~vnv&> z{#5=&Lq?ok$f6YZ30M060)Jr6EjWA<=9WNmf1!~$J8V;@djUlI$q69b{#h`}oy*hX zus`3hNbxn10jd%U?$EhloTsnG&3`%>CLUBB$TsY`87Ej=T3mXR@KO*Jna+DOd4cI| zbf6J?A<4hT{3>OQ$p`ZbOviCM)VS993V0Nwr6;`aLHB_IG~HM5Wr379*Si;`>9`R{ zhRaDd=ILDGxcR>z0py}hJ$EUZOfPb29<9w+!&g7gdpc>p4Vx=n72^RzXX&E6j+BC) zhZgC)59MLk7H|S&{Hdp3RDuc$SI+Ceb)cZU6xPW^D3kTe{V6p#>!0P|Qk9jZhuE-_C9!{s8;CpARA6}x( z{g{3TZ_Kj(CF0XwCd>a%vH4+#ffXYif~!Q2Uzzu=(q9mpxS=xlhRV<;FTl~+rfsC( z_MA4N)5#FxNsvp50$1aUv>DtL)jUb0 zau2HGd*t4}{e1rnTjFAyONFak`1Ii&O@P<9*aahNnO;X{ma-Zc@_7YmU z_$v5X1BNQay3m9BC%2asVuxC1LUBT))?lm6+hH)c@uD1-x*yPZ6`Yhc! zCpxQpx^EXWk28kzS&fLtof?= z6@<5KD~41R`xW4y3(-Eg;?>CzWtj1w6!Y`~EkfxVaZ$PwWaU?`uNdNFkcYCW$21?B zP8qxxNwmD4byR-CR6Wvs0|@VZfh)$>f+?^gb_Qw^V*B&?#@nyK1zxPgXG%ebF0a&cULMSPJ#fFNdbs)9$fB_fQ?9J)Vaiw%m9gTa+&XM( z-S4_dt{#p`ArMeaSWzlxj7{~n?pHUb^ExB{d)MvPP}+J}4fjJ&ejhF5>G)O|p7=9; zPp97hBefm%M3xpgV_^I;2F8;i7~jL&xdVBg>mxSvD~5=bFkZplY2WizbdP4hP!g!) z1Wn0^Bxs;Eux#@3gQEO5p@IhHpF5C&-Mxy7{RM0~3Cs_OrB?=lWbtH*f#sJx>Cd{7 zP3AL($M<8OT&_6QLr$stWy}8gIBQa|zvr}OK6bJ#$CS1Gm&pEv8Ef2!;yPx|7>5NG z2No=6vn=D@o&?;^LW_g5FF>eEbb3nXTcSl3t|_wROx6H5mIhL?%x7L;vSI*gfv?0! zBiuaXD_BG?mSespc@cV?w{LR}{dy{<%`WrPj($L`~d%UN&tB`l*sBzo{vo+-Cn7H(f-BR6U{<-E5T0w%jRR@7RIvY?U8vE9k zLyzKE3w9JRpPyB^S)TKdOTZL|;RGzy-(`NnA?q9(y3@tsD^Y_k1O^0izQYJ64-(1d zIb^j1liD@#<9EnKmd&7@WivixbGpNqUQ$Ts#X(6(XC2)_qjjeR=F66JpJf1Yx!>Fe z%dZr;vETe^J=m+?Jn#z^^ikgiW+2+nqvw5z&II_(eON%9pcOD(aEmRnG&u!22HWn% ze9><{3Ehcy1q8$SXo=!qjM)Kg#!>9{R)0ANvfhACwPyxCt!R6*@Kt#qmC6NL_pMFY>_e*~{BL&oHxsjnA*f%Nf}-a`Zh7#o-v< zG2fzJkp%So1!8frC>c;64s59&@q7f&sZ{xu#b3gfMD+-MeizqJju3xXE;@o`mZu#u z{ev0xTEt+C8aAIm&A<@uL^vc`O2$7*7&AOEgOO|GddrZ>auUbANcCh(BrL1(L#`lm z&#+o$h8M;~3^{o~X~QdlsfN8PtDnw#1q?MM4_6vipV17Ns?R$8p-if3e>|!i6{>Tm zxWFb@Gf+QG<(4!#S*||WmHs2!y&W2QTlpiEt+RUUzK%I^^d|JjdoB&SPV>bZ&1X8ye-wl#F9a~lF`u>*D^pYeT~IYmHqXQu@)_Ck zgjRddTf}{eq&?;%MJ?5bWph8n}H3iomsd+XFDAk?)PTn|FiTh zv%|xO`n|b`=|+sBpIx&B0PONDoS#HLaQ8W`Us-fmDtvDTVjcZp#5`}W_IBFX*)&G+ zRCOrcJ3eRAhZIXlM8wY6^r54_eFxS%DkkJJg}=J*N6*mzc6NzXJ9)4R-O|hM zW2d!Lg^_fx9otp{S<=#~F`SH=BVD^@(sm3T!>zuEp1`k7kNyM*nzmUH-Flb2YuhT6 zke_D-9di1Q9H#VNId6?0@0lAN-^rohwrc@ZvR+kyWI{mpjB`+P))xxUIC+JrUpY*3 z@%zu!XFF$$Ld{>M#UQWV_xw(dJ`m>!8op~ImZrvC^lfFZm6?F~+spbW)!gJ4u+O+ItoOK}SEjB@a70-f_dD9}@lA%FzOv%{I3a z4!FI+i!P*yc1p>k;e!wSrukNu0Sw;WdggZIF?9V91eMJvWgT{XWZV^sqIssl)&#jX zXdcF{ldQ(siO258(i8`Sim85VK70HavYV#LA7o({yY;NRa4(`9@v>ya z_8XqV2DeVNn|hy)xM8_s9yjbQ>riVfei%#NHatf&rmBOOBxpY4HJ{WfSZ#ffjs9V% zGy8yFR{;d6u4`*PRUgonczZ56;Q8i0hge6DN7Ji!bN;uH1G5uFTPe49-7x0XVd=3K zao87^N_KZ`EueVFVfQNR_K+xo>hC$T2_oG4^fD}C@bnw++D_~) zm*~M@IfweOO@Tij{A5Ue5VsIpm^|*&uzk>Ubxw-)6#{UKn*(NuLS47p?uB^#M2$;$h7c&Q{#C7UneC=1rF2REAtB`GL} zSOr=ivC8k%^JU@=?~7Ekdegs>m|z}P@^2{S@FmFL*I^Y_ZNh;~tbT3&r(rvT5o0Oh zaE2YM`5Pu8Sk+$kKPYnyeA_7nwg5QJ*!=apob08@pv(r;cKYvoemmhSqF91&GiyBb zJIt_;Q=rlRdKuu{gY(}nbZ*s9b8g$3!{kbG=MMG~Nb20d5(+wYu=XOq!?&p&%u3;I zweLl$`c4I*6F7Z|hKQycy6Eh^K!SCX%+Ob;$-I4^VQtX0A6NuHxDj{^=G2SJ{jKCF z*QZxFM97}8oI@~#ne{KyL;z)vz#H~j)le?UV1--l^>~GbBE8s&fAF}4SlOKjyYV@1 zccRa8k@o6vY~O4&{L{Zt1~P8r=ZdGBjz5}e8uTQwThs#c!zpn9tUbuBT);?L3N=R z+6oO2>eLF>I8qkPWAK1s$TFeK4XbRd?0Km!K4H?A#agn(twu-6%)#kmkIUg$(- zW=cX9TvkX+jEak<3J^hyn&sDJ&;CNg-djztJUZ3%p(kbZ1QrjYKfymJB!;eTls4?$ zy6sW41)`n(NOhKF%+x^_Vz#zW5>W$}PB~<-FN<~@eaDf!kM0W+7Z0}JHbTR)`#U=* zuI;U0haoD#u$LwDe5AX-!@z4`a147}&m0Xpd>j zsPubA>0yEMu)ujeQiu;RM*`)OUpUGqBTya=qnzQ8_ffSI>az@UjQh<)Ai5;59TM0! zc@KQTi^vzgI7T^f^n$~;ld&9@D+-^Cz5xUr?FT*yDoFmtk<4?o4ypDL3ygvOri0sB=7{b zul~bm{Avit(Pq$X5*oiMXl&!8C5JMsT?MiO5u_za>9h2Kw0#qr`uC2wz6jC|gwSTB zrD`YCXBkjP+f8y-VB0OQUFSXUH(unwi+#JpIL-lG{}zXLyE$EHF+YwYHOfrFL_Ow~ z55qB0a|@d{*xa&TE9QXjUW6}c)I3XTIN6(y`Iuh`WyM+4R(7F*UY6$}dKteF3L1!m zM|XK?=>|>aX7b+a)9s_naDVsfFT?0?s58ak-7nMRfqlY~B{+}W`fgVmmTJ>f+evrA z!U}VmxQAySnXP^Yr)?=~(6pURFiuQb?Y%)PQ~4Fl@`v&zCN*AUW1U|Sx=~Coa(H@) zOfc+a36awaTTvSJzJBy$hi^NT@^<5*52`UR7amn;DZM+WX2;Rfj%1dHXNZI3Iw;6X z{*m|@!}tX!;73|SG!YwN>hbno{6}J#7Q*o21PpV|?RyH$Ve+IIx?Uh;!xHRe6C-@< z25=6RcUu|fz~TbIAkhEfI=}TI2?oYT-rg}4hk^6yMou8S@kHq2ft3@MYnA_&3Cga+Cb{B1_jxKhU56XkMH~MaN&k)_`%ZHo%x?%6j zd`yK9#Jxm%LuPOp-9p4K)&&Ty%IY|O#IW~B&&RqI9XQiRzcnB(XFc{PQ}k7?G*F1| z-$A9d`ZvLNqwK?C{b|-k@d(#F8(t*sLdfF33bF8oXq~4*$^@JzCco6y)EWaV-yS!w-gV4X7 zf7|@@TWfcdUD->5UEa=?!M!Qo?vx(C274Q(UT3o08%XG?f~BVGF0HA@Ig55>adQ!K zmazFxVIKr%I7hz^b%9^-p>^v_y@oBnMn|);5-ryr?5b4%V}?t*sOEJCS@dHD&Dw>y zfoJXW5NS65cL?=9{pcSi#aR1~$5yyC%dp!^} z;{TQ-UFmaRqE7XsU@hH2l>|(|HZry@G3@ctRYw#bzURoL!v#om$x(98yGeMZ8;*{2 z9!92Z?1rOlyQrvX8&$z?I8u1r+c%PPgaj_I^Ux_$?>@=|8{I3IbL0+&D%ow|ezc8n z!=@0sqNw5`HjTEN5Vw-!BEh}o-&J!#9U9-5l2GvXVtD_ztYt#tXH?JdB}oLsGAz6Q z5<9#{--R@UQfJuneSTTg)*mK96M)G~D6nURT%slW549|54AbhEBGbOGrOa4_zI`^V z%hHma)jOd=%UP~)6^$r{oihI2oXOpi>V(m zrVTFpOWQBd79?17J7ZDoEcJ{g;ZiOzDR-L0uz+3gduljhh@Mbv4eMEw{(IPeLIwXY zQ$vQ}*jA%MUi8mQ%@76_VQD}=oD}`=0}Pg|^dDqkJ0`Xh*8D>lAN%Km?$NUutgT|e zKYj~l4a43as=?ARY+~5^FA`z}qW|qG!gUTgqQ2Mx8d_wLynNxY?%-e9yvr5Hb3H0| zD(zOg6PQ;LwzBdLk9x=FKKh?Hut6INk_WrlFYae=SW~??KyPqM1M|@$YF`GzuI*{~ zWMD!GY*&m}bkjRwe<$o8V0Y$aoM=1zZfcLFI|w7SMZe|HV}ZkdXa~&R3Tv#+%SFMy`jRmFSp}Sq z^b|+WGn8HDeTIY^{WJ;DCseoY(XWN7`SiMBiDei|k4}#%H3?!uA7{>$@`axFjqUKs zgp(rN_AuwQ8dV;6Qg$Y4hT1QDfEZ_Ddw@dCh4!HMexE|Qzh~H(dSLV_$Y6H$H1*18 z5?Pj7jYik)fn-crS8LuV)?C1t_nM7#Oy^8A%ojKyI#BQXlLD|0fZAJ)yRX8W_4um* z+P;o`>?30phpD-MwbD|R<~UxCbXKZ0Z}1q65~EdO5|o%kB_>IU(J3*>N=%9pld8n% zm6$0?%v2@DKr!Bf#uCGpHCPw%rW{~RIU3b2r7hlt$OhVACVm60A}Sdk|0TVxGaAvJ zsjQ0b&SI5jC~muuq*am<6f_c*Qb|fuOuJAjMM+9kO6iqSQ}AB;yC_ z$qL?+M?7aHZ?Nb{u60M)qt=2#kCt__3DIA>Y;e9jTWbAOc&GK|1Uuainfx|u$7Dipr~a|2`Y z)9il_fz|XbPGI5jtbWZ{G-JkmT{<09(Li{Q!uCs4ioO_f2iY(Xjm6jkazDav#wx$Q zIEy-6xuYfMNef~TOp8IH1YPpX)Ak+1Y{P$3kM1gDdC-IxD4PFr@hI)`3vZh?aw|1f z;-1uOM3U-F-Y@ih5-JmYe?V-7t-wnfiJ9K`D1JIm@d}QD3 zXj9KSxVvVi=DY?c9L^60W*PR}CXW@MOwM`SX+zu#6Lb{MzsY!>esb}0O{7v_Z|tN` z`QBhza0tE*hG$f6bxz7*Kjagf zf3BcN*!0(~A5gaC zU6wZdt|i{c2-(_J)x}EVH%&xTM6M+~id3YEwDw_C1)bUZvE@v4m{VI_O zO`>duX9rb>Kjyj>)5Wxeuls(gw(EZp237tK*(?h0w777mS9Wz#zGeQOi+q;_ZP>CH znRBoNIe7nl-J;U{(RtBUxS?0pwUpaLm@ z)VzQWp2z_Wex~^amSt4!p6$iIWbdffogB~yrhwR#Nk^IVAvm)`a6~2}Wy+vT3qp|Q zMnIa1pDgUo3+NNtfJq=Bp&Nl%SF+n&vY>Eiw;U^7%kRenH=SQ+#P8ZTU|_PnrjYrlc2FN<#@5^#7Jj z{C~6Bk2Jskz(V{Sdj%ngoNt;3-WYxI&%^)n$Thgqnw-s~r{L+RV@~&@r@+6=A5r4q zk0;CnAW=Z=oJUpJMOC8OTe6YkR1g0;_0gNv!%qfoj?8yFfsi?AXC+1M$T(gGgy2=4 zTsJs0WdWhj>xzJHA2{`q|8F_(VoS|@5ahVB0)4zdUzlj0R>k*GLLLlZ1Vq9lGwkg} zFZ5;gD)b+FGEf!5C7kto&zDdke%XL}X((YK8ibJ1U8{@$CZ(}_>tG!Of`*%xu7|9k)bZqUb=+W!Pz z$(*})y2H1P7~Ah=F)&tB3^BI<0TzROQi>tQhRlTo>7}vVR47T0;R)gyD?mh^BxN9c z3QtBM8&BiZ23;6S9T@aZYJ(1K&>d$Vk*POCrDh^4Pklt)Jm*cb@uYp`Nef`iLjsr_ z|4*7{zF9r~WWd3|Wk(j63gJno+RStuGhk*J7DQ(F3Ws<+fnrbEb*B!+gN(H;{mwbg zO90H9=5ha;o8ArL1ZOYwElva0=6p^A)^1kS%1~9VqoQI|OePWoDniGjxl4F^H9(`J}APM5InG%G4s%^G~DrOdD;*xFz-y z<&Gz`pqxTE=Z%bM54HDkwC zskh#w63CBV!4lP;tj)|o?93;F?#y)YWFyQr>^+D)i_oM+LkXLxNh>q+C|40Z{v%Li zVp|?jDYaifBdD;%>MjRt=!S{t<$NkgBZ1V?tf4<@6X zCFnuVEdQ(YvAc{urubjNhrG{%@Z}`6r;B3FXV}?A) z?{lEv2)gU(W{o8Q&nxlPFruL-Nd=pL=WU8|cw9FGPx0B86F&t~69?Lo!?y=Y4$t;ftrr?bI zQ2_Zf@4)Vtr~?Tv|8MD);p_hey)p!q4vc757ZOdo^H2osYNL;xi|E7Xci}_cSA>sI zI^8JRrT1QV&6D(!5$y^%(5Tzb$7|G!@IzsZdP;KUu(oIpZ0X*_o25Ar)hta!v(Ce( zJEB=S-mKBzQ?m#y|0#N9==zV+E5lD|7V)K*of)B1Q{!|YbFY8bIUq=m*#7U++YGv{ z*M`F+L+~isbEM}qWstdnH^q{)Se9Ve2+&b%0(CR-o zEg<~kFfVKiCiq__CA-a1DWw^$OB>yFjtz@fH#QX2xNEAOLabT}CY+%>($n~wYP^5x zUFD05?_OMZ*V3Z=^8Bj(8c>b?&|%VuF^^s)b>iv=Y;}*=)zZZ!`D7oH)S9Y>S~bf+ z(~(-^SzN?FVOc|dPjP+C8W)ctNNS^}u%^ELftuA1S?n%X%^JXZsx+UB5t2G#EupB! zt0d9Hs7`P_QeM}@OV7mgq)w_`Z*$kUQHW4Vr>ImBWvOvJ#EWK7bfW8##SM-|o-qTB zQR_VAb?fYn9(Pn+rQPYOQ!34*e5t%-d7Zmn)blipu3b+6MSE7v$djI7P}g|sY8Sih z>v%iJ`$Mf?TYxq;Ha76)s3nz@+;mr^lt{F@%OOd-h@NoM=?>nI{RXxy5iS(r0v5LS zoxyskUzr892c+bJP&Q{q1A z!vp&WO^V+N3^do2FK%$#oi(f7b+X{RQkEMbJ7b3(49HI4%Nn!1MMHIBs% zcBi|pCSi@k+)%5pTwVY5!o~)-v#}n1ioaoM)yzp?x>N)V`Bak5in?dS$;av?M$#fj zV%?g18XMOo)UC1BH0bKqEN`T~o?5r2e0^haUBeo?v%IEh3R0b5o&1Jce8r&DL{QS= z)ZBq4Z&SNkyDo2U27ZHhlV#* zNE0q$U26|TD=p)w+1#j2nwBTg^q|%e3M3rWL{@3va_~rEd47G}8qN^ppZq)`6Km?1 zHa6H3YU;}yn{+kx1&wZZ<2uBa*&Xhrn)>B+Yu36EUszv<9;O$M3mIbjx8BC-3aIRF zUS*}U4RPNs=kc#1qzQDy%TsF|K$XT;y@j8fQ zHolR8T%A*k3u_uy+w1Ew3_u-{{nW*&#gx0GrlFPuCF>&+`Z^ZPdWg}NL_5z~UgKP2 zM{lyMB;cpAtUOv2K$RH+NMloz9dnDc8=XX*uP?SVdR+D*d%e46g@~vAkBq+?@zgHj z;OWJzH_#QUAL0#QjY^V+K;0#1`qT;v6Qn#ACQ9pAm?Zsxg*vI1g&zg~%EFI>$x>=L zHTkXw9t2n3%BY)|?{a}jAY<{T10!XkDDoLfH5?^DzH-%U^)H_Obs_5#}pc8eoZgGRlOhei}-o$urTD}9~3o^jvc6u;>G=>^I0s2jhL8lei9gR-(*QXaC{!fY|E)9_9 z=jMTuQA0cJJQ(8vK#Kto#2~;PG5c%7 z|F&Q-E#8Qr>=+I~dZM$ZgvW;%96=0_*i7NkLgEZVB}h*+q$J9Op+JHO11CsNbdD6t z!G{ci!7vKa6P;;FI1>Tmg9y!Ik)qm4h9K%fQ3` zKtG!7^6;fA4o!5J8KhB$LyGhz;6_p-Rl2&opayaX{U9=Ofso6N+1{VLsh7yTO~qof*^@5M`9&PkVr(Uq)AXAx^h7jGkjDSJ}Ad$Inm%C8XeP9 zNdmpJd!qYiKz!$kuo5BlPde)Rto<{LMqk83^OVv*x^zBIWg`stk6NljJxioS>4z-T zp%11rNgPH0uSryVGC|qLP!@8Tq$<@hnE;H*EK$3Y;#5iW;r$dtXJQ=umERjpzajD6 zCc^I`B>L?~pTwh|6*$J5=ZU|soPH|lXQ*e1^l>m%N}EVGbIVNI{Xsj0rgd%#VRTD(dMHINK==rKdluKe$bmIm^W~p>h1xZ2?F(*imN5>J+}Al@I3KIKWbhozOSg$_o{p0o5Y^Hm~B}*&@6R zA&o&Jx+#{HPJNM{XnI(8*xDqe;vN-0e|G2Z32ysVO=(aCzeLT3#z2DH;SclJe!UeOCzhx zrGYi&k{(Yvo`rbY@GPh*mx}NVtSy)J-CZsj?<{|zne5W^>I=RPQ(W~O*!Ol45L7odK>w}x)g{NOha|i!&uR!R;`Zar$x0eqTrc} zhyHFrn2B)amWnIpr|z3dB<;c~=`6yvw^m8>ZZ45BzF8%;;9HOPRd`Cemq{77R7q}x zPa)ia@M%0{$afOo$M8OaClBSdJAda^RJz`FKqw0L(bn zv;mcHdk>45zS<=wR%GLRirQ$d!8d9{A}j}XC#~!m8VwCd&=VS~X$^r7)WeYA@pqD8 zkAX%-Rwq@;%uG>qU=(e!!&Egzp&e^a0#N~p+8sy(eR4Q`t^s|vA%>c}dbPdD?Gglc z0mH(YCNdDSCEyGN;l*JCGPReiE9Pbp$)y8*Xp*T#6Kr-j6^4-jv3E7qJnSL*7BzYv zsJF8sE@UdMYq8g|DG7ksM~R*6XTW7?Bd1PfovRK-Sl=|EDp=_7iR?=oZSGoLFVVTq z)l^@zftF;ShkSYx6u4@G^6x5?EZ}nXbtk=>&g=V|ciLSP} zH`Lo%RTKMd!J6oPL(T;19qP9-q)peA3$m)EmH0+KF68}4cDfZ*+T|cqWP-~917(uS z!N{v~IXGpJS`3M;cR4tDX+t6wi|08GHkh%&c1&KX2r_U`4I)$-h_7JNA+9F?R5gTq z@G-Siv^GY@)nN)j+@D4Ke<36pw{>yR70Wm)=E)t9s>+6Kgz#eQuK zb|e54;{FnvRR$aqBx5;IBupRIHyN%IH1k{#CN!bxs0C_CnJD;#A}vCeqzUkd!uyvL z#m+`r)(kQ_oeWPvsDb{HLnILG59JXP6zM+7q_`If-9zk=;Q1!16k}h=alw8XfFmw9^7{L%a`lWaXsw>m*Hd{nKfoMfHniIRPXCTLi#0k`8^Bj0Q!v z#3&_1L;CcV=&=T7Hca#nwM2)OC>@3l8`-;W`?W>X{8JxSa>JJlM*E z-|*l#4^)jT=Z!4T%wWYeH}k;CgC-6Wwee1mT7@E(?9Hiyqo|d!xdb7QD@Ei&V`DQh zDl<@ek%@6uY&L2yuW^dV#u+X)A59xPpWfU;`bC{P9%^ic;|)-<#lemC2syARO0Kxb zC57@$Rq}D{u1pp_gFcA-8xr4rB77Mk$-7nHgV?qEWb0CzW8=v?|9xS3M}oy#Q%ef6 zM0JAC#V27zG9hM#q-BDS<|Ks`!)Q;+=agk~KBv^n@j0byB*EueoPPyon0#h6u^^WR zD_Fod=_$ObQp$z?My@M3q)o;Zr0z%B)M-i@(-&!KkCL^$U}eXlBT2(N)kroHm*^K=FdS}xnw z=WRM6O1Z?9=! zTXFlStq^*z1HKrBfJ>Wn0=8P3PIhr_)}q#3568 zqi6Nnip9l^*o3{SVOmUt!!bp~*w)v%SFhE%;pKx>jSCrV>lz!~Yi+CH@j}`#;IpJ+ z;losF-{6YXpU+Yor$)8Gr6J_eK%!fk3vJXZ{Zqc7$<8Dni7X?MQr5T?^57Md8ZAv~ z_4K+1{cm^LYZKSF$q6B*;(CHRRe>8pJc7IyiN-aJ6%BPobxtrAn6jomaZRJ`A^ZB2 zHH~oYX=;QzuUpf|oo-@a51@FWAsV(zML^Lapzp`qv=GnbJDoKfglMIOL2#i5+#l&Y zL=i-b3^&S6SKwL+1y-2)oBpUU+boSNOc5x&8)YN^asiY6j3T@mA&s!%vMXO}EO@gx z%09Ob-)*OgrQLX*!83lcSgJ+b?v}jI{Sb~brSx)cDG)=T5d6ivg?z~*YD>~(vry}I zE-eDAD8gbDB&q)mr7^o7=D~R$%x-3p`8-(7gU5OBGadjKO_1|oKrX?fOvt2|k_8+F zKPJs6Pd3uaCge#qJDrVAuBDS`T!0+bh+F`K={+nfiQg9@9r46P^w&lY6a_&S8XkSf zm5W?ZyF)nP-Ywvi#JSu>?h=cTS{{)D8IVIuUKZ(~RUVRHxC{Y6Dym6jEazJBWiw5g zmq5b4!>l z_$0oc&w#xS-+c&=eZ52)!m}^CMA|m5MA}cV5dSKkKD_54|7N8BeY|Lp76A8`p)oeG z@G9xIEWBF!8w;C!hryI)8%qzvh*=rLfaX@KLAGf$e?3QI?RZLK2w1TSdVbW6@MI~naSQA124QN{_y8Bmp!k}ql@B|r^!nfF7-8!Yeh}t%31;9*!&lO~7 zh~9i@`8nymR9f}$iYiF5}D`s*f4GzW)J!TeVh9Zg~YKk-! zCX*PwR!wJDMt^x>G)UpkMEIl#w~J5~p;v?(Md%XYLn2%)!h1z%6JeXe3r?9_X#^Q27|>QSOqJ<}ds;^baJ6*1bOu@U?AQhESwPzkOV_B<(^q~{ z2wEhC4nwH18AjM9+dNH8jZU|{7A2u@!H1KGjlamfZK4_caN?j&)Q#&v2?qWdN+Iau z0l`EC_`3vh$J2kB?ZfCaEfOhLw4%n>v!ngvoX1~6h&*L&(S3Wyi+upZRk!o_Um}FU z^_lhoc7iG+c$9qr!Ue`{tZguZ0=X#rKM|RjXKJyKLcBx4cqG%v7;8{cgxZ0mdMjTs zq!mZ(aVb&^=?mfZJ`F`@#Yq>MC~{?*ipc(k$)6v);R1rucqXFLiuv|Zunga~gyXOP9%A;O=E zP$SI{oW#bvpi8cl4WdsN1AY_=@uJwkh#CW5m8ioeZskW6#Ey|!{8lj}i$R}=E3Hb9E6!CX-z7D-QC zDS!#hD3sFND<)MfuBdwO0*&#ccpOB+fXv|WmZ~c@Gf~vWgP-%@4?OsU2RChDS?=dS zCl3Hj4Dnz$+8r&ErbLZ-Qc|8m2h(44zQ`$Dh=rie6$=g85j!R&#)A+Na8Htg>8Kii zZS(|#GvY`MAu@sx8$n%E?rSIJ7BYmSF(gHB6Hr+YRc1yU(Lr+KRW$GE35ZWnM}!m! z4kK$(6yPaQVg()bM6~=~Aiigca1KI}-)A9auhhmIPkw7882iXLCx}b+Bt=INDl~`_ zqIIzZMUYSEF-XZP>oJw|S$a$@efA!MM2*v9lXZg@#E39_x)LPK3N#+}>vkSI$AiD{ zVA^-sxIiyp3dB2n0dBdOF*s%usTMJbE<5e^>s;h=0gnc}a7Tv;O58J)dn)X*a5ym6 z+sWs}r6LdjMIZ<8s>A*(oxfpvAok8;EXuIDGxr)j&&5Ba1l!s=hdZ^L1(?{}c1g7& ziC7;ieMxn9=#}XzMfp+&w%EzQL{DA^Lx38H`l2k&*i_9|Y6Ol{idTgXDypIbLhOZ| z2Vk~@ovvXw1Ce9>7DS?f% z6b6mGsuJ^=Ygg2E4$*{&PfwmXpXsN+ioiB88e8!t&auTAV+4cOEVg|_rHt0Pt)cdj zlQeJNgyDCE?IX-1v0nq=N{_~jy-&mXDZF6I&^eoT zBT$Ix=448bD9!Sug zEt$z~L8|7@QP*VrLirMTHSnpS65%?;Fz3(#;0)ocjHM9T6NF^sSenp53ai|1@ zWMVnnB~m59N1aMfpd@)9(WWF(^K1m>F**xdx<=HmmZnk3=*rcSkwAqi7gSd22A#{l z$LI`XaO@qxUg#$eH`bpR^p0bj{3b0e|N(ez%_ zy47?;NPbftUY4Tv=2-Un}GJ8arOyw!&eZd{$G{S;ioF47k&!ATY&qtJ@BU- zRg!XN#k1e4lFn?vnUuOJwgbQz&zP#DF*D-u>|9nQ`ERR|wrxZ`csfv5+MU1) zb!^6ah6Uxy5NE~rQowu+cWB@lT#d8J2uD!X*bbcWlsyidQE$m6_@vuVwjAeV?!Y_3 zc}Oq9GnFlrXb*rkinoc-4QkQ%R@Tv!1r(-9HV>~!!cL6Q*7s|(1cwY*IQh{ktFv)6 zqG{Ax5gqa~rUr!KnQR3&c7+mf$c7niKQ9_#!9;=; zI#V|i^mIx@(b5pFgHkYn_%w=Fx?a(OklqI)+n^}NbWfU65x*I>rJ=}pvS5k)!-!7- zJeI$L4i{*#6!jxE6|vL@w2nh`CYJVN5z(}KLNvJ?k0Y8+w1hM@KQwtV`%we<(ioIM z<}_LzBAzOwr7Mr!g$j*PxlyagO_#PQxp^#An1NUwU_cFLa4Bvc;uy*g(A`NadK>1` z1&B6KR&c8_TLX3m%ul&UG9oF;h9#PmhqNh5TA96u(Tl1niA*rlNj8)?i;l5ICNPde z!ZD~hE08cv0mW4_-Yt~43W5X zBb4R=J&S}jXgzFLh+l-vEunbPe8fMSidhHoxRc34H%mnf$u>k!Q-o(^q7ij$Mq)xS zoqz?9r@?6*h?t7K#t4hAK!>KI6rRG}nV1yVhS=od#X>#^rFRD+2^09+;<7L6Vnma0 z*vX=~u;k3DA|+`TqV+a9aAj+X~a(v@my6w0x2cWBH^0i_}YsoyBk?%#AM+! z0#oDnG0=*eJwKwt680lOU#uj+n;-BI5$;B8y zc4sqPS*6;F$X8hnL@#@B4IM-TdEv*{3pJ@sGDzbHX}5On&*-@OH~wGtz6U(2;_7>L zvq_d@AqfPHii#Q$1uY695~zWY5D;X^KY}6x1`LQ0$*#r%x^@AxUei)*TWo0yuePE?r@7wPq zf2zZ4ZT~U&C2Eg#So{yHem~=ThjkTvroRFHR9sUP5r3q5O5%50|FGlFe@w#}w!hc* z&;Gd%p9Fs@tU7PC-`}_WtA3&5@3#FnY~S@u!e6PX;g_fu>u2JBY?<&`9^d1PAFZx{ zU!q>L7Q<)wk8J;SiSM$qf2G53vi*qdzis=M|60f23V*7)O8rv&G3s4A{H!N*e3|WU zu>HffKN#XJ^Sv79lU(l2%HvLTC%IGHePBu9b|<^N?lkwgYO+di^fmTt?Av&4qqp(O z#y*V~G>&LYYaGy+-8iUmT;ur0g2s}@m8!CFY~%aZd)D8r<5s(M%xbet>u=Uyt-n}D ztv_4uT7R;RSbwzMvEH^0TZgQ-tT(Mz>kaFm^}2Pydd+&(`h&IKdd2#^^*d{y^|JMn zwb$B%FMV}byR8=MW9voh$kJJA_-(k{WEq5AxMDmng})0fcR5@QgjTo%a3|m@Z-)>L zH*E!kZ@3WL18~_8c54DS{0+As@1x*XLeSj>e;?e4Akx9*;MrG;ceqF4>H)J6;e#O1 zH^J?pkX;V^Qy@UY1#X2f4!7!h;ID*WzZ!xz{K`o`AItbvIsCx(M`8evi5%9zFP<{yY;~@0!g8;vNKI&h9 z!|sS1j52j0{Ry}^NIMO13h-qJ$5~sgSR1Xl&gfwRLFHJ?1VY=3rA(M{CysQ}O6(%V z)lE+Wh=gQrHBuH410bIY%NB+#J2JdN3Ji&tw{=T`drYwA$eL0+ji;q0g$S2U0(W8p zkwI~H6iiG-0(GlAS+JyQ-n4uL7&n(Dn3Q2#n~;~*z^W7|j)c3r)eQA0nx>E34@&XE zNto0vA&ZV{Pp905^WZQWcO*I-BQ2|5!Rs2Af={|(N50+<%9)76?6;IHFIs^HcQE#- zcCi{{abZg11o<@w9s$4W?-zl|nB(-cg zB`>7zod6fBZF5jC*nkA*FSW@YkUdF|i^c9_F9Xf3(%Fr6$3f8IO-{Hb&JHL=Ba$}1 zs`kyDrP6gqa%YlLrfxNou>|&|d5m05>V|6N(FLF?|H2ix*7CL_RR$riM;YZ}Y8+sk zUduHQZ{KvQlv(KO`M4okl6Y0hH2a;CM0Oc);<5@dMW=mxbo51{RRUNIFI_k#*cvtO zCXg_|Z~=wfFt)JDZUS9Vo_S7SO!5Z%(`d`ttSOPT2$b*3wK2Ff6lwi*%atwH-1>iy zOZSH7U+2>GccVCZuq76!N8fduG`^TiU!pc)=1SwS%ChCWE98{Da*L<~dpmxf&=vMv z`vnK-dHg(Halzx~&N{@ct`Xsd$MzGhPH~FWjlyLtVuGxgkBu*mjR_+6^ha{tRs}Iu z)~jgXC4-AckgE=mVNn_6YAF(R%S)g4#4*xSCc8#ajook3!bS6gO9Nlb90r!z>38;;{eJR zi5)4proC!m9ml{`ipqK)(^D^!ctdl-V9lrA2KQNsz;?CTA7+8M)R*yeiVWQ>M*NVu zT6K0$sLzFW8?0`IdgBHwEX>z*%kc}vV0)A&h{2OopgWE)Vy+ISNRWXiscqeHbe-Ot z7|qaF&Ha3J)+93lDCIY;s<8LfC!A!Rrb6T1s$Q>PdvpvVfP=j_o4Rs zZ;`-J+MA`lRoZ(*doOA4eeDhWPf3ucy#?BfXz$nBYt^2my$iQWg6Z13LwgTvZ?E<` zw0GLm0y$25H)(I3_I|3p-)Zk7?G4-}3C3#g2JMBl_cQU5z6repjDojo?@jG}ti98J zBXMK2H(Psk+WUd_UeMm(wAbfJNpP8XkWgiO)ZwTPc8NaEwrPSLfYa9Y79LMaS0lC( z`j+^9#Bpl90-^AY9Xsm;c5&kXfC9!s*ut~-)2wY!v>X5u{4k~@3wwjj-l4NLA)8E4 z0wL%u%j+yC$sn?^l{*S9E)#&H>05rtOE}0H0k8+o{@HkZS}@f^jl2_EkG&jkvca?p znpxKL3YMm^Ia$^qyZRnkrfVP>{q`oH)d3YkV(GbNadrjmE!bY}kacdq5&KSi3)h;5 zCQL*Y1H*L2#+Y`B;zu?3_FkQZ{km?rGPp8}+q@$>sMmYB2)D;wI#9Ov0+t@9eJ8S} zUZHy4r2|ELFW9=>r9(cls@KX!FU#c?AE@E;Z9S?w(78|7(XK>4sj>;M$H51?HFNyl zC9AR?B3WY(wCQnskM<5h_ljVQ*lIc1GGHyR{c4TF81N*H1838f*{wo$*v0JDVZQh+ zO?$V}@^@p;7?W}UgJ{Zt2D_)-(Zp}16090v*nI5vqa+%+-LD^xDScvWl|U4ReT4Xqmf3{K*wmB|cA z3)W0F0Dm4h9xCO}-ACf}nNki$M!Fp~Z!cuD@(ba5y46=m`3RVbmF;|7am2+Af18k} z3w%PZKb46o?lMorHz7W$PuawUcPzx0jJQwDQ`9gUKzPc6J9rCGp9ObJTYe|6CGsw~ zqh$W#+J#lA3+^bbfdZ;~4Ix`R3w&uBUt!fPx<`r7hlrE~3n^A7FIWiiIdy?v{CgMR z%o4w`)C1WZCP|Oss&x?w>V;C)#pOdIlxV>NlFzLyc*=rX%N8%CSGs&r03KA-fo{1p z0UY;EO8s^75ECvX!d<6_5trec!YRT&y>@sAmUnl3cE-AUcm5&k7xPrpj7MtB1dQoO z%a+f14#aV~)7RKG4(M;?hykT5YKRzb#_e?%TpnHB;N^hwB?Q4-4J=nbP~aiwBUg1zXN zuDZB)#QwC;e0?di(tjt(SGWS@SrETXuADcTiHNkcSY;-65IWJbI2U{vs&0ZKh z0CLZF66cQYcL;g6#_T88tb@Aa6Kt_QqU|Ri|5)2kj`-m$)mr~w+fQa=PUvnw>G=TL z#=u#B65FwNB-&5zIR?8)xXiyM+D~qHi908W_LD<1D|^^a`k%noG4RrUvJvr){bbz{ zZ9iEBy!j@!tpA8DTKJCrq(6f9?_i7eCvZQ4Ec71`EPjkR6Yn`ch13G~(4*Muh1=M- zQq{CU=HCXK`;ZTCk9iqz2=Dkg+Uh7^Gb&XzTr2X3*=Dw4M0a3-?+5GdgwOGuBYg+@ zfk}jL;r)on(x!;^d}bf;=i#vfh=c(k7dg|&Gm*FwNDoS|a1nAnTKkcMz7Y$avP^c3 zCAc*fJR_(rl*qQ;L~vS>AhGT0o<->47_cxXpxy}7M-c48WwN~1+6h0fyh0sCxED4; za*ZQk`Oyp$VX<$WaHcsfsma;&l7$6!8V6RNF^-3D&c!DLt3692%xOSxQFNA+?*nuJ zuCHyOq{Tb{%hU$n%exKiw&djL(P4U8wc)(*`#6TGEEN;`;QMGAYxf7kIh->E7)WQZ z74Sl_G#kF;R2mSwIH!*hHpLGfg^#ug+#vX{*$gZlImr$=TT)W&#%8J=b`JcEB50fw z+k_dNizxlQ7~7zcfrAkkwQr5XeICLG+6|*GN!J=*`TiXfo)3UCitMc?cg&GQ9Z0OKIw%OmbZ@`8wE;!EYZw!KIg;!`>!95F$vwVc5GOTVf?Zm3qSEyq6 z{ltzfdbS23lW-u?51$rpP!rjfin|cX{a_XXp>kHz2A&6>xgl6gg8c&Lv# z;Uyc>4-B!yLeiFlVsj(HA4fbCwPN-s@y;BDFt$<%en0({z$vsY#BKpXIKi!f-&e=j zRANWeON19)V8-rnljjsHd#tm-Tz0?eBy?75AUI_UZ6T z;g_fb`5l0jqiaC!^$li23$qBY9L7sh8*c}xm?LE zx2wPFD_|yiPrfZ-3s>aJ2lN(bS zX$aOAreJxE8I75ZS&jb2GaAotJhSmE7=q=(H0=7u3mb< z**FSDVlx{1H|8YGYD{e$-Z-ssOykwIu~@sc%WAfES}#~l*7Md5>pAOL>ltf1jKh9w zZL^-Xwp#xQqp&SjC(Od0vYxblV>MczSx;EMwtfY(FfZol0Or>{O_&#(ai#(80l33( zU2ubTVeW;if~$u+45xO()C$hG2e5FD!4!(N>%5pRDm}U z4!05RQMfH|L*D`(xD9aGhal&`FN6OOpWzhV*CQVfV2k0(;M8H12kr=*7cLWS6x=wt z(A%i@JE$w17qUkc+?b!Ct&VuW}b0+*f-$UDNfXN!(JMr%Q1h{^Wc0eB0uObfZ+l00~ zfp#lH_^uAb{{{7hyfOmt+mJT94Kg3X=e&n-xW|yT3Hikf=%W=SydIWoT)}^Vaonn}oB+1fB~@&8l+woyFB}X`6r6PVv2?)~jUm87 zmZD_=*BqzZ>`utOmo^%%Hh|oHcJ?xFI}O~Uovst|mJhNe+M*?7BHyR`61Hf=)F$Md zuJZrRCA2e)fiR|1g_7d#eM{_LH>M~Kdt6==NX#VDUgXCH)UJ{i*2ysDZ!1_ zx>w0LvVaC6vQ1c&Do#;iF9i@>v#JFT-f>5!lcAG~g#9lh{)!s)cO=$g6shoLn4`sR zy6ax!;c5&T#;3vc$C#W__Mo6^)B%h%9IB?|7-cvdxjlN(9%l*HmR+K_2JO{IE`bDj z3F_m|(Hx8xS!K(0d1z9U0H*lCG?#KuD!{1Yq67jSC1gH27L(J}k!Su(L|%S^3?vUu zgYTrB8rfH69>{{|&0b$vi;o@E*5X=SluxqkMu%CCm9u=>T#Y0B#1GJT_Jw9(R=8Hc zY3Xh$duzOlR1?M<%+%&{1?(j3(M1=@8o#GCTSCi`!p8j>*u*ekV)WybT9Fl_akeB3 zF{a0wWD=>nSRF-TuWiZmU!+cnep6g`k$x9*)>}ju(VOvBLTT+e<=-&g;?(^G##@QG zu`grh6g2gvCc_KkEoT}MdhgNlLqx06!~QA(Iloap^yjlwe{H2@4$-b*z%ogB7JOTDSlnd4g5KJ5-(J=>V z8*E*T1!Y#Zy(}q&t*#~_EKse-A;7MO(8}y|mi-b}tOWEy1miC*N0beM1qQk!SP(7* zguTFtDY3IAXI-;V`krv7+1rD$rjjb#TB=?U>rcB9;eOCiPlS%dBxtyPpM!~{Cs>M} zT5JuOhbcPSh-kN=gfI{vKxsI1C=>#Tn(^u^tE)&CRE`Va4q^{f2Q zK%BLyF~(l0GjW3-j7RfPWm5~EX8^}ySY@aH8VKLmSTVn*dhyLRXBe$m?H&ubjYt@s z0!6Tcm3jQpBQ|!=6;nboOqkNI_&#%Dp6vWyc_=mzk!EOXB5mZng}Wf$tWfvC{SfXa za9aTA1uL%qI&2}}p2as1zGxp~+_{jwu?GI%-N!g`PEXqSe`O!z0kqAR*~b_+xEtL) zhE7PNyDjJ%(%mumq&u8s#M@G2fN$Q4U0syy*rGkiE*o9_g=EKm>`8VB$w)$qG{f)g z#^*`8q9D>^>eghZHc948t$#J|-~-NwD%2H+p)`iOAMROT-;c5J-$i#LFxI>Cr2px3 zw-IIjGW%y=mhR>Zs8kP}S*Zq{jxl^1?&vGI5eO zA+3Fa$UZnI`T~A}gDJQ?87)oKXG$#ta8?Ld&=i!F6R>n!o?Rx5+Yd59aA_4!hS>#> zq^`uIZm6^as5lmL_=Hz&j}K)hu0W5CJQD zi_n6v0QU~Dz}(i?2HsR&CE&G1{J6Wdy0x6(_C;}vF*?@KVup{7BTvA3fVt>yCetAM z>A_U+fzsyzjN-kkJ$Puz zu{O@YzBwFzAz0c#d`p%?xfBz?u6q#x?FGMm-Hde>MRDVQ`G3Z? z-;oOSJRE<0{{-6t_@g@J_sScOj4to-eWFz<3zYZ#1*&z(0u?xKf#Uaxj*cn+(%&cA zm%KoDV{7gLHKyMJ^$^mkfeX~oLEsO=a9hpr1*!?pt1erh23@#7h2XD&(?5Jnkp}SV z@z(988xE8Q5v;G6;mKAo5DMC`ShiuK+jHDY+kjwfTH_RK@$x`z4V7O)W}6V6CgJu< zR5E;2LT5k$=v=r1gZV*dJ~EqIZU1@O|IGF;dRNC^2Y)K=?hf1UjkceG?qK?}G0(Cf zQ*MJshU&5zssk;MaGDym<8T{?BvD3WYsOPFP21(~MUzyf0%uq16TkQ0n;v;V`PCZY5+Ys9_x4778colS|YQlt`{?EMEpSU)(9V zgc|ZBWIghUJF_dra3yBr#zhgN87d3Vo2BSY=V+lj5mJu2pg_VIE>$(a-Ip9Q+WeZc zQB~iqAUCOett)r$wo0pLo}oB9syD z%~$h)Vm+n+2MsunO2JMJ&i2y=g=gfpAh)FeqjSIj1qm(#tIE4-c_vO@f5US50oCP= zA*78f&i?6B81=~UW&qH|qw1q@jRe}0Hztvy<|CfYfuWzKQl`(Zy>(#~tyn^cq;mie zA4*qV+#*%YZ?+T10z_|%D+oZqcGF97clScctd_+s1JtfKC>FP`eSXWQk}gKi;vmj- z+N;stgW7vqd+%t^`&WUySbNj8w@iEA(%#eJv4!z_;BSdzV#Kiu37c!`@JHbf2i(8< zZ6rY+|IHj+?iaV)h1`cDCojNos}m!xhoLNY8yM_Eu&?Mkob@VQykM!GcX?cdt%9q< zV)s_s@Y#Y!tHp@N4$cv9Y*5@0LsQmKp#~uwH&o$L4*;_D2O}V@h$*KnzD?|r7@CVv z7!ob5(snVVpI@UjX!-Ikd``0$v}wQ0_V2O%U)cT|wx5DZ5gxLHT)oMxMyU|i(LL4$ ztbcSm_OiH8;p(#T==7K&P~G4-3(SI|<;A4IqC%ukNbHEXw3F4F>M3kdMZ!WFdv zTLUVspJaE3D-neowkijZ0EhJJ9QZE)Jwi~nw~hLgpqHv6=gWejw)@s1r>2BjxN&1u zfR*N@SAl4q?T^Iw0zO2Aa?!5cPkwhpN;*%Cbq0q4uY?ADC7usRSMHwy6tmbq?R})Z z>~;wpsl7_=t~xEy>qA*WfLWOiN*02I$3#d+ss>F~H{M(OA@p&7Y-hd2Vg0`(Cfj*ss7#0tVA zs$_&GdaZJ*O)5;kzgLK?csdpBI$`509jjC9z-!lql`0oxoefu5*sXPhyEZn7VSHg{lD}*b7y9sV7++A?%;JyvF366E`ekfoM!s`&u zA2(}O{T=Lu&i++`!R*8PhWB;YR`_cWx96h#1Q}=x^r}Zr=Bwjyhw;20PJNuOszRWR zp_OV6-1-^NA6`TI4#ODJt0wOA zvwd(;>f*0qZj=pw*>FN2Zc~&%lo82UzIg~uw?plsF}MoButZ*7V}~(!h=Tw{Smo^a zd2lI$as6oxFY=M`XBW0cP~b}FTAbZL7zcR(UO%)34!A(U#UlnDD%%>whVovm(g;jbKXZRx9XD0 zAie#oLNI^RKGgnyz^9(_zf-sT|MxUtn~Aw6{`=PWpqAQ*zTp)eQ*eWpbmsu|D1+pt zT05w}dK^LN-1M|VlGM}a!(*`g{j>Nb>Iy&{gGRY5`t8pI@)+JTBakKr6NMX+O_ccM zQoQaZaA1=XVdX|Bm=I2IR8;!-Rs8p#Dc$ufJ*lymoDoV|jeY|(p$eqxUX`DESn!*) z8Ef@-J5z1nS|i`@^qtUj&s_N{K8XfKSmi%-_}%bFA^cxif0(7t{K1I>4GBRCTuJLT z5^o9Q0z}8eT^1;5nAEo8=jj4%;7??@*aP>#>YMB3B3}FZsTj0mqMVa_xZE1{OiOVp zRrnt_A2>4&h!2l`h*flMoTJk81=PiN3iDScJy~`)uxoJ961EJXA>%fVeFi1Qw-cc4YSw57$oxq9I)m>IaBSbkPdrY6!?_88F0wrFWT$#vAkWbz1i9eY40c6+pE0~ zw0BOYBq-M2a_ymkIFIL)RjLDUiK440_=77JQY09R*sdNBeYC<1Qi4tM7U({znjkiq z(IgB4(kn)QMd#$kW4Sh5bVv{%#zSw55iz&1NswS;P%Qo&ba=#CBW+48Go}iiK$Cg} z!XA}Pmo}kVK6HK}qP_`~Ym==7(v6m1XV^ahPUzSkPrX!v-=~+6Y!4L{ad7X|6)?NH z_Gs?~VW#E_F&==MztP3KAZN!tqSzzhcYq@1DsVdj0=>d&>W(&t%5W z`Mo_KKpQa}^0s;reZ-yOPvO6Wo#F|f(l1qu#4l41iC?Y`iVr~%ef$#kiHF0-2Yl5s zd7rJW2T{Ln)dMp=4kLyM)V4uLFmOkztGbTr$}`HAaz1j)fC)D=5R=S zw?00ZTmcWmYJxz7CTru>u=+e1`Q?Sm^BKN>T7Yfb=nb5%L>z8)neqV$x6uNq6g$4y zN{@YXya)6|l?~{=1H*xnRxB(o-Na!uaC`YK4GVRd8pQlyIJ+>gP~(W55$TcN zP?Za4ub6m3jpE#o)&p*$V$b3OkXWU3uf&%t*Trf$a)P}sn*jQ5r_p<4r8w48d+BQO zgkJ4XV8(qAX;^zLROG`5a8jHhAcDbF`>-QrOUP(ydt#-QuYP9xKeqkv+5R_e|32Hl z2R_g|fI7tgCRwm``5Zb@`23v@pX-s0C~N)KznqQL|L05p{#o(fcu{e=`4&M zIq^w*EML)d+!wi6lPBp2H#VrVZGICM6~}tm_o-hDLUQ3S?P28rT3wIi@V07?8Dbu# zt-;bn%7u859#;U-JOF|T5+{3DnJ*QE17eNsx&;?zzHjLwnPX#+4=2p;hbO6EcGt@S?*bCE!>ac_5tv}a}Dmf>HogD zxE^Jueb=M#zvzC1FKgd5Zyxl3aQdDE_7tyE+J*=Ew7Anhh^V~bPg{AB6!gvy<3Vxc zR(<$wq6rJY-0j3fl2TN*IIz?SAv*c4)Xggv*Ki8M`-tKRstJBNZWF*ZptIYK4b9(x zBslf|4L+AU86X+@#kL=^{SqvdcxabKVN2)ZNGV*`T&O?cXW4@xZi2!02_pNEMrR64JTV)oKKCO~ZOXZdaKQH6U|)6CmZ2aX8~)-(c^CO7j8q z!k0)$RVm~Ntt53rLt2A$nXwG@g5;D1rzN@m%~ zF`h&!Kc0enND%g)cKDy+PeS++b5g=QOuhV|v|=?1&e6*khqPXP)neF6rsJD+aPw}h zR3iYRf3SHP^;LWd32&M5!7i<+oEcomE1ISKs18V%I7dE|(KQ0W_^gm^5eQf|vrp~V_R-M(|#u7Hpy(W^z#uDis+o>c12*4y0uM(1Q z>PTfWo2{p2A^{OELmpIvF@jCW;B5=>HSjodqi&EFN!zCu)-AjlcdWz)LpQLY$_s>E zr)5tGhuV-fQcv9yB&AIsl2{UEKD?vu{Do3uw6-75jcA8s@c-)7;gkB{Tsh!88HEY7 z*4?h2dq57Y?YbGf`>i7N?77AAeMQ>vZ5dpwhF8Hp7k>Qr71s|f?(u!a0MgUGxf1Y0 z;kv-O66b+@l!yb471KXl(8hp#ye0B>sXH&VaE2i34f_a^f2!u~+?L?LoQ9xo?4F{8 zUvP?u0YG+D8AAHu(@~3W!#0Q}ImD3EsqnzQ3(c&s@4;;wj)^(&k|h)YlyT+>82fj^ zB7N5m_js!i+8;K_0W5k*mi8*pMpBJf=>I@oyt#u5AV#DsKYEDM(K`4XFu#J&0rR@; z`_lCLMB86!`;XZEyYQ#tq}sXY`KhYES|UDoW76XW*l5LG=`lUY?YhoU`kvF%MT)f0 za{whI<3YkB7_VMEh-1dhE*X{45zCvhAMFj!oe0-s4jZj}UnW_%8SHA+xTu#xb<3=m zQ}aXBU=VFDqqkeFuTj~(!S$X2%?PRX)Td*)8XPaBTw&ge5OOyN;KT&`CWKGD$%Wpy+3L%xi15g4x%>jKGxpp5|?z920=+|e$a~q z06Q?b<%um|^D-+xt{hApFKvLcS#)s?f%xvy2AG;f7Y7xh5;iJr7)_-{>)JzsuWZhr zU9G}n(pFu#dH?m*>fSL|kHJ@Zb4txU<;N`l=1p^}m4R;>y^6QBO+nAdrW=|YT{ko% zeTDIs(P1>3PobsOGzBtC%@>)Z!rWSM%$j>cbA|aG{a`ee8^>psR?Lb_?=n6?nj5`H zwn`^Er_}rglNp6RxGw*!3bS7+>>@f{XEo)w4~z?brNjxoY3>cPZ`|os>wCkS8^t@i z8{U-J4uS-{yDOdGC|4B^I%~HnB=J6p0^g%!f0qw~nn-)cO zBAmU1whqBVnU*O2p@BX$T1PgOSI^DBH80kPs>tBAhk{u~%l0}1n0G$ZX0_ELMR=uG z1$;(}QR+1pAh7)oCb}w`Xk=5Qu(P53gpp)^ucpm1%1<;DcK-GO;&^%^-kV3hTHyyvns74ZMo}^ z>wD4Yg%W+j{Kq$;Q7Y^*{|=vEpJC^&{jYOxF#d95vugA}w#JXxm*EQDrSP3F&QZ|A z;eRZQq+_Kgl%2>nCzMd=?6V z$itxKx2FqR^JxS!eSCyQN;k-e!9n z>1j5aD%vh=gS+A4+X+|FBP15a_8g4AxxIv4hA^~Wc-N8AijjLG(~n1{n~~{9Bh!y? zERt%zmF2W$L-}zu=CaQ$%P2e^DePz|Jdsu2P;MgdF0}A$qtFCdwG?(`H57LEm$(|r zj~XrJ#5Q*MQMBZd&0}t;R_5ghFv^cqnkOE{!}Oz1x;8hCz=yZq{B65s?n5=B4Y2`P zHxwSx&3xuJG|9XaWAW`>TrR(Jv_?Wrxw)!d>~vy9<}8@o0?HVv$%+#6ZH z9!<%PFb9GWtZfQR(NUp?5bj^nB~dG89kZ5n$m30T{5cvXKXA*E6B05VAz)UOe6fQj zBB*_GFNiLVAv!IJ=o~whMC%V;gDFn=>s+TgUjLAk*! zFqO^OL|$Q@0nF`gG(I@(dZuX|c@q45N?ECSw@&g^^EM#K^W+9cZO%j@^Zf6&S$?y+ z_?WdQPl_Jw@6@5x-0Vk&9qoNU9$y3LgG;v%wagO;`#!?fHf4OLX-!iwXHj_kCoiD} z7@4mb$z6D~26p2A4b4)1GI~oA|G982Tpg9!-t37j;@$!`I97Leh;h;whux4j0F?bbR z3{Nrf{4f!ZTjOacb^R7Kx(9fUZa5X5@UBh{E41kGsh~Dx6qO}S%Juq3QzbkdAKn;L0FxB^Cvfc4yX=7eI*LD#A5)iItRQ$Q2Ef~GMajechKdf=m!)K%CjOwWmIe>L(D_nPd$e5-g zRkyQ9?b}h&}-y(nOpt< zOs&R8Ac}s*N2TUqj3F859~v!lZ@7{30R|p&ieNJD&@#=I3d}vNAj?Qnx%mWVW}`E* z($g@#(|7~$eBT1c zdku-seC&O46HeE{!)5`)P2OwQ9$Gc9VB|^2CA-Z({``H*EJ8_&t_{A2_ltBA8=ef< zG77xNVtR3~@5om{(7!?oV@&&aa}xN6-~1_f0a)x1W1q-5Phb{CsrwoQ9wR%~@T>=D z+7fq#nIdp&t)OS^$>6KT?(5l#>y4?|k>YG)sy9;XHKzI^#Xe(dW~4aNn3@wQ&M~GA ziWCnrrVfo14>hI^j}#9#rjCddk1(c=iWHBMGWx5xoC${b*u@{9ElW)=hO*Io1KV3< zX)UgzWJ%`bi`pz?N#6gKSq(Eic6Cj{V)pH14RUD{l+l1GKiC%CvFrEZm&HrzbwyWo;Wlii-OHqx#6POLRCO?a)DzGx}VXxn>dn-!Pq^~|-e&Q;T``Pvc+ zWRDc1pu}xHpZJbmLz%qjKXdj{45<$=zhMFbF@LzQ&5GQaZ|q)kD3D=3gvhFI(hx|6 zclnInB)}+rG@G|msBAF?4ypt{SBpgoPr)=8Dael>?=|_D`!lfGD>Ygc?ReWVUjQhE zxNZmG3A4aWT0^V7D%cN#`=T9xw9JhFLXo%}d`9`sjzsx=Mt*+A)1muO zx>(DuN1%~uJ-7v-oPU7MdBu>-jC(bU+%AYJUksBbFtPq|n(h2s+pPL>3?Lcck7Ee8 z6pV2}C|>_AZnw_7>NAY+NNw?Ua3qq^tPTY12Y>nQ7(6tGR$B_qdnJ&>HE%PQvuI!Q zHiXNfx~SOvR#ltzWY_uRO?TjN&7r$f@%Rz?Q~E*{Pr^p3PzH8J<{WfJ?Jd$7R~s!E zTm5tDOXnE=d6Ck2cnQ>(1}YkArZudb_7nW(;<>6}WtBV|{$it`nAGNFPa91}zJ9ao zkFIAY=A(oDVws;J58aE9J5k&{#tRRR+&OF~l>zdQ*ReX;c!7veGt_Gq=*{@BVO%aV zW6$`&@A7u8O38zaba(c!{l>Ih?=YZw(EKIZ4J^_PmRpc%l;wJCFyGz%1U?fG1+2M2Mlm4NQl!?K zSL+RWM>e$-WV_n4@f{@yK1u`_1pv&RtIfRC$1~Qr2*HWD1Ko?JJcF$tk1tv99c|~*m{3}XO9#6^ zbu)FKd1Nm$JxYBDyq3aF!RbE{Deo}+oe?T5j{2*oorCG8?P^YiPfa{#g;sZ>h#|Ci zL*W6)oX7p<a5mNCQQ^EriNtQmx6Uy@}$ zj%HZ&a}~n6%IW7TzJ35D&RFva{%@WHXmGI-?`EbmDk+d;Jn(Bo6+qZ{Lqg5To8QL@ z0fj!EhZ%HDJ!0`3+Qv)dG27yqDC*EoHF!2hNuhTZh%_{}-1K2A&4xf;YM`?Uk1yJ> z%`$Uzo%2bUoQxX^E%ZgJ1A(46d2<^&5Zr7K6jKd_t>%P&(w=>d^5ar$bJR)8ntW}> zS}IZ`BwXiJclXtiFC&uevD#FD0p(b_n1Aom#SjuQ5n^`;c+4#FL`)^u+07Ts0>7o$ zZ;rdE&3Z(d=5wbtUf=XSm}MXoyA`h#UfQr1X_p3f<($ zy%+%FjOkwEjL40qG20Wl@whSF7ny#-nBEnc-Vqu<2EE|Uc<6=t>75PJ&6(kM?hA zAUF_fa#0{un0+Nt#&??Ap&c~;{Jvg-gROEwSvoV~$u&H=R*lCRVJ_jwp+fg`$ZGeZ z$}QnNW<2M61bNMt?88pekZ-PY_4UI5|A{7=9}Qm|;nlGI2s`chnaGTHnqXO-6W zGZ74(j5&-mKG9P@@ZpOX?I~pL&{>E~1DsHFLLfk5V?{RVd|`znTKSFF?9u4e*v!6k1o|Ez(O>T?_`gdWoZ}@t?d_TP~$c8Hw5hrTNYLzTtCbND&*dtj&&&N=*jyi z_!=q>0+D%{^B3A$cfSf=%|;)wc_`|7{ji;S#!DWBx7FwB?$|uMM^wfGdr+Cp6d?Wb zKVxhC4^XLwvRp6J1s-z&+q=`rVn}%WIDq1c4Z-C%lfH_6+;8+{rkfdMx;kxqp>0H@ zg6S>EBu^JsWmz^JP>v3COKarSWd~+JJidgQ;o1HJVuAz9vN%aqN>o`W}Tcoe{e8eKtgpM6_{xp)a}x65?Qc? zLfamcb{TAAH=iFTZK!ce8$Jiv_R)qf*O($pu>KlF%f|>lS3h5YX3lv2;O0#?fwCcA zed@ztfBTwaR$Sm*3EYD~heND=ONtphj|;mJPf2`*L?Zc{Wp0@Zy~>T|XW)BAr&J_T zHxG+G-C7NPXAa9=w4>EB*8y5ncm2dU?L+K_h2VbiV4I3|3*6jzIJ=VrGmI}9hI2HIMv(3 zHjuVW+V1P0VoH?7e^j2}4jPth5m}0sSFgN;Yws)3FsdqYAw9Cu&X(lCz@|daYtC?O z1N0&wkHeOE4cgLP$3jP8uW#EbFp$HP#@3#TC*u_qtm}HLCVqz=iK270VM(NHRDZV2 z6F2mRD&0l}#!NI1-2^n-Ka58M1*1`u&)yYv;0xD_2zLg8!%frt`V=HeJ zxWj;BGNdWaPnub2)cBKbpJV(!Qho$`D%kUg_{)s)qY*#$5jtbU4_N>jBW#{o7`aXp zwx8BEyjqstWbtM$*3V`w{@Fqd`mfZU5WyG0mLWif>L5Lp*c>A`MP>z(+A0joe)48Z zvq8^OuJ(&{d}tF|1QXzy_FP+%ZS-Z1i*{_c%mru^EUz#xQ&%fAbG)>^&>DHDrSN0W zB!?k5elir0GU7sY$>{Qvm;k6Qh|%p?c92hkG7(g6{t&YgMA*Q^PHU!wRt8is+Zj(;nDl0UEZVjd3azq|b2qx` z3qN*J6oyuRtO7SNU0^np1y8!nk4k)O>i))hngZvQ<_A+DOuYDWpRTQc>{_z0<(>IgF`OU|$@PTTEy#g|BjQvBabh2+V)?1X_Kk^_hY<( zh1JJ?ou@zBn0{P8=2!#l79jS=uo7>7B8vSokfGg74$dN-Y@qO@Z$SZz5i-;c%RPLH zGFR)cY&%St&SD9}bS4!oKuK*@%{)gj&xd8fx89i~sn**gLt6R>dW!@ByAQh0-eWrh zGVuLJF>PZ}LLqzZm5jnx)!(9fX4H9{Fy4aH2u+43S9I1!Cj^(F#>cb`!2Iol@Z-e< zUY#QoxDQI{-DW9vhe2~(fww^O#w7~nb)z+$2NjvK>?tgPvM$L;!oJvoZ@q8nbqr+a za%`ZrBDlu8_T=3|jQ6G+uS1)A(YK+U@5DYDU+xDyo`}+gD@@3>uqZyZsPZy~A3ty_Ix1x3^eKM~>e-jf6Gehm^3X z9zK6WR6VTq>GK?Y`Zpisx|Mrj=A5CQakx)lf=|8@O@Np*3_Wu;y2~tMpG}U^i3@m{ z^j;)om(GW3p#43l<{ycITnrE?4hY_yd86KtzM62dGk>F$8U3V-JZ~e5BV~R)R%Xl( z`QGAir&@Ib%Ze?D!cOybG@>Z1PniF4k(B&Omi)1}WG75NX2NJuo{-X>Fkb^WOZyZS z*zNCG)4Rf}yR6`2QMkkLMg9>cYXYw$uu7cts`tP-vghpRfIRO0kw*7KL|hC zAG&?Rb(JdEm#uXz6qIdGA{}1Bb#qj3FdmHjN_#RMg<*nzNY{bpU!INuF43(t_6O)# zF=~1Ka;Kl567#G|Hb158Uf9*(pJ(HQJ~4n6i%guuc561be&hY) z05&?d90l-s~Zhs!f-JRwiW=a#EZ&YL&&5(kP z3M_=YMnyJ6W}^bDAs;76AM%xbsXKn=jPEcEC$a+Lrv~Ot%~*3U%GmY@{^b>WwWSPq zh5Vk-_Vpk;%N3M5N7m#lAod*K<+G;Cv00O{i=KDl;&ZX<|@$ zhTpsP)jLx2{y;dd1D72*pQ&PS0}Q_}2B)h6S)_DPxb94a4rs;Vu3(T=nj^Xhs&@WK z?l!B!D9HAk(}!Y5ydaxzKIqlt&BwP)zj?X5W%3Q?78l5ympcc6RJ1K?2QEZ)gyxr& z6vaqrtsfm!kfZxiWTKo&J`+wk`8YtOjzY!0>?ryIFyq@+fEcCrSt{syQD!05sj24WC11@jMKf zzs6}W9eapWV7yS(s==_tqJJ^oQGb|_=qj&5X7;{avw4y63F~>57*OSyARBHOsjxs|Z!Z5)c!9AB| z^R4?OGwjLau;c2G&De>zGl!^cVSL&j$ESTqr#*vdLu`7M@j)&P%|G9vi>Z-tZvx{x zlY}5es012RF-uZDfCPE#xK|W_!V$#L=)ym{e813n^ao_d*8IgR-q-618ZDu&$Ge|) z5aVfraWHyN+RLA}AJQ%DTpZq`=`$CgX#_oJ22WRt16=n1P)_m(S!NCgOkblY2SeX$ zed{6Qsp*z_N}H~Q*11s60IplKjJd~bD*6c*CFfzHoF(`16dxL zTuJH6eUbIKsD^B|*=;d5B7HSZ>R6}im^ZNwOEGo;ztSz0US%!}wpl^q%h(#K(ZOTC z9!h96>I*p9b^c?de9|6$aifN`$0_39^u^+%ZN>C`&{p*un4NB?xbzRQX<}Kd(@miD zz0fy0?7U<~{C-~7A3Lnb4bvb(g&s%pNI~)D4Oh>CKaWe|!`R_lm!Ws~0+G4C-9_F_ z*WuGrTaz~esJ@`qco|^AO-&jK`K>%dJcu0J#Sl+}`-+JAL78M>ZS>|=uicBl$+IZU^Ad zGxxD)8t!9X09hu0G6g78fF1^r2z9&7?Qes>P^jB&emV`xmR;Nk7uy1`r6uGEv@;0T z0vz`JG&c5EU2QvJ1YhMj`jER}74*9}NmP2wFTU4v%n~be$agm^NRdXx2}6u9?OEK8S9$lu@Xz0b-Uzo zPGE=*_3IG7@eP6--(`BVSB~{S zCl7LEeCGv3Arb70e#Attp~v4w=d-)XhcmVo+y=J#I4tGH7Sy7%Id>qu(M4-oU*O!& zUkZ$X8{0l9I>w8~qopv$1=tz*Ixs6CFh6G$?fGpG{l;+${II^x3=BV6u+WPXqg-S6 z2hLsdY7jDV6->@VMy|4;RvEeXN%XGSo{g!ad40Wqc{8@%(Z4AVn#*U)emdxNxy)e@ zk+`u*n?Z_#;VwK|-|obJ*^8q<$i?opRbJ!n;TYapNBBdG39xb>Tgf3|v3=P8Zif}V zx$0xFC9GKjEy?yiU=JwFcXMfpiFdDlU+27Epx^Is-mlc}i=6lI`n|$=_v`l}=e<(D zkH$N@hqOD(cvCD_Uq<;_%%&q9R_Ie#aDLtnN*Td)Fr5}NB?Aq1ou1{Zxf++yN3mpT zACtFZ69Ln}8`klueMsI8@(3Nmr}k`6Hexu=^6GrSWNO$&J0SVbBm>RZI{CJ-tr=_f z0InXR<|dF#bH>*7q#DrE!%%Gqv90|X0PvIEIDr!{!u z&?_G9&UmoNcrCQ^v(Pa-?i{-_ID!%AjiJMn1Gz>sp3cG3nZ{%+y(U-sjTvReEI+!= z8BKXWsREb4GH{4-AIGHMxR2w}Z+ufm-}hwn#o%G@D}wezg%}CD$x~RGsE&cnEo+8` z>E4ENAG-RNm&!!HDzDZb9GJJVEC|7}GOy4FC049kUwk~;J2)M9RFQye*?mk&7Qy&C!1XXY`U_1u>wWbZ3I+%K|;Chz{?T>zo0Ua z9Yk`n*&Dd>WV1V(Nwg{$9L!{jojIO$747iLyN83r=we1OIPKON`4Lfx(M%w-;Tx6rSv9im4z^Vi5zPre5LNG7!KB>${vILI$M{7wEtZA+*2`DGVuXeh`!g_z33JFv8hc*= z!{~#C)yKso>n*J&%G{^hoS)T-g#9PcHFp>&4!Yu{Wu0SO@gFvY^H-=(Nj`dKBuH$-zaPO zJJv81ywW*InHlGTQv1l`MrM98kR1LTM?f&7qca$%58ytT4_=bmB8w(hWPKf4%$DQO zdyEm$9%8sGwho&4*x^M=tZ&7v4#ai<8J>n*v|X`?y|Yj}?9vj>DE3FvjN-D$R1Y4L ziYp^iy?9M3o`W3)nZJzdy++!wH%pD{eZ~sUuy;z0gZI7U@Nc0RN~UncAj$LRL?%jF z7C{O?W>Z6P54n=ZQFSa!Ju?R-i;U8&hb5hds|Vyn1lzSodS8$98>q1Z&k8^iW%|MK z>9uYg=f8r!%^PSZ_nLY5B`m!T(%utAT8gphN-+w`Ttyz#1iUw@(XBVtpP`UU`7)Pp}yw1*a_3J0qx~K zG&Yc58n=4a{{4;tvntBXn+HO8-a~3IJF~GAyw!)8(-<>FV)P-GX7i9lW;&6>b)=if zn#~;&ne9Yo=t$vq&E{rAint9?dC=rpsu>gs9@A_6huQTX_T}r3jdPe>X6JtV7KEF- z-ivDky#~h!J&%JW)U`mFZ;uoCt&hlTTOPvlj&?S|KMHLLKk7iq^y$!6msdH59q`Ek$gD#qT4SoROL`FvNQJTz@OljVK9KTZQ)>Xf(HtXS#8oV{%xl51HU zKoCi`;T^)*dB#9FK07vT)oI2+IX^pA&d*}iv+YctV=-i{OgT}@#9m`3(w7uB8=;3d z(w(!h*ee3VgE9LySz-t8T6^g3Al_R-e0Py!j-TRiOoWHGF}cENQX~VyN#JdfuQQAR zf*Xvp{}LCB(llSialHwsSCs2b0=j4hid^p;EHc}Vi_sHkxnc=+m66DYM00gH!@Eqo zpD?uZf?XMFevS+yLGw_d*=p>=^P$47cmDb25BT^4vaf(IV{4dGWqslM?R|CI)$7-j zh3~ttxeBv0sC4~))88LMqO(28Sm{TUJ21eGD)XCHA_^Vc&VdXc(VoCnCky7gf|m=H z90yAh=4vw)(8G3vEZSjIAlMQ3A?$M*1QeCT5ma3(J`S7stI$gtuDXRF*T$V(hHSDBb zVYdiuXC`6!+#)@pL}{K9d5XlMr#Ordg-clU55{t;Vyu5zAhX`T3~I7IB8{hvB^Ah6 z<=Gre2GE~lI+gvhPGqlD$tNez8yv{vIwN?cn2MNJf>}|WJ=tqcoDUV@ImVqh*1|m( zTS4D6MwmkyC17Y+54F3YE8s+J?l?^S2Q&-vmJdWx;vje9UUUP8v0YrqRqG56HW5Y9CTL$1Xvz+pg{!Y{-B%-~S`_Xf{DS#Y*1 zI0#8F?`H-F$dD*0M(2xMunUb3l4|`(cAmHg%cb4en-&LfG-J_@eU`Zz%~gNX;w7Ms zm$#>LVX@o%Ih31dr~#pSmMQ3u_4=s{fbD6q6%^|;*1sf>RqtOSs}dg>;W8v`UN7(c zkheKk-b=Rgj$?BzUySusg|2<|?j)RZH}dCDW--=379Uor!?wi2%ofbrkUiET4=1f1 zrss#qQ(PQ_5c*47CDo;4?na~ibzg^tf+7#r{Szw2&AGq@DPy6ZH*&1Qrd zfqfn{zXu@;ItuKu(xwKTW1a^irYQN{jfC9#IDpL{lHXA%DB9l>&bfZ9|MtMZdjIV$ z`78A5Zyeh>1cz-f9(kr@q-NVx79c5}12a{wnH zBR@c~#mhDd)q$s^gzBnQAPI^z9AV%Y>(KXsaFl+|Ux5dd>DIv6_5NF_D-2|V^4!6G zf|=S8a|!SQX8pq~$658_w+Iqlf%6GeNT9Lni8?U2Ui==|s9P}y5fEh?yFLU46G*8S zU+SJ$x+;(#DP0AnHb+Kg-~#-22hRrWYpHt6D6Qym#N?sCAm!|kpd0 zUCwRqd^_nYpxt3e%4G?*#v#9;1<}Z^;F+SM`^sfLEI6t>fpnJa70bK~CDHaCFoIjV zH!uhsKg;-*{DqDHTpGx5MPQ;~140!nE2`aqI-%^bZK+OB8V(;#8w_ca{7 z%agr_09Gy%E^8H0>m|tPqn^iLbL4brmmxbBlz}Pxaj<414im^y81p&JWh%`3`yvGA zLv5Rl!)Q6#spUZo7%=1;+oZ@mEW)Ydl^V1P%yaIZavk#6ZC=3l*3e2QxksKXn3o^8 zw4wYkiu*^5>W1lup$BU4A8)|vh_AoPrKj^Y2ya;Bq2=#+8rgy8Mh}Y6-i7i|{q%N` z-Jst(3%r9|J+ML^7J7q=yG&o|d$AVGCj%v&13NM@lNq1EjQa}4-T zJ|>5G`N8yZGXt$o%Qk!WRdnwtCgcl3nbqH=G_V!YfVO2~GH8==+-tEphaHA-h;q&> zT@;!Ac}wAE3i{Wv(pMK{JU#vMna1=?I3JvMX2bN)Wt6uENaMB3h<5R)Q!Q`{@-od;C?dYN% zyDfA3NH3NP#Ai)7wF;rCrm++$v)0hMiXf6vrbKOdV)>E1Odb&P%2>_DG=X0 zfj&~8*8s`2uIQc9M8DoCnr3d|x&iPu23ld;h25hNj*8`6xm@_pnHFbWVRpj z9p|8VSn{|3iBa}8jQz-ZIp>kJX9Lwvp%`BFf8ERRF?UI*F(@@MWpjnJrpb2_g zQaEBi1R_kjEh#P;uo+u1VyT#Xi90AK5NCb61OKUl_Q{<{Ft^!uOcI?gL)(EpF0dy4 zi=_Qi*NSx%rhQ&1%4 zHAwK}5D!=2B9mjk@wo98?SHYCQ;;3nCMSG?w_$vnKZhwQl*4#3_+%a`@WGfr6V~~e zhp!#_PTSjqa({5BATzSm2^)d1Il0~+G}KOe8y1%L4u+ji%G>Bj^A0{joAcGk-QJ{S zp2#v^L+Lb;uV)T#pMW!>m}Rof;oss=9Sc&36(w*%cw2{5=1k0>b4rj7s?~X%ghLF6 zQmiyLyer$;$3*=r7VX$?nSUFO30~LJZj&@Ylh`IcgjwJA;(xSFuyun5q-8yh(isCH z*ah7Op?ANr&O_kuD*QK~o=K8BL_}VA%P@_VULzITEgm?pKV$1GU&hlj`f~U7fMwo* zvV@P^6DjaXF;O0jH>3nT$zep}gGG_@&w1+fBT&~fC6f1975bdtN4VBz`sbkOa2fOe zwjcjPt3Oh~yIfB_ibA&EwARYlSooo_TMj;j&ALdK;i1(Zs=#I8XZXx}VI=V5Rvp^_Sz2oqX9=f ze)5w=Xt5S-vvZtWFEu%rd)6iRmsx_H)2BJiF-+!2Z7T6UV=KU;V^#B_p12l#0j?^+ zHLn{kX=lnM_0vC<6LxyDZw$}3e~Kol2)9%=bR)yiNHML zPOq`d3+n=X!u?xA!RuQ?Ij|+?C3&8Vz7&;h34SX_+d{F6T8?P_g@q%TZj)JtG-yKBa8MtW2JC^wo zaw9Q8W$bI`L8>zZUL*1m(UX?>djPfP=m^?;zm7-Gq8)p2{tGc6!`K+*S#Vniip`2X zIG&iX_6d~O2yeoFENaKw3^Opw;ZnmWyK2t#8upkfvX{6U3J*hM)@jV*2gu{j0WIO? z3+z%A9u^JS5u-LAQrQ^|(+^M##vMo|SZ?6~#uv6m3XfpQO2)K^bHBT=5oPw}6uAc{ zVvNGW=A*5!g9+}kiC2r!V@!ak*RR!m1IH>l6lDYe# zSQcl`DsAW?&0O{pqnnsF6BEtankv~B3y$S;wvu@!fMTvgAqQs zf#BTj>-hy|Nf;g{5gP1|Nv@`dwXp$Yp~e05FF;p#iuSjLQOM9VU#38i##4s}CoSF` z2boR{SiHN7o_!bZj_Fytcz0JlnZ5$-H}|3smex`&CQN9QcL8#^mv~hG41>!E?%Dth zvRw%mEW!wBperH~MkJyLsjw@eG>kA{dsHD0`r)~$(=zji;Hsc3C@}{mrta5JlI@d0 zk!4{iq46O&I8kRwSgM5bWKz0N2}>KgX8REwk1gEKg5wLi8c4c^D2HD|t&_0al4Ajs zZ)Ld!E1eC#XJd`TsiVf_CXHp9hA5AxTPMi{i-Tv93vow{n}x||N*ER_6?3L`rRT>0 zHx5T*>vRvEaepEms1QutCipn)A&8AIHca)EI3x3Gfg0IJMx5OXnxpNzs&=&m*u|(D z+c5;CcO{hG+@6+c8By88eUc*hrTHZB&q;$~1m!{68_y1cW=l}qfJVgE;|;LeuSt~S zDQ8+Rvb6jeuY~jNHX7LM<_<7Tg^*rfyw+je$E4PjLq<@R8qP|`&&eUBF*acNIYF(D zmzC|zq!?1X7x@Zm^~JWva2^f8UN3LoLCG0Hr>{BfjP5+HI|AuI85P(({{;uFZm!wNF<;6is zml*BOw0BG1^c_;>hSWbiV`}Vq{@=e02W>O`vnS8!{~h9j7bAVx&F(eyVRt-YwOop^ z$Njtoqi1}n%iZL`eJQ_aoYyxH?8)a7KJu-;E+6v1hu}R`Ssx$FI~w$2f#fe{fLl4p z2<(G_#X)rxy%Ey;CG~zR`Il5>vlC@|%Q-%}(zUaPe=)&{HXv&c>Ku?k0MNZ?i9OX^ zdGsD-iq)0sziyNWqR5Yyo3xvLKC1w61v2xF1}%7k&xkEhPQP~ilz`fWR~Ip{VJ7`8 z=dPsrJMJJfbMA~HGZ@ayoUuE*zzV6IH#nBMCM<72EcI*lq8;$i@hNjw$ z{+u(egu~wlxLpTAPH;dWc8>Ghg~f@R_!2awyznBBFecVN2Xe*?K0^{1+A=8tofro+ z_@(?GW-(i$4zryhz8iy!tiNy?V{_+9Q|FFNbs3vFKKotNlz;>4KaTvf%bMf9&A6Tu zKbvY{1i#(~21oT7GGZysj*gOIii&j;Xs0_Rj6xwl;VS!KJ0h(x%5xX-(eSihWiq4Y z?N9R>x93c+G;EJ?pIhA3-CJ`@M$OTl%?h7$o7-L4iu{H>24<*nSO?R-K8j<@3MRIX z7&!->P-Jb2M)$CCPH1yH>A0e64oTL5c*b_GPu6`FKEF*fc5GH#e0kFbgUIv^Ol``S zSaHKjqSG+ORAGjZOMlguUOVr~n3$_!O>+buRUF>QPu{L17~=v^u+4ofx}JZ$?kSW|j9ADS5JF$wn6= zGv8ht7U*hsT>$^Y9w{nks#qNl`@*THVzU^VY+CB1> zT4G@>bX7bcul&?hINWPEWaW)5^qQMo zF*@$P+?(^Gr@TThdw>Zyv!_&WAg5l-xi$ScHNKo&Ga9bln$bOAwvm2!S(LtR@AS8j zo->5067o=OzkUrY>5jLk)thuoXx%mHV)Rf=5^@P5Nj?*)I9l|@_>wyM%BkpDZ#Mns zA)tUjnttjm%9nL^VOcr@bWX{XTooOsNUwOmM@8-Lh839}GzQv#J`jG$iY|9seQ#KO z%Q#;}V^mUKP^&Y+$~NB44pAr&klh*}gsRNqMpP8UYl|C>{sVL5G9lR^g~YS8b|DMn zj6AB|;vPh7M!NmMuoGbA$eu_AE*?)ESdi)iOT}(wx+PG^y_6n}KcVYY%+QDpL%$6s z5m@QXtg8%qCQE&vZ6JbP9)1OBe^8KiRX(ly{>5^e!nDOeSpJm%Q@J|}(q5WRt8&Bn zU9+3{{TAP`)Ik$C0AYLv8;y^f*+yXQb}s{p=8)(&6u1gz57Ybd#n(sE8w=}NruRwG zkaWEO9)ODbsXA#t^M7<-F87U@J-weMn7Xg#-245Q*hh8F>0>S7vM^zC&AD9pUE+VJe_(w*WD{QH-=g@5uv5XpIN)f zruUw+T1p4*aL}V&qh`o$?YCxp4l#~}f%c&}QyWu5%HR_Z76bR9#xaQorfqzPT-O2} zd&74v^GfVzSS?6rNtGX1hRjb)fwdz>01e)b-N5p1@(c7R{0*51A2 zHD`9Qvhw|@k&;jz;Z66q*Otn`MXR)#+m|~OI3`!jjRzmHzHTlRhKt`}+m{f@9!2A3 zHe4RhpzfHKM`T&nO=yke9G+fO2vvXdjxD;w3|{}>19%ms4w#J{kQbRXyZ$&1f`t6}UaXr7?$NO)xUy z9%h1^pDn|8q6E)D<$QOSLinV-BKfV8zQZ-_2*}g`!hR?PeAnjkt@qPf8Iy+k(D*5l z8Xx3Dt8EKdb57Ufib;4onECX(Idm#*f_D$;xa^_9bz&Ro2U7-rqy!y`Nx+X;3I6=R5*VtA9iz zxI;uJ2xJZNzFi~rCVQv;6o?s>l%tp?n>h_bdt9B9g7M|BKK;N16Lqo81tdY&6`h>w z6rbai14~|8>q-ye)c*nRPcB%hGm%6`S)y4aS{nMG4s{Rx;PskBm-bheAbE3{g*a@f z1a@CH*cn_*l3Z`TDlzi2^Pae$xUbpg!)=nLciJ0usd1n*E>gcOFzEN1m z$j&;>vN|gFS;q~XbzB$L0nh9n-(AB@(8q<%Li#CEA zruC&oAAXm?g0Vg^(J(S$q>PX+V64u0LuU7jwN-q&s`hWVjmt z4GSeY7tG;_^d9`pNuf!lWC1I%lJ&9x>4cb9j>b}LJjuFWG7CWGj*|9fi+k~Pmd1jP z7`Pt|YjLajR+FbBO#cq#aOxEVw-ZdJo?bjV@ARTHTjSL48pFn1E)dy0^Yl{6M!mlA zM!f`g)$!||JC=I4qBgVeJC^INC5nR=iF$|6B~m7q?h}luZn)8?pD~jgZWNW1ms~te zck4ej6Ih!zPcG|W2h{n#uz4IJyFFr)3U0SyHU9w` z#8ChDHD(NR$&jBbq(f=1w`!BlJz>PEr)g!DI&mxpUJQzR?VsveS`P26MzF&N8aq!6)!p~0s zC1|Nmsq7{PU-VD+?#LG^_bF;@$!t0kKgp>F4v?&o+*c*t`(H@mwH z^T3s`-(z2D&a@Y&yJY_SdA67Mfdq_Am1JHlMy4wkOHU*pLJ8D12CwUzhRk-O-eO8t zON7Une}Zn_R%d|DN%V9-Aj9?Z;GG{LO`0jg{oMEgWzvUk>#7VT3HvP?W20yc={Y9r z51=8YvnYSVMo+YQZ<>%1NM)g~`ihW%qOdn3B;vtZxBaUhioWg52y57gjq@zceg*1Q z+H1}3SghTkI0pMt=P*ozB|&tLKW?BcsP8r!it+<@Od;@98m+7MbM80>L23+Ts4>){ zaTQBnu9(d^*M}GrA)iyb@VhuPGIqeBRM_y%6pb6@8+Q-~JZ2R3J0RFV$^B{9ZR=S| zBIk9uilH}o-53LqDSnz|q)`}|wL>);w&wve2vfT!0DAT$4PL6BiB^F;b7mMJx!Z^G zd%nl&n!L503QFW{Q-Z&TN8EJOcGF#T(&-|KbT4lph;8Vq+x)>$)_}XJcms#7aOmoy z5_?WAf-X`(Wwx)Ki#?fpMWmcuL`rj#A7@K`4}bf;9;mzkHAjm4Hbq8k8v4RHMqk)@ z|JSyBdEae0CTzmbE*r7$o?^0R78-@e#%1vLuxC3nD|?&! zwL0rOOoLisXW@H9>MT?c+C;zLH5lbF<(^zI$T7~Z+Ro7~owg(3Avl@4ARLlW-C zS@=Kd3^y~9nAOA|E6NT;8lc;5q{q-F*xWE+2vgquezRPQz%^uneW~##rANR0YhT(S zPX=Y_GP5%ZOPtTCB~FyakMO`1?WxnZgC_p7HhENxN)sxNF|s)U~9c?B)*mlm$d_6)zp!d0n- zdwuAhULV@FRy2TZ42-8>{Z}xntHqVyY$t2f#^83r+r4raYD!<_$_syA7xah-W4sB5 zs{6NYCqI=*RwUfb>}yPK?JGA#2eKRckFKaxfFjK^RE-H`*)UBVOQI1sE}^E>S7p$( z>Tje(Mo`sJ(QGs0Fhl9$ppcpy`!`HSX3kYX=yPleCkHgu$Kon)rTj9b#(nNXtjk)i z1yUY#BMQ8heU%FH_*d#se@YM8U-(z3^5NN|ehoVaFLbiN;-$}x#*bZj)X~|qiGT0v z#nA1s)Mf5szL@hDs+VA%VK=P@1J&lrj|2zi`UsnQ6UUMG1a29~9&7FH5w#l(vI?PE zzXvlwXQ`l*PPnUgT2*;WvV=&X8s~vL3W>a^k5G+(I|~erQrSnc6F+%}+9df|`>t9Q zC0RZo#GZ&4#GEpdZ*vDVbx7q3Wf*QdXnSS{_(&USPAF<7mp_XWJ4`&c9{&(kzVm!? z`7=?#G7ESIi-W33|=8{OPsK z7apj(b2sllty=!^=bPs3_>6btha>%5oIT@B^E0)jR~rSoyV{&?nH`KC8uN~H>qq+i z_U)>~mL(hL;oH;O?|HkbU0ic~a)2V5!;k=^(mew90_PW>^3Co(y^o3SdH(pMUCkbx zNDj0qBI=iumMy7aj6a0Ol=>sc?`JxV?^4=Pv=4t{Ns0x9*reiUfeRU-$nkw(=CvZbQmIs@^ z&i6U`*2Q|yxnbDyAyqPZsDtk-!ldcf8|yVKK>YT0llJDn)Hcl{+SbLLx~i2<*hqQ= zw$O3fZ%F&VSy*%IiWR}0`XibitZP&(hpn zAL)+3*TQ@Qyu)K6eoPLa(hVf$tKW*nNb}eHZvF}lQRW}wSYEsNt&sULDHZcZXX^y+ z;`3c{zeOx7&d9+H(E$r)&Oz|>vH}gs!-!O11Bq4MnO2@cwu+$>@_e{a7S3XCkSE1l z0)D9H+k;Hlg00XJja+bcqNqpoT3Un`kTAIH7%Y5hElFkHW8m@`?4<)Aq{~7D;qbgEoG;JZs|q-&xmrw~nS?=Fh?mZe1n4bSm?vM6B2X|oQxXU-fh-SQ#b?xf<=tOx}n4y^kt+DxV+p79X zKk%CPafo5|HGHE>%SXpU<-Ym2*s1C(<1)1P^T`W`HlXNsytf$kQq?!p-u1fgqh?oj zGb+OTAIJYN{zvkEHvbBn%0DVTVYTwVvl^S3ZQP61Zt^lT=5(C>8-RS{WupA#&CgV>>q;|4G{cRxV$+vv z%93@$YSisadza)*%lV)`+iCMHj8Z$#K0J@(zl#5h_}{w_F5xQQc+8Y|cELVlil&ri zzqNO3n8xHeAp7-wMifm+WQYE{n15FZn3b${%J%Rr@eu9pog6WF>UXXhb@f%LYp%ZH z%Og&V(?|VjT<Xq*jVQSF(<#b zX~%Y@*=t`zT(Q@@C~4hC0fnXJmqf{yijR{&ZrWkYX)7h%KMPWaA=ZHGrM|8xRaA9; zo)%Ocr77r5XEI-J7RN0n2(f!o;MsN1KdWohG5qWT4Ao&P)>HecDV1Ca?2Pzh?_+wSF#(dt5Sbh=GI48KLbc1 z7adn7>jiP@KB9IJwGIl#T>Pajb8clW^wV#}##E`fUAzo+qImiuuqtoiy5?giCSOCN4d6K8N&-g)v>O?r)nI8#}`dd;N z3`I!~AZaLbzhNVbPpO{1T?HzYzUJk>3{*Qo0d?m?^5*ww3BH4ARa`! zn+1IQIVEo)G^J)|=JcgKl8ry!_$| zLq;VVsD`B~K{(t3h_~!^RNgTU^R?x;HQG1j{NpueWknGBJ^_FIMrlQJ>OhuPhxwNe z0VP|b%-VQvyv}26%my(-@(ox7B*NZ?OG+}$un(v$a3P`ulnuA~ULpP4sh0g2Vkf)K zXB0h>tp7O^CSU4vQK=nWl+PxdgPy5z@+{|m{x^^F{#d2F0boP;&p$!1m+Z9NUGnAV z&JB|dlmZ&_zIo-}v0d|BNpH$mIEYE0T<3%(k5b7W=A+Ldx^w0%2O#RiKqYb>@nC_WSTp;9_6#iLc(qZ2Vy^{`>95_#Jz8U7rtzP^)fJQta7?^{Err~l?ZgsEAcr+ z5dnVln6i=wtH6J3VQDH-M{kX*cs6~OrC~(NYj*N^ip5q`bs)P`=8CHJ)M2v^uy^Vp zr+LS~+^@t7BOXsL1`QO&GvcSbAAO3--6(xX&@@y-WkR$5T1 zAGwO6nT78%g=P8>`cVZe8QHukn7;bbe=~+1mtnKMt z$Q!Y3Br|qKSr+Yu4p&1r1jyj7XoK?ZNerWkJakG7=PY4(55#SxCU@rI86T;T{=})d z8$YMHfA#e1%v`N_G0ih`OZ1GYPxr(ZO&MGQjuGRh!?rks-N^R=8eVtIM+05G!xQba z@0Pox_Nl__eglh)J%iT`6clU`u|6^+x;xx_h2eiJ4yji$GM*j+=bEIKDR`p>bkNc4 zoHgy`Q>T?rmE~tQc!ZGV&k*Nt+?_v&!dPVFYjbZNgS7YgRbPc1PTe0b;q_Wx1+eOb zCH)eG>QgsSEoxHcXa33|4BY?4MAh{8-DiMio0-O+rSRVQhM$se_%p1l&`L?`0xYMW zZ~a3=$br%Cu>WEG)BKl0AO}s^l3=1#i?}*G{m=SWB?^+B6L_ZCdmZ|hp5jb(mzkH_ zbb6`DE`-340LJ{+pdY+l)X~1ifsHpBQ%FvkzWW1^(i@>gVtmZtBipO-#)Lj!b2WT6 z%&nvuCa1CT@?~vf?$Ub7vdk)Lyp?4|zu_wPEbBx**-uAVX|zrJWpwl;JD&M;Th4ut zrXeEJWtZ41BV}DRP8^(d?*4W7s3J63|28WMn*8J7rB%oIxH{rQsG3h9WOT*J`iGQA z44}|y`XwZ>@6c)bgy=hTnto>V9Xd%rG5QXjq#qW2hfdOa^PPvm7A7w+IH;53gkBTM z9JJ_4>=Cm4c$qW7_Nq{3xPj(bi;rOgr86(BI@NdO4`eIkzr$}ejb^!-y%3nh(DQiN zCvJ8(tB#0KKFK%YK&HZnunym2GJ0NUoMnccezW^qwKV~*!xZ@pZ*hHL{hOZ0QD8I_ z{jvvWvpboB?IyPn{P>6?gcGva&HGdh% zcm#K{C4)E0HwPI_2$v?nGE>+R%k_M!q+~)OSfXgWblJzVUM~S*s^%oy%xP=OH+PcQ&YQ~!IH$LW^^t--sn)jwlZAOpl+)(TfDpu4{NxGMO*y}>noAjw^ z&HjZIb8>}ja5=0{FR|Z*{gwus+*Q&$Arn&cg=s-(}(fua>y`OytqlQ(xX9;PzepoPS$Pt6qP|f<1hEaAMhIBJb znY-DISYf&xT^A=~gPA$a?)=VxN(Gp<$mwiE%)?{!xjyHPx6gEfOl3@gK4I_y1fv>O zl1WB=XOH&!Mr;&1Brp3({t#+r360ahb-cwUXV!NOCF@49gU8NloRnY^O$9UiyPY0-F$SS_UXQq2Toz%I0znHjS6irdUC@kl$xh;NmelW zLawz67FME=Qp(bq{&n!`Q3KFPx=~^YUe}EpB3qzYu|-ck%&o07Df84uzGLZ;yXsf-Qkgm}m@B8CM*@ywR70cH`g8nJ zFjPqZxbSTHRIhB=yr<`X%%RZwZG<&sZU$V9^*8fg-B>S++v=d+>B}v77ILS(=#ZvL zit4p$S#L=3JC+ia8b!eVVX`oj>#=S}Zk?5>gg&&PzJuhA^;@jGO5iw?Dcr^Nn1F%h zp$~DtLSYBn)WOvzXd%t})mUU^^feowDa+RH$URJaCC(CjAg*41LLlY!MkkGA!Lt)* z6L=eeuw@uYch^?C%g#QS)YHb<&W^9xV;@F9w|>=73MBl&XK*2RJ(!^x9N?~C643Md zw2)IAdA(4F7@X?H)+c?L{QYHjP)97aFl=%vZR#6WH)i_N827U?kwN*_yLqji^&W#d zyUXm@1Jy{_tKG+!?6eNmrq5W_MpWR_#;59bY1Wu^k`b|4al4BAgOa&hC@iqh>L8Y@ zF3V$3TZ#3_-BF|wrf?Jdk!;qJFElm!Yw|Cne}38Q%Rip|?C9kmO!?!W+CP2QpY$1YPiCiYrtY!+=#cN ztZ}afr^Ov_ANTX&9d-_8k8W{~l9Jqe_+&S%83}MA%!}eyLq-{`?B`EFCU|>T=+dM< z6h~PZKCIARkc9nItx8n%Kxe%&4gwqbUt`@N(=7CYXvVDr8-1Z-`LuUY`R-{pADOY= z48)8?$5hr%m8R6GA%^>9lWi$W=ty$2YaK}E+iMqLdy5n2E>HdpcFmZ%>2pDNUyn+$ z<7nTdC<+Ygk$snvP$>l-71>F^|2*GEI?6H?m1qVM{>kT9<(SvaI_sxGu6e2DrN(uz z$YnIz_dz2+O*SI0xn+kkuC1fP?`es1%HNqkU{v_I+5Kw((N;5i zQdfrQFDEytFLurXFBJ@Xr$$H+#J8BSIEX9J$QEeB=-_0PH+Go>ift`^XPc>tgk=D zd~;W!n4ejn^H;?PoTOAcXN0JjiTI{#M>XD~l( zng(O3vP5&OVX!FP-+RF&!W85zqGrf|Hg0b&m>+^D10v+7FLZskC6r6RRct#>E9;sL! zkrr6!Y$^qhJ!%7&_|OJ=vQx8I%?Y=(A>qbo!uu$k{p_uSxTNcRCMzrBubt)Kmcti- zXj|N%5mlch>%~7pB=d47f_l=4nG?vAL>hPP_6Dx!0-OT4^vnmHr^&@hX6diBfBVg zr*^dx#?mQD57}A%R$2Qty_;nHfBEhdwE4Gt_QlHBqxEHltG-3T7E)^P5__7qZlQN;k)`hD zl}vEIW;=B#%&}|a<+b8&m7T0JUDy27NL@fxnU%iU^I#2}!*_!voy1!-af{fU-RUP~ z!7;ncALs_!TXDMY?ARYl5NEDBilWu#E;K{W#T;AN8o#bC`Ies(pF9$cy$bGJSH3po zI)_}*D9_qWa=*X^Q-BuO3~>#23L??iYV~MZeG}a-f1>DXeEy4p_kM=*rB0R>ShkM+ z^{P^TN%ekKYLp;*(2lbqiXy)>NQd5fxHRS(8AHu0J8Nv8-7d{~p&zY5tQ>bgvUY3@ zCdSJrAwRcE1Bk>5sahv|Lv@F2mAudvYbR1?o^5v@XH2F43R9Xdli%jFx%)Mh&}rt! z8M`S!HE|x(1YrQxC2Hs8VyRQ~UQIQvc!EZ66M6g*=GnETE$`U1hZa|}yJoreY#2ni zgF;R8NAcs^_0d^muH^VRuM~G8h8c~Cu!!h*!)T1 z=WFiKe(cz=B}tEh*5SOMH1HnqXoat^&TV-Gnu1$_*SR~H`R98vQY^iH4I#3dKc9|u zrN~_RH-RykI2n!?<2Zek_9oReu*S!5evYIvw_uNK@4{4OWb!=W_9f$UsK(bwKjTZP zGOr(*S^J*X2X+UZ4rJQhxZm&4mGOfzXDoxdiKY5Hpl8LjN|4Y)^_o2eWBL;t(T@nV zy1X5i6na+2t0s7Kg&PT0oB&byfbThoS$$RvWMwz!v74obSoIxHAt6(4h#W_*a+TQ{Vy7BekW zo9l-3=L@zK4eyKzgOe+;?5G9646M!|ZoR z_S7yy<`lA@g$%IY((J&Nx*>xpA(kBwz7=Qtgl|RJL=2 z-931|?K+>+=+EdSksfX@mldZ^u$N0~x&056p1n=GEDP;GFSnfe^piRF@ax*`ll2u{ zu~sidA25U7AE$J_rqituiapt0DE3%;p;!dt?IBzJP-P7c@df8zQ;9neu8I#GJEIb~ zFFHS2mnJ0Be%PWR$-2pKVlu8KJFsW>yQ6xnrmmBB|7idygC zzE<0ioS5>$CRDZE_Mq`k%1bES_*^{qnkQN1>JvO#30PXJvbJ@V!jxk>R`|MGYHJxs zwF0Fb-q?KE&{#8OAwB#t4sowLsc#i`1VKDSdnx^nlYKefb9OKnIS59LW}g{;^CqIll7O=1U_lJT$U!+OzhEsSJs*>$le-jkkGWd5w~+dr!URrex_|W z+@I6?p^b(|g8J*Vb8$bB?a?H!xLa*ug88mwR_YUt;AmezHF`n+CG2QL7ZuD+e&N=C ztZn_sZW*eI8|LW-!Y})+)rhl0^~rVyKWIhks@5xrLfn{Bq;0TaUDZZbY;IlE+A<>K)z%$0 zi;KMdjQX_Q_#<_-9{S8IhT>8CXm@Y39yBq3;v;RoYudwJ(!RoPyZfJES~J~#!cdPy-fz?5w8Z0yglJ(3?FWy0&*T=X;$VzwI&8He)8D}5v;aB+PX&x25 z{`b*dLxUnzG{4>KCbl!DaL{&lFFA#SZvPWo&$}T=zx7uZ$jRZy6n)tCZ*JuGS`5W| zFNOeD_^o&VOz+2p>7gp_IFpl)3lu=+ShsY6HY^^lb4v7^HB+)8kLwKP4UA1bQCczM z)=Ws&{e$12B9ps5J;b~j4vc(Mydk%S-}yB~x&~dsm#p7tNrQD=UIGu`c(|stOSiN9 z+koshxWlhTyv4=qVjN^sYuv4mimhIn{eCc-3w`>#S8kSnZc@0HABF~h+R@5jj4t|d z%kxn)6m_Gb+`sO_?uPs$@GIJ-FU*p3(*6FY4DYCTx=X{{Qu;0LePU;paBsCSSArXF zrd!pn%Oh4d?gZOQp??dU5dLy0AeSGP7Po{+Wx}M87xa&lx4I1%&|zKhjaNqs7h<*e zS#=29^FsWIf?lD@_p)*o<^;YcOtco9_zQ-l zJ(J@OGD!O$pNHK6I6veVG7GgezXlf3KIR|2rrqEArRP!qc^i{|2dm!lxH{~-*opFL$wX1TbE(Xv1&!V8TaV1+aK7GF^bJGFR z>Sb;=PFonK;LW^`he)yK7&;Ou_8iK4q}ao@4eN{EdZ zZka6v)W_z8g(mBzXkszClx3^`2Yjq;vgX3FoK46O;)xrc$ci3Dl)Qe-s`EMu#-y;u(u{ zJPDizznhyxf(U*hF@>ajs#51A(CbLvEUIM8x+=+;Jdl-$&Cz|e8w4lLYzAoEcy`9F zQ5S)dZ6!e;tSNW8J{-6+pTRt6_>;L7tU;RmO8Ssf=3+%cv|UfSfuli+Um0HA@2UQ?U<#&`WHvGs_0 zVYD8}ctHqnRBkfEL2XYnhn$JZ98%GOo2N<6dZc zr>({MjAUT)mh65FL~D;^{qG1+!B_;>%<8@-nh>t)_X6>IHd>dtNqjLn7z4uuvU6lR z`7#Tz6vh}BI_!yk8Uw#4W8ik~(JC|shKby-2?*qkfiHc`s><&$Wwb)}(<71LYX~N8 zw$X$rf)E@BQDFAb$-4V!0S5ftFn&uQ0;bLV{Avx__Hx^ux0O@AXfzw` zU;G69+lx#$(z5TPDL>OG9bP)3wpqS+80^jp&ieNiR8fI;>9$pDPXdFx`lqJTLx|tE zJKS_a)b>aaFf7D7j*IXP+if?ySBgTsBNsYaqi8@7sAQ z)oW~)Z}Q8dBi#7CU|M``mo=9uG7&*<~k+ZluxL2uVXI)=s>8J*?6&PU)A3T;0{+xh&A}q%5;Cq zV?EEx(FhL~R^-QzecpLeZl&beHpH%(aDnTl*8o>G57Lp%n(4j+vyM^+rrhu0`b{N# zFNzyyaj)K|&IMIZmRBvK&nwHVLl54QM>i`d&f}?5+#MFoY87_JuKn{L`)wa|HkMDO z$*Q6r^J$7y!CpW(=zev%T@Dr*l1`pievIsPJT7OoF-o#OvYU*G&l()tz(KwYgp|U^ zwpSC+5mg19N}xgQl=A<~T&<#*oC?)4zJ;8jhneZuPWBL%BtHQ4G~5q-7Q zli)>Q9;~dd`Yk%tp?FQ|5$it|9hx>`!loB2*Mj&U=6=45>StK!1^LU`5LGW=fuILoG0IE zvssn|n0KiN;-M^JOX!b6moKBdkJ@|4BfRCg{3*2Nw|3Cm^(dFQKl0^IAr99ziZjm} zoe0Hme!b6AXrC@A+Bk(eS_)2~Z4d8>Q`|`_gi|~TQl&Yy;brC&?8u#V3TgW(GRgo} zNF^9*n{5Macx;I$>;CFL;50?Mol%PuSwn5^>T}u0x*HxB9=o-)!wa_DOTSSoT-f1l zeC3bbf(}Q=?vuaTXNTRsj@>VGIQx)Qm0w^t(Fz^AFM>R&!&_fchdoDC?Ot~{^L}G6 zz7+;38=kx1ysokAS;Rzr+>a#;Jq_JhF)|^pHn-szU*LcK8{E0E1}s;7m@vnaGfG?S z>TT_|hAc~y@Blpi#P^thqpEiF9BS7X9gyn7o!n)q(#)bt&W~NA`%4^dj*xjT=IVl* zjHTdy$6kj5L+CJN33>&i@sgU4zHQIwvxevnt=@9_(}Q~Vy+;OL?KWI+B#&i2N zPAOxJEJxp*T`8V9w||jTaBQ7OYGFR-Ls*1Dts~WzW_O4ru#w**O!>|0W$(xwB@sMk z7AU1bMo(Bz#pV>@AYI1`8)d<#ALc64N7(z{KKU@0Js9>EzME0Hg`6sa5rsbKOF8%U zlO_*EUj_=rH;ZIH8)8kk8->(RKO7R@nm0OLVHz{Z`gdtH{=ji)>UJZ8;ET7CWc>@g zJ>dO?CRfaxJhMKRu9@uK{Go6e(?1TqdAWfLVQ+Kq9c+kZ*Zn=A1*!cF)9X5O&2Fyo zO|DqEM8#6V{>F*Vhp!I9Qx_-Kyb)IBZk#4x%B>tNk-yb*W-eaXqo_DNB9sDWRxSZn zvDC4VRM;HMRJ#ruhZyln9u@7W(lFMYwwP;UqY;2>q4C-iP8VoS!q8}is@P2s@Vt1~CC z+Gr?@Lg3lUyHx5LJj-JFn1J3P+ijI{xqjf^Ro2I4k-Il7)IK4qL z!^t*C+HMmoGpqEi8%6BXTSbx9R7Co|7;Sk%-tNApfWdGGQU01i6SGTFK)TvRr3Z=VU zMQBmWa!#k!`~#x+Llh5qi0mJ<&n}wke)9vlu)AI5uu}irP{4dUnm%ZQJ{H_iz!>qo zHfSbZ0Xz;rv=bhZ*cv>{j}?cs0P)%v0g*Z{1VZX$DD|jm>nHoBc>t^m3;=y*7e&3T z99QjPG&byWy2tD?U2graCkim&x2(nZT?HRgi1}lSR$`?=k!dg}_=43%+9V-=dbsui1Zi)_ld6pKLzMvsU zmo_eF#~l9evSpY8+#3%Tx_-|cY@{uJ5Tjz1e%uE$(LTrXv-R&F98f@h2{6{han{AL z{0cDU{mT26YGqkWg9{^`|H8wAKbiK(!NHAc8hqU@G|DXHi_SBJllOylzJ1|d$}-5T zZY6CjJ+yYUw-r6AcC|MY9cYf59)v@ks~#I{1PCRW50+5jA~{v-MXzsHRyT*w+SNwK zrn}3d9Ofh0V%x<3PRW9zXa+l%jz+05fnv_EB0QNKQuk^a-+eP;3D`9F?wgVOgr4Ac z^$i`S(ie>EGK?Q{-^OUy8u1e~H8p36J}V) zSz~`CUus{;tWi8%`^W%q!()uNPsav?_tEB@+qukJP56xeMaDdK_;Z>fba*;}TFOtY zjW!?j97ik_EK-Lov1d!IG}*kk?mV3&uiqN!Wy;S%#L-8JAQ|HGBn{H-!L{*>u90=} zq#$D5F&R4C#QsbjEIy88r{TN6R`AwW1RF8Y%(sFhIVRb~^6!P5J6t{K6cm*69tjEt zK{G0G^~GG5IQBvgK_WxR0gBiC^Ig818i;azFojZ=UuagBC1dPxKmCoF-gR+*0a2mA z5PxN=Nk@sJ=j)}BkmA6o;{C!(@b18Vf3(+cv$HDVjflRk6+GA*y5j?UqwaEoUsm}Y z^gXqEPk1$&5S;RjW5=25oOSrbCkjj*FD02Bp{8Ouk|wJCJ=A{Z3H4PEn%W_%Zj&a= zL>$8|H&KHIa=W5*NdEfA$%JunGQT*ywDo89X`cqIPZUvii~G^9(WY=%f=#ISXKH-y zQ(LT%UhHi62xFCk*QU&K*NMRGId?h98{$KB`(SEN#c@Np;x0aKHcPS=-#lhc&5}h3^e)s*e^7wOyk$< z;6vZpOk!%ZxM~|}X41jTqyzSxNz!;=;EuD2FvL#;{K#>=&djHOpL3_Ml_giihxjS5 z2)3flfQTN;x3ghi?aZHBAZH;an^zmoXf3kZD`os?+WRT5y-%3gdtyP%Z5kICnlJUu zR5gZ4MOZ{hi4)|N(~P&VIKhvv>cjraR=*zCq~P0!k;fb72ER4SumkMuYj!B#n-i3- zLY1>|^y77FxbD&wnit89BB>D@*%7U?qm^LkSgq>Y~e27^i?|HPPLrQfA3a4ms{d|)pdEK+VUNv-R^=@l0 zejPYRJe6n|9{5uM56X?(ZezF?@6GHvbeGFaj8#%y`7P#}3}e8OX3rt<>jwXnuUOlQpj!xL@#M zBzI_W#kVgr9m#x%;A_eR9-XOvSSx*tR5L2J0bnmb~b zT#mEp=iHaRMZ>vtok@0*+O?L?_VY5i*!(Zm4H%LhX#4C;LY02z(=X@TF~4!S9$QF~ zOTW#nxOux>bKrf>jJO8c62?fF*}e#6$q24ydn!8B;(nhBf)GgqCVOgEB=-9dAspuB2DU9QdP!AD~(}AX}4pXpuyo^^jH{yicMwp+ zENXVTpF_A|x<9`OZ(4KCcUE1X)z<8Oxy0bgJuR9t$rXKTnm|Y=dPbanBX#{Bv5q62 zL#RDoSn+FX1W)Js7zfq_<+zXXisrkv9MY6GQF`H~9So$6hwB5;F9)f3#RqZQ^8F45 zuDeF(kI$-A(YU#HIHd^Ir3DYMH?w%u2}pfeP6IkDcuP z#9OcyR~dIs!diO^%5h?ZOy3VctY0;lX~5TAlyiRQZ#zF{2v7RDkD2|I0?=^(2$`$h z!T=0idvk&Pz4dVyS_Ispgw`f%?9J|l-UgimqfPSK1~tt_>5Wp@OZbx{)y8MkdBf>z zR}Z#BZKz$7(96q=DC*w48)ikwg1g$DuFr-}(rZK;*cC&SGeImJhRQ$O3 zHC=bFPxZ~7E~oX_O1>71DRmbwLbdAHkoCq5t?czbpKXjcuRgw%gEv$rOP8R)mB*?6 zkL#oWNBE;AjMiFTnkf9h_1v?qAAsNB(?4DW4yZjcJvA6G1T}&aw4m|eU;Pjmz4W{e z%q$wK%hut@nnR$k5CL*9((Y9Srdfb0EI*0G69O z_*6TMyQpRi-1yD+5lR*WCuA3f*k1*LC+o#%PHBmnf6pA%Qcl+Yg11S@73aoRec7+$ zKh>#duaR;x_{r#aru~pb`=`FFOO=nwxUQ)KGA^DPls!Dtw3WAO_CxC;RhHe~bj7lz zcAo}!=t`JMx6j4^Po)p^r7yP9(%sITYxEYfxw zZJWOA_S8q)iz<^V7RF(m_(l#?BM(v|`>K)2>|tRe@yKNsLCF;_M@`wqVH1|9{lV}; zEAne0@Cw`bJc%EwEokGksEu9K#z%-|Yw&Hf{o9upmSnJh0m(E2{xz#(*d8#y+-Dz> zhrp*lDTKhdy-F`=>k%_Kt_Gvc5W%h~%4zNDLr(fgiws{}E65qEsbX$*`k;#IC#Si3 zd|E|SDF!^FaBjur*1zzY@Z>L)^a1n`m~0* z)eYB!!j(4Q?XfE1uM{8T3#wRGwdpvDHkE-e*Ko>gtXazxcxwjBH@!AA3@uDEgOW*b z_Qkewzx9)7@2I0JFaX(uCdBjdFya1!o_2ic0a*~nve!DhodX8w}^3VcmEQHiqoW zlb?5g9S`boNW>sF&-9&v#aQ#ze8l^(>rtShM&0{zDxcb?luN@^n5j??tV|ey*yF>w`=#GItAT86aa(u zHW+t*Pcf+WUVDIIcA&7vIZ1M@{_8EWEQ;LVBXw92`Av)L8$~|qBT;KmT#2D1Fm(Llm+Dur!|f4dI%8Tfz2C#kb}XWuSPiJh{mR-E0zsbNeAF<0)T z8P)DI)ry_m4f+gY?zfmhQH(w(MJ3nF1ZZI`Z&OR2GjkFRQPuO7`AIPpCO|kTVBAK0 ziq>EU;B1FU_Fi{egS~kzVxFMKx7Ze8=QXMWX5B@D3lNEQ?u{-=c?#Bh5Sr^;?Ikqk zkIYw29R~232RM$#psP6s4a#v`t*KjR)=AN969pk9JZSdRJ&Idm#l3%n92S-tw4-*m zMRSLHL`14_YW0}pcGiYXv|AsRVE4t1HW=R>tWpC^z^eUEDD(UyJ))I&N-$`Y>J_6; z{+mfH$0$hhJ5O#7xZlXl?xFd6I>~WaglVIW-cggYCt5A(W7(dX1Kn3-_ZCeqK^Dh* zwLLpg&;#jC)w$`rn4Rm~xsRh-9y%{aFQQtWtGXMTe<)Kl7F9q4jcWsss^R z$v-Ie@62bNZ%b^%pHB_wEI#w@B4Pb&h4oKx%a{iw4EH*nd8z$pV~x+cJ%v`G?>pak z)6MQk`}_f)oS*!T4^Kn8uIwz7hqT`_dJbNcr{|(M-Fo;!3SaBN zt~KH&k4G3Uqf3NMT2sEvfy^rQEt`jkzI5TKVVFO`BQN<^pNWzh%w!G1*?&V(N z%<%dKl6Lu9*R&4vZYa2P&GaI=I0v@wL9o+6;A!1g6>2au+AO4*YfC`n+QLyGmE+!n&gC zg5(|nIQibob#}$*_=3o*yaophiK_!fSWFkBU!%#*}S0em$~-vP%##sDqf2HbTD_&#$a+gwreudH86GecJgkVll6TSO_C8{% zg5|40Pvhkk`fAV}6mI*qz8?C=otC;xxGeB46JK*3n?KZ^ZVpuTI2YlwFyWGGnh;Ze zm1|{#M`Bcf9sf*!@+H^2RPhRj-#^YxuGw9&4)MwBx49cOas0hui`7!U=-MbhI+w5! zNu+ut*PumFMp@177HSYL!}J43+$ZO3sc}o}$=Lh>_yOv2Z=NLu@)ue9n6K}a>QfhJ zkfK;{r)>(eTPM2ZL>kbJrq5*m0Cp)o1HRyrrgvak2S@%b+LA}yE>UahgeCU0MIzZ~ z-Nw`aGZQd5rM#XIoiU!+llt?0>~;R+rxmV zGFey4BaA=~^#RR7@z1ZAy>p7Y-6yM*e_L7YBd`F8!tO~1{AE!Ph#a5s$x~dG2C|9p zmA@R3L}ki{1$>yOC7(zo#0iy~0VqTvaFC0Wd6bn~$TVL2@=EB1ER^br!p_dRh|!78 z`Bpz6fyxn~X856^S0b;Vt6pPXZ3HcP{*@0!th{eiDx!Cc)~VNoBmbG+plAMRom-+s zX=8NPsGKdFW$cg(DT=Fq#MAk0&dtA*omo3ZdSkd-gu00~sBSY9Ws@fu{^#QlZ zZLAqLwSE-MDcmYU4OofCQX)E<=C}L5Z`J5PqwGZJ`61cNNqG7|lZ@hL!(5{inl<~c z)?j+8#q`3#^UjKC32v(0n(c{8g|149n+l!AJKck?(gQH0nNL5FbF1$#JZNz30+?#u zYu9Ko!JD$HOcKGEO8L7kX;=UP(iTg1shHlHzBi8`d_wzG;M`mNOuqc*A%egVd1_qx z02AT93`@)jGj#~L5F-Jn%!oP$>MnyF2Zrh!uDBmF(Jk6vVv?jj5z*sFj8 z69R4K8@1qc&;7N%g8TFyT+p}S;4E}p!@-$(WwC3!1=GqJ4zhrQq+f7tk6>D9u%NVI zP_|nzz4YWF1Gxnup43 z?$;$gZDCaYKo4quU0(B`qJXD5xvyM1|9vhjA3M-QTqx!Mh9bw5fun}sc)@AacWL-t z%F5JtBK*dZ-W`L3#F|-G?}`?$miKo3Y}C&-{cO+==SD--di~%EzoBX^aQOrJw;}qK zrl%MVzDM&p9^WJKVnurKONe`oA&tkq&fu-F>PhVNmT||;%Ep=|mcuV$Bf=WL^0=aF z4&X|juE!Op64`W16*vFR<+nI{C9&K^R7+D)7T06M#`L*LkXg_aTR3oUv@7s1-&kJL z)KJruS@2|R;j#NpQ&RJ!E>C(g+k?_#**L!?QB&f(bw7}A%H!6Q$Ma38^G(siH|24f zva+)&dyg?qS=mstGP7V=XH)h{Q&O``OSoTgMgVYd{ere)__Ux#R{V-;0R z3*_lNpo5I6g>3ipAjTkCkH<0kO8Ml%k$S6nQYkHD+rpvt#vo%szZc3{RJHMoK^thu z;{^?&r!=Hp#jjLDm~JaoyoGF0LwIB6Sbu2<_p?=0EmK37c*~U1LN=)(yfL%#4aq~L zsA_%Kkb?0=v4w-_CKDe0+Ny0O zRU3kuQlBdPP^v9f#+DK)!xe><5q>Ckla--GqcS#?F!^f|K2`Y9fZAQ?vi@2o17i`c zFs;ZUfh7Faiqv=Eiqv=EiYzJER|d?{iMabg7UKgK<8qZIrn^0Mu-iS4GrQRhx(k6bs#~}J z0CW$-tV=)97GYMBK4-0R+C>C|kQfelQAaw2yp?KkgkJkRI*E3kW0)F3=sOftn9TJC zNl=&n1s5ax7l0?1Upi|idERwqrD}?$4y$n^L6*-qL6WRlesEQ5jyn*du(Y`;^SEwi zt?bpMbG$voT54ux{uOO<)R9~APg-F8k?3aN79~1diTaU9tPq&2o>D*S3edT~zNo`mH)Hf2-MV&QoW@duZicKMg92lW6i{y!B`g>S=v?hPoGcudwE^+s? za#QISM|0?PHkuQ_j5M0hfv{=A?^Xzlz=jLX-PP+p?Bwe1M-uCZ8sx5E8fcIv-^(Dm z%o%c{5lf$hU$yF$KOiORyrpVe8D=FXKfm%J0^IUCv^J`?yRN7MRl5{$_?a>Z-FZMS zOx-+`jwF_&f1P{g3Ov+CGv&W1h6>zzP%+iL>gK`4`Ri9 z&aB;Fct)GY<65ddHr>U||M1wxy?$nJol%!$-7WsZv{Tq0I@~ynM-gBC_q9Zr&mlAW zmDjMwnhk=a$4SChLrMsZqy?Zh8nd!ca}rKKps?2gP#}L3&$xdV`p%$CdCUT*CGG2?SpJI_hqmLKG6X%}TjcYF*(_rvzTA2QZ*gPB}jeP!@0>$0m|GI1&% zn98fR)i=Qp9^X-N=Cok^rtRhppaFkQxRlUIIZhG?eL=L7B3yaZ z_Iwc+V&Pjpexr(LQxOPM_bNhHC6#gdeH_j`_L$5EMW6+PvZsw$qPu5PCoZvPCu8Gk zq$SNGmTXaE-zE0!jGU;*rTM$g?GoD&ar7_6mh*So<`c6seTn3#T#Q)yrZ3H&`2;Sm z(r8n~(rp&sV9(C@_b&7Cn){)Wpr%VJ!d39yj2JVYY(c?lBbOVjbMJE7Rqblk6id~d z+*G?-{gZpl+f{nWv$d<$r-FdslU>$Xn(gdtnI((1-g1y1owH7=ICag2~^tlnP9idVG`Rdtb_OzY;NX_4NsH`;c; zwIm%goZI-{ z!v7}zu_pe`#S|%F?lSQtC^)E9>jXIEd*myM-qg5YZ5Zu_P=`1a{V&%U@CjSi;8<#y zT6FMKJ8Jrc#?59+xQ&h;Q?)j`|K5Q`RU4GI49>->ek4-O$YzyZcv>D}$vQcJV)50q z)voe`X3oHF^W$d0e(3fJ-gU!fG8Qp5LT%doCqsCQ@S*UNQKTLDPX^N0t(As%pBM}D zdo%^MoXR3ya`|l<$DZ*!9Fh|sAl4oM?F96S4dzstd0*F<>&*{C;d86qLA-u_K95>V zo-G8p3w})UVt#`4lCMLpAG#k_kC*;GSImH_ssE`ms1wZ;#{JDpG$A(fv4Q{f{D%?M z7iq+o?xdC$vEmn`^i;?jnmI8~_4s#UI z;d*>`pCT5sSmn0+Jsd^IV)e1&X`PNDPP=MPi`CO;g?NDnfdgp^KL(Tm1%12%IrqSU zRJ2ij@HVKuCZn5{|2mJaPIwm?yt(jaerJleCw1hq13JGC-6O}#tjzp@@&e7!xRKcX z6#rn=E&+Jepu6E|WZwe?S2?x;lBBtZK$NU|7Jw3tq^CGpCp{uT*UUba(&^A1_-Wu} zZaCUvsmt63zC3ghq7^_lvIqY4)%%3*KHYG90lHhSu&VOix{FrG+-x-nm^$+!m>l=c z;TMWc^F3XiHGq}Ui5$@bc2~3673~h&()@kH9Xvhc4h|cG!iRSPzS&*420j{mme<{n zCdsxe-6tP)CQ;3QP19u1U?&mX*nYr~n>o8;@XnVD?& zRMLJ2WSalROMEV(r#}?OioCC7cQ571HzPsCVNe4>5q}*iUY3lj z(+ltZI3CR<5ry+gi&9tdva2#t1lO;M``6Hs?S>e*vhqiogew^pOU?H!N|W#tswg^NeEN2J@z_->r6Li{W~k1oF$l?K-k{jqF{PIy||irk1nn z^K&?)0tMH8+U>d?68bMcyDa&$SLQySTvPQJsUC+zhbtj}qimjX*`_m~k!gj-S1YJm zTP5goy}lc&>VkUY_`ED>sk#}fst1D>kS(1M@!Ih>V`Y)qUYuz!wy)yM`|-@~xV^`z zv9`xW-{0UpsA8kK*M6Z9*Mb+Z`xWt_{n9@%G`p5@Wlxk5#=k+k7i^RD~kV^^yYlh{Bjvid%|3V`#2v@g3X9;(H^n9gtfzhPhSw)w*AfzVEH%^RdcUEP5~EeFlZ@eRuWA zrHqjN08lP9^~^o*u2w+k&u3#Ek7jiv+^w1QtX|0)m_yh#ka+vG4Je^l#p9ornenO({|*Sdr9wYb=JO{6It;D9vpl)DKK+G$bK`a2mT-SsotvZdiZ zfmRZrhUIz-?7MON-x_N^VxA7qO`VZF1$K_PwEZv)*;VyXvAjui=`wy+?30a$SM5wx z{SAKw%k727hl#3>O#d8(4ciqedzYpEK!y|`98vXA`qVFU@X0m*xq~}|aL?|t7g%oW z%=P@L(}9CK`fB6atcyY1#MDqErPzRg{w8SbuByKg@GLtK=f z^a1gFz*qvL-ZwHH7Co%!3x(JIqv#9e=feuB$cGiwk`K#Q1OtFEE-mrBp{-$W%A%H( z(GmqmEy+jpwVeIYoDm%8LzuIFlyg8B9OcYM47Qv@q;5(QS@!x)9v$U8It-3-<|B@? zoI|_$oMri(gQJ|o$f@8cXFg&$Q*!LvOv#ND0Yc@kMP^!$@0b7~Gtu3|Lh78(EE|ZV z;mnEr7BZW;#q@_)(i$_3kfkdD+wOw{lp^^PZtLtuNzZ(Q05>Swd((4?`^=Ns;-6q zon#;b1QH-f5Y(tq(V(IrA^{B<5`ywEkZ(mKl0bqniDX8xd<6r_IHpCbUfWWu)%I#@ zdr_&PQl&xzeijv#DpmB-_F$-{no87^d4Fr~b0#x^eE8h{`@YZfztO{*v-djtd#}CM z+H0-tl`4N%Mn6Y3-z47TZusvtixVFzIk_%A*#F2Ir_M>pYIxLteJ z;b0%#9c=8R$FQe94cSot2WJi}R{cB+o6WBydrtK%WHQ$4}t zLSFoSbiOlaSTTMaI$aqQLzvkIY90BE`z13JFp;-l%8|PUxi$O5%`tK;x*cKmKd}Vb z5vYiE_IR1r9>EiVgwNF%Qol|u%{>GqX7BgIrv2O?362p1vAsLz17~-r;kDJ$-L`h!z-!gek?mjR3 zo~nkeQU?TL43vHa)&S~X(#$=^)$&8zQ#u%_SmLYNEgO04boL)pXlqvhbjAy2Dz+#D!@)MW&04zgj(A z`tol=1m+O5nn=JiKO7blY|uULb;o&=&OX6;ONjF(pIzt*&kHTrYU{WoxoyABPB!;A z)=Le0g2?_xYd2^g+3nU79A!zzKb+)rhG;jmTkm8rlH^*RdTF+BNB2jat{p&L8I4GDcX+uRa}gcXg$w&W#5xYjDz8X;0|qZie8KL4*D*wUfNST9?j>?zo18t+TN zjT@vow?0BQTQ`erME?wC<}&n4r}5qdkx8@)Nh_kAn`}PT@h#V6Js!jty<87kU%&Q> zH1TVp?Gd(0*H|epYjX^4{!HVZP*p!g;S^l?;&*x6^~9U|MB_<;WU+;1lG*oV+x(uD z_m1Z0<_cS?MI+v!;r4X+$~&jgv*ETX0)ds#OS4+T^w%rq8QyfjEwtA`?JGymnTKT$ zi$~~3%oTky8`_6CshcYb^mNriFQ?gxeS(*s?BH1^EflHAVTO6BbuPb|>0SA|9kjrf z&Rnclr+G8M?b6?E!U=2!8^k3Q{%$j`(wT%Sc_H}=Eldp>S~zwsRTF==PBH6s@7CJp zo@A7`?mUtz><||(K!W^?Yy+Q_f2;+k9tu5}St5tBeOJzcYRz@&x^Q-mlC>TsS0NE& zOW!!_G3`=!V(33yB#E>TzK_Ic@q_F|h(^hS1h%Wb>JXQP5VF;X2_}tysL_^8-=3LBoF2$~I_&9W=ImIM{7zj>n;GBrcwQtr5p0 z>2GaL>fA0;UQA7$x`|V}cdhd-J{qEhkhkv@f%<}m?7guK+52KU&@wa8-1m$ZNutv# z+4FdVJ$Zy6D|sT6#;<=?azqkrTl6+#XQj=I5Fy6V+c^8Q z<^)WKUb99zG-_j37|e1_L8zma#ZT!6xN$aKC)a+Z*q8V`Yrl#Sn6dUdE-`ELUC0kH z-uIo&kHKJb6YVnB+M`TDb)$Rj(Ln+S5+^+(OT+@%cIZ8mbgIx3yH4YjbC3*5FA`;X`I$f zgCm!(t1%I>rDU=~?x?krtozxa3Pqf~ng%(f7aCJGbKV~Oym8e5efsftBOz+4mtvvs zR#4G6LW->Q2egsdD`el0eb^;;bTM}(&ZIO*ED8=7_mgm#_9($N?55!ul4CQ&U5+Ty zq2`fQylOD7)8$n*;noPMML?_*KVQdxany-F*Tf%{0IB>R`4OkZVwv;fvJYmotr|(_ zhfegfPIUV6`GHjjiQ4Eyz2!s&GmGQ057=Mc;6!h6qSKcb2UZ>6%R)jjvJb45sdG8M zQO)6(Plq1Xp%psxV3h5fRO(?I^;9I$fV>1dTo%jBmIEqrX4`JPfKjm5I%zi7QhBpP ztkIr+%ND+w@-^e(#-YKcFoV+2R+hNQxsB}RhA9uQBICmdA_0M3swz%Mg7PGjkhae# z4u_{mcsq6oI^2aS)<}c_54LiKZ}rKL((TX4KDgSp-b#FG2MnwajsoRm7Y93KQpyoh z%Fr;$5+A+;7S<0L zfBFhe5n&(^&t>u$q!+~wP46d+FEEZl<-`dQ(d*;hWK;6^i4a_~7B?)fRlYojM45%z z%#i~#nIrmVaCv6%h=Y>p^@e}eQk8i#y}=y0mcwhkBURXgD0=FJ&ZpK-XYo@+g>PfR zHZX||L2#dFPJx?L#$TzK4tvh}!*;kS@Qc%dAguQLgE z>s3U`LV1L}l8}-3@0f*B#EjBzh?9mcO%$F-MmQ?m3vv)Jj%}Q!)o4Y5Kr1{Di+pA) ziFqH~CjZJhhZk^}*uJm&*tfMX{P~mRRLHc^*Pzb}T^u;Vvr2QNYueJYEjWbi_Vnz-FbPIU*yd}k`#Y>3E%R;H|(CbruRwcq_6TupZ+2; zeS$Jlgu(UCnQz?KJzE!%SI6Gl@tfCz$yt-N)_ky_{(1d@A1`lGT5s^Xy7c!xzzb+Y z*gME@HXikwtO*jlkL~Ljc99aF&dgsNxb^i3itlOMqk0zZ)e*{IN|vrsW?x6Vg|F5^g_joc>DUTfUZ zc7194`yQQ>sCH``RlUC4ZxTPL;WT`K{sckO@vxINvmJi*V#DE`m+Fu>Syyx%%<2=lCbr+P zvDR#H^onwgNr(QaGtMPygwzO+t9Y^t>>2T`O? z;Sq!Ta*(fo9u&q>>$rJcQnJLSuB>c6^~o6PbHNdlnjws-KQZ2**!_YxCLmD!l-Wst zOIhtIxPp5SL3ooBpSnD${woehG%IRVQ}rG7U&Z8zJ@XghoYh!C|U_yJl3yMosxPs&d6CpD}{5tlTc z6l(R$0))nFUKdT6_yBD}dXx^UU^cR~?5B@{4uPyVx13e;HZ`q{Fll*;x znHA{8y=a}m7m;PwgykTFLe5_GYO*>>C9acpC0%`U;yx}NPonbTykR}Zpau8D zi6XOXUjf2a0SYOm3{w9~LNRGut;5!2J;5F@xWa|bz&Qx%GFVgT(KCFfgsC+55}GkNjzTSC?ir5y2aS4!eN*&!|C z$`&TKc%q0KE=zMrjBFv%Q;~aUVK?uD-3(KY9FT}aqT!t=RAbZ)ven_d2?8cQDfNDU zDP#1dYm=E%(uy%_ptxEO4@p#={;U&%4t$_pU$W#sDP@S=ok)-*->WQ#HTP@$17WHN7;%Ka9n%X8?IVRJA*G=?=M6{ z{*^1Oj3hbe1SH622NrXs=$2KmA&hJ5fBpLjOc#V~3SQ zlF&*|D&s2PP2B;dMbY5Jpf_RtoBkuRmWdy?J%R6}Vzb8B$JWlO;&Zf5Wz>s(Df3QT zJ-sPEuVR7l@0U?(Xg+ZZ8V#~>_;>RYw&uCjIC4q&IuqJDd4qH8fpBGT);ObFD z6%S8m4DMnla>Pt1jK=I79@q0gE}|&oB1yA86{m>6IK^I|l&PX#ps15I*~ZhnhwRCm z)#y4|erC09DELN{(X=>PUCFG|M}e~YmiFZaCa*c;t5pakb!3X1ZZkzht9UYZ<4r~p zLN3eRtnZi48pZyRC1Lzu5k807D7YMDmJzb?<2+@>jA0wHk8}dXNzYO(mTfEh&xGxv zQP!Qy4~EcahNw)~;iH`iOLq86A~CJ{dA@8^9ZK;dl~*eC3P{ z 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�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 z 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 z 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%0A$~N2Q61FI9o=R_#x4f!yVnJR}b8UO+ zu9=wWDJ`n4@Zu$Ozn?~x_WG8Sc^cE$L(bIJdK@P`*|qQm9ChP&Rr=jJ+_nE6^gWNT zAK@1Wv<+mw4kDg@f0wQ$i8<`{DY@(z;?%W%s<8TzN z8>g_yewZ&dlCR!9x zWfG=wmL&wlEAcoao=mnH#K(zrPc)-n0&uZtR~=`Wta$|etZ@``=6FiI4#uAxEM`&p zon?4*u+3dlvp({pV&Ze$AXz{%b6%1GEd8nvHI4J+IO=g{PAteNukqeKd178s@!hvf zUY2Ocijo?nIdjO#UVFiMn{%%1$ZN1XvL)*q)naiF+oVqsRnc~tA=$Z+b0yt3p<%NlY>~nH> zhmrCX@tGNBhR!PXF7gx)h@p&VjXN!f1wk1u2(v7AAE2$ zruB3^rr-SvckK>w|b+Re7b?Q$4|88p%NB-fa`ijFD*K#sO)hg4!IY_CZ$Xu}ymU?0D$D>*Bhz4J zV)H$fC7$ZI0>Q`;&Uu)6Ts|P)vsh>!hUU>`ddrLXY=!MSFM|=QJB#z!`02TV@>s`%lI{bG*&Jf zn`4>J9mE{26G6@Avg-o#xr!GTu`5Zfe0}jVk~yLJ7Q8)mO4+&=@?#4PDbvyFNEeAj&Z(nO@K%79I%ni=&54}Bfr4a6i*)4m?2zavON_mJ=LIJ<%^%I26aScV^|%Fg7I^6 zE5(RPEuFyb0-2;wnnM{fbo-i=JOYUlc1Co&oI6%pz|QRg=L|o)1%= z?VjI%`6+BO%16&CDN##K6I-}7j$$#3iz;e8RAU-@3ME`9v8br>&Y*G7!1FW6h)1zl zUaW@7rL*P;$|bbG^hTMPnauMkvc^+Q!!IscR~xA1<^_$EwuQGD zgSg)2rR*4R3=uejnw`X)ArWydI09UdW-Mk-Rc$3-vERU0iyh*`Fcg{*JJML0<5s>Mr@B~i@LMfL6 zCdAnap^HL6+SH$@VrQv256yz0P8g!3{w!fhgeq&bx4Nj0r0OE0;IZ9}Hmtko-vDluY{p3z*=pl=R# zHQR?=F8Cz9Mdg(>Xf>a6nus-t&%v%@$5AYfH#oOc^@?z%=Ci~X_z(vE=a!ygf11wH z2^sNhfMi_EmZ4ZM>8KE9!!kLpjf5wm$OXZ9(ujUD;LgKGet969@*&V zEVgks?lNQmAKPBFQpX`*}`yZtyt!` z^G3ebdRTy83b0>*E&&pA#BvN%luOxVn5V#MVNykklMN;;K`^e(Tyu(678RF!*H9L? z!u)G3S;QoSJRakbMwbzVlUA@xFdNIXO^(TBbsd zYW2mYp?$+IHmnWAu2+z2PxtJRUw|(1?9r>Dp%$~04x6wA_}v#+{Cbu;2IHmc0q*4S zVQAMqOp~}IQ|E)8R2%=2g`)7@qLqZ}k}&n3vgZfO;{|~=KC$1K3tu?mZjC3JJ zqQmIP$wVO=PmZA&8X$NRHvoEww_7KMA1&aS@qk8})i6f7-69!h>{z;I<|uCvQN&me z?hjIv^5DckpzE21!Y?!CipXWQZ9jZ<`xdarQFSxmQ9K9yGMk~_k@#g)K7(JTXIu^& z3$o09nGTRivi?-UD;A08azOISYz8F1Oa~zOWs>rRPRy3@UI}+e__2gn6^MM_k?@d& z7Z-~7S_vPO@UId^FBa*!60VosGmGG=3BKR7tEey?`1(rtCz(@8N4jWc1m8B17XUC^Rl44(aT~W zF@ZX>(aW+8C2YJbhGJ)kVg@hE&IrmSjD^v#cuLY)OC)7U5SFr;tQ}=7UKRtjrpXv@ zbMRzrDLVoj_Fk4yh&UHQds%vI5tEl?Ac)D!lKiqAi8ON!g^4rV#>>(+IBd3kA(hp& zn>;9%E_x+%{l%2W+(9e2Y8bsNTT#g3WihnZqQE(9CkokmSwa=;$IEhz2rzqD40ue+ zMP8O36tefS*p&?7Wtq?V2$jLhLOstSbrTnC8*>#)`zwYl-L)bRnWbPI56Vy~*q>rs z&ccOkwjJecoG7*|;A`%FoG3ei$K*t@!x6@bGLE$Xk8+}jHdwSYmHDVL;W_Ci&p4Ly zH>Pci50EgJJ{j zk|y9byGv*>VWXp0u}v>QUb?#^vfiJ?wo@sKkHkQfY0Ti<4mQh};?cSxF3cQ})*57& zBJg-DUB=fiYXx{*fIkXwSb(nt0JAI}j~p~<8G>=mWAS*@S+WR^$0X?D1fh#*jK_N^r`iw6WJ^G^^?2{?oKxy}@Am7cW_7%m zp3o8Xec;Q0&*v7bSvjw=v}$4=Zaj3SPU_+mOnK#< zrt`V<_91!k35N3GQ#$vnE-Qh44(5DrSh@z|`Dg4n=sETCxnYTeb0LEBx#7^LbF?AP z=Mt;w%7JkPC z;|SG1(DS)rYo2(@yEGkl2J9QjuCpwcbs{brkghWUX>3e;A##5|?a@s8p9QQBL0phP z&Z+jrl+mQvV?eGG2{9g;$K|tqQ!TUf=D<#}7;m9fxUnJpg zBz#Rm*GiFot%MB{{#nBKZ^-fz{+ERBNqBj+NUxRfXA&Ni@N)^zs}cDYOSnnGLlTbk ziuCCc-YVfE627g{Yel{iK-vfTfqZTSbbvoj-X{PDd_Fg$tMjBn71N;;n#3K8c*=$)ffTg0?;G!VqJbCh9=iS`geVd4z8**Qvj z$F9L)vDx;8RF-rU1Gw>gu7M~z>AKaN$J{}Wa@7bddZ^I&cOhHz`CJ2Pivq))ghIAE zN1+PZI>@hNtBC;f&XEC+Nx5j}Xgvzq?;P2c46$>xgl#5NhMgnodE}ZlpfYj6rZIU` z4xV9oKKB^#1~!pInn{yPI5`64kD9}p|6$xuvPEIyjR8eA+xAb}ttCUlB!-aZb9Vrb zX=}+2N0_apNvs)o)Yg({j!8v1{mQj>1*uI@Ru`&g@Sp*iPkwbIy#GOe-r5S4W|JQ z4_WLWA+YQ{8Jb}lUpV7~4Lc@@v{o7L`P{JcQd$v_EsS8dD()V>*1A-H8w4m9ph18g z0?<6nd_K1fOjwOzT$@>Ts~)#x5xZ67@yJFRT}Bjqx2hKomlE4#v0EjVSD|*RK)m#;gH8V#VM=*T2pVl4hqnQNlj>Jc!@)>+I zlMdLQ)x8g7lB|C!;SmYXxL^2at_36?&3%BhrTZs9(uofxy!Zj}TrA;FB>bm@>2)Ig zTM{0W@Pc(Bey)Vyl(0#{J_#p3DDth9aKD6p39qgf=?_Twl7z=4Oj<9}uaxi>3BM=d zJ_$!{5czT?TqWU;Bz#4}v%V$rt&(sXAo*xsmCt@a^3hz$6`XuD=Y{DzIP?TjoBB(X zi+YH`<+9A0%VErwK$5q*T$;iceEcuAE*H{AtINei8QjfK(~vF`N9b3gE5elz<8nEM z@b=CiWyukuH)g$CG3L~EN+u@mK;f05`?8}CL4>g7MF{G zTGPzTAq;i!E76mH!~U>tC`6nKpm}oio7Sw{%y)*?w~2KMdnwckE4*q67fow z23!`Givf>WxnL18QOMrqVplSR%Vj>xBUA>L3$@oGC$7?gZfx5a9J>RufS*MmGD*RN zh(3|98>I|~bvXg1auzORvp$rwIjn2Tf>4KbT|H17;~UR*IKp^T#<67JQ63f1c8eiN zW$9FzaHI5-XB?{_M5cF}4HS{@WHmDBz7tBNb*U-W)odGb+4xS3`G}B!Y{_@hf?`(R zN$67Z*%6eo_nm|)X{$@qSt6!k_P&!)$jEmx9wn{56Jsg(PNpH7$#-JPb2VFH&STO_ zZuG6bleH+;kMG1-h2Xrs%YzQpL-GhVO)C!~x&QaZG0E zu&yCn2E_(^Cr-@X&At;_OxWn?RqQDClmosK(JM^oExkXB^-(E{!^A+8xfG!`I!tKY z5EpKaNQ(`!OX1cqcs)6GBVWT@BEUQW$^_Ubz|#UyhcmlBwxLN)2*x#!#r<*6l0~>b zXeC~UG`fr^xcg%>W=4%=e;JlZ#u@_d4|Wg@9Pn8vapXxIfU>S} z0}d1VRv~?qn9f2G40RTY(rMYs${OHH7|dCyuyhU1$!YSmH2ui{LC&I5ZKR zg(6ndS*U{#Qx6cA`79LWu|Est(gtxBDjeNGXQ4WHr(KWu&sIav~;?(M)`UiRz zDs0WC?gTrsDd0~b*&S=dSy05e0qGhCNItOUcO&Q~ zt{17FEMTc87qA>uJ`J!0&%-!2BBKN&VWuFSeM*I!^ z(pjk20m;vH#`lDuZ80F}-9`ypB6={C5+iB(l3+n4hgqP_@0F4Ju33emGCYJpOo-@ zmHs1|_gazdR2*}Uhbte(F_-+Q*)eAzaRdzj!K=PBHXbEx9CLURUa?EYB#Y8TeP?$KwZ5(qeKeKCaSZua^A(gG{H96fZT@+vaGv_gP z(BoV+jAx-Xeh%51&q5j6Yf<1FwjG6R&q9SNXzPEtl64XR=Ce=+JSOF$vrxxS$lft$ zS2BcSZVBrlR0hW!^*mbn8&H|JVAGg9Du;!)JPVci1x7FZg?f=@(j*g3jv#OrD&(eLlu(q{rmHrnDg2o>aSPZBjQ9_{dpO{ZR^i7kVt2tXyzU8=Vf9|NB%rR zwhW3@3V%7f9VN{EJX+`2=;$owIsx?hS*QUI4_Ry)A+Wgi4D^}C7tZ)#!;VQJtyKnm z7Aow#lvYG!3nOp_j(nW2wXPCiu>iFKJR(4|05lIXI|KK@h1!W=T$@>(fqj-N(isSk z$9AOAWkkW9flip*Hrr(343x{OP|iTP*z#|Nw2UO^_x~{j@+O%W5ySFt%tDi3$&;Rm->)Bd88cd7pRTg3hx5qW742{LIGL$ zJMry+67>m2_3IUZuM5&q@1i?BGt*dKl#QEUJldo$NfM}P2WHU{9esT+lM%Vr*V&B) z*E*@g$=BHv=n49)zs`;th<9-VBAB>e(nq@5?~kV-4fXJA6Y#rJZN9NkFsHW0TeV`A z7q6w>QS0>#^1})?zn?Z7Kk_HOt8j&WHw$;|pMVxWLi|s1Sr?$xFF~mMpNzCbdEcBo zpKZf)DuTM2wu$?vWZYiBQ~9pKdniwba7F_!!P@}EcNH$Md{@E3vMFqAG{mR>RvHm( z{g?v9szEoKWuQdx#}q^v^T!l6a`qTMra(E>ge{Xj1wyUbw}Z1sdAD-LW&~*;Jq2su z=B~KT9vTaXr*RQ9mt+y?2Nax7LhmMp`F?_hp@V#R9&O;?P57`#y+7YrsNSD{TEF`f z?%LOYu6l$EKqx>mv{DQ~wL2E}*(rq^8cxptx*eR!@zpo{KHo`U^BxCDW&D*y*0*MQ%%;0z&Hj*e(j5rJi~ zNHR&y@>K&1M~POmtizY0Rz@!CeW+vjwTWadmd_`EDm?Bi{D z`9}Pt75@cKigK`&p8?<1MhwQM06xB~@s#9MSK(J|ylVvJV-j=Odpc%{B2(uj+!Kx1 zj86gF;)g^9$`pxm{ku9!isIIDAK{#2#A193;4~7tO=4Zvp<|^eU>);w^q-4t?6D0h z+g{VJ(HFm*Wn+)m zBDKo+Z3y6XPYGj}Bh|%FyY%vh+_+tS{#G@9e==W<-y;{OyK%T{AN~uxC4n#wAs)d_ z7bhWJjo(|*j@@|9Ku}lmFGbuz8TTgOV8(BO4-_oB*TybS31gRSmM_gLVxMhDv>j_Am9Kx9lJBS-CDp0=T^8=zKLTA}BE&q6xj&$te3Ou-?=o1iI+nwFB=10PdG@e*+whd;|9R@=t^h5dMN-C+A+oE1Pog z{`qYEuOM3lb#3{zxZfz_ehzplHf2A`lTGqTKtad1ZET5Y+7IU0{d{o{^BB=( zp7)0@MlFeaL}@{8vs^>ikkcdA>y{|FzJgzH7vDVmP``_s3%OqTOfI_)VIIQe2zGKU zK)jOcZnWblo=XtuqWkRM=CY3ghXT?y5^ykb4cL&1I+G1i5oQ}=5_SknAUR63nq?in z6tyyPS?@p{!>=^1YK%{TAp$>X@2M^=D)!(cr$;QGde0SWy=}+!g$_mG=NW$o9l9{& zI!7!S2WOJ(zUTVr9A%T9)$jJ>u6+e)xd&k#LJ@+U-fTj=vPl`=pU+ZuV*Y_Rb&dbM zxF3Ufx~2o3icMOE@??{~E#d2c!X}+>@jC`2AXqkqr4NB-=q8EiwVEV~4Va{5C=qOu zL>aS5Vw^ihlSDZKCTR@#U^PjpoIA=S(ZWAqlISVeB;gyb-)ZGGiFg_pzPTidNKF!3 z3!LsNB3|Ew(82H~iLY&bSg6LWGiRxB>uUXO9`4#d08O7EMD5CD?-5i=6$BHJrpB$+ z$g>sCV-VDJ9QPF0B;$4g4rbgE_&~w5pW4`?DX%+Kl-{mDsc^ z2_fPzs~H>rSkbl0ZakpheHVA_KLb6#L3j?~Q3N{~w;^8Hjm`V<=G`A4SH!8S?2qEU z0P%EH1D=ZAcnsyqZu~{UQNSoi@4b&nTX8@YXffg zRT0|}1A}d+G~vyO*u#1`PmMkMr>n8&fAqW0ao2wB?p$^~!a{^A5$yDG8RFI0(}K46 z@LYkQuFOA)I0i^pEZ|_q9)S-Ov>mdsCs##mPYetMQlc+zkj1I30~mH#6Y4U{I)r^O zka|k8_AgMfek)DM`b+(8=rxe_C4bIkQxUF3I3K}I*4cj$$8miXH3i*RZv-~41O>G{C{GBa;+|Y~ z7T{GfJ_nHa<(iUf`8I5*^DH}u1)pb`HaQ?AetJhmn9j3oLTz-Or48@~)EdRE3wNGH ztQY64SXtp&;lVE+d&{dTCl=tF(M2nAs)}*MWi==T@r)nL}Lfsq|Er7uQUjQ&mwR ze!jehcvN1kwl?#s%4vbCURMmPx^nNh3k7Bl>V%BVeB+~OYQEvVQr(@8yY^9gbJ=+a zmmtI=*!A^kh*$Fs`svvgJZB=P%h@LG+hp8708eGUadoShZ9?!bjlf+oAjb-R%K_L zp>l4bezrQtQ|fgv^;^pNd9FsxO@6nN&rL`UabF9INaB&tV>W>f_Z?y8F{eRrr(_5J z`$lC4|2|pS!4vvj%oOyE$uH!x83wweP@SEy{;n7qc4^XW zwW!}YhCI?>=X*Zqa%IV9=y&sR*WLwMP9XdT;VlF^J#rlgNR@tEZ3~`L5Y+Y5%i?~k zjN1ixDmMKP%99Ua2=Efj2NX8ldI;1q3!1{FjR>~TM6lIDQ*6LO7obG2g%)MZ7J4mb zkI8!gJOK;66@*$X^ft~O@NzTOjvC-E-Ag_UNT*EPGbJ+mE~U746vnKv;+1L9o-oO^8=x*-5k`4QEbPS$mM!drjqNP@k*}m=yxCCu089oxhxl9DZ;e~c5*F2ypn4>+R=k&F9Kb3 zzvOS|Uwa)ADA!TaO zucIpBVdR#Rv0l(+);G&M=`^t5l=SU~vy{G-pQrTgA^q-A+_gXP27dn;;TeQS5bX4A zH{zAPokY8{JMsI^h@*?{k0IQQP>Vpa$E<^2M@_`bf#~4cL(su-HvWIhC^jf}zTMjY{Bx8gzfQkfh`aXpK+A^+pCcSX zu+t;wn*piPw;DI&IT=A++YXESEi&%6l#axKuDjIlh`)~VwB~mKFTp%OVbj%Ny}H= z_ZQr?mmkSxH3;`16d~B@;6}u&v8)H}NPY`v%@C)qGCWh<1O&RK01jp>6Zk*@eb3cm zJ12+nn_HPjbj1z47&T=eLkjCa0kdo^cFjuOsmbs`G6fH-yK{6pL)BA%{G0Z+y5Jb?0KZ=R9xbHKr`CBw3K3Y#ydS4OKR0sH|CiQb?{P z>1#UXwdCDD;I@k7FsQX;SQe4QBQ$Pc*+I}@p4$&%Eg6<7+rANj*Oad%{b_2MufQ_ba zGpf;_uO(H4*+!d`&|+y%g9Pv!Y-pcZ2fvP*h?fJ=!7;u-pC60+q^?{x1#p3kF99Su zWdCGfdjSW}4c-f&PyMLThRZ@lnDzoTqc++L*as-~0xs)+FTnD>kTkXxwOTg-&?Ma+ zCQ!|m4FICnYR(c31w(&mi1>!zm+SYVToz)9@#0HH{mzQ0Z;;c!h0{S#ID(A(=J#{i z>wq82co&{YMx8$&n2ffcA1ovK_=7=4D#9eAt56%ss1i`f=<@!X9oXN}KVOl?Dp0RQ zN;`orASJ5XA|;~NDkWpV&>x?`XNXWu+`tGX_KPoEgq0NDdFc-HrhsbxSGkQCKy zkrYvDm6Wky=$E>QZ=w2=g;-*|cxybYl#)IO$S4{2&VOV76L7YSUjj%nYWdy3WaJzd zEF*f)&>$lfVUkfjY9kr_5m3nJ(n$J~cs(eM?Mt;05krdtBBF{dA|hg~A~F^X{gNZ+ zTigJMCBBQdD8q_~?c^;$BXBk2zUf1(r2zjW!PGO^!rHhV%YuEC+R4#=RXt84wlKZxI#IY!#KUVCWZ$@clbf6E|?8Netr6 zrSKwSWj%p@Re}4>AK~3Uz#qx@CP0!|+1`Q4EOC6W%;=D_L1rq#B(q_ton$r_P{?d~ z|1t|d#|wLMK8wIxrcPTox=NI+$RPk%}Ts9qWv5c<(Bwa|u zcG1QMGuUQ?-5WC4PJ~eJhi$(+SQlsq%%BS@!lVn2qBhcnR{(`Bg!p{0g%NletOC_q zM4N&(1w>0#TSQCbT19Ip7-jif|poeQz)3MSu=K zx>5j1R!#7A4@6cIt_YSDIe`tbQV}LutwL=it6u}2hJG8?n}t=$L>u9rdh~&ytBfCo6M@(J1RU0rC$6xho`c{QxaS1rO${HsI9KHAO?zzFMxY^!F?x_O_9U#hdv0xIF}+VZbj96sswyF%+G1~2b>fP< zGd=1d2}u=2H8pxMw~SC_N66(nX$9 zPqnAA*n_;ewO$v+)YMjZ?dtLYW$X~~o-Nf?6GfH4D}_p(eV`-00G~`M)yd$8R1qIv zUYcE0bA4@jiMzZsv%F@d{$ZsA@m%CBF0-j{3ChMM=s0Vl7$QV<%u8v*0%^00YM}9f z^ewoJ8B&nHX2l&<6$^@1c>E5w9dX0XC?NHnS6N!cSIx7Ei@}JhYEor>5d(WJ$q)}Q zb2E#)MfCamIOa+mmdAh4fuclml!J0QRh}V9$dPza)ymtlzEN95DvWGN_z1bf~%k^AK$C5yb}xG5hA(-(Zdm4R#ok# zVk-UEaFMd=>6;P5@Tz!Za&4`aF zE?(rhGp@LJPKl?u!c|tEt*AQVxqw+|;d6b@|pKSeyc z&q|66TqKbG!ZF0m5$(DFl3sPzPGmttSL|Fwg&7M@&L9`CnY2{;m zLD3z@CAqAJ=pC-ptJ3iiI3f~NBj|DyKV-t?#uFSao}V*X#Ig*ieX`rsAC`!|unb_B zo9YVc3I^urH3#LZ1z3F-o6pJ0Z!CGbw(Nr>I0$M3F?QBjKj% zaxYAluHU?K26x5Hwt{@TAN_73`i2$+dn9$<5CdsQpvw^$5(=PIqN`y@Q~i(f_5l}k zSD&(QaV0xBBT@jMyT&w~5!5tYUlh~z(I}oH66!&tkEO|NwoUHnr^)Oo&;pyI(~@6) zXJwHWQ@$2KYa7uzGC-@I9!H#@%T{n?Cc|krHIgfmoi3-xfUcwNjl3d=n#IjAihKMf$H2mCT9gfy>4{t_p7I1> zTFG7BWnJ@&R;xI$mro*GG+7UHZO%*=O_y@YYcR^|gThe!dKzWRt(GDK0#OkyCqojA38I6FIUzNG(`isso{#d1p-r@P8-^X85Jw{u1|0{N1SctxqSQ=E zm`K8NRSz!@QIAzdv%)4cvIcHi4DFQCgOo&I1I=Q5la?MyDZ@oYNK&oTr|zz! zDCfMsa9$=3?ol7&`gL*$N(`M&29pyoar$J=67`QVrCiskl7x%;=xVjLTN|i@;?JUfM;GatK9Aw(ghXk2%oTus+Y#7`fnO;* z{aRxnimPQpKHM|>XL*p3^p|U9jGT*61RWA~sDrm+=pcWqBc8M%XwG&PMF!8=GQo4} z*qw)1Ir+XFP2=pieJI*KL~lDBYlr~ds{w|=A0v5^wOXI67)+_MAcT((OHMJ$QC|?F zgp#>5W=&29eoo%+r^LCeh*hu}=E1#+C;k<%YF5i*1M!4>B0@t_>*oB$H`TZGHWZ{f z8=R?Hda8TZd73xXIsM$)B=@eDwb!+me1E$BWB>Y=TIbZ3Zbwtp(wlF)^_JGn8guVr zty)X|V(nwC6ZxWjQ7e1=NYdk8)JFP7{ZNm)N&73#&|dcavZ%*T)o3kRl6Jto%MrbAmbRz0F@r74AUd6?HzTdS?WB0f zXvj=;X$XK$K&N|GQgp{`ZEt;BBJwS)Z;4l>^fD9|q7=%++LVd?8p_1j)Dsh?o`IK9 zm4Jsj4?G>omA5mh@(dqaEC_r1K2 z{awGIuGH%LGe!a}BVJ>^ow%EE4tX@avGuE?*nL&nOB+6QKeD&}9}j5Bk2FP>G2fW) z_V}MnzO9UD?Am5vu5~s=bzjb7>eHAvzL_F7h+cn&%=ib2^Ucou*uSC0y`^P+i}&ir z!agm|_s;B({Tl9G^1ZOR$KQQ^#7XTaE))#v-wrXK$i|Iw~LJ&5xEM%Q1uyj35^$h1sitMMOaDNz7x;wJx1ez+;kl?k zJO-*crX=JiOavt+x^*z)!QGc_pL1*IE04wilx<)U9yg z#^hA3cj~8*TvH{@+gRs=13B zMVvGiO=ySD^?PnCWbO?u$m?@zEZb0f!_006n(*Sy%ek$hc2W2Hc&dcA{Q%M07~hPyd50JaqvQmEWc!k}*Bh1z^WvL1E6@kxsYIsF*&Uzd zPfV?SzJ4G2Gp|_Gds2H}3>LmI=<1?}j-b1q##@JKb7R2&wOQH=z8{qL`1uGjHwM() zl+p0wRKI&yv>GpFU~sG*uKgW7=tx-)46@g$z0^G&Iifq~T)&|9V0S8tjpfC7u3dp# z$$GB$kmOADz5f+n5NJ!}RFb`3sJ+P<4ZOBf1a_jIY0zo)G~qj?hNY1Im7JU4Vy_a=mut zPNYcApBu#a5e?H)HK=8)@5P`pF(3x$T78#*i0*jpHPG-d+I6#>gOJRRG@w`~P{r0m zXE{a5Xun=^>qf$uILFZ;qzw~6&@Qxlnc{iBovkBCYJOcqvaEN;gl zY7F2Qz!X6A2Nn%LbCV=ICp9i{5O6=6w!we@IQOo*&zeyIk-8h_oQ1~u;_f7&)?V9K zbC!G8xzTUW$*nz%{E79eovhY1wFPJr(Omr3GNACjzkMD|*oHfy*HaH`uw$u8_a^Ue zc=6%vsD?Ktx456p8J2M3>4z6YHF}3R9$t{(el~O15U}Cw#B13>eGM3 zYNH#{f7H0veRg(jm$u3|c|Uq1x?=YWd^UDN;%9qkbn%{7cdz>^ZBbHn!aYOW&+m_R z`G>dqUuj+UE)v2U6=0pKa zD(X!YmUsegCm?FP=1c{cgvUuDB@MS}h?>@jRKRq=X@D7sPuDQ`WihP)Pa~!~YDc+u z&8Nm>V6ysx@7w9Y)8&nsshM?aQ!|07mzv?TwcNex*&T2>G7BFm>``5Lm0 zYgxc`Ov^gPBadiVM;fw@Hf9}f$m(p&I@*wRP|ND%s{*a?AZN?jGQy=HEr~z)zA?kV zoUGUC?t6_v!`|u6n4{J9>0|$l6YlR+pz)X+Xrt&SN_|tCdi;W9kT*sv>}_!15pxyy zhAWV9>S29O;YU*g<-Yulm{}CxiedbOeOXhUJ23FuUk=Cxr%485WZkvvgBo`X^nu;Jwe>xMIlR;vvXS?%K_idq zjYJ^T^+iv9yq?f6ce>A(&Qb>+Ow&y+i}rnu)evKx|Ln+E~~F-9Q}V z*@M}h?-9)P^!D@yiSB{FHloBR`n_7;+Fx7Svn{ASyFm?D<=cUYU!c@nlmbz{A0U>d zg+E`7c6FNCRo~Vm_55VR{GNuw=7y}@9L4w;RQ&Y!2t}th>ha&*$b3)mrxyA29XwH| zXgXK1;>E0IqfplOdE$R~${l)&mbF_;sc&u8MpF6*NN>pMtG}-gW7rqek-)mbX5R)F z^oFda`umy?{}S(D=s!)wE+@Lz_j&i~5#4K4>XAE{ue+2R@o#GH)PK{(yq-odJm2MO z-_YYP1oM5j{0Hj-ZoAHEoZqPx?uId%`q%$Zn|znu(dXZo^=$XmJm;Ah0z}S>??Q4* zUgP{Gk>C9ylT`O5bN{);J7OHokZ!xB)%`rCqvK!!=|R}PhBvgU zwX0C=Ose+q!?&W^a~;}EN$W^?>S`Sg2ef-!bq@^r>K=D>y!-i2qbK>#00FOqfPaC> zEUIUtOAyci2m%^h)SS)M_2JC1N|`a+`)Z#z0b%%rIPcKzi}+fx6pOU(i)a{o(RVW~ z*ydxw_J<`X<@>${9uLv}2ClXG9{easwpmD~jyUuIA&qltNw%OMczs5TuL}`$n!XSt z%?CO~K#LC;`L&f%0oq1_Hh1?m5L#IlsOh}y?e43!cQ99rsqc1bXQS3U?d5rYAcaAm z+c(iT(&tN8d57@DvEJyZEv>%q_xLfjX4~s( zhtwZ^Kyz-`jfrQgdsj>8xCi`@BG%veT4&viST81~@Itlv;E(dxx5T)gO^V)&lD7!^ z;iK{AaKmz6!}8-B=lkK{>eOhiR#;Ydff5F|-EkjiZ}pu699l+{vM3dZ`T;~7-9mpb zKX|@bf6iXt;(l-o+Mcm7>%{LcUj}vVpT^Zp#F`3zvKRmGIBM`c*nloG|2P&u(PGGE zzSa*>OW|=;>p|k2ujZeq-P^qYxWB?MA?gC|>U0y{iwt-#CA@_`_pVmo6&bX)_W|E1 zh3`P!eSSGJUTgk1maekkFXr<0AB31}4x@ez+PU=@NZ;uTx*+ zlMYQlP`*ogzQy#s9M90P#W$f>8GDek?twT%4;qCYG+gwchP_cAH|+CiFeSI$x*Sz* z27=eM#lc$D{*&X%0(jg!7;1`4d8~WP4=6!@C&$k)inrOJhER?heow&F8rj zV!Xo;remBv7h_po_ie=Z*DzS!0x1)7UiAG8RCX_DoZrjizr*8u5&tWSzY10lW1RMe zATSDB6lefat0*;PF;D8b4768+_U<^OY=Gg`8}Tu3#7W;4M3Mn+;;_%R9+3FHvI=P4 z7F~^W6ue*8)`ww0u>T3Vg?|xCe;TrWf053AL;G$-`!3<_Ti&>V>-Zbbk&gR@g3885 z9z$#IpJNKtJ-u-Q$NGlv9cYBs$R8**15NK9198y9XE4m&?wioQ*PrC=`*E;rc7qUs z#`iYneSH2`iI#NBmTb<~4rvKmyn9!CT~~}ZiT)*jwcmSYU00m#>gGJu&4=_`ft!!x7D?~8*q#$)QLh3g&g!0}B>f6aF}S2ZgvNDGQj&g-$CISr zpm-_EvdbaMDN2@6AV8Pp?@%XXD8@?vJ)+saS%I=NRxXA0GW2;Vvx(!alqNzaU7&Q# zgt*#^sZYG&yN-GT*G(huIX#AcaU~E^zc@!ya5+&R?LGF2&~-^&G$@E~K^Hfoa9_C} z+5mmI<(w*)kb% zFN~IP={#=IRK$IN{W@NDJdfKt4RN2JiC5^a>_r_sWf=S*n|2opi^PN6A!}7k%!3`O#6X6I#2SRpT1}j0xTbF?n4)zJk z(l?uK1WtmCoy#{@u`R5AGig!LJ#?~K9J-#lm~FcTo49f(Ihu9iG;s{E|HQTP zJUR}7V;ABe0w$ic6N_DUwQ=iU8C256qM~RA_GY$YI zq5o%_`F>M*NkI9ViA%cj?;AAlsbqlnZP%V2-V3b3yeD48g=!KpF%17Rt`Pj@Ovk?z zSQ@%i{9>dJmj9I~OMHJ$LL0pouUXB!k!8*d=KUsqghdP$0~&Z}wCN;Nr(v`aL+qQO(2Ga;dROsqh6ns&nkW*o(Ie8Y?LJ)e_ukz&NPoJ z>SaN2du2v2w;w+hZYR$&b31uZ+!jOxahoyXPh9`aAhw0%_(se;gRk2$>!eG?{}}0m z<@ZjMC4T!QWNeg~-*kW$yxu_!(ns)?Q{i>?Y%{M1r`duC1FwlUarR9hc7^0~kL0W3 zb^Dcq&ni9^&x7UjSd=9`-z}kyUehbDc)M~9c->A6(s|u+D!eY6b9#6!h%oS)_+!;; zy&1%|ko?YHZ1#cO>a4pTPBiX+IvkziABlB@|26zu_fO2~SyU(X@Rm3mhBqvAA~IjQ z*;RKhd}gDu4ebAh(?6Nq*Ss7R3o12STk32`YFOgrelPBBzrl$@_YAFeS@w>j_Gx+8 z-RAynLa*K6x+jHd;7cf~f^Rl=kA{nWq;%2m(+XYM{6y4|?OeXs#pq0y2{N0BR__}bQ9sA`yI4oHA{xEN1-TN+Y+|-t?M(Ci{F`Ldr zVvE;F+tD)T$R|Eo%Cr`l$TCgO<4cxs@O)?hW)iEbzelSifhbv;y$tNi|AED>RVjc znRhltcgLa@M^kitTN3%3$w@N`w2MPv{un2Y%hXP5Zi+5rd|O2uMblW{y>PTPHzU%w z1V;**=}^scIXiqBofQG$?o(4E6YLeD{g~YnrZ1_vE z`be?zrYpq~8{PgwY+v_jBT$iV6VU4_^CU8ohv+k-ux!ERWxio2XkSR_J#1yM}LWZ>DPV# z!l9k+S;T>L|KRPX9k#D(hiD`DmRxj)<^YZ0sx~W$_*hq)K=k$b3wyg0z_!1Nd*N-v zHo+ie(TYxYin2I@wX*2sR#}t)y)KK(v9KdqR22&jKCsjvi;Ivf@z}`XEGwp7-#Cfs zN{(sJviLJLxBm~w;%Sg^in1ufDz`sb8wo}ghV2~RXrh~A66GG}Uck+ugXO+Q-q zFWwtzz@gD-3R!K8MjvT(mfi^~>k5oVqv?o~A4d1kved-K4#Bh@8UttXXmr#-LJ}n; zQNkf7{JY7p>awq5tk9O?)SiK;Rz*~yt0Ad-E_UQPwG$SiFvkH=CqNX&2n>8`j2J?m zTQNxR+Ya%-UGlV-NW3^|<;Ca#FOp~ikw*=6M#K^qawZyCk_eW#-ddKL^w?Wy`C9>& zsDuCOj(RfihtI|8+uE%B z8Eea*QZ3I_N*WOnqY{xb$;hZAFe>rz+SIX+9j-_n%eMrC?x=)GlrV`B_})NzNZmQt zj!&gpVNz*Bo~wKD0QogCcrQRO4N-+jizFWnoJ$nvwg0zt>z%dGt#>L?lW4C&b~mnD zNJycC6iRr9wp0F(>DK>F-~0b3fB5`qz;nqTpR&z-95d|xZ007Q*KOtp$VfKxHbj!8 zdp^%#GyfI9V`DRCTQT+eMoCPy9Mhm}=D(ge-8Qqm9>%V(s}Z|*;_hkv?pL^LUz3Hs zK7>XDEY|d^McmEZig^Ai3Z7}@F?MbqdkS&t%EU8W6i?ShfV4q4@clI^ol+pYzuv0K zc`H_mcWsL3Yg>%!iR(9+Y8MNfu%AIgEypCSR3lyK*9+QvWc*iv^xEdu8}bIUM@YXZ zrUJbhGz@rYy&28i1!6~#+-i7_y!v9+Q-t>575VbYB7ET>4LPw=Ia8bj@eCf$+8+7VV36TWCR0(j|* zev3JbVvlm@K+0(P;2bq`o{v2}7{l$2Z8z=tBn4{6${;jGHZ>7o;_WuFhA0d2+ z@E3$P5r(5bo{caLAqGKiH5-^R3Gw77vb!>oCJry)qi4Xk8leYq1qkXI&$|`ATO;Ef zc&7fb4`bdy`iB|^#P1AJ4>?!3E`8%LLswJ2F_^avb+S9=JN2 zX?W^!@0snYZ;9gP84;fkKTZA1enc;E)wlZb8dr?(PZ!|SPwOoLr~A))-G6@Nvc0q} zn0^3nZ(_~F-}P&oy8jP^(RbJFU;1yx8Rot2=ViXq89d|Wg{8EFp^VfV-z=UHcxD{9 z-wC2yXB@aMj#GuV?g+0a2K=fR87^Ofz`qOrP>J9D>|Xb?@_xpFRT5W?0T<5U;w0lg z+T=lzA(+Qm0oIzl8b0&eL z=4=A-O-|pNU=cszOXq!2&%L6a2{`bLFccxFdsOpAQFxOmyjc}~LKdd8*jg5rQOPq3 z6KkVqWVyiJ<$IGzUX58Uu#Gx`FX6T?Azzn}Zy_wao^k0BlWq|dwf{;>Q@oKZfm z?Q16W`kwEXc*f~X^dQvvR#wtm7CM6?4Rj_kYFlt}fKHJHI)Tqf=fcS79ATo1+ zG1aro$kakS6I1zm6!gBcBIzAfuP*=KNE^NeCkJR1d=2U!@81&CKZ47g=6W8~>k<9o zTP^Ak;5{=jwv1bt$F4!hK)4=Z0YV`{^D*l8FV0M2brCosCXj6hQJ76LS&G@L62 z6r53|@#In??sdTP2*TqCKSlT@!ZQfXeFFD*fxAH9t`oR-DBPFpxEJHSp#Arc#Jd#k zT~jW55wGdT&zm!Q!~O?8nA$=fjf}+aVSnrI@bQpc!Mihw?p=kh%l0B8UQ5jyil=z~ zlz^vUcuKg8_ehK_vh4ookNvHD{LVq9968ThL z7P92g=OVALJKBMH-XZh6!{&KM<9~MwAD3JCc-+dz;nwC3G_du#Cj9^IL$CP$)(fif z-4Am)8iZS$X$)>{rXjesxsR7SD9im&lp}v!Zv&3slkMr$ZcJ>%u%@;7_R(4A9@